기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

[Linear Algebra] 고유벡터(Eigenvector)와 고유값(Eigenvalue) 연습

고유벡터(Eigenvector)와 고유값(Eigenvalue) 연습

관련된 내용

예 1)

행렬 A의 특성 방정식과 고유값을 계산해봅니다.

$$ \left[\begin{matrix}1 & 3 & -1.5\\9 & - \frac{27}{2} & 4.5\\7 & - \frac{39}{2} & \frac{15}{2}\end{matrix}\right]$$

행렬 A의 고유값 r을 가정하여 표현한 특성방정식(det(A − λI))은 다음과 같습니다.

다음 코드의 sympy.rational() 함수를 분수를 표시하기 위해 적용한 것입니다.

r=symbols('r', real=True) 
A=Matrix([[1, 3, -1.5],[9, -Rational("27/2"), 4.5],[7, -Rational("39/2"), Rational("15/2")]]) 
cheqM=A-r*eye(3) 
cheqM 

$\left[\begin{matrix}1 - r & 3 & -1.5\\9 & - r - \frac{27}{2} & 4.5\\7 & - \frac{39}{2} & \frac{15}{2} - r\end{matrix}\right]$

cheq=det(cheqM)#특성방정식 
expand(cheq)
-r3 - 5r2 +36.0r
sol=solve(cheq, r)
[sp.N(i, 3) for i in sol]
[-9.00, 0, 4.00]

numpy.linalg.eigvals()함수를 사용하여 고유값을 확인해 봅니다.

eigVal=la.eigvals(np.array(A, dtype=float))
print(np.around(eigVal, 3))
[-9.  4. -0.]

예 2)

행렬 A에 대해 벡터 v가 고유 벡터인지를 결정해 봅니다.

$$A=\begin{bmatrix}1.5& 9\\1.0& -3.0\end{bmatrix},\quad v=\begin{bmatrix}-6\\ -1\end{bmatrix}$$

v가 A의 고유 벡터라면 식 1에 의해 고유값을 결정할 수 있습니다. 먼저 고유값을 결정하면 다음과 같습니다.

\begin{align}Av & = λv\\(A − λ)v &= 0\\\text{조건)}&\; λ ≠ 0\end{align}(식 1)
l=symbols('lamda') 
A=Matrix([[1.5, 9],[1,-3]]) 
v=Matrix([[-6],[-1]]) 
cheM=A-l*eye(2) 
cheM

$\left[\begin{matrix}1.5 - \lambda & 9\\1 & - \lambda - 3\end{matrix}\right]$

eig_val=solve(det(cheM), l)
print(np.array(eig_val, dtype=float).round(3))
[-4.5  3. ]

벡터 v에 대응하는 고유값을 결정하기 위해서는 Av = λv를 적용합니다.

print(A*v ==eig_val[0]* v)
print(A*v ==eig_val[1]* v)
False
True

벡터 v에 대응하는 고유값은 3입니다. np.linalg.eig() 함수를 적용하여 고유값과 고유벡터를 확인해 봅니다.

eig_val, eig_vec=la.eig(np.array(A, dtype=float))
print(eig_val)
[ 3.  -4.5]
print(eig_vec.round(3))
[[ 0.986 -0.832]
 [ 0.164  0.555]]

위 결과는 고유값 3에 대응하는 고유벡터는 벡터 v와는 다른 값입니다. 그러나 이 둘은 스칼라배의 관계를 가집니다.

v=np.array(v, dtype=float)
x=v[0]/eig_vec[0,0]
x
array([-6.08276253])
np.allclose(v, x*eig_vec[:,0].reshape(-1,1))
True

예 3)

행렬 A에 대해 고유 벡터는 v인지를 결정합니다.

$$A=\begin{bmatrix}1& 6\\ 4& 2\end{bmatrix},\quad v=\begin{bmatrix}0\\0\end{bmatrix}$$

정의상 0벡터는 고유벡터가 될 수 없습니다.

예 4)

예 3의 행렬 A의 고유값이 7인 경우 고유벡터를 결정해 봅니다.

이 문제는 식 2와 같이 행렬 A와 고유값 7 사이의 특성 방정식 A - 7·I에 대한 선형결합이 성립하는지의 여부를 결정하는 것입니다.

\begin{align}A=\begin{bmatrix}1& 6\\ 4& 2\end{bmatrix}& \Rightarrow \begin{bmatrix}1& 6\\ 4& 2\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=7\begin{bmatrix}x_1\\x_2\end{bmatrix} \\ &\Rightarrow \left(\begin{bmatrix}1& 6\\ 4& 2\end{bmatrix}-7\begin{bmatrix}1& 0\\0 & 1\end{bmatrix} \right)\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}\\ &\Rightarrow \begin{bmatrix}-6& 6\\5 & -5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}\end{align} (식 2)
A=np.array([[1,6],[5,2]])
i7=7*np.eye(2)
c=np.zeros([2,1])
Ai7=A-i7
print(Ai7)
[[-6.  6.]
[ 5. -5.]]
Matrix(np.hstack([Ai7, c])).rref()
(Matrix([
[1, -1.0, 0],
[0,    0, 0]]),
(0,))

특성방정식의 기약행 사다리꼴 형태 (rref)는 한 개의 피벗 열과 한 개의 자유 변수로 구성되며 자유변수에 의해 다양한 해를 가집니다. 다양한 해들의 영공간이 고유값 7에 대응하는 고유벡터가 됩니다.

Matrix(Ai7).nullspace()
[Matrix([
[1.0],
[  1]])]

numpy.linalg.eig() 함수를 사용하여 고유 벡터를 계산해보면 다음과 같습니다.

eigVal, eigVec=la.eig(A)
eigVal
array([-4.,  7.])
print(eigVec.round(3))
[[-0.768 -0.707]
 [ 0.64  -0.707]]

식 1의 성립여부를 확인합니다.

np.isclose(A@eigVec[:,1], eigVal[1]*eigVec[:,1])
array([ True,  True])

예 5)

행렬 A에 대해 고유값 2에서의 고유공간을 결정하고 A와 벡터 c와의 선형결합이 독립 또는 종속임을을 결정합니다.

$$A=\begin{bmatrix}4& -1& 6\\2& 1& 6\\2& -1& 8\end{bmatrix},\quad c=\begin{bmatrix}0\\0\\0\end{bmatrix}$$

다음은 행렬 A에 대한 고유값과 고유벡터입니다. 이 결과에 의하면 고유값 2에 대응하는 고유 벡터는 2개입니다.

A=np.array([[4,-1,6], [2,1,6], [2,-1,8]])
print(A)
[[ 4 -1  6]
 [ 2  1  6]
 [ 2 -1  8]]
eigVal, eigVec=la.eig(A) 
print(np.around(eigVal, 3))
[9. 2. 2.]
print(eigVec.round(3))
[[-0.577 -0.633  0.133]
 [-0.577 -0.77  -0.969]
 [-0.577  0.083 -0.206]]

고유벡터는 원시행렬의 기저벡터로 구성됩니다. 그러므로 고유공간의 열벡터 수와 원시행렬의 급수는 같습니다.

la.matrix_rank(A)
3

위 결과는 행렬 A가 기저행렬임을 나타내는 것으로서 Ax = c가 선형독립임을 의미합니다. 이것은 A와 c의 확대행렬에 대한 rref로서 확인할 수 있습니다.

c=np.array([0,0,0])
Ac=np.c_[A, c]
print(Ac)
[[ 4 -1  6  0]
 [ 2  1  6  0]
 [ 2 -1  8  0]]
Matrix(Ac).rref()
(Matrix([
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]),
(0, 1, 2))

예 6)

행렬 A의 고유값들은 [-2, 2, 3]입니다. 이 값들에 대응하는 각 고유벡터를 결정하고 A가 기저행렬임을 결정합니다.

$$A=\begin{bmatrix}-6&-2& 6\\-8&-1&7\\-8& -4& 10\end{bmatrix}$$

A=np.array([[-6,-2, 6], [-8,-1,7], [-8, -4, 10]])
print(A)
[[-6 -2  6]
 [-8 -1  7]
 [-8 -4 10]]
eigVal, eigVec=la.eig(A)
print(eigVal)
[-2.  2.  3.]
print(np.around(eigVec, 3))
[[-0.577  0.333  0.371]
[-0.577  0.667  0.557]
[-0.577  0.667  0.743]]

위 고유행렬의 3개의 열벡터로 구성됩니다. 즉, 행렬 A는 기저행렬임을 의미합니다.

la.matrix_rank(A)
3
고유벡터
  • 고유 공간을 구성하는 고유 벡터들은 모두 기저 벡터들 입니다.
  • 고유벡터의 수는 원시행렬의 급수를 나타냅니다.
  • 그 고유 벡터들(v1, v2, …, vr)에 의한 선형결합은 선형독립입니다.

예 7)

다음 행렬의 고유값과 고유벡터를 결정해 봅니다.

$$A=\begin{bmatrix}3&6&-8\\0&0&6\\0&0&2\end{bmatrix}$$

A=np.array([[3,6,-8],[0,0,6],[0,0,2]])
  print(A)
[[ 3  6 -8]
 [ 0  0  6]
 [ 0  0  2]]
la.matrix_rank(A)
2

행렬 A의 급수는 2이므로 1개의 자유변수가 존재합니다. 그러므로 존재하는 고유벡터들 중 기저는 2개가 됩니다. 이 기저벡터에 대응하는 행렬 A의 벡터는 열공간(columnsapce)으로 나타낼 수 있습니다.

eigVal, eigVec=la.eig(A)
print(eigVal)
[3., 0., 2.]
print(np.around(eigVec, 3))
[[ 1.    -0.894 -0.953]
 [ 0.     0.447  0.286]
 [ 0.     0.     0.095]]
print(Matrix(A).columnspace())
[Matrix([
  [3],
  [0],
  [0]]), Matrix([
  [-8],
  [ 6],
  [ 2]])]

위 결과는 고유값 3개에 대한 고유벡터 역시 3개이지만 열공간에 의하면 기저 벡터는 2개 입니다. 이러한 차이는 고유값 0인 경우에서 발생합니다. 즉, 고유값 또는 고유벡터는 0 또는 0벡터가 아닙니다.

식 3과 같이 고유값이 0인 경우 A의 선형결합은 선형 독립 또는 선형 종속의 모든 가능성을 가집니다. 위 결합이 선형종속이면 고유값과 고유벡터가 가역행렬로부터 계산된다는 정의에 위배 됩니다. 또한 선형독립이면 그 행렬에 관계된 특성방정식이 존재하지 않습니다. 그러므로 고유벡터 역시 존재할 수 없습니다.

A·x = 0x → A·x = 0 (식 3)

다음과 같이 정리됩니다.

고유값의 수
  • 원시행렬의 열공간의 수
  • = 원시행렬의 급수(rank)
  • = 0이 아닌 고유값의 수

댓글