이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

ilu

불완전 LU 분해

구문

ilu(A,setup)
[L,U] = ilu(A,setup)
[L,U,P] = ilu(A,setup)

설명

ilu는 단위 하부 삼각 행렬, 상부 삼각 행렬, 치환 행렬을 생성합니다.

ilu(A,setup)A의 불완전 LU 분해를 계산합니다. setup은 최대 5개의 설정 옵션을 가진 입력 구조체입니다. 필드는 아래의 표와 같이 정확하게 명명해야 합니다. 이러한 필드는 구조체에 원하는 수 만큼 포함시키고 원하는 순서로 정의할 수 있습니다. 추가 필드는 무시됩니다.

필드 이름

설명

type

행렬 분해의 유형. type의 값은 다음과 같습니다.

  • 'nofill'(디폴트 값) — ILU(0)으로 알려진 0 레벨 채우기의 ILU 분해를 수행합니다. type'nofill'로 설정된 상태에서 milu 설정 옵션만 사용됩니다. 다른 모든 필드는 무시됩니다.

  • 'crout' — ILUC로 알려진 ILU 분해의 크라우트(Crout) 버전을 수행합니다. type'crout'로 설정되면 droptol 설정 옵션과 milu 설정 옵션만 사용됩니다. 다른 모든 필드는 무시됩니다.

  • 'ilutp' — 임계값 및 피벗 연산과 함께 ILU 분해를 수행합니다.

type이 지정되지 않은 경우, 0 레벨 채우기의 ILU 분해가 수행됩니다. 피벗 연산은 type'ilutp'로 설정하여 수행됩니다.

droptol

불완전 LU 분해의 기각 허용오차입니다. droptol은 음이 아닌 스칼라입니다. 디폴트 값은 완전 LU 분해를 생성하는 0입니다.

U의 0이 아닌 항목은 다음을 충족합니다.

  abs(U(i,j)) >= droptol*norm(A(:,j)),

기준의 충족 여부와 관계없이 유지되는 대각선 항목은 예외입니다. L의 항은 피벗에 의해 스케일링되기 전에 국소 기각 허용오차에 대해 테스트됩니다. 따라서 L의 0이 아닌 항목에 대해 다음이 성립됩니다.

abs(L(i,j)) >= droptol*norm(A(:,j))/U(j,j).

milu

수정된 불완전 LU 분해. milu의 값은 다음과 같습니다.

  • 'row' — 행의 합계에 대해 수정된 불완전 LU 분해를 생성합니다. 새로 구성된 요소 열의 항목들을 상부 삼각 인자 U의 대각선에서 뺍니다. 열 합계는 보존합니다. 즉, A*e = L*U*e입니다. 여기서 e는 1의 벡터입니다.

  • 'col' — 열의 합계에 대해 수정된 불완전 LU 분해를 생성합니다. 새로 구성된 요소 열의 항목들을 상부 삼각 인자 U의 대각선에서 뺍니다. 열 합계는 보존합니다. 즉, e'*A = e'*L*U입니다.

  • 'off'(디폴트 값) — 수정된 불완전 LU 분해가 생성되지 않습니다.

udiag

udiag1인 경우, 상부 삼각 인자의 대각선상의 모든 0은 국소 기각 허용오차에 의해 대체됩니다. 디폴트 값은 0입니다.

thresh

0(대각선 피벗 연산 강제 적용)과 1(디폴트, 항상 피벗 연산이 수행될 열의 최대 크기 항목 선택) 사이의 피벗 임계값입니다.

ilu(A,setup)L+U-speye(size(A))를 반환합니다. 여기서 L은 단위 하부 삼각 행렬이고 U는 상부 삼각 행렬입니다.

[L,U] = ilu(A,setup)L에 단위 하부 삼각 행렬을 반환하고 U에 상부 삼각 행렬을 반환합니다.

[L,U,P] = ilu(A,setup)L에 단위 하부 삼각 행렬을 반환하고, U에 상부 삼각 행렬을 반환하며, P에 치환 행렬을 반환합니다.

제한 사항

ilu는 희소 정사각 행렬에 대해서만 동작합니다

예제

희소 행렬을 만들고 LU 분해를 계산합니다.

A = gallery('neumann', 1600) + speye(1600);
setup.type = 'crout';
setup.milu = 'row';
setup.droptol = 0.1;
[L,U] = ilu(A,setup);
e = ones(size(A,2),1);
norm(A*e-L*U*e)

ans =

  1.4251e-014

이것은 AL*U가 행 합계가 동일하다는 것을 보여줍니다. 여기서 LU는 수정된 크라우트(Crout) ILU로 주어집니다.

희소 행렬을 만들고 LU 분해를 계산합니다.

A = gallery('neumann', 1600) + speye(1600);
setup.type = 'nofill';
nnz(A)
ans =

        7840

nnz(lu(A))
ans =

      126478

nnz(ilu(A,setup))
ans =

        7840 

이것은 A7840개의 0이 아닌 수, 완전 LU 분해가 126478개의 0이 아닌 수, 필인(Fill-in)의 0 레벨을 갖는 불완전 LU 분해가 A와 같이 7840개의 0이 아닌 수를 가지고 있음을 보여줍니다.

이러한 불완전 분해는 BICG(쌍켤레 기울기법), GMRES(일반화된 최소 잔차법) 등과 같은 반복 방법으로 풀려는 선형 연립방정식에 대한 선조건자(Preconditioner)로 유용하게 사용할 수 있습니다.

참고 문헌

[1] Saad, Yousef, Iterative Methods for Sparse Linear Systems, PWS Publishing Company, 1996, Chapter 10 - Preconditioning Techniques.

참고 항목

| |