부분 피벗팅 LU 분해란?
LU 분해는 정사각 행렬 A를 하삼각 행렬 L(대각 원소가 모두 1)과 상삼각 행렬 U의 곱으로 나누는 방법입니다. 여기에 부분 피벗팅(행 피벗팅)을 적용하면 행 순서를 바꾸는 치환 벡터 P가 함께 생성되어 \(P \cdot A = L \cdot U\)를 만족하게 됩니다. 피벗팅은 절댓값이 가장 큰 원소가 있는 행을 피벗 위치로 교환하는 과정으로, 0으로 나누는 상황을 피하고 수치적 안정성을 크게 높여 줍니다. 이는 순수한 선형대수 연산이므로 어느 나라에서나 동일하게 적용됩니다.
$$P \cdot A = L \cdot U$$
계산기 사용 방법
먼저 행렬 크기 \(n\)(2부터 5까지)을 선택하고, 정사각 행렬의 원소를 행 단위로 입력한 뒤 표시할 유효 숫자 자릿수를 정합니다. 계산 버튼을 누르면 L, U, 피벗 벡터 P(0부터 시작하는 인덱스), 그리고 행렬식이 출력됩니다. 선택한 크기를 벗어난 칸은 무시됩니다.
알고리즘
각 열 \(k\)에 대해 \(|M[p][k]|\)가 최대가 되는 행 \(p\)(\(p \ge k\))를 찾아 \(k\)행과 교환합니다. 그런 다음 \(k\) 아래의 모든 행 \(i\)에 대해 곱셈 인수 \(\text{factor} = M[i][k] / M[k][k]\)를 계산해 하삼각 부분에 저장하고, 나머지 원소를 \(M[i][j] \mathrel{-}= \text{factor} \cdot M[k][j]\)로 갱신합니다. 모든 열을 처리한 뒤 M의 엄밀한 하삼각 부분에 단위 대각을 더한 것이 L, 대각을 포함한 상삼각 부분이 U가 됩니다. 행렬식은 치환의 부호와 U 대각 원소들의 곱을 곱한 값과 같습니다.
$$\det(A) = \operatorname{sign}(P) \prod_{i} U_{ii}$$
예제로 풀어보기
\(A = [[2,1,1],[4,-6,0],[-2,7,2]]\)인 경우, 첫 번째 피벗은 1행입니다(\(|4|\)가 가장 큼). 따라서 P는 \((1,0,2)\)가 됩니다. 소거를 진행하면 \(L = [[1,0,0],[0.5,1,0],[-0.5,1,1]]\), \(U = [[4,-6,0],[0,4,1],[0,0,1]]\)이 나옵니다. 행 교환이 한 번 일어났으므로 부호는 \(-1\)이고, $$\det(A) = -1 \times (4 \cdot 4 \cdot 1) = -16$$이 됩니다.
자주 묻는 질문
왜 L·U가 원래 행렬 A와 같지 않나요? 피벗팅 때문입니다. L·U는 P에 따라 행이 재배열된 A와 같습니다. P 순서대로 A의 행을 먼저 정렬한 뒤 L·U와 비교하면 일치합니다.
행렬이 특이행렬(singular)이면 어떻게 되나요? U의 대각에 0이 나타나고 행렬식은 0이 됩니다. 이 경우에도 분해 결과는 그대로 출력됩니다.
피벗 벡터는 0부터 시작하나요? 네. \(P[i]\)는 결과의 \(i\)행에 들어간 원래 A 행의 인덱스를 나타냅니다.