1.1. Gauss-Eliminationsverfahren#
Bevor wir den allgemeinen Fall eines quadratischen LGS wie in Gleichung (1.1) betrachten, wollen wir zwei Spezialfälle diskutieren, in denen sich die Determinante von \(A\) direkt ablesen lässt. Dies bedeutet wiederum, dass man in diesen Fällen direkt eine Aussage über die Lösbarkeit des LGS machen kann. Der einfachste zu betrachtende Fall ist, wenn die Matrix \(A\) eine Diagonalmatrix ist, wenn also gilt \(a_{i,j} = 0\) für alle \(i \neq j\):
In diesem Fall weiß man, dass
gilt und somit \(\operatorname{det}(A) \neq 0 \Leftrightarrow a_{i,i} \neq 0\) für alle \(i=1,\ldots,n\), d.h., das LGS in Gleichung (1.1) ist genau dann lösbar, wenn alle Diagonaleinträge der Matrix \(A\) ungleich Null sind. Weiterhin lässt sich eine Lösung \(x \in \mathbb{R}^n\) in diesem Fall sehr einfach bestimmen, nämlich:
Da man zur Bestimmung des Lösungsvektors \(x \in \R^n\) in (1.4) nur \(n\) Divisionen benötigt, liegt der Rechenaufwand in \(\mathcal{O}(n)\).
Widmen wir uns nun dem zweiten Fall unserer Diskussion, nämlich wenn die Matrix \(A\) die Gestalt einer rechten, obere Dreiecksmatrix besitzt, d.h. wenn \(a_{ij} = 0\) für alle \(i > j\) gilt:
Wie im Fall der Diagonalmatrix lässt sich die Determinante hier analog als Produkt der Diagonaleinträge nach Gleichung (1.3) berechnen und es gelten die gleichen Aussagen zur Existenz einer Lösung. Die konkrete Berechnung des Lösungsvektors \(x \in \mathbb{R}^n\) stellt sich jedoch, verglichen mit dem ersten Spezialfall, als etwas schwieriger heraus. Betrachten wir das ursprüngliche LGS in Gleichung (1.1) für den Fall einer rechten, oberen Dreiecksmatrix \(A=R\) so ergeben sich die folgenden gestaffelten Gleichungen
Für den Fall, dass \(A\) nicht singulär ist, d.h., dass alle Diagonalelemente der Matrix \(A=R\) ungleich Null sind, lässt sich direkt ein Verfahren zur Bestimmung der unbekannten Lösung \(x\in\mathbb{R}^n\) durch Rückwärtseinsetzen angeben. Hierzu beginnt man mit dem letzten Element \(x_n\) des Vektors \(x\) und setzt die Lösung sukzessive in die gestaffelten Gleichungen (1.5) ein. Hieraus ergibt sich das folgende Lösungsverfahren.
Algorithmus 1.1 (Rückwärtseinsetzen)
Wir betrachten das LGS \(Rx = b\) für eine rechte obere Dreiecksmatrix \(R \in \R^{n \times n}\), einen Vektor \(b \in \R^n\) und einen unbekannten Lösungsvektor \(x \in \R^n\). Wenn alle Diagonalelemente \(a_{i,i} \in \R, i = 1,\ldots,n\) ungleich Null sind, so können wir den unbekannten Lösungsvektor sukzessive durch Rückwärtseinsetzen wie folgt berechnen:
Bemerkung 1.1
In der ersten Gleichung von (1.6) benötigt man eine einzige Division zur Bestimmung von \(x_n\). Mit jeder weiteren Gleichung kommt eine Subtraktion und eine Multiplikation hinzu (wir fassen diese zwei Schritte nach Definition 1.1 hier zu einem FLOP zusammen). Dementsprechend lässt sich der Rechenaufwand für das Rückwärtseinsetzen mit
also in \(\frac{1}2 n^2 + \mathcal{O}(n)\) bzw. in \(\mathcal{O}(n^2)\) angeben.
Sei \(A \in \R^{n \times n}\) nun im Folgenden eine beliebige nichtsinguläre Matrix. Wir versuchen im Folgenden mit Hilfe des Gauss’schen Eliminationsverfahren durch geschickte Rechenoperationen eine Rückführung auf den oben diskutierten Fall der rechten, oberen Dreiecksmatrix zu erhalten. Betrachten wir hierzu zunächst wieder die gestaffelten Gleichungen für den allgemeinen Fall
Die Idee beim Eliminationsverfahren ist es im \(j-\)ten Schritt die unbekannte Variable \(x_j\) aus allen darunter liegenden Gleichungen zu entfernen, sodass nur Nullen unterhalb des \(j\)-ten Diagonaleintrags bleiben und so sukzessive eine rechte, obere Dreiecksmatrix entsteht. Obwohl schon aus der linearen Algebra bekannt, geben wir im Folgenden den Algorithmus des Gauss-Eliminationsverfahrens ausführlich an.
Algorithmus 1.2 (Gauss-Eliminationsverfahren)
Wir nehmen zunächst an, dass die Matrix \(A\) nicht singulär ist. Man beginnt im ersten Schritt mit der Elimination der Variablen \(x_1\) aus den Gleichungen \(i=2,\ldots,n\) in (1.7). Hierzu bestimmen wir für jede Gleichung den passenden Vorfaktor, der nötig ist, damit eine Differenz mit der ersten Gleichung zu einer Null unterhalb der Diagonalen führt, d.h., wir setzen für \(i=2,\ldots,n\) die Koeffizienten
An dieser Stelle wollen wir zunächst die starke Annahme machen, dass \(a_{1,1} \neq 0\) ist. Wir werden uns an späterer Stelle um diesen Fall gesondert kümmern.
Die Vorfaktoren \(l_{i,1} \in \R\) multiplizieren wir nun mit der ersten Gleichung und subtrahieren diese von der \(i\)-ten Gleichung. Im Ergebnis verschwindet nun die unbekannte Variable \(x_1\), da wir die Vorfaktoren \(l_{i,1}\) in (1.8) entsprechend gewählt haben. Wir erhalten somit die folgenden neuen Gleichungen für \(i=2,\ldots,n\):
Wir können das verbleibende System von \(n\) Gleichungen nun wie folgt schreiben
mit
Hierbei haben wir implizit \(a_{i,k}^{(1)} = a_{i,k}\) und \(b_i^{(1)} = b_i\) gesetzt.
Dieses Vorgehen lässt sich nun für den \(\pmb{j}\)-ten Schritt des Verfahrens für \(j=2,\ldots,n-1\) wie folgt verallgemeinern. Wir setzen nun für die relevanten Gleichungen \(i=j+1,\ldots,n\) die Vorfaktoren als
Hierbei nehmen wir wiederum an, dass \(a_{j,j}^{(j)} \neq 0\) für \(j=2,\ldots,n\) gilt. Diesen Vorfaktor multipliziert man wieder mit der \(j\)-ten Gleichung und subtrahiert diese von der \(i\)-ten Gleichung für \(i=j+1,\ldots,n\). Im Ergebnis verschwindet nun die unbekannte Variable \(x_j\) in allen Zeilen unterhalb der \(j\)-ten Gleichung. Man erhält damit die folgenden neuen Gleichungen für \(i=j+1,\ldots,n\):
Wir können dieses System von \((n-j)\) Gleichungen nun wie folgt schreiben
mit
Nach \(n-1\) Schritten des oben beschriebenen Verfahrens hat man die ursprüngliche Matrix \(A\) in eine obere, rechte Dreiecksform überführt und man erhält nach dem letzten Schritt in der letzten Zeile eine Gleichung mit nur einer unbekannten Variable \(x_n\) wie folgt
mit der oben beschriebenen Notation.
Nun lässt sich der unbekannte Vektor \(x \in \mathbb{R}^n\) durch Rückwärtseinsetzen berechnen, wie in Algorithmus 1.1 beschrieben, wenn wir annehmen, dass \(a_{n,n}^{(n)} \neq 0\) gilt.
Das gesamte Verfahren zur Lösung des LGS (1.1) lässt sich anschaulich durch folgenden Pseudo-Code beschreiben.
function x = SolveLES(A,b):
# Gauss-Elimination
for j=1,...,n:
for i=j+1,...,n:
l = a[i,j] / a[j,j]
for k=j,...,n:
a[i,k] = a[i,k] - l * a_[j,k]
b[i] = b[i] - l * b[j]
# Rückwärtseinsetzen
for j=n,...,1:
x[j] = b[j]
for k=j+1,...,n:
x[j] = x[j] - a[j,k] * x[k]
x[j] = x[j] / a[j,j]
Bemerkung 1.2
Der Rechenaufwand des Gauss-Eliminationsverfahrens in Algorithmus 1.2 liegt in \(\mathcal{O}(n^3)\) bzw. genauer \(\frac{1}3 n^3+ \mathcal{O}(n^2)\).
Beispiel 1.2
Sei
Das Gauss-Eliminationsverfahren in Algorithmus 1.2 liefert einem die rechte, obere Dreiecksmatrix \(R \coloneqq A^{(n)} \in \R^{3 \times 3}\) und den modifizierten Vektor \(b^{(n)}\in \R^{3}\) mit
Durch Rückwärtseinsetzen mit Algorithmus 1.1 erhält man für das LGS den Lösungsvektor \(x = (5, -6, 3)^T\).