上の式はベクトル \(\left(\begin{array}{r}2\\2\end{array}\right)\) が行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) によって \(\left(\begin{array}{r}18\\8\end{array}\right)\) というベクトルに一次変換されたことを意味します.つまり,行列はある向きと大きさを持つベクトルを別のベクトルに変換することができます.
いま行列 \(A\) について向きを変えないような特別なベクトルがあるかどうか,またその大きさは何倍になるかを考えます.例えば,行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) をベクトル \(\left(\begin{array}{r}2\\1\end{array}\right)\) に作用させると,
となります.これは \(\left(\begin{array}{r}2\\1\end{array}\right)\) というベクトルの方向を変えずに大きさだけを7倍していることを意味します.
また
も \(\left(\begin{array}{r}-2\\3\end{array}\right)\) というベクトルの方向を変えずに大きさだけを -1 倍していることを意味します.ここで,7 と -1 が行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) に対する固有値であり,ベクトル \(\left(\begin{array}{r}2\\1\end{array}\right)\) は固有値 7 に対する固有ベクトル,ベクトル \(\left(\begin{array}{r}-2\\3\end{array}\right)\) は固有値 -1 に対する固有ベクトルです.
固有値,固有ベクトルの定義は次のようになります.
ある \(n\) 次正方行列 \(A\) に対し
を満たす \(n\) 次元列ベクトル \(\boldsymbol{x}\) \((\boldsymbol{x} \neq 0)\) が存在するとき \(\lambda\) を \(A\) の固有値といい,\(\boldsymbol{x}\) を \(\lambda\) に対する固有ベクトルといいます.
Python の NumPy で行列の固有値 (eigenvalue),固有ベクトル (eigenvector) を求めるには,np.linalg.eig()
を用いると良いでしょう.上の行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) について固有値と固有ベクトルを求めてみよう.
まず,行列を定義します.
行列の定義
import numpy as np # プログラムの先頭でモジュールを読み込む
A = np.array([[5, 4], [3, 1]])
print(A)
[[5 4] [3 1]]
固有値 (w) と固有ベクトル (v) を np.linalg.eig()
によって求める.
固有値と固有ベクトルの計算
w, v = np.linalg.eig(A)
固有値を表示してみます.
固有値の表示
print("固有値")
print(w)
固有値 [ 7. -1.]
固有ベクトルを表示してみます.
固有ベクトルの表示
print("固有ベクトル")
print(v)
固有ベクトル [[ 0.89442719 -0.5547002 ] [ 0.4472136 0.83205029]]
つまり,固有値 7 に対する固有ベクトルが [0.89442719, 0.4472136]であり,固有値 -1 に対する固有ベクトルが [-0.5547002, 0.83205029] です.なお,固有ベクトルは任意の定数を含んでいるので,線形代数の教科書に登場するような固有ベクトルが整数化できるよう調整された問題であれば整数化しても良いでしょう.それぞれの固有値に対する固有ベクトルを上で求めたように変換することもできます.
固有値 7 の固有ベクトル
print("固有値", w[0], "に対する固有ベクトル")
print(v[:,0]/v[1,0])
固有値 7.0 に対する固有ベクトル [2. 1.]
固有値 -1 の固有ベクトル
print("固有値", w[1], "に対する固有ベクトル")
print(v[:,1]/v[1,1]*3)
固有値 -1.0 に対する固有ベクトル [-2. 3.]
これらの固有ベクトルはここで例示したものと一致した.