1.6 Übungen
Diese Übungen können Sie übergehen, wenn Sie nicht in Details der Fehleranalyse einsteigen möchten. Es sollen drei Probleme der numerischen Berechnung mit dem Computer untersucht werden:
-
Hat die Reihenfolge der Summanden einen Einfluss auf das Ergebnis?
-
Gilt das Distributionsgesetz auch auf dem Computer?
-
Wie entsteht Instabilität?
Die Bedeutungen der einzelnen Anweisungen in den Quelltexten werden in den nachfolgenden Kapiteln erklärt, sie müssen Sie jetzt noch nicht verstehen. Ein intuitiver Zugang reicht aus.
1. Übung: Hat die Reihenfolge der Summanden einen Einfluss auf das Ergebnis?
Es soll die Summe der Kehrwerte der Quadratzahlen von 1 bis n berechnet werden:

In Zeile 03 können Sie die Anzahl der Summanden ändern und so den Einfluss auf das Ergebnis untersuchen.
01 #U_01_01.py
02 summe=0
03 n=300
04 for i in range(1,n+1,1):
05 summe=summe+1/i**2 #absteigende Werte
06 print(summe)
07 summe=0
08 for i in range(n,0,-1):
09 summe=summe+1/i**2 #aufsteigende Werte
10 print(summe)
11 #genau
12 from sympy.abc import i
13 from sympy import Sum
14 s=Sum(1/i**2, (i,1,n)).doit().evalf(20)
15 print(s)
Listing 1.3 Anordnung der Summanden
Ausgabe
1.6416062828976226 #absteigend
1.6416062828976228 #aufsteigend
1.6416062828976228698 #genau
Die Ausgabe zeigt: Wenn die Summanden in absteigender Reihenfolge addiert werden, unterscheiden sich die Ergebnisse minimal. Diese Aussage trifft aber nur für eine große Anzahl von Additionen zu (etwa n>300).
Fazit: Bei der Addition einer großen Anzahl von Summanden sollten Sie die Summanden in der Reihenfolge aufsteigender Beträge addieren [Knorrenschild: 6].
2. Übung: Gilt das Distributionsgesetz?
Es soll untersucht werden, ob für die Formeln

und

Python unterschiedliche Ergebnisse berechnet. In den Zeilen 02 bis 03 können Sie Zahlenwerte ändern und so den Einfluss auf das Ergebnis untersuchen.
01 #U_01_02.py
02 a=4.2348
03 b=3.2349
04 c=2.1234
05 x=a*c-b*c
06 y=(a-b)*c
07 print(x)
08 print(y)
09 #genauer
10 from decimal import *
11 getcontext().prec = 16
12 a,b,c=Decimal(a),Decimal(b),Decimal(c)
13 u=a*c-b*c
14 v=(a-b)*c
15 print(u)
16 print(v)
Listing 1.4 Untersuchung des Distributivgesetzes
Ausgabe
2.1231876599999993
2.1231876599999997
2.123187660000000
2.123187660000000
Die Ausgaben für die Zeilen 07 und 08 sind beide ungenau. Sie unterscheiden sich nur in der letzten Dezimalziffer. Das Python-Modul decimal (Zeile 10) ermöglicht eine genauere Fließpunkt-Arithmetik. Bei den vorgegebenen Daten wird das Distributivgesetz erfüllt. Experimentieren Sie mit der Genauigkeit (Zeile 11), und beobachten Sie die Ausgaben.
3. Übung: Was ist instabiles Verhalten?
In die Funktionsgleichung

sollen für x die Werte von 10-5 bis 10-15 eingesetzt werden. Zu erwarten ist, dass sich der Funktionswert dem Grenzwert 1 (für x → 0) annähert.
01 #U_01_03.py
02 from math import exp
03 x=0
04 for i in range(5,16):
05 x=10**-i
06 y=(exp(x)-1)/x
07 print(x,"",y)
Listing 1.5 Instabiles Verhalten
Ausgabe
1e-05 1.000005000006965
1e-06 1.0000004999621837
1e-07 1.0000000494336803
1e-08 0.999999993922529
1e-09 1.000000082740371
1e-10 1.000000082740371
1e-11 1.000000082740371
1e-12 1.000088900582341
1e-13 0.9992007221626409
1e-14 0.9992007221626409
1e-15 1.1102230246251565
Bis 10–8 nähert sich der Wert von y wie erwartet dem Grenzwert 1. Danach steigt er wieder und fällt dann wieder ab. Das ist das typische Merkmal für einen instabilen Algorithmus. Diese Instabilität wird durch Auslöschung verursacht.