Numpy入門 基本的な線形代数計算 その4 固有値

固有値と固有ベクトル

固有値の復習

固有値の復習からです。

以下の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)
\]

ユニークではないため当然といえば当然ですが、固有ベクトルが教科書通りの値とは異なる点に注意してください。