2019년 4월 1일 월요일

파이썬 SymPy 기호수학 - 6. 선형대수

파이썬 Sympy 기호수학 - 6. 선형대수

$\qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad $ updated in 2019.09

SymPy 기호수학 - 6. 선형대수

sympy 라이브러리를 불러오고, 사용할 기호 변수를 선언한다. 출력을 LaTex 수식으로 나타내고, 맷플롯립 모듈을 불러온다.

In [1]:
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)는 독립적인 행들의 갯수이다.

In [2]:
A = Matrix( [[1,1],[1,-1]] )
A
Out[2]:
$\displaystyle \left[\begin{matrix}1 & 1\\1 & -1\end{matrix}\right]$

랭크 구하기

In [3]:
A.rank()
Out[3]:
$\displaystyle 2$
In [4]:
A = Matrix( [[1,1],[2,2]] )
A
Out[4]:
$\displaystyle \left[\begin{matrix}1 & 1\\2 & 2\end{matrix}\right]$
In [5]:
A.rank()
Out[5]:
$\displaystyle 1$
In [6]:
A = Matrix( [[1, 4,-5], [5, 2, 1], [2,-1, 3], [3,-6, 11]] )
A
Out[6]:
$\displaystyle \left[\begin{matrix}1 & 4 & -5\\5 & 2 & 1\\2 & -1 & 3\\3 & -6 & 11\end{matrix}\right]$
In [7]:
A.rank()
Out[7]:
$\displaystyle 2$

고유값, 고유벡터

주어진 행렬 $\mathbf A$ 에 대하여

$$ \mathbf {A x} = \lambda \mathbf x $$

을 만족하는 벡터 $\mathbf x$ 와 스칼라 값 $\lambda$ 를 각각 고유벡터(eigenvector), 고유값(eigenvalue)이라 한다.

행렬 A에 대하여

In [8]:
A = Matrix( [[5,-2],[-2,2]] )
A
Out[8]:
$\displaystyle \left[\begin{matrix}5 & -2\\-2 & 2\end{matrix}\right]$

고유값을 구한다.

In [9]:
A.eigenvals()
Out[9]:
$\displaystyle \left\{ 1 : 1, \ 6 : 1\right\}$

고유값은 1 과 6 이며, 다중도는 각각 1이다.

고유벡터를 구한다.

In [10]:
A.eigenvects()
Out[10]:
$\displaystyle \left[ \left( 1, \ 1, \ \left[ \left[\begin{matrix}\frac{1}{2}\\1\end{matrix}\right]\right]\right), \ \left( 6, \ 1, \ \left[ \left[\begin{matrix}-2\\1\end{matrix}\right]\right]\right)\right]$

결과는 고유값, 다중도, 고유벡터 순서로 반환된다.

다중 고유값

In [11]:
B = Matrix( [[-2,2,-3],[2,1,-6],[-1,-2,0]] )
B
Out[11]:
$\displaystyle \left[\begin{matrix}-2 & 2 & -3\\2 & 1 & -6\\-1 & -2 & 0\end{matrix}\right]$
In [12]:
B.eigenvals()
Out[12]:
$\displaystyle \left\{ -3 : 2, \ 5 : 1\right\}$

고유값 -3의 다중도는 2이며 (이중근에 해당), 고유값 5의 다중도는 1이다.

In [13]:
B.eigenvects()
Out[13]:
$\displaystyle \left[ \left( -3, \ 2, \ \left[ \left[\begin{matrix}-2\\1\\0\end{matrix}\right], \ \left[\begin{matrix}3\\0\\1\end{matrix}\right]\right]\right), \ \left( 5, \ 1, \ \left[ \left[\begin{matrix}-1\\-2\\1\end{matrix}\right]\right]\right)\right]$

다중 고유값 -3에 대해서 두 개의 고유벡터들이 얻어진다.

행렬의 대각화

행렬 A에 대하여

In [14]:
A = Matrix( [[5,-2],[-2,2]] )
A
Out[14]:
$\displaystyle \left[\begin{matrix}5 & -2\\-2 & 2\end{matrix}\right]$

고유벡터를 구한다.

In [15]:
Ae = A.eigenvects()
Ae
Out[15]:
$\displaystyle \left[ \left( 1, \ 1, \ \left[ \left[\begin{matrix}\frac{1}{2}\\1\end{matrix}\right]\right]\right), \ \left( 6, \ 1, \ \left[ \left[\begin{matrix}-2\\1\end{matrix}\right]\right]\right)\right]$

결과는 고유값, 다중도, 고유벡터 순서로 반환된다.

첫 번째 고유벡터를 뽑아내기 위해서, 다음과 같이 인덱싱을 시도해보면

In [16]:
Ae[0][2]
Out[16]:
$\displaystyle \left[ \left[\begin{matrix}\frac{1}{2}\\1\end{matrix}\right]\right]$

중첩된 리스트 형태의 열벡터가 반환된다.

괄호를 하나 더 벗기면 열벡터가 되고, 이것을 전치(transpose)하면 행벡터가 얻어진다.

In [17]:
Ae[0][2][0].transpose()
Out[17]:
$\displaystyle \left[\begin{matrix}\frac{1}{2} & 1\end{matrix}\right]$

고유벡터들을 열벡터로 배치한 행렬을 구성하려면,

고유벡터를 행벡터로 배치한 행렬을 만든 다음에 그 행렬을 전치한다.

In [18]:
X = Matrix( [ Ae[0][2][0].transpose(), Ae[1][2][0].transpose() ] ).transpose()
X
Out[18]:
$\displaystyle \left[\begin{matrix}\frac{1}{2} & -2\\1 & 1\end{matrix}\right]$

대각화

고유벡터를 열벡터로 배치한 행렬 X를 이용하여, 상사 변환(similarity transformation)하면 대각행렬이 얻어진다.

$$ \mathbf D = \mathbf X ^{-1} \mathbf { A X }$$

In [19]:
D = X.inv() * A * X
D
Out[19]:
$\displaystyle \left[\begin{matrix}1 & 0\\0 & 6\end{matrix}\right]$

대각 원소는 행렬 A의 고유값과 같다.

행렬의 함수

행렬의 제곱근

행렬 A의 제곱근을 구해보자.

In [20]:
Asqrt = A**(1/2)
Asqrt
Out[20]:
$\displaystyle \left[\begin{matrix}2.15959179422654 & -0.579795897113271\\-0.579795897113271 & 1.28989794855664\end{matrix}\right]$

제곱근 행렬을 두 번 곱하면 그 결과가 A와 같은지 확인해 본다.

In [21]:
Asqrt * Asqrt
Out[21]:
$\displaystyle \left[\begin{matrix}5.0 & -2.0\\-2.0 & 2.0\end{matrix}\right]$

행렬 A의 제곱근 행렬은, 상사변환으로 얻어진 대각 행렬 D의 제곱근을 구하여 이를 역상사 변환한 행렬이다.

$$ \mathbf { A } ^{1/2} = \mathbf { X D } ^{1/2} \mathbf X ^{-1}$$

In [22]:
X * D**(1/2) * X.inv()
Out[22]:
$\displaystyle \left[\begin{matrix}2.15959179422654 & -0.579795897113271\\-0.579795897113271 & 1.28989794855664\end{matrix}\right]$

Numeric Analysis 4 - Numeric Linear Algebra

Numeric Analysis 4 - Numeric Linear Algebra Numeric Linear Algebra ¶ ...