Eigenwaarden en eigenvectoren: Eigenwaarden en eigenvectoren in Python
Eigenwaarden en eigenvectoren
Eigenwaarden en eigenvectoren kun je in Python berekenen met de functie eig, zowel toegepast op numerieke als symbolische matrices. We geven hieronder twee voorbeelden: \[A=\matrix{1 & -3 & 3 \\ 3 & -5 & 3\\ 6 & -6 & 4}\quad\text{en}\quad \matrix{-1 & 1 & -1 \\ -7 & 5 & -1\\ 6 & -6 & -2}\] Deze twee matrices hebben dezelfde karakteristieke veelterm \((t+2)^2(t - 4)\), maar \(A\) is diagonaliseerbaar, terwijl \(B\) dat niet is. Dit komt omdat de eigenruimte bij eigenwaarde \(-2\) in het geval van matrix \(A\) twee eigenvectoren heeft die geen veelvoud van elkaar zijn, terwijl dat in het geval van matrix \(B\) niet zo is.
>>> import sympy as sy
>>> sy.init_printing(use_unicode=True) # voor iets mooiere uitvoer
>>> A = sy.Matrix([[1, -3, 3], [3, -5, 3], [6, -6, 4]]); A
⎡1 -3 3⎤
⎢ ⎥
⎢3 -5 3⎥
⎢ ⎥
⎣6 -6 4⎦
>>> B = sy.Matrix([[-3, 1, -1], [-7, 5, -1], [-6, 6, -2]]); B
⎡-3 1 -1⎤
⎢ ⎥
⎢-7 5 -1⎥
⎢ ⎥
⎣-6 6 -2⎦
>>> t = sy.symbols('t')
>>> sy.factor(A.charpoly(t)) # karakteristieke veelterm van A in t
2
(t - 4)⋅(t + 2)
>>> A.eigenvals() # eigenwaarden van A met algebraïsche multipliciteit
{-2: 2, 4: 1}
>>> A.eigenvects() # eigenvectoren en eigenwaarden van A
⎡⎛ ⎡⎡1⎤ ⎡-1⎤⎤⎞ ⎛ ⎡⎡1/2⎤⎤⎞⎤
⎢⎜ ⎢⎢ ⎥ ⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥⎥⎟⎥
⎢⎜-2, 2, ⎢⎢1⎥, ⎢0 ⎥⎥⎟, ⎜4, 1, ⎢⎢1/2⎥⎥⎟⎥
⎢⎜ ⎢⎢ ⎥ ⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥⎥⎟⎥
⎣⎝ ⎣⎣0⎦ ⎣1 ⎦⎦⎠ ⎝ ⎣⎣ 1 ⎦⎦⎠⎦
>>> sy.factor(B.charpoly(t)) # karakteristieke veelterm van B in t
2
(t - 4)⋅(t + 2)
>>> B.eigenvals() # eigenwaarden van B
{-2: 2, 4: 1}
>>> B.eigenvects() # eigenvectoren en eigenwaarden van B
⎡⎛ ⎡⎡1⎤⎤⎞ ⎛ ⎡⎡0⎤⎤⎞⎤
⎢⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥⎥⎟⎥
⎢⎜-2, 2, ⎢⎢1⎥⎥⎟, ⎜4, 1, ⎢⎢1⎥⎥⎟⎥
⎢⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥⎥⎟⎥
⎣⎝ ⎣⎣0⎦⎦⎠ ⎝ ⎣⎣1⎦⎦⎠⎦
Numerieke berekeningen gaan efficiënter, maar de uitvoer verschilt (in niet-essentiële zin).
>>> import numpy as np
>>> import numpy.linalg as la
>>> A = np.array([[1, -3, 3], [3, -5, 3], [6, -6, 4]]); print(A)
[[ 1 -3 3]
[ 3 -5 3]
[ 6 -6 4]]
>>> B = np.array([[-3, 1, -1], [-7, 5, -1], [-6, 6, -2]]); print(B)
[[-3 1 -1]
[-7 5 -1]
[-6 6 -2]]
>>> t, v = la.eig(A) # eigenvectoren en eigenwaarden van A
>>> print(t) # eigenwaarden van A
[ 4. -2. -2.]
>>> print(v) # eigenvectoren van A als kolommen in een matrix
[[-0.40824829 -0.81034214 0.1932607 ]
[-0.40824829 -0.31851537 -0.59038328]
[-0.81649658 0.49182677 -0.78364398]]
>>> Avmintv = A@(v[:,0])-t[0]*v[:,0]; print(Avmintv) # check 1ste eigenvector
[-8.8817842e-16 -4.4408921e-16 -8.8817842e-16]
>>> Avmintv = np.round(Avmintv); print(Avmintv)
[-0. -0. -0.]
>>> t, v = la.eig(B) # eigenvectoren en eigenwaarden van B
>>> print(t) # eigenwaarden van B
[ 4. -1.99999996 -2.00000004]
>>> t = np.round(t, 6)
>>> print(t) # eigenwaarden van B
[ 4. -2. -2.]
>>> print(v) # eigenvectoren van B als kolommen in een matrix
[[ 8.80956890e-17 -7.07106781e-01 7.07106781e-01]
[-7.07106781e-01 -7.07106781e-01 7.07106781e-01]
[-7.07106781e-01 2.63837509e-08 2.63837487e-08]]
>>> v = np.round(v, 3)
>>> print(v)
[[ 0. -0.707 0.707]
[-0.707 -0.707 0.707]
[-0.707 0. 0. ]]
Merk op dat je in dit geval zelf moet bedenken dat de laatste twee kolomvectoren van \(v\) een veelvoud van elkaar zijn en dat de eigenruimte van \(B\) bij eigenwaarde \(-2\) door één eigenvector opgespannen wordt, ook al geven numerieke antwoorden door afrondingen anders aan.