과제/2학년
[과제 : 2학년] 선형대수_1 (with. Python)
브디크리
2023. 8. 26. 17:06
서론
파이썬을 이용해 선형대수 문제를 풀어보는 과제였다.
문제
해당 연립방정식을 파이썬의 numpy, scipy를 통해 계산한다.
1. numpy.linalg.solve()
>>> import numpy as np
>>> A = ([[0,4,0],[1,1,1],[2,4,5]])
>>> B = np.array([1,1,1])
>>> C = np.linalg.solve(A,B)
>>> print(C)
[ 1.25 0.25 -0.5 ]
- A행렬을 계수행렬로 만듭니다.
- B행렬을 만듭니다.
- np.linalg.solve()를 이용해 해를 구합니다.
2. 역행렬로 해를 계산
>>> import numpy as np
>>> A = ([[0,4,0],[1,1,1],[2,4,5]])
>>> B = np.array([1,1,1])
>>> AI = np.linalg.inv(A)
>>> print(AI)
[[-0.08333333 1.66666667 -0.33333333]
[ 0.25 0. 0. ]
[-0.16666667 -0.66666667 0.33333333]]
>>> X = np.dot(AI,B)
>>> print(X)
[ 1.25 0.25 -0.5 ]
- A와 B행렬을 만듭니다.
- Ax = b 이므로 np.linalg.inv()를 이용해 A의 역행렬 AI를 구해줍니다,
- x = (Ai) b로 해를 구합니다.
3. LU분해로 해를 계산
>>> import numpy as np
>>> A = ([[0,4,0],[1,1,1],[2,4,5]])
>>> B = np.array([1,1,1])
>>> P = np.array([[0,1,0],[1,0,0],[0,0,1]])
>>> PA = np.dot(P,A)
>>> print(PA)
[[1 1 1]
[0 4 0]
[2 4 5]]
>>> PB = np.dot(P,B)
>>> print(PB)
[1 1 1]
>>>
>>> E31 = np.array([[1,0,0],[0,1,0],[-2,0,1]])
>>> A1 = np.dot(E31, PA)
>>> print(A1)
[[1 1 1]
[0 4 0]
[0 2 3]]
>>>
>>> E32 = np.array([[1,0,0],[0,1,0],[0,-0.5,1]])
>>> A2 = np.dot(E32, A1)
>>> print(A2)
[[1. 1. 1.]
[0. 4. 0.]
[0. 0. 3.]]
>>>
>>> U = A2
>>>
>>> L = np.dot(np.linalg.inv(E31), np.linalg.inv(E32))
>>> print(L)
[[1. 0. 0. ]
[0. 1. 0. ]
[2. 0.5 1. ]]
>>>
>>> LI = np.linalg.inv(L)
>>> print(LI)
[[ 1. 0. 0. ]
[ 0. 1. 0. ]
[-2. -0.5 1. ]]
>>> C = np.dot(LI, PB)
>>> print(C)
[ 1. 1. -1.5]
>>>
>>> UI = np.linalg.inv(U)
>>> print(UI)
[[ 1. -0.25 -0.33333333]
[ 0. 0.25 0. ]
[ 0. 0. 0.33333333]]
>>>
>>> X = np.dot(UI,C)
>>> print(X)
[ 1.25 0.25 -0.5 ]
- A와 B행렬을 만들고 P행렬을 이용하여 PA와 PB를 구합니다.(1번행과 2번행을 바꿈)
- 가우스 소거를 통해 U(상삼각행렬)을 구해줍니다.
- 소거행렬의 역행렬을 통해 L(하삼각행렬)을 구해줍니다.
- LC = PB이므로 L의 역함수 LI를 구해준 후 C = (LI)PB를 통해 C를 구해줍니다.
- UX = C이므로 U의 역함수 UI를 구해준 후 X = (UI)C를 통해 해를 구해줍니다.