MATLAB Function Reference | ![]() ![]() |
正規方程式に対して、共役勾配法による LSQR 実現を行います。
表示
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) lsqr(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,...) [x,flag] = lsqr(A,b,...) [x,flag,relres] = lsqr(A,b,...) [x,flag,relres,iter] = lsqr(A,b,...) [x,flag,relres,iter,resvec] = lsqr(A,b,...)
詳細
x = lsqr(A,b)
は、A
に矛盾がない場合、A*x=b
の線形方程式を、x
について解こうとします。他の場合は、norm(b-A*x)
を最小にする最小二乗解 x
を求めようとします。m
行 n
列の係数行列 A
は、正方である必要はありませんが、列ベクトル b
は、長さが、m
でなければなりません。
A
は、A*x
を出力するような関数 afun(x)
です。すなわち、afun(x,'transp')
は、A'*x
を戻します。
lsqr
が収束する場合、その影響に関するメッセージが表示されます。lsqr
が、設定された最大繰り返し回数に達しても、また、何らかの理由で収束しない場合、ワーニングメッセージが、相対残差 norm(b-A*x)/norm(b)
と、計算が停止した繰り返し回数と共に印刷表示されます。
lsqr(A,b,tol)
は、手法に関するトレランスを指定します。tol
が、[]
の場合、lsqr
は、デフォルトの 1e-6
を使います。
lsqr(A,b,tol,maxit)
は、繰り返し最大回数を設定します。maxit
が、[]
の場合、lsqr
は、デフォルト値、すなわち、min([m,n,20])
を使います。
lsqr(A,b,tol,maxit,M1)
と lsqr(A,b,tol,maxit,M1,M2)
は、n
行 n
列の前置条件子 M
、または、M = M1*M2
を使い、システム A*inv(M)*y = b
を y
について解きます。ここで、x = M*y
の関係があります。M
が、[]
の場合、lsqr
は、前置条件子を適用しません。M
は、mfun(x)
が、M\x
を戻し、mfun(x,'transp')
が、M'\x
を戻します。
lsqr(A,b,tol,maxit,M1,M2,x0)
は、code>n 行 1
列の初期推定を指定します。 x0
が、[]
の場合、lsqr
は、デフォルトのすべてゼロベクトルを使います。
lsqr(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,...)
は、パラメータ p1,p2,...
を関数 afun(x,p1,p2,...)
と afun(x,p1,p2,...,'transp')
に渡し、それと共に、前置条件子関数 m1fun
と m2fun
にも渡します。
[x,flag] = lsqr(A,b,tol,maxit,M1,M2,x0)
は、収束フラグも戻します。
フラグ |
収束 |
0 |
lsqr は、maxit の繰り返しの回数の中で、希望するトレランス tol に収束します。 |
1 |
lsqr は、maxit 回の繰り返しに対して、収束していないことを示しています。 |
2 |
前置条件子 M は、条件数が良くありません。 |
3 |
lsqr の結果に変化が見られません(連続する2回の計算で、結果が全く同じです)。 |
4 |
flag
が、0
でない場合は、常に、出力される解 x
は、繰り返し全体に渡り、計算される最小のノルム残差内になります。flag
出力が設定されている場合、メッセージは表示されません。
[x,flag,relres] = lsqr(A,b,tol,maxit,M1,M2,x0)
は、相対残差 norm(b-A*x)/norm(b)
も出力します。flag
が、0
の場合、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)
に含まれる残差ノルムの推定のベクトルも出力します。
例題
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 12 to a solution with relative residual 3.5e-009
function y = afun(x,n,transp_flag) if (nargin > 2) & strcmp(transp_flag,'transp') 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); else 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
x1 = lsqr(@afun,b,tol,maxit,M1,M2,[],n);
参考
bicg
, bicgstab
, cgs
, gmres
, minres
, pcg
, qmr
, symmlq
@
(関数ハンドル)
参考文献
Barrett, R., M. Berry, T. F. Chan, et al., Templates for the Solution of Linear Systems: Building Blocks for Iterative Methods, SIAM, Philadelphia, 1994.
Paige, C. C. and M. A. Saunders, "LSQR: An アルゴリズム for Sparse Linear Equations And Sparse Least Squares," ACM Trans. Math. Soft., Vol.8, 1982, pp. 43-71.
![]() | lsqnonneg | lu | ![]() |