기본 콘텐츠로 건너뛰기

[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이 아닌 고유값의 수

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...