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)