과제/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 ]
  1. A행렬을 계수행렬로 만듭니다.
  2. B행렬을 만듭니다.
  3. 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 ]
  1. A와 B행렬을 만듭니다.
  2. Ax = b 이므로 np.linalg.inv()를 이용해 A의 역행렬 AI를 구해줍니다,
  3. 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 ]
  1. A와 B행렬을 만들고 P행렬을 이용하여 PA와 PB를 구합니다.(1번행과 2번행을 바꿈)
  2. 가우스 소거를 통해 U(상삼각행렬)을 구해줍니다.
  3. 소거행렬의 역행렬을 통해 L(하삼각행렬)을 구해줍니다.
  4. LC = PB이므로 L의 역함수 LI를 구해준 후 C = (LI)PB를 통해 C를 구해줍니다.
  5. UX = C이므로 U의 역함수 UI를 구해준 후 X = (UI)C를 통해 해를 구해줍니다.