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

pcg

선조건 적용 켤레 기울기법(Preconditioned Conjugate Gradients Method)

구문

x = pcg(A,b)
pcg(A,b,tol)
pcg(A,b,tol,maxit)
pcg(A,b,tol,maxit,M)
pcg(A,b,tol,maxit,M1,M2)
pcg(A,b,tol,maxit,M1,M2,x0)
[x,flag] = pcg(A,b,...)
[x,flag,relres] = pcg(A,b,...)
[x,flag,relres,iter] = pcg(A,b,...)
[x,flag,relres,iter,resvec] = pcg(A,b,...)

설명

x = pcg(A,b)는 선형 연립방정식 A*x=b를 풀어 x를 구합니다. nxn 계수 행렬 A는 양의 정부호 대칭 행렬이어야 하고, 또한 크기가 큰 희소 형식이어야 합니다. 열 벡터 b는 길이가 n이어야 합니다. A를 함수 핸들 afun으로 지정하여, afun(x)A*x반환하도록 할 수 있습니다.

함수를 파라미터화하기에는 함수 afun과 아래에서 설명하는 선조건자(Preconditioner) 함수 mfun에 추가 파라미터를 제공하는(필요한 경우) 방법이 설명되어 있습니다.

pcg가 수렴할 경우 해당 효과에 대한 메시지가 표시됩니다. 최대 반복 횟수 이후에도 pcg가 수렴하지 않거나 어떠한 이유로든 중단될 경우 상대 잔차 norm(b-A*x)/norm(b)와, 이 계산이 중지되거나 실패한 반복 횟수가 표시된 경고 메시지가 출력됩니다.

pcg(A,b,tol)은 계산 방식에 허용오차를 지정하는 데 사용됩니다. tol[]이면 pcg은 디폴트 값인 1e-6을 사용합니다.

pcg(A,b,tol,maxit)에는 최대 반복 횟수를 지정할 수 있습니다. maxit[]이면 pcg은 디폴트 값인 min(n,20)을 사용합니다.

pcg(A,b,tol,maxit,M)pcg(A,b,tol,maxit,M1,M2)는 대칭형 양의 정부호 선조건자 M 또는 M = M1*M2를 사용하여 시스템 inv(M)*A*x = inv(M)*b에서 효과적으로 x를 구합니다. M[]이면 pcg는 선조건자(Preconditioner)를 적용하지 않습니다. Mmfun(x)M\x를 반환하도록 하는 함수 핸들 mfun일 수 있습니다.

pcg(A,b,tol,maxit,M1,M2,x0)에는 초기 추측값을 지정할 수 있습니다. x0[]이면 pcg는 디폴트 값(0으로만 이루어진 벡터)을 사용합니다.

[x,flag] = pcg(A,b,...)은 수렴 플래그도 반환합니다.

플래그(flag)

수렴

0

pcg maxit 반복 횟수 내에, 기대한 허용오차 tol로 수렴되었습니다.

1

pcgmaxit의 횟수만큼 반복되었지만 수렴되지 않았습니다.

2

선조건자 M은 조건이 나쁜 행렬입니다.

3

pcg이 정체되었습니다. 연속된 2회의 반복이 동일했습니다.

4

pcg를 실행하는 동안 계산된 스칼라 수량 중 하나가 너무 작아지거나 커져 계산을 계속할 수 없습니다.

flag0이 아닌 경우 반환되는 해 x는 모든 반복에 걸쳐 계산된 최소 노름(Norm) 잔차를 가집니다. flag 출력값이 지정된 경우에는 메시지가 표시되지 않습니다.

[x,flag,relres] = pcg(A,b,...)는 상대 잔차 norm(b-A*x)/norm(b)도 반환합니다. flag0인 경우 relres <= tol입니다.

[x,flag,relres,iter] = pcg(A,b,...)x가 계산된 반복 횟수도 반환합니다(0 <= iter <= maxit).

[x,flag,relres,iter,resvec] = pcg(A,b,...)는 각 반복에서 잔차 노름으로 구성된 벡터와 norm(b-A*x0)을 반환합니다.

예제

pcg에 큰 행렬 사용하기

이 예제는 pcg에 행렬 입력값과 함수 핸들을 사용하는 방법을 보여줍니다.

n1 = 21; 
A = gallery('moler',n1);  
b1 = sum(A,2);
tol = 1e-6;  
maxit = 15;  
M1 = spdiags((1:n1)',0,n1,n1);
[x1,flag1,rr1,iter1,rv1] = pcg(A,b1,tol,maxit,M1);

또는 행렬 A의 자리에 다음 함수를 사용할 수 있습니다.

function y = applyMoler(x)
y = x;
y(end-1:-1:1) = y(end-1:-1:1) - cumsum(y(end:-1:2));
y(2:end) = y(2:end) - cumsum(y(1:end-1));

이 함수를 사용하면 전체 행렬 A를 저장할 필요가 없으므로, 큰 시스템에 대한 해를 더 효율적으로 구할 수 있습니다.

n2 = 21;
b2 = applyMoler(ones(n2,1));
tol = 1e-6;
maxit = 15;
M2 = spdiags((1:n2)',0,n2,n2);
[x2,flag2,rr2,iter2,rv2] = pcg(@applyMoler,b2,tol,maxit,M2);

pcg에 선조건자(Preconditioner) 사용하기

이 예제는 선조건자(preconditioner) 행렬에 pcg를 사용하는 방법을 보여줍니다.

입력 행렬을 만들고 pcg를 사용하여 시스템의 해를 구해 봅니다.

A = delsq(numgrid('S',100));
b = ones(size(A,1),1);
[x0,fl0,rr0,it0,rv0] = pcg(A,b,1e-8,100);

pcg가 요청된 최대 반복 횟수인 100회 이내에 요청된 허용오차 1e-8으로 수렴하지 않으므로 fl01이 됩니다. 선조건자를 통해 시스템이 더 빨리 수렴될 수 있습니다.

입력 인수 하나만으로 ichol을 사용하여 0 채우기로 불완전 촐레스키 분해를 생성합니다.

L = ichol(A);
[x1,fl1,rr1,it1,rv1] = pcg(A,b,1e-8,100,L,L');

0 채우기(Zero-fill) 불완전 촐레스키 분해 선조건을 적용하면, pcg에 의한 상대 잔차는 77번째(it1 값) 반복에서 요청한 허용오차 1e-8보다 작은 9.8e-09(rr1 값)이 되므로 fl10이 됩니다. rv1(1) = norm(b)이고 rv1(78) = norm(b-A*x1)입니다.

위의 행렬은 디리클레 경계 조건을 적용한 100x100 그리드의 라플라시안 이산화를 나타냅니다. 이는 수정된 불완전 촐레스키 선조건자가 성능이 더 좋을 수 있음을 뜻합니다.

michol 옵션을 사용하여 수정된 불완전 촐레스키 선조건자를 만듭니다.

L = ichol(A,struct('michol','on'));
[x2,fl2,rr2,it2,rv2] = pcg(A,b,1e-8,100,L,L');

이 경우 불과 47회 반복만에 수렴이 이루어집니다.

초기 추정값(반복 번호 0)에서 시작하여 각 잔차 내역을 플로팅해 선조건자가 pcg의 수렴 속도에 미치는 영향을 파악할 수 있습니다.

figure;
semilogy(0:it0,rv0/norm(b),'b.');
hold on;
semilogy(0:it1,rv1/norm(b),'r.');
semilogy(0:it2,rv2/norm(b),'k.');
legend('No Preconditioner','IC(0)','MIC(0)');
xlabel('iteration number');
ylabel('relative residual');
hold off;

참고 문헌

[1] Barrett, R., M. Berry, T. F. Chan, et al., Templates for the Solution of Linear Systems: Building Blocks for Iterative Methods, SIAM, Philadelphia, 1994.

확장 기능

참고 항목

| | | | | | | | |

R2006a 이전에 개발됨