Zum Hauptinhalt springen

1.2 Fehlerfortpflanzung

Frage: Die Eingaben x,yx,y sind schon fehlerbehaftet (Messung, Rundung, Vorrechnung). Wie groß ist dann der Fehler im Ergebnis z=x+yz=x+y, z=x⋅yz=x\cdot y oder allgemein z=f(x1,…,xn)z=f(x_1,\dots,x_n)?

Absoluter und relativer Fehler (Tafel)​

Sei x~\tilde x eine Näherung für den exakten Wert xx.

Δx=x~−x(absoluter Fehler),εx=Δxx=x~−xx(relativer Fehler, x≠0).\Delta x=\tilde x-x\quad\text{(absoluter Fehler)},\qquad \varepsilon_x=\frac{\Delta x}{x}=\frac{\tilde x-x}{x}\quad\text{(relativer Fehler, }x\neq0\text{)}.

Damit ist x~=x+Δx=x(1+εx)\tilde x=x+\Delta x=x(1+\varepsilon_x).

Der relative Fehler ist die natürliche Größe für Gleitkommazahlen: ∣εx∣≈10−k|\varepsilon_x|\approx10^{-k} heißt „etwa kk gültige Dezimalstellen“. Die Rundung macht laut Rechenmodell genau ∣ε∣≤eps|\varepsilon|\le\text{eps}.

Addition z=x+yz=x+y​

Δz=z~−z=(x+Δx)+(y+Δy)−(x+y)=Δx+Δy.\Delta z=\tilde z-z=(x+\Delta x)+(y+\Delta y)-(x+y)=\Delta x+\Delta y.

Absolut addieren sich die Fehler einfach. Relativ:

εz=Δx+Δyx+y=xx+y εx+yx+y εy.\varepsilon_z=\frac{\Delta x+\Delta y}{x+y}=\frac{x}{x+y}\,\varepsilon_x+\frac{y}{x+y}\,\varepsilon_y.

Die Faktoren xx+y\frac{x}{x+y} und yx+y\frac{y}{x+y} heißen Verstärkungsfaktoren. Entscheidend ist, ob sie klein bleiben.

1. Fall: gleiche Vorzeichen​

Für x,y>0x,y>0 (oder beide <0<0) gilt 0<xx+y,yx+y<10<\frac{x}{x+y},\frac{y}{x+y}<1 und beide summieren sich zu 1. εz\varepsilon_z ist also ein gewichtetes Mittel von εx\varepsilon_x und εy\varepsilon_y:

∣εz∣≤max⁡(∣εx∣,∣εy∣).|\varepsilon_z|\le\max\big(|\varepsilon_x|,|\varepsilon_y|\big).

⇒ Die Addition von Zahlen gleichen Vorzeichens ist stabil: Der relative Fehler wird nicht größer.

2. Fall: verschiedene Vorzeichen (Auslöschung)​

Für x>0>yx>0>y ist ∣x+y∣=∣∣x∣−∣y∣∣|x+y|=\big||x|-|y|\big|, also

∣εz∣≤∣x∣∣∣x∣−∣y∣∣ ∣εx∣+∣y∣∣∣x∣−∣y∣∣ ∣εy∣.|\varepsilon_z|\le\frac{|x|}{\big||x|-|y|\big|}\,|\varepsilon_x|+\frac{|y|}{\big||x|-|y|\big|}\,|\varepsilon_y|.

Gilt ∣x∣≈∣y∣|x|\approx|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=8N=8 Stellen: 📄 Folie §1/4

x=0.98765444…,x~=0.98765444y=0.98765333…,y~=0.98765333x~−y~=0.00000111=1.11⋅10−6.\begin{aligned} x&=0.98765444\ldots,\quad \tilde x=0.98765444\\ y&=0.98765333\ldots,\quad \tilde y=0.98765333\\ \tilde x-\tilde y&=0.00000111=1.11\cdot10^{-6}. \end{aligned}

Eingaben: relativer Fehler ≈10−8\approx10^{-8} (8 gültige Stellen). Ergebnis: nur noch 3 gültige Stellen (1.111.11), denn die Stellen dahinter sind unbekannt. Der relative Fehler ist um den Faktor 0.981.11⋅10−6≈106\frac{0.98}{1.11\cdot10^{-6}}\approx10^{6} gewachsen.

Merke

Auslöschung erzeugt keinen neuen Fehler. Die Subtraktion selbst ist sogar exakt. Sie macht den schon vorhandenen Fehler von xx und yy relativ sichtbar, weil das Ergebnis viel kleiner ist als die Eingaben.

Allgemeine Funktion: totales Differential (Tafel)​

Sei f:D⊆Rn→Rf:D\subseteq\mathbb R^n\to\mathbb R differenzierbar, z=f(x1,…,xn)z=f(x_1,\dots,x_n). Taylor um x=(x1,…,xn)x=(x_1,\dots,x_n) bis zur ersten Ordnung:

z~=f(x+Δx)=f(x)+∑i=1n∂f∂xi(x) Δxi+O(∥Δx∥2).\tilde z=f(x+\Delta x)=f(x)+\sum_{i=1}^n\frac{\partial f}{\partial x_i}(x)\,\Delta x_i+\mathcal O\big(\|\Delta x\|^2\big).

Terme höherer Ordnung werden vernachlässigt (die Fehler sind klein, ihre Produkte noch viel kleiner):

  Δz≈∑i=1n∂f∂xi Δxi,εz≈∑i=1nxif(x)∂f∂xi⏟Versta¨rkungsfaktor εxi  \boxed{\;\Delta z\approx\sum_{i=1}^n\frac{\partial f}{\partial x_i}\,\Delta x_i,\qquad \varepsilon_z\approx\sum_{i=1}^n\underbrace{\frac{x_i}{f(x)}\frac{\partial f}{\partial x_i}}_{\text{Verstärkungsfaktor}}\,\varepsilon_{x_i}\;}

Die Verstärkungsfaktoren sind genau die relativen Konditionszahlen aus Kapitel 0. Für f(x,y)=x+yf(x,y)=x+y kommt die Formel von oben heraus.

Multiplikation z=x⋅yz=x\cdot y​

∂f∂x=y\frac{\partial f}{\partial x}=y, ∂f∂y=x\frac{\partial f}{\partial y}=x:

Δz≈y Δx+x Δy,εz≈xyxyεx+xyxyεy=εx+εy.\Delta z\approx y\,\Delta x+x\,\Delta y,\qquad\varepsilon_z\approx\frac{xy}{xy}\varepsilon_x+\frac{xy}{xy}\varepsilon_y=\varepsilon_x+\varepsilon_y.

⇒ Die relativen Fehler addieren sich, die Faktoren sind immer 1. Multiplikation (und analog Division: εx/y≈εx−εy\varepsilon_{x/y}\approx\varepsilon_x-\varepsilon_y) ist stabil.

Logarithmus z=ln⁡xz=\ln x​

f′(x)=1/xf'(x)=1/x:

Δz≈Δxx=εx,εz≈εxln⁡x.\Delta z\approx\frac{\Delta x}{x}=\varepsilon_x,\qquad\varepsilon_z\approx\frac{\varepsilon_x}{\ln x}.

⇒ Kritisch für x≈1x\approx1: Dort ist ln⁡x≈0\ln x\approx0 und der Faktor 1/ln⁡x1/\ln x explodiert. Beispiel: x=1.001x=1.001, ln⁡x≈10−3\ln x\approx10^{-3}, also wird εx\varepsilon_x um den Faktor 10001000 verstärkt (3 Stellen verloren).

Tabelle elementarer Funktionen (Folie §1/5)​

📄 Folie §1/5
f(x)f(x)εz≈\varepsilon_z\approxkritisch, wenn …
xαx^\alphaα εx\alpha\,\varepsilon_x∣α∣\lvert\alpha\rvert groß
x\sqrt x12 εx\tfrac12\,\varepsilon_xnie (halbiert den Fehler)
exe^xx εxx\,\varepsilon_x∣x∣\lvert x\rvert groß
ln⁡x\ln xεx/ln⁡x\varepsilon_x/\ln xx≈1x\approx1
sin⁡x\sin xεx⋅xcot⁡x\varepsilon_x\cdot x\cot xx≈kπx\approx k\pi, k≠0k\neq0
cos⁡x\cos x−εx⋅xtan⁡x-\varepsilon_x\cdot x\tan xx≈π2+kπx\approx\frac\pi2+k\pi
arctan⁡x\arctan xεx⋅x(1+x2)arctan⁡x\varepsilon_x\cdot\frac{x}{(1+x^2)\arctan x}nie (Faktor ≤1\le1)
tanh⁡x\tanh xεx⋅2xsinh⁡2x\varepsilon_x\cdot\frac{2x}{\sinh 2x}nie (Faktor ≤1\le1)

Ablesen geht immer gleich: Verstärkungsfaktor =x f′(x)f(x)=\dfrac{x\,f'(x)}{f(x)}. Die Zeilen xαx^\alpha und exe^x sind Ergänzung, der Rest steht so auf der Folie (dort für tanh⁡\tanh als εx⋅xcosh⁡−2xcoth⁡x\varepsilon_x\cdot x\cosh^{-2}x\coth x, dasselbe).

Ergänzung: die Zeilen nachrechnen

Für sin⁡\sin: xcos⁡xsin⁡x=xcot⁡x\frac{x\cos x}{\sin x}=x\cot x. Bei x→0x\to0 geht das gegen 11 (harmlos), bei x→πx\to\pi gegen ∞\infty, weil sin⁡π=0\sin\pi=0. Für tanh⁡\tanh: x(1−tanh⁡2x)tanh⁡x=xsinh⁡xcosh⁡x=2xsinh⁡2x≤1\frac{x(1-\tanh^2x)}{\tanh x}=\frac{x}{\sinh x\cosh x}=\frac{2x}{\sinh2x}\le1.

Zusätzliche Rundung im Ergebnis​

Bisher wurde zz exakt aus den fehlerhaften Eingaben berechnet. Am Rechner wird das Ergebnis aber selbst noch gerundet (Rechenmodell): z~=rd⁡(x~+y~)=(x~+y~)(1+τz)\tilde z=\operatorname{rd}(\tilde x+\tilde y)=(\tilde x+\tilde y)(1+\tau_z), ∣τz∣≤eps|\tau_z|\le\text{eps}. In erster Ordnung:

z=x+y:Δz≈Δx+Δy+z τz,z=x⋅y:εz≈εx+εy+τz,z=f(x):εz≈f′(x) Δxf(x)+τz.\begin{aligned} z=x+y:&\quad\Delta z\approx\Delta x+\Delta y+z\,\tau_z,\\ z=x\cdot y:&\quad\varepsilon_z\approx\varepsilon_x+\varepsilon_y+\tau_z,\\ z=f(x):&\quad\varepsilon_z\approx\frac{f'(x)\,\Delta x}{f(x)}+\tau_z. \end{aligned}

Jede Operation kostet also zusätzlich höchstens ein eps\text{eps} relativ. Über einen ganzen Algorithmus mit kk Operationen wächst das im harmlosen Fall wie k⋅epsk\cdot\text{eps}. Gefährlich wird es nur, wenn irgendwo große Verstärkungsfaktoren auftreten (Auslöschung, ln⁡\ln bei 1, …).

Stabil umformen​

Auslöschung lässt sich oft durch eine algebraisch äquivalente Umformung vermeiden. Standardtrick: mit der „dritten binomischen Formel“ erweitern.

D1=a+h−a  =  (a+h−a)(a+h+a)a+h+a  =  ha+h+a=D2.D_1=\sqrt{a+h}-\sqrt a\;=\;\frac{(\sqrt{a+h}-\sqrt a)(\sqrt{a+h}+\sqrt a)}{\sqrt{a+h}+\sqrt a}\;=\;\frac{h}{\sqrt{a+h}+\sqrt a}=D_2.

Mathematisch gilt D1=D2D_1=D_2. Numerisch subtrahiert D1D_1 zwei fast gleiche Zahlen (für kleines hh). D2D_2 addiert nur positive Zahlen und dividiert, ist also stabil.

h = 10⁻ᵏ, gerechnet im Browser mit double (eps ≈ 1.1·10⁻¹⁶)
kD1 = √(a+h) − √aD2 = h / (√(a+h) + √a)rel. Fehler von D1
14.880884817015163e-24.880884817015155e-21.7e-15
24.987562112088950e-34.987562112089027e-31.5e-14
34.998750624609638e-44.998750624609648e-42.0e-15
44.999875006239662e-54.999875006249610e-52.0e-12
54.999987500031722e-64.999987500062500e-66.2e-12
64.999998750587764e-74.999998750000624e-71.2e-10
74.999999880794803e-84.999999875000006e-81.2e-9
84.999999969612645e-94.999999987500000e-93.6e-9
95.000000413701855e-104.999999998750000e-108.3e-8
105.000000413701855e-114.999999999875000e-118.3e-8
115.000000413701855e-124.999999999987500e-128.3e-8
125.000444502911705e-134.999999999998750e-138.9e-5
134.996003610813204e-144.999999999999876e-148.0e-4
144.884981308350689e-154.999999999999988e-152.3e-2
154.440892098500626e-164.999999999999999e-161.1e-1
1605.000000000000000e-171.0e+0
1705.000000000000000e-181.0e+0

Beobachtung: D1D_1 verliert pro Zehnerpotenz von hh ungefähr eine gültige Stelle. Ab h≲eps⋅ah\lesssim\text{eps}\cdot a ist rd⁡(a+h)=a\operatorname{rd}(a+h)=a und D1=0D_1=0. D2D_2 bleibt bis zum Schluss auf volle Genauigkeit.

Weitere typische Umformungen:

instabilstabilwann
1−cos⁡x1-\cos x2sin⁡2x22\sin^2\frac x2x≈0x\approx0
−b+b2−4ac2a\frac{-b+\sqrt{b^2-4ac}}{2a}−2cb+b2−4ac\frac{-2c}{b+\sqrt{b^2-4ac}}b>0b>0, b2≫4acb^2\gg4ac
ex−1e^x-1expm1(x)x≈0x\approx0
ln⁡(1+x)\ln(1+x)log1p(x)x≈0x\approx0

(Die beiden unteren Zeilen sind Bibliotheksfunktionen, die es genau wegen dieser Auslöschung gibt. Ergänzung, nicht aus der Vorlesung.)

Übung 1​

📄 Übungsblatt 1

Aufgabe 1: Archimedes' π\pi (Instabilität)​

Kreis mit Radius r=0.5r=0.5, also Umfang π\pi. sns_n ist der Umfang des einbeschriebenen nn-Ecks, SnS_n der des umbeschriebenen. Rechnen in einfacher Genauigkeit (float, eps≈6⋅10−8\text{eps}\approx6\cdot10^{-8}).

a) Herleitung. Eine Seite des nn-Ecks ist sn/n=sin⁡(π/n)s_n/n=\sin(\pi/n) (Sehne bei Radius 12\tfrac12). Mit dem Halbwinkelsatz sin⁡φ2=12(1−cos⁡φ)\sin\frac\varphi2=\sqrt{\tfrac12(1-\cos\varphi)} und cos⁡φ=1−sin⁡2φ\cos\varphi=\sqrt{1-\sin^2\varphi}:

s2n=2nsin⁡π2n=2n12(1−1−(sn/n)2)=n2(1−1−(sn/n)2),s3=323.s_{2n}=2n\sin\frac{\pi}{2n}=2n\sqrt{\tfrac12\Big(1-\sqrt{1-(s_n/n)^2}\Big)}=n\sqrt{2\Big(1-\sqrt{1-(s_n/n)^2}\Big)},\qquad s_3=\tfrac32\sqrt3.

c) Warum instabil? Für großes nn ist sn/ns_n/n klein, also 1−(sn/n)2≈1\sqrt{1-(s_n/n)^2}\approx1. Die innere Klammer 1−⋯1-\sqrt{\cdots} ist eine Auslöschung, und sie wird von Schritt zu Schritt schlimmer. Stabile Umformung wie oben mit 1−1−u2=u21+1−u21-\sqrt{1-u^2}=\frac{u^2}{1+\sqrt{1-u^2}}, u=sn/nu=s_n/n:

s2n=n2u21+1−u2=sn21+1−(sn/n)2.s_{2n}=n\sqrt{\frac{2u^2}{1+\sqrt{1-u^2}}}=s_n\sqrt{\frac{2}{1+\sqrt{1-(s_n/n)^2}}}.

Jetzt wird nur noch addiert, multipliziert und dividiert. Die Formel b) für S2nS_{2n} hat dieselbe Struktur (Plus im Nenner) und ist deshalb von Anfang an stabil.

Ergebnis in float (selbst nachgerechnet):

nnsns_n instabilsns_n stabil
63.00000003.0000000
963.14101843.1410317
7683.14307263.1415837
30723.18198043.1415915
122883.00000003.1415920
245764.24264053.1415920
491520.00000003.1415920

Die instabile Folge wird ab n≈200n\approx200 schlechter statt besser und bricht dann völlig zusammen (1−1−u21-\sqrt{1-u^2} wird in float exakt 00).

Aufgabe 2: Integral-Rekursion (Fehlerfortpflanzung)​

yn=e−2∫01e2xxn dx,y0=12(1−e−2),yn+1=12(1−(n+1) yn).y_n=e^{-2}\int_0^1e^{2x}x^n\,dx,\qquad y_0=\tfrac12(1-e^{-2}),\qquad y_{n+1}=\tfrac12\big(1-(n+1)\,y_n\big).

a) Partielle Integration mit u=xn+1u=x^{n+1}, v′=e2xv'=e^{2x}: ∫01e2xxn+1dx=[12e2xxn+1]01−n+12∫01e2xxn dx\int_0^1e^{2x}x^{n+1}dx=\big[\tfrac12e^{2x}x^{n+1}\big]_0^1-\tfrac{n+1}2\int_0^1e^{2x}x^n\,dx. Mit e−2e^{-2} multiplizieren ergibt die Rekursion.

b) Fehlerfortpflanzung. Ist y~n=yn+Δyn\tilde y_n=y_n+\Delta y_n, dann

Δyn+1=−n+12 Δyn⇒∣Δyn∣=n!2n ∣Δy0∣.\Delta y_{n+1}=-\frac{n+1}2\,\Delta y_n\quad\Rightarrow\quad|\Delta y_n|=\frac{n!}{2^n}\,|\Delta y_0|.

Der Fehler wird pro Schritt mit n+12\frac{n+1}2 multipliziert, ab n≥2n\ge2 also verstärkt, und zwar faktoriell. Schon die Rundung von y0y_0 (∣Δy0∣≈10−17|\Delta y_0|\approx10^{-17} in double) wächst bis n=30n=30 auf 30!230⋅10−17≈106\frac{30!}{2^{30}}\cdot10^{-17}\approx10^{6}. In double: y20≈0.0435y_{20}\approx0.0435 ist noch plausibel, y25≈28.4y_{25}\approx28.4 und y30≈−1.5⋅107y_{30}\approx-1.5\cdot10^7 sind Unsinn (wahre Werte liegen in (0,12)(0,\tfrac12) und fallen).

c) Rückwärts ist stabil. Wegen 0≤yn≤e−2∫01e2xn dx=1n+1→00\le y_n\le e^{-2}\int_0^1e^{2}x^n\,dx=\frac1{n+1}\to0 ist (yn)(y_n) eine Nullfolge. Umgestellt:

yn=1−2 yn+1n+1,Δyn=−2n+1 Δyn+1.y_n=\frac{1-2\,y_{n+1}}{n+1},\qquad\Delta y_n=-\frac{2}{n+1}\,\Delta y_{n+1}.

Jetzt wird der Fehler pro Schritt durch n+12\frac{n+1}2 geteilt. Der grobe Startfehler yk+1=0y_{k+1}=0 (statt ≈1k+2\approx\frac1{k+2}) schrumpft bis y0y_0 um 2k+1(k+1)!\frac{2^{k+1}}{(k+1)!}. Selbst nachgerechnet: k=10k=10 gibt y0y_0 auf 5 Stellen, k=20k=20 und k=30k=30 auf volle double-Genauigkeit (0.43233235838169360.4323323583816936).

Merke

Dieselbe Formel kann in eine Richtung instabil und in die andere stabil sein. Entscheidend ist, ob der Fehlerfaktor pro Schritt >1>1 oder <1<1 ist.