Beispiel 1
Gegeben sei die Matrix \(A \in \mathbb{R}^{4 \times 4}\):
Jordannormalform bestimmen
1. Charakteristisches Polynom berechnen: \(p_A(\lambda) = (\lambda - 5) \cdot (\lambda - 4) \cdot (\lambda + 1)^2\).
(→ Wolfram|Alpha und „Wie berechnet man das charakteristische Polynom?“)
Daraus folgt:
- $\lambda = 5$ ist Eigenwert mit der algebraischen Vielfachheit 1.
- $\lambda = 4$ ist Eigenwert mit der algebraischen Vielfachheit 1.
- $\lambda = -1$ ist Eigenwert mit der algebraischen Vielfachheit 2.
Es gibt also genau drei Jordan-Blöcke in der Jordannormalform. Zwei davon haben die Kantenlänge 1 und deshalb nur ein Jordan-Kästchen.
2. Anzahl der Jordankästchen bestimmen:
Es gibt im Jordanblock zu
K_2(1)
.
\(K_3(1) = \mathbb{R}^4\) ist das größte Jordankästchen von der Größe 3. Damit ergibt sich folgende Jordannormalform:
Basiswechselmatrix bestimmen
Für jedes Jordankästchen der Länge \(i\) muss nun 1 Vektor gewählt werden und \(i-1\) Vektoren müssen bestimmt werden. Dafür muss \(\Omega(\lambda) := C - \lambda \cdot E\) bestimmt werden.
Eigenwert 1: Kästchengröße 3
Wähle
Kästchengröße 1
Das 1-er Kästchen soll zuerst kommen, also muss \(b_4\) zuerst in die Basiswechselmatrix. Unsere gesuchte Matrix \(S\) für die oben angegebene JNF ist also:
Nun sollte \(J = S^{-1} \cdot C \cdot S\) gelten. Also, Schritt für Schritt:
Programmierung
Hier habe ich mal für Leute, die kein Python haben, als Kommentar das Ergebnis präsentiert. Ich denke damit ist klar, welchen Einfluss die Reihenfolge der Basisvektoren hat.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy
from numpy import linalg
numpy.set_printoptions(precision=2, suppress=True, linewidth=120)
C = [[1, 0, -1, -1], [-1, 0, 0, 0], [0, 0, 2, 1], [1, 1, 0, 1]]
C = numpy.matrix(C)
b1 = [1, 0, 0, 0]
b2 = [0, -1, 0, 1]
b3 = [-1, 1, 1, -1]
b4 = [1, -1, 0, 0]
S = numpy.matrix([b4, b1, b2, b3]).transpose() # [[ 1 0 0 0]
print("4123") # [ 0 1 0 0]
print(linalg.inv(S) * C * S) # [ 0 1 1 0]
# [ 0 0 1 1]]
S = numpy.matrix([b4, b1, b3, b2]).transpose() # [[ 1 0 0 0]
print("4132") # [ 0 1 0 0]
print(linalg.inv(S) * C * S) # [ 0 0 1 1]
# [ 0 1 0 1]]
S = numpy.matrix([b4, b2, b1, b3]).transpose() # [[ 1 0 0 0]
print("4213") # [ 0 1 1 0]
print(linalg.inv(S) * C * S) # [ 0 0 1 0]
# [ 0 1 0 1]]
S = numpy.matrix([b4, b2, b3, b1]).transpose() # [[ 1 0 0 0]
print("4231") # [ 0 1 0 1]
print(linalg.inv(S) * C * S) # [ 0 1 1 0]
# [ 0 0 0 1]]
S = numpy.matrix([b4, b3, b1, b2]).transpose() # [[ 1 0 0 0]
print("4312") # [ 0 1 0 1]
print(linalg.inv(S) * C * S) # [ 0 0 1 0]
# [ 0 0 1 1]]
S = numpy.matrix([b4, b3, b2, b1]).transpose() # [[ 1 0 0 0]
print("4321") # [ 0 1 1 0]
print(linalg.inv(S) * C * S) # [ 0 0 1 1]
# [ 0 0 0 1]]
S = numpy.matrix([b3, b2, b1, b4]).transpose() # [[ 1 1 0 0]
print("3214") # [ 0 1 1 0]
print(linalg.inv(S) * C * S) # [ 0 0 1 0]
# [ 0 0 0 1]]