[Algebra] 행렬과 대수를 위한 파이썬 계산기 구현 및 예제 (1)

yourmean·2021년 1월 30일
1

TIL

목록 보기
2/3
post-thumbnail

행렬과 대수 II 과목을 수강하면서 나를 너무너무 힘들게 했던 건.. 끝없는 과제
결국 행대 과제를 위한 계산기를 만들었고 학기 내도록 아주 유용하게 사용했었다.
생각난 김에 오늘의 TIL로 포스팅하기로!

  • chapter 구분은 강의교재인 통계학을 위한 행렬대수학 의 목차를 따르며,
    이번 포스팅에서는 9장의 구현에 초점을 둔다.
  • 새끼문제 출제 가능성을 고려하여 코드의 간결성보다는 중간중간 검산이 가능하도록 하는 데에 초점을 두고 구현하였다.
  • 이해를 돕기 위해 예시 행렬을 대입하여 실행한 결과를 코드와 함께 첨부하였다.
  • 코드 실행에 앞서, sympy와 numpy를 import해 주어야 한다.
# module import
from sympy import *
import numpy as np

📌행렬 Norm

행렬 AA가 정방행렬이 아닌 경우에도 계산이 가능하도록 구현했다.

1. Euclidean Norm

  • 행렬 AA의 유클리드 노음: AA의 모든 원소의 제곱합들의 제곱근
A = np.array([[6,0,4],[4,0,0]])
sqrt((A**2).sum()) 

#Answer: 2*sqrt(17)

2. Spectral Norm

  • 행렬 AA의 스펙트럼 노음: ATAA^{T}*A 의 가장 큰 고유값의 제곱근
    여기서 ATA^{T}AA의 전치행렬(Transpose).
    ATA^{T}AA의 순서를 바꾸어 계산하지 않도록 주의
sqrt(max((A.T*A).eigenvals()))

#Answer: 8

📌행렬의 무한급수

  • k=1Ak=(IA)1\sum_{k=1}^{\infty} A^{k} = (I-A)^{-1}
A= Matrix([[1/2,0,0],[-1/2,1/3,0],[-1/5,-1/8,-1/4]])
n= sqrt(len(A)) #행렬의 차원
(eye(n)-A).inv()

#Answer:
# Matrix([
# [  2.0,     0,   0],
# [ -1.5,   1.5,   0],
# [-0.17, -0.15, 0.8]])

📌초기값 x0x_{0}가 주어질 때, 근사해 x1x_{1}구하기

1. 정석(=교수님이 원하셨던) 풀이

1-1.설명을 곁들인 (친절한) 풀이 추가

2. python 으로 옮긴 풀이

검산이 가능하도록 단계별로 나누어 구현하였다.

# 주어진 행렬함수 f(x)
def f(x,y):
    fx= 20*x*y-10*x-4*(x**3)
    fy= 10*(x**2)-8*x-8*(x**3)
    return Matrix([fx,fy])

# G(x) 계산
def G():
    x,y=symbols('x y')
    fx= 20*x*y-10*x-4*(x**3)
    fy= 10*(x**2)-8*x-8*(x**3)
    G = Matrix([[diff(fx,x), diff(fx,y)],
                [diff(fy,x),diff(fy,y)]])
    return G

# x0, y0에 주어진 초기값 대입
x0= 1
y0= 1

step1. f(x0)

f(x0,y0)

Answer : [66]\begin{bmatrix} 6\\ -6 \end{bmatrix}

step2. G(x,y)

G=G()
G

Answer : [12x2+20y1020x24x2+20x80]\begin{bmatrix} −12x^{2}+20y−10 & 20x \\ −24x^{2}+20x−8 & 0 \end{bmatrix}

step3. G(x0,y0), Gx0inv
G(x0,y0)를 계산해서 Gx0에 대입한 후, 역행렬 계산

Gx0 = Matrix([[-2,20],[-12,0]])
Gx0inv = -Gx0.inv()
Gx0inv

Answer : [01121201120]\begin{bmatrix} 0 & \frac{1}{12} \\ -\frac{1}{20} & \frac{1}{120} \end{bmatrix}

step4. 0△_{0}

tri0=Gx0inv * Matrix([[f(x0,y0)[0],f(x0,y0)[1]]]).T
tri0

Answer : [12720]\begin{bmatrix} -\frac{1}{2} \\ -\frac{7}{20} \end{bmatrix}

step5. (드디어) 근사해 x1x_{1}

x1 = Matrix([x0,y0]) + tri0
x1

Answer : [121320]\begin{bmatrix} \frac{1}{2} \\ \frac{13}{20} \end{bmatrix}

profile
𝐼 𝑒𝑖𝑡ℎ𝑒𝑟 𝑤𝑖𝑛 𝑜𝑟 𝑙𝑒𝑎𝑟𝑛 💪🏻

0개의 댓글