LU 분해법
하나의 행렬 A를 주대각성분이 1인 하삼각행렬 L, 상삼각행렬 U로 나누는 것
[A] = [L][U]
계수 [A]는 같고, 우변만 달라 여러 방정식의 해를 구해야 할때, 각 방정식의 해를 O(n^2)으로 구할 수 있다.
[A]{X} = {B1}
[A]{X} = {B2}
...
가우스 소거법을 이용한다.
해를 구하는 과정
1. LU 분해 단계
[A]를 [L][U]꼴로 분해한다.
행렬에 대해 가우스 소거법을 적용하여 상삼각행렬을 만들고,
이때 발생하는 계수들로 하삼각행렬을 구성한다
저장공간 활용을 위해 다음과 같이 저장할 수 있다.
알고리즘
2. 대입 단계
[L] 과 [U] 를 이용하여 벡터 {B} 에 대한해 {X}를 구한다.
[A]{X} = {B}
⇒ [L][U]{X} = {B} : [A]를 [L][U]로 분해, 이 과정에서 D를 얻을 수 있다.
⇒ [U]{X} = {D} : [U]{X} = {D}로 치환
⇒ [L]{D} = {B} : 방정식의 근 {D}를 구한다. (D는 LU분해하는 과정에서 얻을 수도 있다.)
⇒ [U]{X} = {D} : 방정식의 근 {X}를 구한다.
1. [L]{D} = {B}의 해 {D}를 구한다. 이때, {D}는 상삼각행렬을 만들 때 함께 변환된 {B'}과 같다.
2. [U]{X} = {D}의 해 {X}를 구한다. 이 결과는 원 방정식의 전진 소거 결과와 같다.
LU 분해법 알고리즘
소거 단계에서 생성된 인자 f 들은 행렬의 하부에 저장된다.
순서벡터 O를 이용하여 피벗화 결과의 순서를 추적한다.
요소들의 축척화된 값들이 피벗화에 사용된다.
피벗화 단계에서 대각선 항들을 탐색, 0에 가까우면 특이시스템이고, 에러로 처리한다.
순서벡터 O : 피벗팅을 수행할 때 각 행을 직접 바꾸는 대신, 해당 행을 바꿨다는 '표시'를 저장하는 벡터
Crout 분해
LU 분해의 결과로 A 행렬은 L과 U로 나뉜다.
이때 A 행렬의 각 원소는 L과 U의 행렬곱에 따라 aij = li1u1j + li2u2j + ... + linunj 꼴로 나타낼 수 있다.
예를 들어, a11 = l11u11 + l12u21 + l13u31 + l14u41 = l11*1 + 0 + 0 + 0 = l11 이다.
이런 방식으로 L과 U의 원소를 원래 식 A의 원소로 표현하는 것이 Crout 분해다.
값을 직접 구하면서 이해해보자.
l11 = a11
l21 = a21
l31 = a31
l41 = a41
(위에서 a11을 구하듯이 구한다)
a12 = l11 u12 ⇒ u12 = a12 / l11
a13 = l11 u13 ⇒ u13 = a13 / l11
a14 = l11 u14 ⇒ u14 = a14 / l11
처음에 구한 값은 다음과 같다.
l11 u12 u13 u14
l21 l22 u23 u24
l31 l32 l33 u34
l41 l42 l43 l44
행에 대해서는 11~ 41을, 열에 대해서는 12 ~ 14를 구했다.
이렇게 구한 식은 내부 (3x3 크기) 다른 변수를 정의하는데 다시 사용된다.
a22 = l21u12 + l22 ⇒ l22 = a22 - l21u12
a32 = l31u13 + l32 ⇒ l32 = a32 - l31u13
a42 = l41u14 + l42 ⇒ l42 = a42 - l41u14
a23 = l21u13 + l22u23 ⇒ u23 = (a23 - l21u13) / l22
a24 = l21u14 + l22u24 ⇒ u24 = (a24 - l21u14) / l22
이번에 구한 영역은 다음과 같다.
l11 u12 u13 u14
l21 l22 u23 u24
l31 l32 l33 u34
l41 l42 l43 l44
이렇듯 Crout 분해법은 기존 A의 원소를 이용하여 L 및 U의 원소를 지정하는 방식의 분해법이며,
각 L 및 U의 원소는 아래 이미지에 언급된 공식에 따라 도출된다.
공식에 따라 나머지 값을 구해보면,
l33 = a33 - l31u13 - l32u23
l43 = a43 - l41u13 - l42u23
l44 = a44 - l41u14 - l42u24 - l43u34
(1부터 뒤 index-1까지 진행)
u34 = (a34 - l31u14 - l32u24) / l33
(1부터 앞 index-1까지 진행)
장점
간결한 loop로 구현되며, 저장공간이 절약된다.
또한 [A]의 요소들이 분해과정에 한 번 사용된 후에는 다시 사용되지 않는다. ( L 및 U의 요소들이 대신 사용된다.)
[A]에 [L]과 [U]의 값을 저장할 수 있다.
역행렬
정사각행렬 [A]에 대해 곱이 [I] 가 되는 행렬.
우변에 단위벡터를 놓고 각각의 단위벡터에 대한 해를 구하여 열 단위로 구해보자.
[A]{X} = {B} 꼴로 두는 것.
'수학 > 수치해석' 카테고리의 다른 글
[수치해석 09] 비구속 최적화 (0) | 2021.10.28 |
---|---|
[수치해석 08] 특수 행렬과 Gauss-Seidel법 (0) | 2021.10.26 |
[수치해석 06] 행렬식에서 근 구하기 (0) | 2021.09.30 |
[수치해석 05] 선형 대수 방정식 (0) | 2021.09.30 |
[수치해석 04] 개구간법(Open Methods) (0) | 2021.09.27 |