固有値と固有ベクトル
固有値の復習
固有値の復習からです。
以下のn次の正方行列\( A \)が与えられていたとします。
\[
A = \left(
\begin{array}{llll}
a_{11} & a_{12} & … & a_{1n} \\
a_{21} & a_{22} & … & a_{2n} \\
: & : & … & : \\
a_{n1} & a_{n2} & … & a_{nn}
\end{array}
\right)
\]
この行列に対し、
\[
Ax = \lambda x
\]
となる\( x \neq 0 \)が存在する時、\(\lambda\)を\( A \)の固有値と呼びます。また、\( x \)を固有ベクトルと呼びます。
固有値を自力で計算するには固有方程式の解が必要になりますが、Numpyではlinalg.eigで算出することができます。
linalg.eig
ではさっそく使ってみましょう。今回はサンプルとして、3行3列の行列を使用してみます。戻り値はw、vの2つでそれぞれ固有値と固有ベクトルとなります。
import numpy as np a = np.array([[2, 1, 1],[1, 2, 1],[1, 1, 2]]) # array([[2, 1, 1], # [1, 2, 1], # [1, 1, 2]]) w, v = np.linalg.eig(a) w # array([ 1., 4., 1.]) v # array([[-0.81649658, 0.57735027, 0.381008 ], # [ 0.40824829, 0.57735027, -0.81590361], # [ 0.40824829, 0.57735027, 0.43489561]]) #
固有方程式が重解を持つ場合でも、linalg.eigの戻り値は重複した値を返すという点に注意してください。上の行列の固有値方程式は、\( (\lambda - 1)^2(\lambda - 4) = 0 \)で1は重解ですが、wで1が2つ返されています。vでwの添字に対応した固有ベクトルが返されます。
検算してみましょう。
まずは固有値が1の場合です。固有ベクトルは以下の平面となります。(s、tは任意の数とします。)
\[
x = s \left(
\begin{array}{l}
-0.81649658 \\
0.40824829 \\
0.40824829
\end{array}
\right)
+
t \left(
\begin{array}{l}
0.381008 \\
-0.81590361 \\
0.43489561
\end{array}
\right)
\]
検算は以下のとおりとなります。
l = w[0] # 固有値1 x = np.array([v[:, 0], v[:, 2]]).T # 固有ベクトル np.dot(a, x) # array([[-0.81649658, 0.381008 ], # [ 0.40824829, -0.81590361], # [ 0.40824829, 0.43489561]]) l * x # array([[-0.81649658, 0.381008 ], # [ 0.40824829, -0.81590361], # [ 0.40824829, 0.43489561]])
元の行列と固有値、固有ベクトルの関係が示されました。
次に固有値が4の場合です。固有ベクトルは以下の通りです。
\[
x = t \left(
\begin{array}{l}
0.57735027 \\
0.57735027 \\
0.57735027
\end{array}
\right)
\]
検算してみましょう。
l = w[1] # 固有値4 x = np.array([v[:, 1]]).T # 固有ベクトル np.dot(a, x) # array([[ 2.30940108], # [ 2.30940108], # [ 2.30940108]]) l * x # array([[ 2.30940108], # [ 2.30940108], # [ 2.30940108]]) #
こちらもやはり元の行列と固有値、固有ベクトルの関係が示されました。
補足
上のサンプルを手で計算するとシンプルに以下のようになります(もちろん計算方法に依存しますが)。
固有方程式
\[
(\lambda - 1)^2 (\lambda - 4) = 0
\]
上を解くと
\[
\lambda = 1, 4
\]
\( \lambda = 1 \)の場合の固有ベクトル
\[
x = s \left(
\begin{array}{l}
-1 \\
1 \\
0
\end{array}
\right)
+
t \left(
\begin{array}{l}
-1 \\
0 \\
1
\end{array}
\right)
\]
\( \lambda = 4 \)の場合の固有ベクトル
\[
x = t \left(
\begin{array}{l}
1 \\
1 \\
1
\end{array}
\right)
\]
ユニークではないため当然といえば当然ですが、固有ベクトルが教科書通りの値とは異なる点に注意してください。