Kapitel 3 Fehleranalyse Der Gauß-Algorithmus berechnet theoretisch die Lösung von Ax = b exakt. Wir hatten u.a. an dem Beispiel mit der Hilbert-Matrix schon gesehen, daß dies in der Praxis nicht stimmt, wenn der Algorithmus auf einem Rechner implementiert wurde. Beispiel 3.1 Durch p(x) = x7 − 7x6 + 21x5 − 35x4 + 35x3 − 21x2 + 7x − 1 ist ein Polynom 7ten Grads gegeben. Läßt man dieses Polynom von MATLAB im Intervall [0.988, 1.012] plotten x = 0.988:.0001:1.012; y = x.^7-7*x.^6+21*x.^5-35*x.^4+35*x.^3-21*x.^2+7*x-1; plot(x,y) so sieht der resultierende Graph nicht wie ein Polynom aus, siehe Abbildung 3.1. p(x) = x7−7x6+21x5−35x4+35x3−21x2+7x−1 −14 5 x 10 4 3 2 p(x) 1 0 −1 −2 −3 −4 −5 0.985 0.99 0.995 1 x 1.005 1.01 1.015 Abbildung 3.1: Das soll ein Polynom sein? Zur Beurteilung darüber, wie gut sich ein numerisches Verfahren zur Lösung eines vorliegenden Problems für die Durchführung auf einem Rechner eignet, wird man im wesentlichen folgende Kriterien berücksichtigen: 28 29 1. Genauigkeit des Ergebnisses, Verläßlichkeit 2. Rechenzeitbedarf, Speicherbedarf. Die Bewertung der Eigenschaften 2. hängt stark von der äußeren Konfiguration des zur Verfügung stehenden Rechners ab. Die Beurteilung eines Verfahrens oder der Vergleich zweier Verfahren inbezug auf Rechenzeit- und Speicherbedarf ist i.a. gut durchführbar. Die meisten numerischen Verfahren arbeiten nur richtig, falls die gegebenen Daten des Problems gewissen Bedingungen genügen. Bei den speziell vorliegenden Daten eines Problems ist häufig nicht ersichtlich oder leicht überprüfbar, ob die für das betrachtete Verfahren notwendigen Voraussetzungen erfüllt sind. Dies gilt insbesondere, wenn es sich hierbei um ein während der Rechnung zu erzeugendes Zwischenergebnis in einem komplexeren Verfahren handelt. Die Verläßlichkeit eines Verfahrens beurteilt man danach, wie ein solches Versagen des Verfahrens den Rechenprozeß beeinflußt, z.B. durch Abbruch, Meldung oder Korrektur. Insbesondere sollte es nicht möglich sein, daß aufgrund eines Versagens des Verfahrens oder von Teilen des Verfahrens ein sinnvoll erscheinendes, aber völlig falsches Ergebnis produziert wird. Um Aussagen über die Genauigkeit des Ergebnisses zu erhalten, ist eine detaillierte Betrachtung des numerischen Verfahrens bezüglich aller möglichen auftretenden Fehler und ihrer Einflüsse auf das Ergebnis erforderlich. In diesem Zusammenhang versteht man unter Fehler jeweils die Abweichung eines nach bestimmten Vorschriften produzierten Ergebnisses vom gewünschten Resultat, also zum Beispiel nicht einen Programmfehler. Man unterscheidet hier drei wesentliche Fehlerarten: 1. Meßfehler, 2. Verfahrensfehler, 3. Rundungsfehler. 1. Meßfehler: Bei der Gewinnung eines mathematischen Problems aus einem Anwenderproblem werden fast stets eine Reihe idealisierender Annahmen gemacht, etwa indem Größen von geringem Einfluß vernachlässigt und funktionale Zusammenhänge stark vereinfacht werden. Schon aus diesem Grund wird die Lösung des mathematischen Problems von der Lösung des Ausgangsproblems aus der Anwendung abweichen. Zudem erhält man die Daten des mathematischen Problems, zum Beispiel die Elemente einer Matrix, deren Eigenwerte gesucht sind, häufig als Ergebnisse von Messungen, die nur mit beschränkter Genauigkeit durchgeführt werden können, oder als bereits mit Fehlern behaftete Ergebnisse anderer Berechnungen. 2. Verfahrensfehler: Für einige mathematische Probleme gibt es numerische Verfahren, die nach einer gewissen Anzahl von Berechnungsschritten (bei exakter Rechnung) die gesuchte Lösung ermittelt haben. Das Gaußsche Eliminationsverfahren zur Lösung von linearen Gleichungssystemen ist zum Beispiel ein solches Verfahren. Für die meisten Aufgaben muß man jedoch iterative Verfahren verwenden, mit denen man schrittweise eine Folge von Näherungslösungen bestimmen kann, die gegen die gesuchte Lösung konvergiert. Dazu gehören zum Beispiel bis auf sehr spezielle Fälle alle Eigenwertbestimmungen von Matrizen, da die Eigenwerte als Nullstellen des charakteristischen Polynoms im allgemeinen nicht mit endlich vielen rationalen Operationen berechenbar sind. Bei solchen Verfahren bricht man, abhängig von geeigneten Kriterien, die Berechnung nach einer gewissen Anzahl von Schritten mit 30 KAPITEL 3. FEHLERANALYSE einer Näherungslösung ỹ ab. Die Abweichung y − ỹ dieser Näherungslösung von der gesuchten Lösung y des Problems nennt man Verfahrensfehler oder auch Abbrechfehler. 3. Rundungsfehler: Die Rundungsfehlerproblematik wird in den folgenden Abschnitten ausführlich behandelt. 3.1 Zahldarstellung Ein Teil der Problematik liegt in der Art und Weise wie reelle (und komplexe) Zahlen in einem Computer dargestellt werden. Z.B. hat π bekanntermaßen unendlich viele Nachkommastellen. Der Arbeitsspeicher eines Computer ist jedoch beschränkt, so daß nur endlich viele Nachkommastellen gespeichert werden können. Es gibt verschiedene Darstellungen, die zur Speicherung von reellen Zahlen verwendet werden können. Sie basieren auf dem folgenden Satz; einen Beweis finden Sie z.B. in O. Forster, Analysis I, Vieweg-Verlag. Satz 3.2 (b-adische Entwicklung) Für x ∈ R, b ∈ N\{1} existieren eindeutig bestimmte j ∈ {0, 1}, ` ∈ Z und für alle k ∈ Z mit k ≤ ` eindeutige γk ∈ {0, . . . , b − 1}, so daß x = (−1)j X̀ γ k bk , (3.1) k=−∞ wobei γ` 6= 0 für x 6= 0, j = ` = 0 für x = 0, und γk < b − 1 für unendlich viele k ≤ `. Falls die Basis b festgelegt ist, kann man die b-adische Entwicklung auch durch Aneinanderreihung der Ziffern γk angeben: (x)b := ±γ` γ`−1 . . . γ0 .γ−1 γ−2 . . . . Im täglichen Leben wird meist im Dezimalsystem gerechnet, d.h. b = 10 und x=± X̀ k=−∞ γk · 10k = ±γ` γ`−1 . . . γ0 .γ−1 γ−2 . . . = (x)10 mit Ziffern γk ∈ {0, 1, . . . , 9}. Beispiel 3.3 Für die Zahl x = 123.456 erhalten wir ` = 2 und γ2 = 1, γ1 = 2, γ0 = 3, γ−1 = 4, γ−2 = 5, γ−3 = 6, γk = 0 für k ≤ −4. Die meisten Computer stellen Zahlen zur Basis b = 2 dar. Beispiel 3.4 Die Dezimalzahl 1123 kann wie folgt ins Binärsystem (d.h. b = 2) umgerechnet werden 1123 = = = = = 1024 + 99 210 + 64 + 35 210 + 26 + 32 + 3 210 + 26 + 25 + 2 + 1 210 + 26 + 25 + 21 + 20 , 31 3.1. ZAHLDARSTELLUNG also (1123)2 = 10001100011. Es ist ` = 10, γ10 = γ6 = γ5 = γ1 = γ0 = 1, alle anderen γk sind Null. Leider lassen sich nicht alle reellen Zahlen mit endlich vielen Nachkommastellen auch im Binärsystem mit endlich vielen Ziffern darstellen. Beispiel 3.5 Die reelle Zahl 0.1 hat die 2-adische Darstellung (0.1)2 = 0.00011001100110011.... Die Zahlenfolge 0011 wiederholt sich unendlich oft. Die Darstellung (3.1) ist äquivalent zu x = ( (−1)j X̀ k=−∞ = (−1)j ∞ X γ`−i+1 bi i=1 = (−1)j Da γ` = α1 6= 0 folgt sofort 1 b γk bk−`−1 ∞ X αi i=1 {z | :=m ≤ |m| < 1. bi ) · b`+1 b`+1 be . (3.2) } Definition 3.6 Die Darstellung (3.2) für x ∈ R heißt normalisierte Gleitpunktdarstellung von x bzgl. der Basis b. Dabei heißt m = (−1) j ∞ X αi i=1 , j ∈ {0, 1}, αi ∈ {0, 1, . . . , b − 1} βi b i , p ∈ {0, 1}, βi ∈ {0, 1, . . . , b − 1} bi die Mantisse und e =: (−1) p ∞ X i=0 der Exponent von x bzgl b. Die Gleitpunktdarstellung heißt normalisiert, da α 1 6= 0. Beispiel 3.7 Für b = 10 ist die normalisierte Gleitpunktdarstellung von x = 35657.23 gegeben durch 3 5 6 5 7 2 3 5 0.3565723 · 10 = + + + + + + · 105 . 101 102 103 104 105 106 107 32 KAPITEL 3. FEHLERANALYSE Auf einem Rechner stehen zur Speicherung nur endlich viele Speicherplätze (Ziffern) zur Verfügung. Daher wird die Mantisse einer normalisierten Gleitpunktzahl im Rechner auf t Ziffern und der Exponent auf s Stellen beschränkt. Definition 3.8 Für b ∈ N\{1}, t, s ∈ N ist die Menge der normalisierten Gleitpunktzahlen der Mantissenlänge t und Exponentenlänge s zur Basis b durch M(b, t, s) = ( (−1)j t X αi i=1 bi · b(−1) Ps p i=0 ,βi b i ) α , β ∈ {0, 1, . . . , b − 1}, i i ∪ {0} α1 6= 0, j, p ∈ {0, 1} gegeben. Schematisch lassen sich diese Zahlen wie folgt darstellen ±α1 α2 . . . αt | ± β0 β1 β2 . . . βs . x ∈ M(b, t, s) heißen Computerzahlen oder Maschinenzahlen. Hiermit sind 2(b − 1)bt−1 (2bs+1 − 1) + 1 Zahlen darstellbar. Zudem lassen sich stets die kleinste darstellbare Zahl xmin und die größte darstellbare Zahl xmax leicht angeben. Beispiel 3.9 Am Beispiel b = 2, t = 3, s = 1 soll die Darstellung verdeutlicht werden. Schematisch läßt sich hier jede Zahl mittels ± α 1 α 2 α 3 | ± β 0 β1 darstellen, d.h. ±(α1 2−1 + α2 2−2 + α3 2−3 ) · 2±(β0 2 Die verfügbaren Mantissen sind Basis 2 Basis 10 ±100 = ˆ ±1/2 ±101 = ˆ ±5/8 ±110 = ˆ ±3/4 ±111 = ˆ ±7/8 Die verfügbaren Exponenten sind ±00 ±10 ±01 ±11 = ˆ = ˆ = ˆ = ˆ 0 ±1 ±2 ±3 0 +β 12 1) 33 3.2. RUNDUNGSFEHLER Die darstellbaren Zahlen sind daher ±000| ± 00 ±100| ± 00 ±100| + 10 ±100| − 10 ±100| + 01 ±100| − 01 ±100| + 11 ±100| − 11 ±101| ± 00 ±101| + 10 ±101| − 10 .. . = ˆ = ˆ = ˆ = ˆ = ˆ = ˆ = ˆ = ˆ = ˆ = ˆ = ˆ 0 ± 12 ± 21 ± 21 ± 21 ± 21 ± 21 ± 21 ± 85 ± 85 ± 85 · 20 = ± 12 · 21 = ±1 · 2−1 = ± 14 · 22 = ±2 · 2−2 = ± 18 · 23 = ±4 1 · 2−3 = ± 16 5 0 · 2 = ±8 · 21 = ± 54 5 · 2−1 = ± 16 ±111| + 11 = ˆ ± 87 · 23 = ±7 7 ±111| − 11 = ˆ ± 87 · 2−3 = ± 64 Es sind also insgesamt 57 Zahlen darstellbar, die kleinste darstellbare positive Zahl ist 1 · 2−3 = 2−4 , die größte darstellbare positive Zahl ist 78 · 23 = 7. In der Nähe von 0 liegen 2 die Zahlen am dichtesten. Die Zahl 0.1 z.B. ist hier nicht exakt darstellbar. Denn 1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1 0 1 2 3 4 5 6 7 Abbildung 3.2: die nichtnegativen Maschinenzahlen für b = 2, t = 3, s = 1 0.1= ˆ + 000110011001100 . . . | + 00 und damit wird 0.1 dargestellt als was der Dezimalzahl 3.2 3 32 +110| − 11 = 0.09375 entspricht. Rundungsfehler Um reelle Zahlen im Computer zu speichern, muß man sie als Maschinenzahl darstellen. Dazu wird jede Zahl zunächst als normalisierte Gleitpunktzahl zur vom Rechner verwendeten Basis b dargestellt. Da die Mantisse einer Maschinenzahl nur t Stellen besitzt, werden alle weiteren Stellen der Mantisse der zu speichernden Zahl abgeschnitten, bzw. es muß auf t Stellen gerundet werden. Es entstehen Rundungsfehler. 34 KAPITEL 3. FEHLERANALYSE Beispiel 3.10 Angenommen, der Computer stellt reelle Zahlen in M(10, 5, 1) dar. Dann wird x = 2.5684 dargestellt als 0.25684 · 101 , die Zahl kann also exakt dargestellt werden. Die Zahl z = 3.4579103 wird als 0.34579 · 101 dargestellt. Die Nachkommastellen 0.0000103 gehen verloren. Allgemein gilt: Jedes reelle x wird im Rechner als x ∈ M(b, t, s) dargestellt mit f l(x) = x(1 + ε). Genauer gilt für P −i e x = ±( ∞ i=1 αi b )b mit α1 6= 0 und x ∈ [xmin , xmax ] f l(x) = P ±( ti=1 αi b−i )be für αt+1 < b/2 Pt −i −t e ±( i=1 αi b + b )b für αt+1 ≥ b/2 Für |x| < xmin spricht man von ’underflow’. x wird häufig als f l(x) = 0 dargestellt. Bei |x| > xmax spricht man von ’overflow’, x liegt außerhalb des darstellbaren Bereichs, ein solches x wird häufig mittels Inf dargestellt. Lemma 3.11 Für den absoluten Fehler in der Zahldarstellung gilt 1 |f l(x) − x| ≤ b−t be , 2 für den relativen Fehler b f l(x) − x | < b−t . | x 2 1 1−t Definition 3.12 Die Größe 2 b := u bezeichnet man als relative Maschinengenauigkeit (’unit roundoff ’). Die relative Maschinengenauigkeit gibt also an, welche relativen Fehler beim Runden maximal entstehen können. Bemerkung 3.13 Um Aussagen über die Genauigkeit approximativer Größen zu treffen, muß man den relativen Fehler abschätzen, der absolute Fehler gibt darüber keine ausreichende Auskunft! Dazu betrachte man die Zahlen x = 25.317 und x e = 25.313. x e stimmt also auf 4 Stellen mit x überein. Der relative Fehler beträgt |x − x e| 0.004 = ≈ 0.16 · 10−3 . |x| 25.317 Wie man sich leicht überlegt, entspricht die Anzahl der korrekten Dezimalstellen dem negativen Exponenten des relativen Fehlers plus/minus 1. Betrachtet man y = 0.001 und ye = 0.002, so besitzt ye keine korrekte Stelle. Der absolute Fehler |y − ye| = 10−3 ist klein und deutet bei fehlerhafter Interpretation eine Genauigkeit von 2 bis 3 Stellen an. Der relative Fehler |y − ye| =1 |y| hingegen signalisiert eindeutig, daß ye keine korrekte Stelle besitzt. 35 3.3. GLEITPUNKTOPERATIONEN 3.3 Gleitpunktoperationen Da R ein Körper ist, ergibt die Summe zweier reeller Zahlen wieder eine reelle Zahl. Wie das folgende Beispiel zeigt, gilt dies für die Summe zweier Zahlen aus M(b, t, s) nicht notwendigerweise. Beispiel 3.14 Wir betrachten M(10, 5, 1) und die reellen Zahlen x = 2.5684 y = 0.0032791 z = 3.4579103 Diese werden als f l(x) = 0.25684 · 101 (= x) −2 f l(y) = 0.32791 · 10 (= y) f l(z) = 0.34579 · 101 (6= z) dargestellt. Die Ergebnisse der elementaren Rechenoperationen f l(x) + f l(y) f l(x) − f l(z) f l(x) · f l(y) f l(y)/f l(z) = = = = 2.5716791 −0.8895 0.00842204044 0.0009482923161456376... sind nicht alle wieder Maschinenzahlen. Die Ergebnisse müssen erst zu Maschinenzahlen gerundet werden. f l(f l(x) + f l(y)) f l(f l(x) − f l(z)) f l(f l(x) · f l(y)) f l(f l(y)/f l(z)) = = = = 0.25717 · 101 −0.8895 · 100 0.84220 · 10−2 0.94829 · 10−3 Aufgrund dieser Rundungsfehlerproblematik besitzen Computer nur eine Pseudoarithmetik, die das Ergebnis einer Gleitpunktoperation beschreibt. Definition 3.15 Die Gleitpunktoperationen ⊕, , ⊗, sind durch die üblichen Definitionen festgelegt, mit anschließendem Runden des Ergebnisses, damit wieder ein Wert aus M(b, t, s) entsteht. D.h., für alle x, y ∈ M(b, t, s) gilt x⊕y xy x⊗y xy = = = = (x + y)(1 + ε), |ε| < u (x − y)(1 + ε), |ε| < u (x · y)(1 + ε), |ε| < u (x y)(1 + ε), |ε| < u. Die Operationen sind nicht definiert, wenn das Ergebnis außerhalb des durch M(B, p, q) überdeckten Bereichs liegt. 36 KAPITEL 3. FEHLERANALYSE Dieses Modell der Gleitpunktarithmetik gilt nur für Maschinenzahlen. Bei der Addition zweier Zahlen x, y ∈ R ergeben sich also bereits drei Fehler: je einer beim Runden von x und y zu einer Maschinenzahl f l(x) = x(1 + εx ), f l(y) = y(1 + εy ), |εx | < u |εy | < u, sowie ein weiterer bei der Gleitpunktaddition f l(x) ⊕ f l(y) = ( f l(x) + f l(y) )(1 + εx+y ), |εx+y | < u = ( x(1 + εx ) + y(1 + εy ) )(1 + εx+y ) = ( (x + y) + (xεx + yεy ) )(1 + εx+y ). Daraus folgt, wenn x und y dasselbe Vorzeichen besitzen, d.h. sign(x) = sign(y), wobei +1, falls a > 0 sign(a) = : −1, falls a < 0 |f l(x) ⊕ f l(y) − (x + y)| = ≤ |(x + y)εx+y + (xεx + yεy )(1 + εx+y ) |x + y|u + (|x|u + |y|u)(1 + u) = = |x + y|u + |x + y|u(1 + u) |x + y|(2u + u2 ). sign(x)=sign(y) Der relative Fehler ist (bis auf den vernachlässigbar kleinen Term u2 ) maximal doppelt so groß wie der relative Fehler der Summanden. Entsprechend können viele Additionen zu einem großen akkumulierten Fehler führen. Eine ähnliche Analyse zeigt, daß die Subtraktion zweier fast gleicher Zahlen zu einem sehr großen relativen Fehler führen kann: Für x = y + µu folgt 2 |f l(x) f l(y) − (x − y)| ≤ |y| + Terme höherer Ordnung in u. |x − y| |µ| D.h. der relative Rundungsfehler kann bei fast gleichen Operanden bis zum doppelten Wert der Operanden anwachsen. Vorsicht ist also geboten, wenn Differenzen fast gleichgroßer Zahlen auftreten, da die Stellenauslöschung zu sehr großen Rundungsfehlern führt. Zur Vermeidung von Auslöschung versucht man, den zu berechnenden Ausdruck so umzuformen, daß die Subtraktion zweier nahezu gleicher Zahlen vermieden wird. Beispiel 3.16 Als Beispiel sei hier die Summation von Potenzreihen, deren Glieder alternierende Vorzeichen haben, genauer betrachtet. Zur Berechnung von ex wird von der Reihenentwicklung x2 x3 + +... e =1+x+ 2! 3! x 37 3.3. GLEITPUNKTOPERATIONEN ausgegangen, nach der in M(10, 5, q) e−5,5 berechnet werden soll, also e−5,5 = 1.000 − 5.500 + 15.125 − 27.730 + 38.129 − 41.942 + 38.446 − 30.208 ... + 0.0026363 Bei einer Rechengenauigkeit von 5 Dezimalstellen ist bereits die 4. Stelle nach dem Dezimalpunkt, also die zweite Stelle im Ergebnis, unsicher. Dem überlagert sich die Fortpflanzung der Rundungsfehler bei den Gleitpunktoperationen, was hier das Ergebnis völlig unbrauchbar macht. Der exakte Wert lautet auf 5 Stellen genau: e−5,5 = 0.0040868. Die Stellenauslöschung wäre vermieden worden, wenn man statt e−5,5 direkt e5,5 nach der Reihenentwicklung ermittelt und dann den Kehrwert gebildet hätte: 1/(1 + 5.5 + 15.125 + . . .) = 0.0040865. Neben der fatalen Auswirkung bei der Differenz fast gleicher Zahlen ergeben sich kritische Situationen, wenn bei der Programmierung nicht berücksichtigt wird, daß für Gleitpunktaddition und -multiplikation weder das Assoziativ- noch das Distributivgesetz gilt: Sei u, v, w ∈ M(b, t, s), dann ist im allgemeinen (u ⊕ v) ⊕ w = 6 u ⊕ (v ⊕ w) (u ⊗ v) ⊗ w = 6 u ⊗ (v ⊗ w) u ⊗ (v ⊕ w) = 6 (u ⊗ v) ⊕ (u ⊗ w). Beispiel 3.17 Betrachte M(10, 5, 1): Dann gilt a = f l(a) = 0.98765 b = f l(b) = 0.012424 a + b + c = 0.9935308 c = f l(c) = −0.0065432 aber (a ⊕ b) (b ⊕ c) (a ⊕ b) ⊕ c a ⊕ (b ⊕ c) = = = = f l(1.000074) f l(0.0058808) f l(0.9935568) f l(0.9935308) = = = = 1.0001 0.0058808 0.9936 0.99353 D.h. a ⊕ (b ⊕ c) liefert das richtige Ergebnis, nicht aber (a ⊕ b) ⊕ c.