| 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 | ![]() |