42 KAPITEL 3. FEHLERANALYSE Algorithmus 2: x = √b a+ a2 −b p d w s x := := := := := a∗a p√− b d a+w b/s Für a = 6.0002, b = 0.01 und M(10, 5, s) ergibt sich im Algorithmus 1: p = 36.002, d = 35.992, w = 5.9993, x = 0.00090000, und in Algorithmus 2: p = 36.002, d = 35.992, w = 5.9993, s = 11.999, x = 0.00083340. Die exakte Lösung lautet x = 0.0008333634 . . ., also in M(10, 5, s) x = 0.0008334. Die gute oder schlechte Kondition eines Problems ist eine Eigenschaft des Problems und nicht des numerischen Verfahrens zur Berechnung seiner Lösung. Zur Lösung gut konditionierter Probleme kann es gut- und schlechtartige numerische Verfahren geben. Dies läßt sich mit den im folgenden vorgestellten Vorgehensweisen genauer untersuchen. 3.5 Stabilität eines Algorithmus Typischerweise besteht ein Algorithmus aus einer Vielzahl von arithmetischen Operationen. Wie gesehen kann jede einzelne arithmetische Operation zu einem Rundungsfehler führen. Um eine Abschätzung für den durch diese Fehler entstehenden Gesamtfehler im Endresultat zu erhalten, gibt es unterschiedliche Vorgehensweisen. Bei der Vorwärtsanalyse verfolgt man sämtliche Fehler von Rechenschritt zu Rechenschritt und schätzt sofort für jedes Zwischenergebnis den bisher aufgetretenen akkumulierten Fehler ab. Für das Endergebnis steht dann eine Abschätzung des Gesamtfehlers auch direkt zur Verfügung. Ist unser Algorithmus eine Implementation zur Berechnung einer Funktion f (x), so wird statt des exakten Wertes f (x) ein gestörter Wert fe(x) berechnet. Die Vorwärtsanalyse liefert eine Antwort auf die Frage, wie sich f (x) und fe(x) unterscheiden |f (x) − fe(x)| < ?. Definition 3.24 Sei fe die Realisierung eines Algorithmus zur Lösung des Problems f der relativen Kondition κrel . Der Stabilitätsindikator der normweisen Vorwärtsanalyse ist die kleinstmögliche Zahl σV ≥ 0, so daß ||f (x) − fe(x)|| ≤ σV κrel u+ Terme höherer Ordnung. ||f (x)|| Ein Algorithmus ist stabil im Sinne der Vorwärtsanalyse, falls σV kleiner als die Anzahl der hintereinander ausgeführten Elementaroperationen ist. 43 3.5. STABILITÄT EINES ALGORITHMUS Beispiel 3.25 Summe dreier Zahlen Angenommen s1 , s2 und s3 seien positive Maschinenzahlen, deren Summe gesucht ist. Diese Summe kann in 2 Schritten berechnet werden x1 = s 1 + s 2 , x2 = x 1 + s 3 . In Gleitkommaarithmetik wird stattdessen x e1 = s1 ⊕ s2 = (s1 + s2 )(1 + 1 ) x e2 = x e1 ⊕ s3 = (e x1 + s3 )(1 + 2 ) mit |1 |, |2 | ≤ u berechnet. Es ergibt sich x e2 = = = ≈ (e x1 + s3 )(1 + 2 ) ((s1 + s2 )(1 + 1 ) + s3 )(1 + 2 ) (s1 + s2 )(1 + 1 + 2 + 1 2 ) + s3 (1 + 2 ) (s1 + s2 )(1 + δ1 ) + s3 (1 + 2 ) mit |δ1 | ≤ 2u. Dies können wir weiter zusammenfassen zu Also bzw. x e2 ≈ (s1 + s2 + s3 )(1 + δ1 ) = x2 (1 + δ1 ). |x2 − x e2 | ≤ |x2 | · |δ1 | ≤ |x2 | · 2u, |x2 − x e2 | ≤ 2u. |x2 | (3.3) Die Summe dreier Zahlen kann als Abbildung f : R3 → R aufgefasst werden, s1 f : s2 7→ s1 + s2 + s3 . s3 Berechnen wir κrel in der 1-Norm, so ergibt sich κrel = |s1 | + |s2 | + |s3 | ≥ 1. |s1 + s2 + s3 | Mit (3.3) folgt daher für den Stabilitätsindikator der Vorwärtsanalyse σ ≤ 2. Da unser Algorithmus 2 Additionen benötigt, liegt ein stabiler Algorithmus vor. Die Verfolgung der Fehler von Schritt zu Schritt des Verfahrens in der Rückwärtsanalyse geschieht so, daß jedes Zwischenergebnis, das der Algorithmus liefert, als exakt berechneter Wert für gestörte Anfangsdaten interpretiert wird, d.h. der akkumulierte Fehler im Zwischenergebnis wird als Datenfehlereffekt gedeutet. Mit den Bezeichnungen und Bedeutung f (x) und fe(x) von eben ausgedrückt, liefert die Rückwärtsanalyse eine Antwort auf die Frage |f −1 (fe(x)) − x| < ?. 44 KAPITEL 3. FEHLERANALYSE Definition 3.26 Der normweise Rückwärtsfehler des Algorithmus fe zur Lösung des Problems f ist die kleinste Zahl η ≥ 0, für die für alle x e ∈ E = {e x| |e x − x| ≤ |x|u} ein x b existiert, so daß f (b x) = f˜(x̃) ||b x−x e|| ≤ η. ||e x|| Der komponentenweise Rückwärtsfehler ist analog definiert max i |b xi − x ei | ≤ η. |e xi | Der Algorithmus heißt stabil bezüglich des relativen Eingabefehlers δ, falls η ≤ δ. Als Stabilitätsindikator der Rückwärtsanalyse bezeichnet man σR = η/u Die Kondition des Problems taucht in der Definition nicht auf! Über den Gesamtfehler im Endergebnis erhält man so zunächst ebenfalls nur die Aussage, daß er einem Datenfehlereffekt aufgrund von Datenfehlern bestimmter Größe entspricht; diese bezeichnet man als äquivalente Datenfehler. Bei zwei verschiedenen Algorithmen für dasselbe Problem zeigt die Größe der äquivalenten Datenfehler dann an, welcher günstigere numerische Eigenschaften besitzt. Ergibt eine Rückwärtsanalyse, daß die äquivalenten Datenfehler in einem Algorithmus nicht viel größer sind als die im allgemeinen schon durch die Rundung der gegebenen Daten entstehenden Darstellungsfehler, so besitzt ein solcher Algorithmus offensichtlich sehr gute numerische Eigenschaften. Um nun den Gesamtfehler abschätzen zu können, benötigt man Aussagen über die Auswirkungen der Störungen in den Anfangsdaten auf die Genauigkeit des Ergebnisses. Für viele Probleme gibt es dazu Abschätzungen, sogenannte Störungssätze. Erst die Kombination der Rückwärtsanalyse mit einem Störungssatz liefert also eine Abschätzung für den Fehler im Ergebnis, während man eine solche bei der Vorwärtsanalyse direkt erhält. Dennoch erweist sich die Kombination aus Rückwärtsanalyse und Störungssatz in vielen Fällen als vorteilhaft, da nur bei der Rückwärtsanalyse die Rechenarithmetik zu berücksichtigen ist, während bei der Herleitung eines Störungssatzes die Eigenschaften der reellen Zahlen wie Kommutativität und Assoziativität ausgenutzt werden können. Häufig erkennt man bei diesem Vorgehen auch, daß der durch die fast immer auftretenden Darstellungsfehler entstehende unvermeidbare Fehler, der durch einen Störungssatz manchmal gut geschätzt werden kann, schon recht groß ist und Ursache für einen großen Gesamtfehler ist. Bei einer Vorwärtsanalyse kann man dies im allgemeinen nicht so leicht erkennen, und man könnte dann dem Trugschluß erliegen, daß ein großer Fehler im Ergebnis stets das Resultat von Mängeln des Algorithmus ist. Eine leichte Rechnung zeigt, daß stets σV ≤ σ R gilt. M.a.W., aus der Rückwärtsstabilität folgt die Vorwärtsstabilität. 45 3.5. STABILITÄT EINES ALGORITHMUS Beispiel 3.27 Summe dreier Zahlen Angenommen s1 , s2 und s3 seien positive Maschinenzahlen, deren Summe gesucht ist. Diese Summe kann in 2 Schritten berechnet werden x1 = s 1 + s 2 , x2 = x 1 + s 3 . In Gleitkommaarithmetik wird stattdessen x e1 = = = x e2 = = = ≈ s1 ⊕ s2 (s1 + s2 )(1 + 1 ) s1 (1 + 1 ) + s2 (1 + 1 ) x e1 ⊕ s3 (e x1 + s3 )(1 + 2 ) s1 (1 + 1 )(1 + 2 ) + s2 (1 + 1 )(1 + 2 ) + s3 (1 + 2 ) s1 (1 + γ1 ) + s2 (1 + γ1 ) + s3 (1 + 2 ) mit |1 |, |2 | ≤ u und |γ1 | ≤ 2u berechnet. Das berechnete Ergebnis x e2 ist exakt für die Summe der gestörten Eingabedaten s1 (1 + γ1 ), s2 (1 + γ1 ), s3 (1 + 2 ). Ein Vergleich der exakten Eingabedaten mit den gestörten ergibt für ζ1 = ζ2 = γ1 , ζ3 = 2 |sj − sj (1 + ζj )| ≤ |sj | |ζj | ≤ 2u, j = 1, 2, 3. M.a.W., |sj − sej | ≤ 2u, |sj | d.h der relative komponentenweise Rückwärtsfehler beträgt η ≤ 2u und die Summe dreier Zahlen ist (bei 2 Elementaroperationen) stabil im Sinne der Rückwärtsanalyse. Beispiel 3.28 Als ein weiteres Beispiel zur Vorwärtsund Rückwärtsanalyse wird nun √ 2 der Algorithmus zur Berechnung von x = a − a − b betrachtet: p d w x := := := := a∗a p√− b d a−w Bei der Fehleranalyse erhält man zunächst p̃ = a2 (1 + ε1 ) d˜ = (p̃ p − b)(1 + ε2 ) ˜ + ε3 ) d(1 w̃ = x̃ = (a − w̃)(1 + ε4 ) 46 KAPITEL 3. FEHLERANALYSE mit |εi | < u für i = 1, 2, 3, 4, d.h. p x̃ = [a − (a2 (1 + ε1 ) − b)(1 + ε2 )(1 + ε3 ))](1 + ε4 ). Bei der Rückwärtsanalyse wird das Ergebnis als exakt berechneter Wert für gestörte Anfangsdaten interpretiert, d.h. der Ausdruck für x̃ ist so umzuformen, daß man eine Aussage der folgenden Art treffen kann: Die vom Rechner gelieferte Zahl x̃ ist die Lösung von x2 − 2a(1 + δ1 )x + b(1 + δ2 ) = 0. Der Ausdruck für x̃ muß daher in die Form p x̃ = a(1 + δ1 ) − (a(1 + δ1 ))2 − b(1 + δ2 ) umgeformt werden. Es gilt p x̃ = a(1 + ε4 ) − pa2 (1 + ε1 )(1 + ε2 )(1 + ε3 )2 (1 + ε4 )2 − b(1 + ε2 )(1 + ε3 )2 (1 + ε4 )2 = a(1 + ε4 ) − a2 (1 + ε4 )2 (1 + ε5 ) − b(1 + ε6 ) mit 1 + ε5 = (1 + ε1 )(1 + ε2 )(1 + ε3 )2 1 + ε6 = (1 + ε2 )(1 + ε3 )2 (1 + ε4 )2 , so daß gilt |ε5 | < 4 u, |ε6 | < 5 u. Weiterhin folgt x̃ = a(1 + ε4 ) − p a2 (1 + ε4 )2 − b(1 + ε6 ) + a2 (1 + ε4 )2 ε5 q = a(1 + ε4 ) − a2 (1 + ε4 )2 − b(1 + ε6 + = a(1 + ε4 ) − mit |ε7 | < (5 + 6a2 ) b a2 (1 b + ε 4 )2 ε 5 ) p (a(1 + ε4 ))2 − b(1 + ε7 ) u. Die vom Rechner gelieferte Zahl x̃ ist daher die Lösung von x2 − 2a(1 + ε4 )x + b(1 + ε7 ) = 0. Um den relativen Rückwärtsfehler abschätzen zu können, sind nun noch die relativen Datenfehler |a − a(1 + ε4 )| ≤ |ε4 | ≤ u |a| |b − b(1 + ε7 )| 6a2 ≤ |ε7 | < (5 + )u |b| b 47 3.6. STABILITÄT DES GAUSS-ALGORITHMUS zu betrachten. Einen kleinen Rückwärtsfehler, wie man ihn bei einem numerische rückwärtsstabilen Algorithmus erwarten würde, erhalten wir falls a2 ≈ |b|. Ein großer Fehler ist möglich für |a| b. Bei der Vorwärtsanalyse ist das Ziel, eine Aussage über den relativen Fehler | x̃−x | zu trefx fen. Daher wird hier versucht, x̃ √ so umzuformen, daß x̃ = x + Rest gilt. Unter Verwendung √ der Taylorformel für d + h = d + 2√1 d h + Terme höherer Ordnung ergibt sich p x̃ = [a − (a2 (1 + ε1 ) − b)(1 + ε2 )(1 + ε3 )](1 + ε4 ) = a + aε4 − = a + aε4 − =a− =a− p p a2 (1 + ε1 )(1 + ε2 )(1 + ε3 )2 (1 + ε4 )2 − b(1 + ε2 )(1 + ε3 )2 (1 + ε4 )2 (1 + ε4 )2 a2 (1 + ε8 ) − b(1 + ε9 ) p a2 − b + (a2 ε8 − bε9 ) + aε4 √ a2 − b − a2√ ε8 −bε9 2 a2 −b + aε4 mit |ε8 | ≤ 6 u, |ε9 | ≤ 5 u und unter Vernachlässigung der Terme höherer Ordnung. Es folgt √ 2 a2 ε8 −bε9 −2aε 4 a −b √ √ | = | | | x̃−x x 2 2 2 a −b(a− a −b) √ 2 2 ≤ 3 u | √a 2−b−2a√a 2−b | a −b(a− a −b) Der Vorwärtsfehler kann groß werden, falls der Nenner klein wird, wobei zwei Fälle eintreten können, die sich beide auf eine Auslöschung in unserem Algorithmus zurückführen lassen: (i) a2 ≈ b hat Auslöschung bei der Berechnung von d = a2 − b zur Folge (ii) |b| a2 und a > 0 hat Auslöschung bei der Berechnung von x = a − w zur Folge. 3.6 Stabilität des Gauß-Algorithmus Man zeigt in einer genauen Rückwärtsanalyse des Verfahrens folgendes: Satz 3.29 Es seien A ∈ Rn×n , b ∈ Rn und x̂ die durch das Gauß-Verfahren mit Spaltenpivotsuche auf dem Rechner erzeugte Lösung von Ax = b. Dann gibt es eine Matrix ∆A, so daß (A + ∆A)x̂ = b und für ∆A gilt: ||∆A||∞ ≤ 2n2 Dabei ist nu g||A||∞. 1 − nu (k) g= maxi,j,k |aij | (1) maxi,j |aij | . 48 KAPITEL 3. FEHLERANALYSE Für den Wachstumsfaktor g erhält man als obere Schranke g ≤ 2n−1 . Ideal wäre es, wenn der äquivalente Datenfehler ∆A von der Größenordnung der Maschinengenauigkeit wäre. Wie weit er gegebenenfalls darüber hinaus geht, hängt von dem Wachstumsfaktor g ab. Empirische Untersuchungen zeigen g stets als moderat. Bei totaler √ Pivotsuche kann man zeigen, daß g ≤ 2 k(2·31/2 ·· · · k 1/(k−1) )1/2 gilt. Diese obere Schranke ist natürlich wesentlich besser als die der Spaltenpivotsuche. Jedoch ist der Aufwand der totalen Pivotsuche um vieles größer als der der Spaltenpivotsuche. Zudem votieren empirischen Untersuchungen so klar für die Spaltenpivotsuche, daß man die totale Pivotsuche nur in seltenen Fällen einsetzt. Art der Matrix invertierbar obere Hessenberg-Matrix A oder AT strikt diagonaldominant tridiagonal symmetrisch positiv definit Statistik Spaltenpivotisierung ja ja überflüssig ja nein ja g 2 n−1 n 2 2 1 2 3 n (im Mittel) Alles in allem können wir feststellen daß mit dem Gaußschen Eliminationsverfahren ein numerisch, bis auf die oben angedeutete Einschränkung, zufriedenstellendes Verfahren vorliegt. Da das beschriebene und in der anfänglich erwähnten MATLAB-Prozedur verwendete Lösungsverfahren für lineare Gleichungssysteme also zufriedenstellend ist, haben wir noch keine Erklärung für das katastrophal falsche Ergebnis für die Hilbertmatrix gefunden. Nach unseren Betrachtungen im Kapitel 2.1 kann das jetzt nur noch daran liegen, daß für diese Daten das Problem der Gleichungslösung schlecht konditioniert ist, d.h. daß kleine Änderungen in den Daten, sehr große Änderungen in dem Ergebnis bewirken können. Dazu läßt sich das folgende Ergebnis beweisen. Satz 3.30 Sei x die Lösung von Ax = b und y die Lösung von (A + ∆A)y = b + ∆b. ≤ δ und k∆bk ≤ δ. Dann Bezeichne δ eine Schranke für den relativen Fehler, d.h. k∆Ak kAk kbk gilt für y: 2δ kx − yk ≤ κ(A) kxk 1 − δκ(A) wobei κ(A) = kAk kA−1 k ist. κ(A) = kAk kA−1 k heißt Konditionszahl von A. Ist diese groß, so ist die Abweichung x − y groß. Für unsere Hilbertmatrix H der Größe 20 ist κ(H) = 1.1896 · 1019 . Die vom Rechner gelieferte Lösung y ist nach unseren Überlegungen die exakte Lösung von (H + E)y = b und E ist in der Größenordnung der Maschinengenauigkeit, bei MATLAB : 2.2204 · 10−16 . Nach Satz 2.6 kann dann kx − yk von der Größenordnung 10−16 · 1019 = 1000 sein. 49 3.6. STABILITÄT DES GAUSS-ALGORITHMUS Die Konditionszahl kAk kA−1 k einer Matrix A wird dann sehr groß, wenn A beinahe singulär ist. Denn dann existiert die Inverse A−1 zwar noch, hat aber typischerweise sehr, sehr große Einträge. (Betrachten Sie dazu einmal die Inverse der 20 × 20 Hilbertmatrix. MATLAB liefert diese mittels invhilb(20).) kA−1 k wird dann außerordentlich groß. Obwohl das gewählte numerische Verfahren also in Ordnung ist, kann das Ergebnis bei sehr großer Konditionszahl von A sehr falsch sein. Gute Software wird daher neben der eigentlichen Berechnung der Lösung auch immer eine Schätzung für die Konditionszahl mitberechnen, und falls diese zu groß ausfällt, eine Warnung ausdrucken. (Bei der Inversenberechung von hilb(20) ist dieses auch geschehen.) Die Konditionszahl selbst zu berechnen ist aufwendiger als das Ausgangsproblem zu lösen, so daß man sich mit einer gut durchdachten Schätzung begnügen muß. Zum Abschluß wollen wir uns noch überlegen, warum ein kleines Residuum r = Ax̂ − b für eine Näherungslösung nicht unbedingt besagt, daß x̂ nahe an der Lösung x liegt. Für unsere Hilbertmatrix hatte die sehr falsche Lösung ein winzig kleines Residuum. Es gilt für das Residuum r und die Näherungslösung x̂ (A − denn 1 rx̂T )x̂ = b, kx̂k2 1 1 rx̂T x̂ = rkx̂k2 = r. 2 kx̂k kx̂k2 x̂ ist demnach die exakte Lösung des Problems mit der Störung k 1 rx̂T kx̂k2 in A. Es gilt 1 krk 1 rx̂T k = krk kx̂k = . 2 2 kx̂k kx̂k kx̂k Ist also krk sehr klein, so auch diese Störung. Satz 2.6 sagt, daß diese Störung in die Abweichung der Lösung mit dem Faktor κ(A) eingeht. Bei großer Konditionszahl von A kann also auch ein x̂ mit sehr kleinem Residuum stark von x abweichen. Weiterführende Literatur • N.J. Higham, Accuracy and Stability of Numerical Algorithms, SIAM • M. Overton, Numerical Computing with IEEE Floating Point Arithmetic, SIAM • P. Deuflhard, A. Hohmann, Numerische Mathematik I, Walter de Gruyter