Divide and Conquer

선형 연립방정식의 해법 본문

성장캐/수치해석

선형 연립방정식의 해법

10살 2022. 4. 25. 22:43
728x90
선형대수 linear algebra  
선형 연립방정식을 다루는 수학의 한 분야  
행렬의 연산에 대해 다룸 ex. norm  
간단한 연립방정식의 해를 구하는 것으로부터 복잡한 사물의 움직임이나 자연 현상을 알아보고자 하는 데 사용되는 미분방정식의 해를 구하는 것을 포함
선형 연립방정식 system of linear equation  
선형화: 비선형을 일부만 잘라 선형처럼 해석하는 것 →선형 연립방정식    

기본적으로 선형 연립방정식은 
`방정식의 해가 존재해야 함`
`행렬 A의 대각선 성분이 0이 아니어야 한다.`
선형 연립방정식의 해법 종류
Ax=b의 해를 구하기  
가장 직관적인 방법 : x = {A}^{-1}b  
행렬이 커지면 역행렬을 구하는데 상대적으로 많은 비용이 들기 때문에 비효율적  
행렬식
행렬의 규모를 스칼라값으로 정의
행렬의 규모가 0이면 역행렬 못 구함
연립방정식의 해의 유무를 알 수 있다
import numpy as np
from numpy.linalg import det

연립방정식을 수치해법으로 풀자  

직접법(direct method)
 반복법(iterative method)
Cramer 방법
Jacobi 방법
가우스 소거법
 Gauss-Seidel 방법
LU분해법
SOR방법

Cramer 공식  

Ax = b의 계수 A의 행렬식으로 미지수 x를 구함
A는 미지수의 계수들, b는 결과 
행렬계수의 크기가 3을 넘어가면 수치해석적인 측면에서 볼 때 대단히 `비효율`  
$O(n\times n!)$ = 3*3!
-------------------------
행렬식 A는 아는 방법대로

|A1|은 a11 a22에 b1 b2 넣고 행렬식
b1 a12
b2 a22

x1 = |A1| / |A|

# 역행렬 구하기
import numpy as np
a = np.array([[50, 30],[7, 12]])
ainv = np.linalg.inv(a)  

b = np.array([1000, 500])
x = np.dot(ainv, b)

print(x) 
print(np.dot(a, ainv))
import numpy as np
from numpy.linalg import det    # 행렬식 함수

A = np.array([[4, 1, -1],[3, -1, 2], [-1, 2, 3]])
b = np.array([-2, 1, 1])

# 어디에 들어갔는지 잘 봐
A1 = np.array([[-2, 1, -1], [1, -1, 2], [1, 2, 3]]) 
A2 = np.array([[4, -2, -1], [3, 1, 2], [-1, 1, 3]])
A3 = np.array([[4, 1, -2], [3, -1, 1], [-1, 2, 1]])

detA = det(A)

detA1 = det(A1)
detA2 = det(A2)
detA3 = det(A3)

print('|A| = ', detA, '|A1| = ', detA1, '|A2| = ', detA2, '|A3| = ', detA3)

x1 = detA1 / detA # 첫번쨰 미지수
x2 = detA2 / detA # 해의 존재성 여부를 사전에 알 수 있다
x3 = detA3 / detA # 세번쨰 미지수

print('x1 = ', x1, 'x2 = ', x2, 'x3 = ', x3)
# 모듈화
import numpy as np
from numpy.linalg import det  

A = np.array([[5, -1, 1],[-1, 3,-1], [1, -1,4]])
b = np.array([6,2,11])

def crammer(A,b):
    n = len(b)
    Tdet = np.zeros(n)
    x = np.zeros(n)
    detA = det(A)
    
    for i in range(n):
        Atemp = A.copy()
        Atemp[:,i] = b
        Tdet[i] = det(Atemp)
        x[i] = Tdet[i] / detA
    return Tdet, x

All_det, x = crammer(A, b)

print('det(A) =  %8.4f' % det(A))

print('det(A1) =  %8.4f' % All_det[0])
print('det(A2) =  %8.4f' % All_det[1])
print('det(A3) =  %8.4f' % All_det[2])

print('x1 = %8.4f' % x[0])
print('x2 = %8.4f' % x[1])
print('x3 = %8.4f' % x[2])

직접법 direct method

주어진 방정식의 계수행렬을 echelone 형태로 만들어서 보다 풀기 쉬운 형태로 만들어 줌
x의 벡터를 구하고 싶고 A는 계수
A행렬을 Echelon꼴로 만든다 
계산이 쉬운 이유: 연립방정식의 개념으로 봐 →대입법의 형태가 직접법이다

에셜런 Echelon    

사다리꼴 행렬   
상삼각: 주대각 아래는 전부 0이고 위에는 상관없음
반응형

'성장캐 > 수치해석' 카테고리의 다른 글

수치미분 numerical differentiation  (0) 2022.06.20
Gauss 소거법 Gauss Elimination  (0) 2022.04.25
할선법 Secant Method  (0) 2022.04.25
뉴튼랩슨 Newton-Raphson  (0) 2022.04.25
고정점 방법 Fixed point Method  (0) 2022.04.25
Comments