MATLAB Function Reference | ![]() ![]() |
表示
x = gmres(A,b) gmres(A,b,restart) gmres(A,b,restart,tol) gmres(A,b,restart,tol,maxit) gmres(A,b,restart,tol,maxit,M) gmres(A,b,restart,tol,maxit,M1,M2) gmres(A,b,restart,tol,maxit,M1,M2,x0) gmres(afun,b,restart,tol,maxit,m1fun,m2fun,x0,p1,p2,...) [x,flag] = gmres(A,b,...) [x,flag,relres] = gmres(A,b,...) [x,flag,relres,iter] = gmres(A,b,...) [x,flag,relres,iter,resvec] = gmres(A,b,...)
詳細
x = gmres(A,b)
は、線形方程式 A*x = b
を x
に対して、解こうとします。n
行 n
列の係数行列 A
は、正方である必要があり、列ベクトル b
は、長さ n
である必要があります。A
は、afun(x)
が、A*x
を出力するような関数 afun
でも構いません。
gmres
が収束する場合、この影響を示すメッセージが表示されます。
gmres
が、設定した繰り返し回数に達しても収束しなかったり、何らかの理由で停止した場合、ワーニングメッセージとして、相対残差 norm(b-A*x)/norm(b)
や停止したときの繰り返し回数を表示します。
gmres(A,b,restart)
は、restart
回の繰り返し毎、方法を再スタートします。restart
が []
の場合、gmres
は、デフォルトの n
を使い、実際には再スタートを行いません。
gmres(A,b,restart,tol)
は、方法に関するトレランスを指定します。tol
が、[]
の場合、gmres
は、デフォルト 1e-6
を使います。
gmres(A,b,restart,tol,maxit)
は、繰り返し最大回数を設定します。maxit
が[]
の場合、gmres
はデフォルト min(n/restart,10)
を使います。
gmres(A,b,restart,tol,maxit,M) とgmres(A,b,restart,tol,maxit,M1,M2)
は、前提条件子 M
、または、M = M1*M2
を使って、inv(M)*A*x = inv(M)*b
を x
に対して効率良く解きます。M
が []
の場合、gmres
は、前提条件子を適用しません。 M
は、M\x
を戻す関数です。
gmres(A,b,restart,tol,maxit,M1,M2,x0)
は、初期推定値を指定します。x0
が []
の場合、gmres
は、デフォルトのすべての要素がゼロを使います。
gmres(afun,b,restart,tol,maxit,m1fun,m2fun,x0,p1,p2,...)
は、パラメータを関数 afun(x,p1,p2,...)
, m1fun(x,p1,p2,...)
, m2fun(x,p1,p2,...)
に渡します。
[x,flag] = gmres(A,b,
は、収束フラグも出力します。...
)
フラグ |
収束 |
0 |
gmres は、maxit 以内の繰り返し回数で、希望するトレランス tol に収束します。 |
1 |
gmres は、くり返し回数が、maxit に達しているが、収束していません。 |
2 |
前提条件 M の条件数が悪い |
3 |
gmres は、計算を進めていません(連続する2回の繰り返しの結果が同じでした)。 |
flag
が 0
でない場合、戻される解 x
は、
すべての繰り返しで計算された中で、最小のノルム残差をもつ解です。flag
の出力が指定されている場合、メッセージは表示されません。
[x,flag,relres] = gmres(A,b
は、相対残差 ,...
)
norm(b-A*x)/norm(b)
も出力します。flag
が 0
の場合、relres <= tol
になります。
[x,flag,relres,iter] = gmres(A,b,
は、...
)
x
が計算される点で、外側の繰り返しと内側の繰り返しを共に出力します。ここで、0 <= iter(1) <= maxit
と 0 <= iter(2) <= restart
です。
[x,flag,relres,iter,resvec] = gmres(A,b
は、各内側の繰り返しで、,...
)
norm(b-A*x0)
を含む残差ノルムのベクトルも出力します。
例題
A = gallery('wilk',21); b = sum(A,2); tol = 1e-12; maxit = 15; M1 = diag([10:-1:1 1 1:10]); x = gmres(A,b,10,tol,maxit,M1,[],[]); gmres(10) converged at iteration 2(10) to a solution with relative residual 1.9e-013
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];
function y = mfun(r,n) y = r ./ [((n-1)/2:-1:1)'; 1; (1:(n-1)/2)'];
x1 = gmres(@afun,b,10,tol,maxit,@mfun,[],[],21);
afun
と mfun
は、共に、gmres
への特別な入力 n = 21
を含んでいることに注意してください。
load west0479 A = west0479 b = sum(A,2) [x,flag] = gmres(A,b,5)
gmres
は、デフォルトの10回の外側の繰り返しの中で、デフォルトのトレランス 1e-6
に収束しないので、flag
は 1
になります。
[L1,U1] = luinc(A,1e-5); [x1,flag1] = gmres(A,b,5,1e-6,5,L1,U1);
上三角 U1
は、対角要素上にゼロをもち、gmres
は、バックスラッシュを使って、U1*y = r
のようなシステムを y
に関して解こうとしたとき、最初の繰り返しで失敗するので、flag1
は 2
になります。
[L2,U2] = luinc(A,1e-6); tol = 1e-15; [x4,flag4,relres4,iter4,resvec4] = gmres(A,b,4,tol,5,L2,U2); [x6,flag6,relres6,iter6,resvec6] = gmres(A,b,6,tol,3,L2,U2); [x8,flag8,relres8,iter8,resvec8] = gmres(A,b,8,tol,3,L2,U2);
gmres
は、1e-6
のドロップトレランスをもつ不完全 LU 分解を前提条件子として、繰り返し回数が、4、6、8で再スタートしたときに収束するので、flag4
, flag6
, flag8
は、すべて、0
になります。これは、相対残差に対し、外側繰り返し回数をプロットすることにより、確認できます。これら三つのプロットを組み合わせたものは、繰り返し回数 4と6で再スタートをはっきりと示しています。計算される繰り返し回数の総数は、restart
のより小さい値より大きい可能性がありますが、保存されている長さ n
ベクトルの数は少なくなり、この手法の中で実際に行われる繰り返し総数は、それに比例して少なくなります。
参考
bicg
, bicgstab
, cgs
, lsqr
, luinc
, 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.
Saad, Youcef and Martin H. Schultz, "GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems", SIAM J. Sci. Stat. Comput., July 1986, Vol. 7, No. 3, pp. 856-869.
![]() | global | gplot | ![]() |