$\qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad $ updated in 2019.09
SymPy 기호수학 - 6. 선형대수¶
sympy 라이브러리를 불러오고, 사용할 기호 변수를 선언한다. 출력을 LaTex 수식으로 나타내고, 맷플롯립 모듈을 불러온다.
from sympy import *
x, y, z, t = symbols('x y z t')
f, g, h = symbols('f, g, h', cls=Function)
init_printing()
%matplotlib inline
선형대수¶
랭크¶
행렬의 랭크(rank)는 독립적인 행들의 갯수이다.
A = Matrix( [[1,1],[1,-1]] )
A
랭크 구하기
A.rank()
A = Matrix( [[1,1],[2,2]] )
A
A.rank()
A = Matrix( [[1, 4,-5], [5, 2, 1], [2,-1, 3], [3,-6, 11]] )
A
A.rank()
고유값, 고유벡터¶
주어진 행렬 $\mathbf A$ 에 대하여
$$ \mathbf {A x} = \lambda \mathbf x $$을 만족하는 벡터 $\mathbf x$ 와 스칼라 값 $\lambda$ 를 각각 고유벡터(eigenvector), 고유값(eigenvalue)이라 한다.
행렬 A에 대하여
A = Matrix( [[5,-2],[-2,2]] )
A
고유값을 구한다.
A.eigenvals()
고유값은 1 과 6 이며, 다중도는 각각 1이다.
고유벡터를 구한다.
A.eigenvects()
결과는 고유값, 다중도, 고유벡터 순서로 반환된다.
다중 고유값
B = Matrix( [[-2,2,-3],[2,1,-6],[-1,-2,0]] )
B
B.eigenvals()
고유값 -3의 다중도는 2이며 (이중근에 해당), 고유값 5의 다중도는 1이다.
B.eigenvects()
다중 고유값 -3에 대해서 두 개의 고유벡터들이 얻어진다.
행렬의 대각화¶
행렬 A에 대하여
A = Matrix( [[5,-2],[-2,2]] )
A
고유벡터를 구한다.
Ae = A.eigenvects()
Ae
결과는 고유값, 다중도, 고유벡터 순서로 반환된다.
첫 번째 고유벡터를 뽑아내기 위해서, 다음과 같이 인덱싱을 시도해보면
Ae[0][2]
중첩된 리스트 형태의 열벡터가 반환된다.
괄호를 하나 더 벗기면 열벡터가 되고, 이것을 전치(transpose)하면 행벡터가 얻어진다.
Ae[0][2][0].transpose()
고유벡터들을 열벡터로 배치한 행렬을 구성하려면,
고유벡터를 행벡터로 배치한 행렬을 만든 다음에 그 행렬을 전치한다.
X = Matrix( [ Ae[0][2][0].transpose(), Ae[1][2][0].transpose() ] ).transpose()
X
대각화
고유벡터를 열벡터로 배치한 행렬 X를 이용하여, 상사 변환(similarity transformation)하면 대각행렬이 얻어진다.
$$ \mathbf D = \mathbf X ^{-1} \mathbf { A X }$$
D = X.inv() * A * X
D
대각 원소는 행렬 A의 고유값과 같다.
행렬의 함수¶
행렬의 제곱근
행렬 A의 제곱근을 구해보자.
Asqrt = A**(1/2)
Asqrt
제곱근 행렬을 두 번 곱하면 그 결과가 A와 같은지 확인해 본다.
Asqrt * Asqrt
행렬 A의 제곱근 행렬은, 상사변환으로 얻어진 대각 행렬 D의 제곱근을 구하여 이를 역상사 변환한 행렬이다.
$$ \mathbf { A } ^{1/2} = \mathbf { X D } ^{1/2} \mathbf X ^{-1}$$
X * D**(1/2) * X.inv()