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

bicgstabl

쌍켤레 기울기 (l) 안정법(Biconjugate Gradients Stabilized (l) Method)

구문

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

설명

x = bicgstabl(A,b)는 선형 연립방정식 A*x=b를 풀어 x를 구합니다. nxn 계수 행렬 A는 정사각 행렬이어야 하며 우변의 열 벡터 b는 길이가 n입니다.

x = bicgstabl(afun,b)는 행렬 A 대신 함수 핸들 afun을 받습니다. afun(x)는 벡터 입력값 x를 받고 행렬, 벡터 간 곱 A*x를 반환합니다. 다음의 모든 구문에서는 Aafun으로 바꿀 수 있습니다.

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

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

x = bicgstabl(A,b,tol,maxit,M)x = bicgstabl(A,b,tol,maxit,M1,M2)는 선조건자(Preconditioner) M 또는 M=M1*M2를 사용하여 시스템 A*inv(M)*x = b에서 효과적으로 x를 구합니다. M이 []이면 선조건자가 적용되지 않습니다. MM\x를 반환하는 함수 핸들일 수 있습니다.

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

[x,flag] = bicgstabl(A,b,...)는 수렴 flag도 반환합니다.

플래그(flag)

수렴

0

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

1

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

2

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

3

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

4

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

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

[x,flag,relres,iter] = bicgstabl(A,b,...)x가 계산된 반복 횟수도 반환합니다(0 <= iter <= maxit). iterk/4가 될 수 있는데 여기서 k는 정수이며, 이는 반복 주기를 4등분 했을 때 k번째 4등분 지점에서 수렴된다는 것을 나타냅니다.

[x,flag,relres,iter,resvec] = bicgstabl(A,b,...)는 각 반복의 4등분 지점에서 norm(b-A*x0)를 포함해 잔차 노름(Norm)으로 구성된 벡터를 반환합니다.

예제

bicgstabl에 입력값 또는 함수 사용

bicgstabl에 직접 입력값을 전달할 수 있습니다.

n = 21; 
A = gallery('wilk',n);  
b = sum(A,2);
tol = 1e-12;  
maxit = 15; 
M = diag([10:-1:1 1 1:10]);
x = bicgstabl(A,b,tol,maxit,M);

행렬, 벡터 간 곱 함수도 사용할 수 있습니다.

function y = afun(x,n)
y = [0; x(1:n-1)] + [((n-1)/2:-1:0)';
(1:(n-1)/2)'].*x+[x(2:n); 0];

또한 다음 선조건자 backsolve 함수를

function y = mfun(r,n)
y = r ./ [((n-1)/2:-1:1)';
1; 
(1:(n-1)/2)'];

bicgstabl에 대한 입력값으로 사용할 수 있습니다.

x1 = bicgstabl(@(x)afun(x,n),b,tol,maxit,@(x)mfun(x,n));

bicgstabl에 선조건자 사용

이 예제에서는 선조건자를 사용하는 방법을 보여줍니다.

479x479 실수 비대칭 희소 행렬인 west0479를 불러옵니다.

load west0479;
A = west0479;

참(True) 해가 1로만 이루어진 벡터가 되도록 b를 정의합니다.

b = full(sum(A,2));

허용오차와 최대 반복 횟수를 설정합니다.

tol = 1e-12;
maxit = 20;

bicgstabl을 사용하여 요청된 허용오차와 반복 횟수로 해를 구합니다.

[x0,fl0,rr0,it0,rv0] = bicgstabl(A,b,tol,maxit);

bicgstabl이 요청된 반복 횟수인 20회 이내에 요청된 허용오차 1e-12으로 수렴하지 않으므로 fl0은 1이 됩니다. 그러나, 사실 bicgstabl의 동작이 매우 부정확하기 때문에 초기 추측값(x0 = zeros(size(A,2),1))이 최적의 해가 되고 it0 = 0으로 반환됩니다. MATLAB®은 잔차 내역을 rv0에 저장합니다.

bicgstabl의 동작을 플로팅합니다.

semilogy(0:0.25:maxit,rv0/norm(b),'-o');
xlabel('Iteration number');
ylabel('Relative residual');

이 플롯에서 해가 수렴하지 않음을 알 수 있습니다. 선조건자를 사용하여 결과를 향상시킬 수 있습니다.

A가 비대칭이므로 ilu를 사용하여 선조건자를 만듭니다.

[L,U] = ilu(A,struct('type','ilutp','droptol',1e-5));
Error using ilu
There is a pivot equal to zero.  Consider decreasing the
drop tolerance or consider using the 'udiag' option.

MATLAB에서 불완전 LU를 생성할 경우 선조건자로 사용할 수 없는 특이 인자가 발생하기 때문에 불완전 LU를 생성할 수 없습니다.

오류 메시지에 표시된 대로 기각 허용오차를 줄여서 다시 시도할 수 있습니다.

[L,U] = ilu(A,struct('type','ilutp','droptol',1e-6));
[x1,fl1,rr1,it1,rv1] = bicgstabl(A,b,tol,maxit,L,U);

bicgstabl이 상대 잔차를 1.0257e-015(rr1의 값)으로 유도하므로 fl1은 0이 됩니다. 기각 허용오차가 1e-6인 불완전 LU 분해 선조건을 적용하면 6번째 반복(it1의 값)에서 상대 잔차는 미리 정해진 허용오차 1e-12보다 작아집니다. bicgstabl이 전체 반복 횟수를 4등분하여 사용하므로 출력값 rv1(1)norm(b)가 되고, 출력값 rv1(9)norm(b-A*x2)가 됩니다.

초기 추정값(반복 횟수 0)부터 각 반복마다 상대 잔차를 플로팅하면 bicgstabl의 진행률을 추적할 수 있습니다.

semilogy(0:0.25:it1,rv1/norm(b),'-o');

h = gca;
h.XTick = 0:0.25:it1;

xlabel('Iteration number');
ylabel('Relative residual');

확장 기능

참고 항목

| | | | | | | | | |