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

lsqr

LSQR 계산법(LSQR Method)

구문

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

설명

x = lsqr(A,b)는 시스템 A가 해를 가질 경우 선형 연립방정식 A*x=b에서 x를 구하려고 시도합니다. 그렇지 않은 경우 norm(b-A*x)를 최소화하는 최소제곱해(Least Squares Solution) x를 구하려고 시도합니다. mxn 계수 행렬 A는 정사각 행렬이 아니어도 되나, 크기가 큰 희소 행렬이어야 합니다. 열 벡터 b는 길이가 m이어야 합니다. A를 함수 핸들 afun으로 지정할 수 있습니다. afun(x,'notransp')A*x를, afun(x,'transp')A'*x를 각각 반환합니다.

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

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

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

lsqr(A,b,tol,maxit)에는 최대 반복 횟수를 지정할 수 있습니다.

lsqr(A,b,tol,maxit,M)lsqr(A,b,tol,maxit,M1,M2)nxn 선조건자 M 또는 M = M1*M2를 사용하여 시스템 A*inv(M)*y = b에서 효과적으로 y를 구합니다(여기서 y = M*x임). M[]이면 lsqr은 선조건자(Preconditioner)를 적용하지 않습니다. M은 함수 mfun일 수 있으며, mfun(x,'notransp')M\x를, mfun(x,'transp')M'\x를 각각 반환합니다.

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

[x,flag] = lsqr(A,b,tol,maxit,M1,M2,x0)은 수렴 플래그도 반환합니다.

플래그(flag)

수렴

0

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

1

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

2

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

3

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

4

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

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

[x,flag,relres] = lsqr(A,b,tol,maxit,M1,M2,x0)은 상대 잔차 norm(b-A*x)/norm(b)의 추정값도 반환합니다. flag0인 경우 relres <= tol입니다.

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

[x,flag,relres,iter,resvec] = lsqr(A,b,tol,maxit,M1,M2,x0)은 각 반복에서 잔차 노름 추정값으로 구성된 벡터와 norm(b-A*x0)을 반환합니다.

[x,flag,relres,iter,resvec,lsvec] = lsqr(A,b,tol,maxit,M1,M2,x0)은 각 반복에서 스케일링된 정규 방정식 잔차 norm((A*inv(M))'*(B-A*X))/norm(A*inv(M),'fro')의 추정값으로 구성된 벡터를 반환합니다. 참고로, norm(A*inv(M),'fro')의 추정값은 각 반복에서 달라지며 나아지는 것으로 기대됩니다.

예제

예제 1

n = 100; 
on = ones(n,1); 
A = spdiags([-2*on 4*on -on],-1:1,n,n);
b = sum(A,2); 
tol = 1e-8; 
maxit = 15;
M1 = spdiags([on/(-2) on],-1:0,n,n); 
M2 = spdiags([4*on -on],0:1,n,n);

x = lsqr(A,b,tol,maxit,M1,M2);

다음 메시지가 표시됩니다.

lsqr converged at iteration 11 to a solution with relative 
residual 3.5e-009

예제 2

이 예제에서는 예제 1의 행렬 A를 행렬, 벡터 간 곱 함수 afun의 핸들로 바꿉니다. 이 예제는 함수 run_lsqr에 포함되어 있으며, 이 함수는 다음과 같이 동작합니다.

  • 첫 번째 인수로 함수 핸들 @afun을 사용하여 lsqr을 호출합니다.

  • run_lsqr의 모든 변수를 afun에 사용할 수 있도록, afun을 중첩 함수로 포함합니다.

아래에는 run_lsqr 코드가 나와 있습니다.

function x1 = run_lsqr
n = 100; 
on = ones(n,1); 
A = spdiags([-2*on 4*on -on],-1:1,n,n);
b = sum(A,2); 
tol = 1e-8; 
maxit = 15;
M1 = spdiags([on/(-2) on],-1:0,n,n); 
M2 = spdiags([4*on -on],0:1,n,n);
x1 = lsqr(@afun,b,tol,maxit,M1,M2);

    function y = afun(x,transp_flag)
       if strcmp(transp_flag,'transp')      % y = A'*x
          y = 4 * x;
          y(1:n-1) = y(1:n-1) - 2 * x(2:n);
          y(2:n) = y(2:n) - x(1:n-1);
       elseif strcmp(transp_flag,'notransp') % y = A*x
          y = 4 * x;
          y(2:n) = y(2:n) - 2 * x(1:n-1);
          y(1:n-1) = y(1:n-1) - x(2:n);
       end
    end
end

다음을 입력하면

x1=run_lsqr;

MATLAB®에 다음 메시지가 표시됩니다.

lsqr converged at iteration 11 to a solution with relative 
residual 3.5e-009

참고 문헌

[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.

[2] Paige, C. C. and M. A. Saunders, "LSQR: An Algorithm for Sparse Linear Equations And Sparse Least Squares," ACM Trans. Math. Soft., Vol.8, 1982, pp. 43-71.

확장 기능

참고 항목

| | | | | | | |

R2006a 이전에 개발됨