Loading [MathJax]/jax/output/HTML-CSS/jax.js

2019년 4월 1일 월요일

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

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

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]:
[1111]

랭크 구하기

In [3]:
A.rank()
Out[3]:
2
In [4]:
A = Matrix( [[1,1],[2,2]] )
A
Out[4]:
[1122]
In [5]:
A.rank()
Out[5]:
1
In [6]:
A = Matrix( [[1, 4,-5], [5, 2, 1], [2,-1, 3], [3,-6, 11]] )
A
Out[6]:
[1455212133611]
In [7]:
A.rank()
Out[7]:
2

고유값, 고유벡터

주어진 행렬 A 에 대하여

Ax=λx

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

행렬 A에 대하여

In [8]:
A = Matrix( [[5,-2],[-2,2]] )
A
Out[8]:
[5222]

고유값을 구한다.

In [9]:
A.eigenvals()
Out[9]:
{1:1, 6:1}

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

고유벡터를 구한다.

In [10]:
A.eigenvects()
Out[10]:
[(1, 1, [[121]]), (6, 1, [[21]])]

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

다중 고유값

In [11]:
B = Matrix( [[-2,2,-3],[2,1,-6],[-1,-2,0]] )
B
Out[11]:
[223216120]
In [12]:
B.eigenvals()
Out[12]:
{3:2, 5:1}

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

In [13]:
B.eigenvects()
Out[13]:
[(3, 2, [[210], [301]]), (5, 1, [[121]])]

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

행렬의 대각화

행렬 A에 대하여

In [14]:
A = Matrix( [[5,-2],[-2,2]] )
A
Out[14]:
[5222]

고유벡터를 구한다.

In [15]:
Ae = A.eigenvects()
Ae
Out[15]:
[(1, 1, [[121]]), (6, 1, [[21]])]

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

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

In [16]:
Ae[0][2]
Out[16]:
[[121]]

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

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

In [17]:
Ae[0][2][0].transpose()
Out[17]:
[121]

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

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

In [18]:
X = Matrix( [ Ae[0][2][0].transpose(), Ae[1][2][0].transpose() ] ).transpose()
X
Out[18]:
[12211]

대각화

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

D=X1AX

In [19]:
D = X.inv() * A * X
D
Out[19]:
[1006]

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

행렬의 함수

행렬의 제곱근

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

In [20]:
Asqrt = A**(1/2)
Asqrt
Out[20]:
[2.159591794226540.5797958971132710.5797958971132711.28989794855664]

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

In [21]:
Asqrt * Asqrt
Out[21]:
[5.02.02.02.0]

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

A1/2=XD1/2X1

In [22]:
X * D**(1/2) * X.inv()
Out[22]:
[2.159591794226540.5797958971132710.5797958971132711.28989794855664]

댓글 없음:

댓글 쓰기

Numeric Analysis 4 - Numeric Linear Algebra

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