Gram-Schidtsches Orthogonalisierungsverfahren Schritt für Schritt¶
Wir wollen und das Gram-Schidtsche Orthogonalisierungsverfahren zunächst anhand eines einfachen Beispiels genauer ansehen. Wir orthogonalisieren die Vektoren \(a_1\ldots a_{3}\)
\[\begin{split}A = (a_1,a_2,a_3) = \left(
\begin{array}{ccc}
0 & 8 & 10\\
2 & 4 & 6\\
0 & 0 & 12
\end{array}
\right)\end{split}\]
a1 = numpy.array([0,2,0])
a2 = numpy.array([8,4,0])
a3 = numpy.array([10,6,12])
A = [ a1, a2, a3 ]
print "Othogonalisieren von"
print A
Dazu nutzen wir das Gram-Schmidt Verfahren. Wir wollen eine Orthogonalisierung \(Q\) berechnen:
Q = [ ]
Wir setzen voraus, dass alle Vektoren \(a_k\) linear unabhängig sind, d.h. die Matrix \(A^T\) muss vollen Rang haben und das ist erfüllt, wenn \(A\) sollen Rang hat:
assert(numpy.linalg.matrix_rank(A) == 3)
Wir starten mit:
print "erster Vektor"
q = A[0] / linalg.norm(A[0])
Q.append(q)
print q
und erhalten
\[Q_1 = (0,1,0)\]
Der zweite Vektor soll orthogonal zu \(Q_0\) stehen:
print "zweiter Vektor"
q = A[1] - numpy.dot(Q[0],A[1])*Q[0]
q = q / linalg.norm(q)
Q.append(q)
print q
und erhalten
\[Q_2 = (1,0,0)\]
Der dritte Vektor wird analog berechnet:
print "dritter Vektor"
q = A[2]
for j in range(0,2):
q = q - numpy.dot(Q[j],A[2])*Q[j]
q = q / linalg.norm(q)
Q.append(q)
print q
und erhalten
\[Q_3 = (0,0,1)\]
Und wir überprüfen, dass Q wirklich unitär und symmetrisch ist:
Q = numpy.array(Q)
print numpy.dot(Q,Q)