Divide and Conquer
선형 연립방정식의 해법 본문
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