Frage: Die Eingaben x,y sind schon fehlerbehaftet (Messung, Rundung, Vorrechnung). Wie groß ist dann der Fehler im Ergebnis z=x+y, z=x⋅y oder allgemein z=f(x1,…,xn)?
Der relative Fehler ist die natürliche Größe für Gleitkommazahlen: ∣εx∣≈10−k heißt „etwa k gültige Dezimalstellen“. Die Rundung macht laut Rechenmodell genau ∣ε∣≤eps.
Gilt ∣x∣≈∣y∣, dann ist der Nenner winzig und die Verstärkungsfaktoren werden beliebig groß. ⇒ Die Subtraktion fast gleich großer Zahlen ist instabil. Das heißt Auslöschung: Die führenden, übereinstimmenden Ziffern heben sich auf, übrig bleiben die hinteren, fehlerbehafteten.
Beispiel (Folie §1/4) mit N=8 Stellen: 📄 Folie §1/4
Eingaben: relativer Fehler ≈10−8 (8 gültige Stellen). Ergebnis: nur noch 3 gültige Stellen (1.11), denn die Stellen dahinter sind unbekannt. Der relative Fehler ist um den Faktor 1.11⋅10−60.98≈106 gewachsen.
Merke
Auslöschung erzeugt keinen neuen Fehler. Die Subtraktion selbst ist sogar exakt. Sie macht den schon vorhandenen Fehler von x und yrelativ sichtbar, weil das Ergebnis viel kleiner ist als die Eingaben.
⇒ Kritisch für x≈1: Dort ist lnx≈0 und der Faktor 1/lnx explodiert. Beispiel: x=1.001, lnx≈10−3, also wird εx um den Faktor 1000 verstärkt (3 Stellen verloren).
Ablesen geht immer gleich: Verstärkungsfaktor =f(x)xf′(x). Die Zeilen xα und ex sind Ergänzung, der Rest steht so auf der Folie (dort für tanh als εx⋅xcosh−2xcothx, dasselbe).
Ergänzung: die Zeilen nachrechnen
Für sin: sinxxcosx=xcotx. Bei x→0 geht das gegen 1 (harmlos), bei x→π gegen ∞, weil sinπ=0. Für tanh: tanhxx(1−tanh2x)=sinhxcoshxx=sinh2x2x≤1.
Bisher wurde z exakt aus den fehlerhaften Eingaben berechnet. Am Rechner wird das Ergebnis aber selbst noch gerundet (Rechenmodell): z~=rd(x~+y~)=(x~+y~)(1+τz), ∣τz∣≤eps. In erster Ordnung:
Jede Operation kostet also zusätzlich höchstens ein eps relativ. Über einen ganzen Algorithmus mit k Operationen wächst das im harmlosen Fall wie k⋅eps. Gefährlich wird es nur, wenn irgendwo große Verstärkungsfaktoren auftreten (Auslöschung, ln bei 1, …).
Mathematisch gilt D1=D2. Numerisch subtrahiert D1 zwei fast gleiche Zahlen (für kleines h). D2 addiert nur positive Zahlen und dividiert, ist also stabil.
h = 10⁻ᵏ, gerechnet im Browser mit double (eps ≈ 1.1·10⁻¹⁶)
k
D1 = √(a+h) − √a
D2 = h / (√(a+h) + √a)
rel. Fehler von D1
1
4.880884817015163e-2
4.880884817015155e-2
1.7e-15
2
4.987562112088950e-3
4.987562112089027e-3
1.5e-14
3
4.998750624609638e-4
4.998750624609648e-4
2.0e-15
4
4.999875006239662e-5
4.999875006249610e-5
2.0e-12
5
4.999987500031722e-6
4.999987500062500e-6
6.2e-12
6
4.999998750587764e-7
4.999998750000624e-7
1.2e-10
7
4.999999880794803e-8
4.999999875000006e-8
1.2e-9
8
4.999999969612645e-9
4.999999987500000e-9
3.6e-9
9
5.000000413701855e-10
4.999999998750000e-10
8.3e-8
10
5.000000413701855e-11
4.999999999875000e-11
8.3e-8
11
5.000000413701855e-12
4.999999999987500e-12
8.3e-8
12
5.000444502911705e-13
4.999999999998750e-13
8.9e-5
13
4.996003610813204e-14
4.999999999999876e-14
8.0e-4
14
4.884981308350689e-15
4.999999999999988e-15
2.3e-2
15
4.440892098500626e-16
4.999999999999999e-16
1.1e-1
16
0
5.000000000000000e-17
1.0e+0
17
0
5.000000000000000e-18
1.0e+0
Beobachtung:D1 verliert pro Zehnerpotenz von h ungefähr eine gültige Stelle. Ab h≲eps⋅a ist rd(a+h)=a und D1=0. D2 bleibt bis zum Schluss auf volle Genauigkeit.
Weitere typische Umformungen:
instabil
stabil
wann
1−cosx
2sin22x
x≈0
2a−b+b2−4ac
b+b2−4ac−2c
b>0, b2≫4ac
ex−1
expm1(x)
x≈0
ln(1+x)
log1p(x)
x≈0
(Die beiden unteren Zeilen sind Bibliotheksfunktionen, die es genau wegen dieser Auslöschung gibt. Ergänzung, nicht aus der Vorlesung.)
Kreis mit Radius r=0.5, also Umfang π. sn ist der Umfang des einbeschriebenenn-Ecks, Sn der des umbeschriebenen. Rechnen in einfacher Genauigkeit (float, eps≈6⋅10−8).
a) Herleitung. Eine Seite des n-Ecks ist sn/n=sin(π/n) (Sehne bei Radius 21). Mit dem Halbwinkelsatz sin2φ=21(1−cosφ) und cosφ=1−sin2φ:
c) Warum instabil? Für großes n ist sn/n klein, also 1−(sn/n)2≈1. Die innere Klammer 1−⋯ ist eine Auslöschung, und sie wird von Schritt zu Schritt schlimmer. Stabile Umformung wie oben mit 1−1−u2=1+1−u2u2, u=sn/n:
s2n=n1+1−u22u2=sn1+1−(sn/n)22.
Jetzt wird nur noch addiert, multipliziert und dividiert. Die Formel b) für S2n hat dieselbe Struktur (Plus im Nenner) und ist deshalb von Anfang an stabil.
Ergebnis in float (selbst nachgerechnet):
n
sn instabil
sn stabil
6
3.0000000
3.0000000
96
3.1410184
3.1410317
768
3.1430726
3.1415837
3072
3.1819804
3.1415915
12288
3.0000000
3.1415920
24576
4.2426405
3.1415920
49152
0.0000000
3.1415920
Die instabile Folge wird ab n≈200 schlechter statt besser und bricht dann völlig zusammen (1−1−u2 wird in float exakt 0).
a) Partielle Integration mit u=xn+1, v′=e2x: ∫01e2xxn+1dx=[21e2xxn+1]01−2n+1∫01e2xxndx. Mit e−2 multiplizieren ergibt die Rekursion.
b) Fehlerfortpflanzung. Ist y~n=yn+Δyn, dann
Δyn+1=−2n+1Δyn⇒∣Δyn∣=2nn!∣Δy0∣.
Der Fehler wird pro Schritt mit 2n+1 multipliziert, ab n≥2 also verstärkt, und zwar faktoriell. Schon die Rundung von y0 (∣Δy0∣≈10−17 in double) wächst bis n=30 auf 23030!⋅10−17≈106. In double: y20≈0.0435 ist noch plausibel, y25≈28.4 und y30≈−1.5⋅107 sind Unsinn (wahre Werte liegen in (0,21) und fallen).
c) Rückwärts ist stabil. Wegen 0≤yn≤e−2∫01e2xndx=n+11→0 ist (yn) eine Nullfolge. Umgestellt:
yn=n+11−2yn+1,Δyn=−n+12Δyn+1.
Jetzt wird der Fehler pro Schritt durch 2n+1geteilt. Der grobe Startfehler yk+1=0 (statt ≈k+21) schrumpft bis y0 um (k+1)!2k+1. Selbst nachgerechnet: k=10 gibt y0 auf 5 Stellen, k=20 und k=30 auf volle double-Genauigkeit (0.4323323583816936).
Merke
Dieselbe Formel kann in eine Richtung instabil und in die andere stabil sein. Entscheidend ist, ob der Fehlerfaktor pro Schritt >1 oder <1 ist.