10.2 Konvergente Reihen
Gerade die konvergenten Reihen sind besonders interessant, weil mit ihnen wichtige mathematische Konstanten berechnet werden können, z. B. die eulersche Zahl e und die Kreiszahl π. Außerdem lassen sich mit konvergenten Reihen durch die Taylor-Entwicklung (siehe Abschnitt 10.4, Listing 10.16) eine Vielzahl von mathematischen Funktionen approximieren.
10.2.1 Die eulersche Zahl e
Die eulersche Zahl e kann näherungsweise mit der Partialsumme

berechnet werden. Für große n konvergiert die Reihe gegen e. Listing 10.5 zeigt die Umsetzung eines Funktionsplots für n = 20.
01 #05_plot_konvergenz.py
02 from math import *
03 import matplotlib.pyplot as plt
04 n=10
05 summe=0
06 fig, ax = plt.subplots()
07 for k in range(0,n+1):
08 summe=summe+1/factorial(k)
09 ax.scatter(k,summe,marker='x',color='r')
10 ax.hlines(exp(1),0,10,color='black',ls='dashed')
11 ax.set_title(r'$\sum^{\ n}_{k=0} \frac{1}{k!} $')
12 ax.set(xlabel='k',ylabel='Summe')
13 plt.show()
Listing 10.5 Reihenentwicklung der eulerschen Zahl e
Ausgabe
Abbildung 10.3 Funktionsplot für den Grenzwertprozess der eulerschen Zahl e
Analyse
Programmiertechnisch zeigt der Quelltext nichts Neues. In Zeile 08 berechnet die Funktion factorial(k) aus dem Modul math die Fakultät von k.
Bereits nach etwa vier Berechnungen ändert sich der Verlauf der Reihenglieder nicht mehr deutlich erkennbar. Wie schnell sich eine Reihe ihrem Grenzwert nähert, bezeichnet die Mathematik als Konvergenzgeschwindigkeit oder als Konvergenzordnung.
Mit Listing 10.6 soll die Konvergenzgeschwindigkeit der Summenbildung für die Reihe der eulerschen Zahl e anhand einer Wertetabelle noch präzisiert werden:
01 #06_konvergenz_e.py
02 from math import *
03 n=10
04 summe=0
05 for k in range(n+1):
06 summe=summe + 1/factorial(k)
07 print(k,"\t",summe)
08 print("genau:\t",exp(1))
Listing 10.6 Wertetabelle für den Grenzwertprozess der eulerschen Zahl e
Ausgabe
0 1.0
1 2.0
2 2.5
3 2.6666666666666665
4 2.708333333333333
5 2.7166666666666663
6 2.7180555555555554
7 2.7182539682539684
8 2.71827876984127
9 2.7182815255731922
10 2.7182818011463845
genau: 2.718281828459045
Analyse
Bereits nach elf Schleifendurchläufen wird die eulersche Zahl e auf sieben Nachkommastellen genau berechnet. Die Konvergenzgeschwindigkeit ist also zufriedenstellend.
Konvergenzgeschwindigkeit
Unter Konvergenzgeschwindigkeit versteht man die Geschwindigkeit, mit der sich die Glieder einer konvergenten Reihe einem Grenzwert g nähern. In der numerischen Mathematik ist die Konvergenzgeschwindigkeit ein wichtiges Qualitätsmerkmal iterativer Verfahren. Die Begriffe Konvergenzgeschwindigkeit und Konvergenzordnung sind synonym.
Bisher wurde nur eine Näherung von e berechnet. »Können Computer auch den ›echten‹ Grenzwert einer Reihe berechnen?«, wäre nun eine naheliegende Frage. Die Antwort lautet: »Ja.« Mit der Methode limit() von SymPy gelingt dies.
Der Grenzwert g einer Reihe ist mit der Summe seiner Folgenglieder identisch. Es gilt:

Das nächste Programm (siehe Listing 10.7) soll diesen Zusammenhang am Beispiel der eulerschen Zahl e bestätigen.
Der genaue Wert von e wird mit

berechnet. Listing 10.7 berechnet mit den SymPy-Methoden Sum() und limit() die Summe der unendlichen Reihe und den Grenzwert für e:
01 #07_sympy_grenzwert_e.py
02 k,n=symbols('k n')
03 ak=1/factorial(k)
04 sn=Sum(ak,(k, 0, n)).doit()
05 g=limit(sn,n,oo)
06 s=Sum(ak,(k,0,oo)).doit()
07 print("Grenzwert der Partialsumme:",g)
08 print("unendliche Summe..........:",s)
Listing 10.7 Unendliche Summenbildung und symbolische Grenzwertberechnung der eulerschen Zahl e
Ausgabe
Grenzwert der Partialsumme: E
unendliche Summe..........: E
Analyse
In Zeile 04 berechnet die SymPy-Methode Sum() den Wert der Partialsumme für die eulersche Zahl. In Zeile 05 berechnet die SymPy-Methode limit() den Grenzwert der Partialsumme für n gegen unendlich. Zum Vergleich wird in Zeile 06 die unendliche Summe berechnet.
Als Ergebnis (Zeile 07 und Zeile 08) wird der Großbuchstabe E, das ist das SymPy-Symbol für die eulersche Zahl, erwartungsgemäß ausgegeben.
10.2.2 Vergleich von Konvergenzgeschwindigkeiten
Im nächsten Abschnitt sollen die Konvergenzgeschwindigkeiten von drei verschiedenen Reihen für die Berechnung der Kreiszahl π miteinander verglichen werden.
Die Kreiszahl π kann mit der Leibniz-Reihe

berechnet werden. Diese Reihe konvergiert sehr langsam gegen ihren Grenzwert π.
Die Leibniz-Reihe ist nicht die einzige Reihe, die gegen π konvergiert. Der indische Mathematiker Madhava, geboren im 14. Jahrhundert, entwickelte die folgende Reihe:

Noch schneller konvergiert die Reihe

des indischen Mathematikers Srinivasa Ramanujan aus dem 20. Jahrhundert.
Listing 10.8 gibt ein Gefühl für den Unterschied der Konvergenzgeschwindigkeit dieser drei Reihen:
01 #08_konvergenz_pi.py
02 from math import *
03
04 def leibniz(eps,x1=3.1,x=3.2):
05 summe=0
06 k=1
07 while abs(x-x1) > eps:
08 x1=x
09 summe=summe+(-1)**(k+1)/(2*k-1)
10 k=k+1
11 x=4*summe
12 return round(x,15),k
13
14 def madhava(eps,x1=3.1,x=3.2):
15 summe=0
16 k=1
17 while abs(x-x1) > eps:
18 x1=x
19 summe=summe + (-3)**(-k+1)/(2*k-1)
20 k=k+1
21 x=sqrt(12)*summe
22 return round(x,15),k
23
24 def ramanujan(eps,x1=3.1,x=3.2):
25 summe=k=0
26 while abs(x-x1) > eps:
27 x1=x
28 zaehler=factorial(4*k)*(1103+26390*k)
29 nenner= factorial(k)**4*396**(4*k)
30 summe=summe + zaehler/nenner
31 k=k+1
32 x = 9801/(2*sqrt(2))*summe**-1
33 return x,k
34 eps=1e-6
35 #Ausgabe
36 print("\tπ\t\tn")
37 print(leibniz(eps),"\tLeibniz")
38 print(madhava(eps),"\t\tMadhava")
39 print(ramanujan(eps),"\t\tRamanujan")
40 print("",pi,"\t\tmath pi")
Listing 10.8 Berechnung der Kreiszahl π mit verschiedenen Reihenentwicklungen
Ausgabe
π n
(3.141593153589474, 2000002) Leibniz
(3.141592454287646, 13) Madhava
(3.141592653589794, 2) Ramanujan
3.141592653589793 math pi
Analyse
Die Bildungsgesetze der Reihen werden als Funktionen implementiert (Zeilen 04, 14 und 24). Der Unterschied der Konvergenzgeschwindigkeiten zeigt sich durch den Vergleich deutlich. Während die Leibniz-Reihe für eine Genauigkeit von fünf Nachkommastellen etwa 2 Millionen Schleifendurchläufe benötigt, liefert das Bildungsgesetz von Madhava nach 13 Schleifendurchläufen eine Genauigkeit von sechs Nachkommastellen. Die Reihe von Ramanujan erzeugt bereits nach zwei Schleifendurchläufen eine Genauigkeit von 14 Nachkommastellen für π.
Symbolische Berechnung der Leibniz-Reihe
Kann SymPy auch den Grenzwert von π symbolisch für die schlecht konvergierende Leibniz-Reihe berechnen? Listing 10.9 belegt diese Vermutung:
01 #09_sympy_grenzwert_pi.py
02 from sympy import *
03 n=symbols('n')
04 an=(-1)**(n+1)/(2*n-1)
05 s=Sum(an,(n, 1, oo)).doit()
06 print("unendliche Summe:",s)
Listing 10.9 Symbolische Berechnung des Grenzwertes von π
Ausgabe
unendliche Summe: pi/4
Analyse
SymPy ist also auch in der Lage, den genauen Wert von π/4 mit der langsam konvergierenden Leibniz-Reihe zu berechnen.
10.2.3 Konvergenzkriterien
Experimentelle Konvergenzuntersuchungen veranschaulichen zwar den Grenzwertprozess, sie stellen aber keinen mathematischen Beweis für die Konvergenz einer Reihe dar. Deshalb soll noch anhand des Quotienten- und Wurzelkriteriums untersucht werden, ob eine Reihe konvergiert oder divergiert.
Die notwendige Voraussetzung für Konvergenz ist, dass die Glieder der Reihe Nullfolgen sein müssen. Wenn die Folgenglieder keine Nullfolge bilden, kann die Reihe nicht konvergieren.
Das Quotienten- und das Wurzelkriterium sind hinreichende Bedingungen für Konvergenz. Alle Folgen, die diese Bedingungen erfüllen, konvergieren mit Sicherheit.
Quotientenkriterium
Wenn man den Grenzwert aus dem Betrag des Quotienten eines Folgengliedes an+1 und seines Vorgängers an allgemein berechnet und dieser Wert kleiner 1 ist, dann konvergiert die Reihe. Es gilt:

Wurzelkriterium
Wenn man aus dem Betrag des Gliedes die n-te Wurzel berechnet und das Ergebnis kleiner 1 ist, dann konvergiert die Reihe ebenfalls. Es gilt:

Wenn der Grenzwert bei beiden Kriterien gleich 1 ist, dann ist keine allgemeingültige Aussage über das Konvergenzverhalten möglich.
Listing 10.10 überprüft mit dem Quotienten- und Wurzelkriterium, ob die Reihen

konvergieren oder divergieren, und berechnet zusätzlich noch die unendlichen Summen sowie die Grenzwerte dieser Reihen:
01 #10_sympy_konvergenzkriterien.py
02 from sympy import *
03 n=symbols('n')
04
05 def a(n):
06 return 1/n #harmonische Folge
07 #return 1/factorial(n-1) #eulersche Zahl e
08 #return 4*(-1)**(n+1)/(2*n-1)#Kreiszahl π
09 #return n**2/2**n #Grenzwert 6
10
11 QK=limit(abs(a(n+1)/a(n)),n,oo) #<1
12 WK=limit(Pow(abs(a(n)),1/n),n,oo) #<1
13 g=limit(a(n),n,oo)
14 #Ausgabe
15 print("Quotientenkriterium:",QK)
16 print("Wurzelkriterium....:",WK)
17 print("Grenzwert.......:",g)
Listing 10.10 Quotienten- und Wurzelkriterium
Ausgabe für die harmonische Reihe ∑1/n
Quotientenkriterium: 1
Wurzelkriterium....: 1
Grenzwert.......: oo
Ausgabe für die eulersche Zahl e
Quotientenkriterium: 0
Wurzelkriterium....: 0
Grenzwert.......: E
Ausgabe für die Kreiszahl π
Quotientenkriterium: 1
Wurzelkriterium....: 1
Grenzwert.......: pi
Ausgabe für ∑n2/n!
Quotientenkriterium: 1/2
Wurzelkriterium....: 1/2
Grenzwert.......: 6
Analyse
In den Zeilen 05 bis 09 werden die Funktionen für verschiedene Reihen definiert. Für die harmonische Reihe ermittelt das Quotienten- und das Wurzelkriterium (Zeilen 11 und 12) den Wert 1. Es ist also keine allgemeingültige Aussage über das Konvergenzverhalten möglich. Erst die Berechnung des Grenzwertes in Zeile 13 liefert das exakte Ergebnis von ∞. Für die eulersche Zahl e liefert das Quotienten- und Wurzelkriterium eindeutige Ergebnisse. Für die schlecht konvergierende Leibniz-Reihe gilt diese Aussage nicht. Der Grenzwert π wird aber exakt berechnet. Für die Reihe ∑n2/n! sagen beide Kriterien voraus, dass die Reihe konvergiert. Auch dieser Grenzwert wird richtig berechnet.