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

formula

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

Funktionsplot für den Grenzwertprozess der eulerschen Zahl e

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:

formula

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

formula

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

formula

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:

formula

Noch schneller konvergiert die Reihe

formula

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:

formula

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:

formula

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

formula

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.