Lineare Gleichungssysteme
Lineare Gleichungssysteme treten oft als Teilprobleme bei
numerischen Verfahren auf, z.B.:
- Lineare Ausgleichsprobleme (Normalgleichungen)
- Partielle Differentialgleichungen
- bei manchen impliziten Verfahren muß in jedem Zeitschritt ein
lineares Gleichungssystem gelöst werden
- Randwertprobleme bei elliptischen Systemen
(z.B. Potentialgleichung)
- man hat oft spezielle, dünnbesetzte (sparse )
Matrizen (Bandmatrizen )
Direkte Verfahren
Lösen das Problem durch geeignete Zerlegung der Koeffizientenmatrix
nach endlich vielen Schritten von algebraischen Operationen, sodaß
kein Verfahrensfehler auftritt. Abgesehen von Rundungsfehlern erhält
man die exakte Lösung.
Allerdings können wegen der großen Anzahl von Punktoperationen
µ n3 die akkumulierten Rundungsfehler das Ergebnis erheblich
verfälschen, sodaß die Lösung völlig unbrauchbar werden kann.
Beispiele: Gaußscher Algorithmus, LU-Zerlegung.
Iterationsverfahren
Ausgehend von einer Anfangsnäherung für die Lösung (Startvektor)
wird diese schrittweise durch Iteration verbessert.
Obwohl hier Verfahrens- und Rundungsfehler auftreten, sind
Iterationsverfahren vor allem für große Systeme mit schwach
besetzten Matrizen geeignet (pro Iterationsschritt ist die
Anzahl der Punktoperationen µ n2).
Beispiele: Jacobi, Gauß-Seidel, SOR, ADI, CG.
Das Gaußsche Eliminationsverfahren
Wir betrachten ein System von n linearen Gleichungen in
n Unbekannten x1, ¼, xn :
oder in Matrixform:
Beispiel zum Gaußschen Eliminationsverfahren
|
| | | | | | | |
| | | | | | | |
| | | | | | | |
|
| | | | | | | |
| | | | | | | |
| | | | | | |
G3(1) = G3(0) - ( - G1(0)) |
|
|
| | | | | | | |
| | | | | | | |
| | | | | | |
G3(2) = G3(1) - ( - G2(1)) |
|
|
|
|
Damit ist das ursprüngliche Gleichungssystem in ein äquivalentes
Gleichungssystem von oberer Dreiecksgestalt übergeführt, welches
sich von rückwärts her auflösen läßt:
Aus der letzten Gleichung erhält man
Einsetzen von x3 in die vorletzte
Gleichung liefert
x2 = (-12 + 4)/(-8) = 1 . |
|
Aus Gleichung G1(0) erhält man schließlich
Die Lösung x der ursprünglichen Gleichung lautet also
x = |
æ ç ç
ç è
|
|
|
ö ÷ ÷
÷ ø
|
= |
æ ç ç
ç è
|
|
|
ö ÷ ÷
÷ ø
|
. |
|
Die Koeffizientenmatrix A sei nicht singulär,
det A ¹ 0.
Dann ist (1) eindeutig lösbar.
Das Prinzip des Gaußschen Algorithmus besteht nun darin, (1)
in ein Gleichungssystem von oberer Dreiecksgestalt
(mit einer oberen Dreiecksmatrix U als neuer Koeffizientenmatrix)
überzuführen, welches dieselbe Lösung wie (1) besitzt:
Falls alle uii ¹ 0 sind, läßt sich (2), angefangen
von der letzten Gleichung, von rückwärts her sukzessive auflösen:
|
| | |
| |
( b¢n-1 - un-1,n xn ) / un-1,n-1 |
|
| | |
| |
( b¢2 - u23 x3 - ¼- u2n xn ) / u22 |
|
| |
( b¢1 - u12 x2 - u13 x3 - ¼- u1n xn ) / u11 |
|
|
|
|
Allgemein erhält man für das Rückwärtseinsetzen
(i = n-1, n-2, ¼, 1):
|
| | |
| |
( b¢i - |
n å
j = i + 1
|
uij xj ) / uii |
|
|
|
| (3) |
Alle nicht singulären Gleichungssystme lassen sich auf die Form
(2) bringen: Die Lösungsmenge eines linearen
Gleichungssystems ändert sich nämlich nicht, wenn man
- die Reihenfolge der Gleichungen vertauscht
- zu einer Gleichung das Vielfache einer anderen Gleichung
addiert
und eine der beiden Gleichungen durch diese Summe ersetzt.
Wir verwenden nun diese Eigenschaften, um das ursprüngliche
Gleichungssystem (1) so umzuformen, daß alle
Elemente von A unterhalb der Hauptdiagonale verschwinden.
In der Ausgangsform bezeichnen wir das gegebene Gleichungssystem (1)
mit
Im ersten Schritt definieren wir n - 1 Multiplikatoren
für die Zeilen k = 2 bis k = n,
m(1)k = |
a(0)k1
a(0)11
|
k = 2, 3, ¼, n , a(0)11 ¹ 0 , |
|
multiplizieren die erste Gleichung mit m(1)2 und subtrahieren sie
von der zweiten, dann multiplizieren wir die erste Gleichung mit
m(1)3 und subtrahieren sie von der dritten usw. Dadurch wird
x1 von der 2. bis zur n-ten Gleichung eliminiert:
Die erste Zeile bleibt dabei unverändert und heißt Pivotzeile .
Das aktuell zur Elimination benutzte Diagonalelement a(0)11 heißt
Pivotelement (frz. pivot: Drehpunkt, Angelpunkt).
Die neuen Koeffizienten a(1)kj (j = 2, ¼, n)
und rechten Seiten b(1)k der Zeilen k = 2, 3, ¼, n lauten
Dieses Verfahren wird nun mit den verbleibenden (n - 1) Gleichungen
wiederholt, indem man wieder Multiplikatoren
m(2)k = |
a(1)k2
a(1)22
|
k = 3, 4, ¼, n , a(1)22 ¹ 0 , |
|
definiert, die zweite Gleichung des Systems (4) als
neue Pivotzeile verwendet, mit dem entsprechenden m(2)k
multipliziert, und sie dann von der k-ten Gleichung subtrahiert.
Im i-ten Schritt definiert man die Multiplikatoren
m(i)k = |
a(i-1)ki
a(i-1)ii
|
k = i + 1, ¼, n , a(i-1)ii ¹ 0 , |
| (5) |
und subtrahiert von der k-ten Gleichung (k = i + 1, ¼, n)
das m(i)k-fache der i-ten Gleichung (der aktuellen Pivotzeile).
Die neuen Koeffizienten a(i)kj (j = i + 1, ¼, n) und
rechten Seiten b(i)k der Zeilen k = i + 1, ¼, n sind dann
|
| |
a(i-1)kj - m(i)k a(i-1)ij |
|
| | |
|
|
| (6) |
Nach dem i-ten Schritt hat das System die Gestalt
Damit wird xi aus allen Zeilen k = i + 1, ¼, n eliminiert und
die ersten i Spalten enthalten unterhalb der Hauptdiagonale
nur mehr Nullen.
Nach n - 1 Schritten hat man schließlich die Form (2)
mit einer oberen Dreiecksmatrix als Koeffizientenmatrix erreicht:
Die oberen Indizes (i) geben an, wie oft die Koeffizienten a(i)kj
bzw. Elemente b(i)k
der rechten Seite während der Eliminationsrechnung höchstens
verändert wurden.
Die Gesamtanzahl der Multiplikationen und Divisionen bei der
Elimination und beim Rückwärtseinsetzen ist
( n3 + 3 n2 - n ) / 3 = O(n3).
Der Zeitaufwand für die Lösung eines allgemeinen linearen
Gleichungssystems steigt beim Gaußverfahren also mit der
dritten Potenz der Anzahl n der Gleichungen:
Bei einer Verdopplung von n erhöht sich die Rechenzeit
auf ca. das Achtfache.
Wegen der großen Anzahl von Rechenoperationen besteht die
Gefahr, daß sich Rundungsfehler akkumulieren. Man sollte
daher die Rechnungen nur in doppelter Genauigkeit
(double ) durchführen.
Um unnötigen Rechenaufwand (und damit eine Anhäufung von
Rundungsfehlern) zu vermeiden, sollte man auf keinen Fall ein Gleichungssystem
A ·x = b lösen,
indem man zuerst die zu A inverse Matrix A-1
berechnet (dies erfordert die Lösung von n linearen Gleichungssystemen
mit den n Spalten der (n ×n)-Einheitsmatrix als rechte Seiten)
und dann durch Multiplikation die Lösung
x = A-1 ·b
ermittelt!
Durchführbarkeit des Gaußschen
Eliminationsverfahrens
Bei den Eliminationsschritten wurde vorausgesetzt, daß die
jeweiligen Diagonalelemente (Pivotelemente) a(i-1)ii ¹ 0 sind.
Ist das nicht der Fall, wie zum Beispiel bei
so versagt der Gaußsche Algorithmus in seiner bisherigen Form.
Wenn das System (1) nicht singulär ist, kann man durch
Zeilenvertauschungen immer erreichen, daß das gerade
aktuelle Pivotelement a(i-1)ii ¹ 0 wird.
Man wählt jedoch als neue Pivotzeile im i-ten Schritt nicht die
erstbeste Zeile des verbleibenden Systems mit
a(i-1)ki ¹ 0 (k = i, ¼, n),
sondern diejenige Zeile k0 mit dem betragsgrößten
Element in Spalte i (Abb. 1):
| a(i-1)k0i | = |
max
k = i, ¼, n
|
| a(i-1)ki | |
|
Die so gefundene neue Pivotzeile k0 wird dann mit der aktuellen
Pivotzeile i vertauscht.
Damit bleiben die Multiplikatoren |m(i)k| £ 1 und
Rundungsfehler werden besonders klein gehalten.
Dieses Verfahren heißt Spaltenpivotsuche oder
teilweise Pivotsuche :
- Die Zeilenvertauschungen brauchen in einem Programm nicht tatsächlich
ausgeführt zu werden, es genügt eine Indexvertauschung:
Man definiert einen zusätzlichen
Merkvektor (Permutationsvektor ) p[1],..,p[n],
in den man alle Vertauschungen einträgt.
Er wird zu Beginn mit p[1]=1,..,p[n]=n initialisiert und
jeder Zeilenindex i wird durch p[i] ersetzt, z.B:
a[i][j] ® a[p[i]][j].
-
Ist A diagonaldominant,
|aii| > åj=1, j ¹ in |aij| (i = 1, ¼, n),
so ist das Gaußverfahren ohne Pivotsuche durchführbar.
Um Rundungsfehler zu minimieren, sollte aber eine Pivotsuche auch
dann durchgeführt werden, wenn keines der aktuellen Pivotelemente
Null ist!
-
In der Praxis kann es vorkommen,
daß sich die Koeffizienten aij
um Größenordnungen unterscheiden.
Damit in solchen Fällen die Pivotsuche trotzdem wirkungsvoll ist,
führt man eine sogenannte skalierte Spaltenpivotsuche durch:
Man definiert für jede Zeile k einen Skalierungsfaktor
sk : = maxj=1,¼,n | akj | und verwendet zur
Bestimmung der Pivotzeile im i-ten Schritt
maxk=i,¼,n ( | a(i-1)ki | / sk ).
Damit wird sichergestellt, daß das betragsgrößte Element
jeder Zeile die relative Größe von 1 besitzt.
Die Skalierung wird in einem Programm nur zum Vergleich
bei der Suche nach Pivotzeilen durchgeführt; die Koeffizienten
und rechten Seiten selbst bleiben dabei unverändert, um keine
zusätzlichen Rundungsfehler zu erzeugen.
Zeilenvertauschungen müssen im Vektor s[] der Skalierungsfaktoren
sk mitberücksichtigt werden: s[i] ® s[p[i]].
Ein singuläres Gleichungssystem wird vom Gaußschen Algorithmus
daran erkannt, daß an einer bestimmten Stelle die Pivotsuche
erfolglos ist, z.B. ist dann im i-ten Schritt
a(i-1)ki = 0 für alle i £ k £ n.
Durch Rundungsfehler kann es aber passieren, daß ein singuläres
System als lösbar erscheint.
In der Praxis erklärt man daher ein lineares Gleichungssystem für
nicht behandelbar, wenn ein Pivotelement betragsmäßig kleiner als
ein vorgegebenes e wird (z.B. e = 10-8).
Die Matrix A ist dann numerisch singulär .
Abb. 1:
Spaltenpivotsuche im i-ten Schritt.
Abb. 2:
Gut und schlecht konditioniertes 2×2-System.
LU-Zerlegung
Bei diesem Verfahren zur Lösung von (1) wird die
Koeffizientenmatrix A zunächst in ein Produkt von
zwei Dreiecksmatrizen zerlegt,
wobei L eine untere (lower ) Dreiecksmatrix
und U eine obere (upper) Dreiecksmatrix ist:
L = |
æ ç ç ç
ç ç è
|
|
|
ö ÷ ÷ ÷
÷ ÷ ø
|
, U = |
æ ç ç ç
ç ç è
|
|
|
ö ÷ ÷ ÷
÷ ÷ ø
|
. |
|
Schreibt man nun das ursprüngliche Gleichungssystem
A ·x = b als
so gewinnt man die Lösung von (1) in einem
zweistufigen Vorgang: Man löst zuerst
nach y und verwendet den Lösungsvektor y
als rechte Seite in
Wegen der Dreiecksform von L und U sind die
beiden letzten Gleichungen leicht zu lösen. Man bestimmt zunächst
den Hilfsvektor y in (8) durch
Vorwärtseinsetzen (i = 2, ¼, n):
|
| | |
| |
( bi - |
i - 1 å
j = 1
|
lij yj ) / lii |
|
|
|
| (10) |
Den gesuchten Lösungsvektor x erhält man dann aus (9)
durch Rückwärtseinsetzen wie im Gaußverfahren, vgl. (3).
Vorteile der LU-Aufspaltung:
- Kennt man eine Faktorisierung A = L ·U,
so läßt sich die Lösung von A ·x = b
in O(n2) Rechenoperationen gewinnen.
- Die Faktoren L und U sind unabhängig von b
und können, einmal bestimmt, für verschiedene rechte Seiten b
verwendet werden.
- Als Nebenprodukt einer LU-Zerlegung erhält man det A = (-1)k u11 u22 ¼unn,
wobei k die Anzahl der Zeilenvertauschungen ist (siehe unten).
Wie findet man nun die Matrizen L und U ?
Wenn das Gaußsche Eliminationsverfahren ohne Pivotsuche durchführbar ist,
dann liefert es eine Dreieckszerlegung von A,
mit
L = |
æ ç ç ç ç
ç ç ç è
|
|
|
ö ÷ ÷ ÷ ÷
÷ ÷ ÷ ø
|
und U = |
æ ç ç ç
ç ç è
|
|
|
ö ÷ ÷ ÷
÷ ÷ ø
|
, |
|
wobei die lki genau die im i-ten Schritt definierten
Multiplikatoren m(i)k sind, vgl. (5), und
U die nach (n - 1) Eliminationsschritten erhaltene
Koeffizientenmatrix A(n-1) ist, vgl. (7).
Die in L auftretenden Zahlen lki unterhalb der
Hauptdiagonale können in dem (für die Elimination nicht
benötigten) unteren Teil von A(i) gespeichert
werden (die lii = 1 werden nicht abgespeichert);
damit wird die untere Dreiecksmatrix L im Laufe
der Elimination spaltenweise aufgebaut.
Ist das Gaußsche Eliminationsverfahren nur mit Pivotsuche durchführbar,
so liefert es eine Zerlegung von P ·A,
wo P die Permutationsmatrix ist, welche die im
Laufe des Verfahrens durchgeführten Zeilenvertauschungen beschreibt.
Beispiel: Multiplikation einer (3×3)-Matrix A mit
vertauscht die erste und zweite Zeile von A.
Man hat also in diesem Fall
( P ·A ) ·x = P ·b =: c und löst
wie oben mit Vorwärts- und Rückwärtseinsetzen.
Programmiertechnisch bedeutet das, daß man dabei auf die Zeilenindizes
der ermittelten LU-Matrix und der originalen rechten Seite über den
Permutationsvektor p[] zugreift; dazu muß während der Elimination
die untere Dreiecksmatrix L in der ursprünglichen Zeilenordnung
gespeichert werden, also a[p[k]][j] = zmult, und beim
Vorwärts- und Rückwärtseinsetzen muß p[]
zur Verfügung stehen.
Neben dem Gaußschen Algorithmus gibt es noch direkte Verfahren
zur Berechnung von L und U
(Crout, Doolittle, Banachiewicz), welche nur halb so viele
Rechenoperationen benötigen. Allerdings ist hier die Pivotierung
komplizierter als beim Gaußverfahren.
Fehler und Kondition
Die mit Hilfe direkter Methoden ermittelte Lösung x*
eines linearen Gleichungssystems ist meist nicht die exakte Lösung
x , da (1) Rundungsfehler akkumuliert werden, und
da (2) Ungenauigkeiten in den Ausgangsgrößen A und b
auch Ungenauigkeiten in der Lösung hervorrufen können.
Leider ist das Residuum
r := b - A ·x*
als Maß für die Güte einer Näherungslösung x* wenig
geeignet: Ist nämlich die Länge || r || des Residuums klein,
so kann man daraus nicht schließen, daß auch die Länge
|| x - x* || des unbekannten
Fehlers x - x* klein ist.
Zur Beurteilung der Güte von x* ist also eine Probe,
d.h. das Einsetzen der Näherungslösung x* in das
gegebene Gleichungssystem A ·x = b,
nicht hinreichend.
Beispiel: Das System
|
æ ç
è
|
|
|
ö ÷
ø
|
· |
æ ç
è
|
|
|
ö ÷
ø
|
= |
æ ç
è
|
|
|
ö ÷
ø
|
|
|
beschreibt den Schnittpunkt der Geraden y = 0 mit der Geraden
y = ax und hat die exakte Lösung x = (0, 0)T.
Für ein beliebiges x* = (x*, 0)T
ist das Residuum r = ( 0, - ax* )T.
Ist etwa x* = 105 , a = 10-10 ,
so ist zwar ||r|| = ax* » 10-5,
trotzdem ist der Fehler || x - x* || = 105.
Die Lösung x* hat also mit der exakten Lösung
fast nichts zu tun, produziert aber beim Einsetzen nur ein kleines
Residuum.
Es stellt sich heraus, daß die sogenannte Kondition
k(A) : = ||A|| ||A-1 || ³ 1 der
Koeffizientenmatrix A entscheidend dafür ist, ob man
bei der numerischen Lösung des linearen Gleichungssystems mit
Schwierigkeiten zu rechnen hat.
k(A) ist der Faktor, um den
die relativen Fehler in A und b zum relativen
Fehler der Lösung verstärkt werden:
Wenn kleine Änderungen in den Ausgangsdaten A und
b große Änderungen in der Lösung x*
hervorrufen,
wenn also k(A) groß ist, so spricht man von
einem schlecht konditionierten System.
Im obigen Beispiel erhält man für kleines a für
k(A) » 2 / a, d.h. das System
ist für a << 1 extrem schlecht konditioniert.
Anschaulich bedeutet das, daß die beiden Geraden g1: y = 0
und g2: y = ax nahezu parallel sind, sodaß auf Grund
des ``schleifenden'' Schnitts von g1 und g2 eine
kleine Änderung in den Ausgangsdaten eine große Änderung
im Schnittpunkt (in der Lösung) nach sich zieht (Abb. 2).
Das Paradebeispiel für eine schlecht konditionierte Matrix
ist die sogenannte Hilbertmatrix
Hn := |
æ ç ç ç ç ç ç
ç ç ç ç ç è
|
|
|
ö ÷ ÷ ÷ ÷ ÷ ÷
÷ ÷ ÷ ÷ ÷ ø
|
= ( hij ) = |
æ è
|
1
i + j - 1
|
ö ø
|
für i,j = 1, ¼, n . |
|
Obwohl diese Matrix zunächst gutartig aussieht (symmetrisch,
positiv definit, regulär), sind Gleichungssysteme mit dieser Matrix nur
schwer zu lösen: k(Hn) wächst exponentiell mit n.
Zum Beispiel hat das System Hn ·x = b für
bi = ånj=1 hij die exakte Lösung
x = (1, ¼, 1)T.
Ein durch Rundungsfehler leicht verändertes System hat jedoch eine Lösung,
die weit von x abweicht.
File translated from
TEX
by
TTH,
version 3.06.
On 27 May 2004, 20:23.