오류에 대한 지적이나 질문, 토의 환영합니다. 자유롭게 댓글 남겨주세요!.!
- 해가 하나인 경우
- 해가 여러개인 경우
- 해가 없는 경우
- 위와 같은 A의 꼴을 아래와 같이 변형하는 방법입니다.
- 이후 후방 대입법을 이용하여 의 값을 찾아갑니다.
- 이렇게 가장 아래 식에 의해서 이 구해지고, 두번 째 식에 의해서 이 구해지고, 가장 위의 식에 의해서 이 구해집니다.
전방 소거법에 사용되는 기본행 연산
1. 치환 (replacement)
2. 교환 (interchange)
3. 스케일링 (scailing)
전방소거법의 가치
가우스 소거법의 전방소거법을 행렬로 코드화한 것입니다.
행렬 를 꼴로 변형시키는 분해입니다.
LU 분해의 장점
<=> <=>
=> => : 전방 대치법으로 쉽게 계산 가능
=> => : 후방 대치법으로 쉽게 계산 가능
LU 분해의 활용
import numpy as np
import scipy
import scipy.linalg # LU 분해를 사용하기 위한 import
A = np.array([[3, 1, 1], [1, -2, -1], [1, 1, 1]])
b = np.array([4, 1, 2])
print("A:", A)
print(np.shape(A))
print("b:", b)
print(np.shape(b))
A: [[ 3 1 1]
[ 1 -2 -1]
[ 1 1 1]]
(3, 3)
b: [4 1 2]
(3,)
P, L, U = scipy.linalg.lu(A)
print("P:", P)
print("L:", L)
print("U:", U)
AA = P @ L @ U
print("AA:", AA)
P: [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
L: [[ 1. 0. 0. ]
[ 0.33333333 1. 0. ]
[ 0.33333333 -0.28571429 1. ]]
U: [[ 3. 1. 1. ]
[ 0. -2.33333333 -1.33333333]
[ 0. 0. 0.28571429]]
AA: [[ 3. 1. 1.]
[ 1. -2. -1.]
[ 1. 1. 1.]]
lu, piv = scipy.linalg.lu_factor(A)
x = scipy.linalg.lu_solve((lu, piv), b)
print("x:", x)
print(np.shape(x))
bb = A@x
print("bb:", bb)
x: [ 1. -1. 2.]
(3,)
bb: [4. 1. 2.]
bbb = L@U@x
print('bbb:', bbb)
[4. 1. 2.]
A = np.array([[1, 3], [-2, 1]])
print("A:", A)
A: [[ 1 3]
[-2 1]]
print("rank:", np.linalg.matrix_rank(A))
A_inv = np.linalg.inv(A)
print(A_inv)
rank: 2
[[ 0.14285714 -0.42857143]
[ 0.28571429 0.14285714]]
P, L, U = scipy.linalg.lu(A)
print("P:", P)
print("L:", L)
print("U:", U)
A_ = P @ L @ U
print("A_:", A_)
P: [[0. 1.]
[1. 0.]]
L: [[ 1. 0. ]
[-0.5 1. ]]
U: [[-2. 1. ]
[ 0. 3.5]]
A_: [[ 1. 3.]
[-2. 1.]]
b = np.array([2, 4])
# LU 분해
lu, piv = scipy.linalg.lu_factor(A)
x = scipy.linalg.lu_solve((lu, piv), b)
print("x:", x)
print(np.shape(x))
x: [-1.42857143 1.14285714]
(2,)
AA = np.array([[1, 3], [2, 6]])
print("AA:", AA)
AA: [[1 3]
[2 6]]
print("rank:", np.linalg.matrix_rank(AA))
AA_inv = np.linalg.inv(AA)
print(AA_inv)
rank: 1
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-32-79b2f18d4fad> in <module>
1 print("rank:", np.linalg.matrix_rank(AA))
----> 2 AA_inv = np.linalg.inv(AA)
<__array_function__ internals> in inv(*args, **kwargs)
c:\users\lmh-laptop\appdata\local\programs\python\python38\lib\site-packages\numpy\linalg\linalg.py in inv(a)
543 signature = 'D->D' if isComplexType(t) else 'd->d'
544 extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
--> 545 ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
546 return wrap(ainv.astype(result_t, copy=False))
547
c:\users\lmh-laptop\appdata\local\programs\python\python38\lib\site-packages\numpy\linalg\linalg.py in _raise_linalgerror_singular(err, flag)
86
87 def _raise_linalgerror_singular(err, flag):
---> 88 raise LinAlgError("Singular matrix")
89
90 def _raise_linalgerror_nonposdef(err, flag):
LinAlgError: Singular matrix
P, L, U = scipy.linalg.lu(AA)
print("P:", P)
print("L:", L)
print("U:", U)
AA_ = P @ L @ U
print("AA_:", AA_)
P: [[0. 1.]
[1. 0.]]
L: [[1. 0. ]
[0.5 1. ]]
U: [[2. 6.]
[0. 0.]]
AA_: [[1. 3.]
[2. 6.]]
b = np.array([2, 4])
# LU 분해
lu, piv = scipy.linalg.lu_factor(AA)
x = scipy.linalg.lu_solve((lu, piv), b)
print("x:", x)
print(np.shape(x))
x: [nan nan]
(2,)
<ipython-input-35-3f70c98bbe5d>:3: LinAlgWarning: Diagonal number 2 is exactly zero. Singular matrix.
lu, piv = scipy.linalg.lu_factor(AA)
이 글은 프로그래머스 스쿨 인공지능 데브코스 과정에서 공부한 내용을 바탕으로 정리한 글입니다.