이 예제에서는 수렴을 개선하기 위해 불완전 촐레스키 분해(Cholesky Factorization)를 선조건자(Preconditioner)로 사용하는 방법을 보여줍니다.
양의 정부호 대칭 행렬 A
를 생성합니다.
pcg
에 대한 선조건자로 불완전 촐레스키 분해를 생성합니다. 상수 벡터를 우변으로 사용합니다. 기준으로 선조건자 없이 pcg
를 실행합니다.
참고로, fl0 = 1
은 pcg
가 상대 잔차를 최대 허용 반복으로 요청된 허용오차까지 가져가지 않았음을 나타냅니다. 채우기 없음(No-fill) 불완전 촐레스키 분해(Cholesky Factorization)를 선조건자(Preconditioner)로 시도합니다.
fl1 = 0
은 pcg
가 요청된 허용오차로 수렴되었고 이것이 59회의 반복에서 이루어졌음을 나타냅니다(it1
의 값). 하지만 이 행렬은 이산 라플라시안(Discrete Laplacian)이기 때문에 수정된 불완전 촐레스키 분해(Cholesky Factorization)를 사용하면 더 나은 선조건자(Preconditioner)를 생성할 수 있습니다. 수정된 불완전 촐레스키 분해(Cholesky Factorization)는 상수 벡터에 대한 연산자의 동작을 보존하는 근사 분해를 생성합니다. 즉, norm(A-L*L','fro')/norm(A,'fro')
가 0에 가깝지 않더라도 e = ones(size(A,2),1)
에 대해 norm(A*e-L*(L'*e))
는 0에 근사합니다. nofill
이 디폴트이기 때문에 이 구문에 대해 유형을 지정할 필요는 없지만, 연습해 보기 위해 지정합니다.
pcg
는 단 38회 반복에서 수렴됩니다(fl2 = 0
). 세 수렴 기록을 플로팅하면 수렴이 표시됩니다.
플롯은 수정된 불완전 촐레스키 선조건자(Cholesky Preconditioner)가 훨씬 더 빠른 수렴을 생성한다는 것을 보여줍니다.
또한 임계값 기각을 사용한 불완전 촐레스키 분해를 시도할 수 있습니다. 다음 플롯은 다양한 기각 허용오차로 생성된 선조건자를 사용하여 pcg
의 수렴을 보여줍니다.
L3 = ichol(A, struct('type','ict','droptol',1e-1));
[x3,fl3,rr3,it3,rv3] = pcg(A,b,tol,maxit,L3,L3');
L4 = ichol(A, struct('type','ict','droptol',1e-2));
[x4,fl4,rr4,it4,rv4] = pcg(A,b,tol,maxit,L4,L4');
L5 = ichol(A, struct('type','ict','droptol',1e-3));
[x5,fl5,rr5,it5,rv5] = pcg(A,b,tol,maxit,L5,L5');
figure
semilogy(0:maxit,rv0./norm(b),'b-','linewidth',2);
hold on
semilogy(0:it3,rv3./norm(b),'b-.','linewidth',2);
semilogy(0:it4,rv4./norm(b),'b--','linewidth',2);
semilogy(0:it5,rv5./norm(b),'b:','linewidth',2);
legend('No Preconditioner','ICT(1e-1)','ICT(1e-2)', ...
'ICT(1e-3)','Location','SouthEast');
참고로, 기각 허용오차 1e-2
로 생성된 불완전 촐레스키 선조건자는 ICT(1e-2)
로 나타납니다.
0 채우기 불완전 촐레스키 분해의 경우와 같이 임계값 기각 분해는 수정(즉, opts.michol = 'on'
)의 이점을 가집니다. 이는 행렬이 타원형 편미분 방정식에서 발생하기 때문입니다. MIC(0)
의 경우와 같이 수정된 임계값 기반 기각 불완전 촐레스키 분해는 상수 벡터에 대한 선조건자의 동작을 유지합니다. 즉, norm(A*e-L*(L'*e))
는 약 0이 됩니다.