Kapitel 7
Die kosten für inverses sind n^3 und lu n^3 und dann lösen n^2 wir berechnen das inverse nie direkt sondern lösen n systeme für die Einheitsvektoren.
Schur-Komplement
Wir wollen das System $$ \begin{bmatrix} A_{11} & A_{12} \ A_{21} & A_{22} \end{bmatrix} \begin{bmatrix} x_1 \ x_2 \end{bmatrix} = \begin{bmatrix} b_1 \ b_2 \end{bmatrix}
$$
lösen. Dafür eliminieren wir und erhalten das System
und dann erhalten wir mit
Wir nennen die verwendete Matrix das Schur-Komplement von
Pfeilmatrix
Eine Pfeilmatrix (arrow matrix) besteht aus einer Diagonalmatrix und einer weiteren Zeile und Spalte. Wir wollen das System
in nur Operationen lösen. Dafür schreiben wir zuerst die ersten Zeilen um in
und erhalten für die letzte Zeile dann
Da hier die einzige Unbekannte ist, lässt sie sich leicht bestimmen und dann auch die .
Sherman-Morrison-Woodbury-Formel
Wenn wir das Inverse schon einmal berechnet haben und jetzt die Matrix nur mit einer Matrix von niedrigem Rang addieren wollen, dann können wir das neue Inverse in anstatt berechnen. Die Formel dazu ist
und für der Spezialfall
Dünnbesetzte Matrizen
Normalerweise werden Matrizen in Python ganz und in row-major-order gespeichert.
Wir notieren die Anzahl der nicht-null-Einträge von mit . Falls gilt dann ist die Matrix dünnbesetzt. Wir wollen jetzt Speicherplatz sparen, indem wir nur die nicht-null-Einträge der Matrix speichern.
Das COO oder Triplet-Format speichert alle Einträge als . Wir brauchen dafür Speicher.
Das CRS oder Compressed Sparse Row-Format speichert die Einträge in drei Arrays val, col und rowptr. Alle Einträge der i-ten Reihe sind zwischen rowptr[i] und rowptr[i+1] (wobei rowptr[i+1] nicht inkludiert ist). Zum Beispiel hätte die folgende Matrix
die Form
Wir brauchen dafür Speicher. Bemerke, dass rowprt Länge und nicht hat.
Das CSC oder Compressed Sparse Column-Format funktioniert ähnlich, aber mit Spalten statt Zeilen.
Kleinste Quadrate
Wenn unsere Matrix mehr Zeilen als Spalten hat, dann hat das System oft keine Lösung. Stattdessen wollen wir den Vektor finden, der die quadrierte Norm des Fehlers minimiert
Wenn vollen Spaltenrang hat, dann ist die Lösung eindeutig. Es gibt immer eine Lösung, aber sie muss keine echte Lösung des ursprünglichen Systems sein.
Geometrisch ist die Projektion von auf den Spaltenraum von . Wenn die Lösung optimal ist, muss der Rest also orthogonal auf den Spaltenraum stehen. Es muss also die Normalengleichungen erfüllen
Da und denselben Nullraum haben, gilt
Falls invertierbar ist, dann ist die Lösung eindeutig mit
Falls nicht invertierbar ist, dann ist sie nicht eindeutig, da der Nullraum von nicht trivial ist und für gilt für eine Lösung
und somit haben alle solche Vektoren denselben Rest. Wir wollen nun die Lösung mit der kleinsten Norm finden. Dafür verwenden wir das Moore-Penrose-Pseudoinverse
Das Moore-Penrose-Pseudoinverse ist
und mit der SVD
Wir sollten die Normalengleichungen nicht selber berechen und das Inverse auch nicht berechnen, die schnellste Methode ist numpy.lstsq.
Gram-Schmidt
m, n = a.shape
Q = np.zeros((m, n))
R = np.zeros((n, n))
for i in range(n):
q_i = a[:, i].copy()
for j in range(i):
factor = np.dot(a[:,i], Q[:, j])
R[j, i] = factor
q_i -= factor * Q[:, j]
norm = np.linalg.norm(q_i)
if norm > 1e-10:
q_i = q_i / norm
Q[:, i] = q_i
R[i, i] = norm
return Q, Rm, n = a.shape
q = a.copy()
r = np.zeros((n,n))
for i in range(n):
norm = np.linalg.norm(q[:,i])
if norm > 1e-10:
q[:,i] /= norm
for j in range(i+1, n):
dotp = np.dot(q[:,i], q[:,j])
r[i,j] = dotp
q[:,j] -= dotp * q[:,i]
r[i,i] = norm
return q, r