ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

構文

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

説明

x = qmr(A,b) は、線形方程式 A*x=bx について解きます。nn 列の係数行列 A は、正方行列でなければならず、さらに大規模でスパース行列でなければなりません。列ベクトル b の長さは n でなければなりません。A は、関数ハンドル afun として指定することもできます (たとえば、afun(x,'notransp')A*x を返す、afun(x,'transp')A'*x を返すなど)。

「関数のパラメーター化」では、必要に応じて関数 afun および以下で説明する前提条件関数 mfun に追加のパラメーターを設定する方法が説明されています。

qmr が収束する場合、その結果に関するメッセージが表示されます。qmr が最大反復回数に達したか、何らかの理由で停止したために収束しない場合、相対残差 norm(b-A*x)/norm(b) と、計算が停止または失敗したときの反復回数を示す警告メッセージが出力されます。

qmr(A,b,tol) は、この手法の許容誤差を指定します。tol[] の場合、qmr は既定の設定の 1e-6 を使用します。

qmr(A,b,tol,maxit) は、最大反復回数を指定します。maxit[] の場合、qmr は既定の設定の min(n,20) を使用します。

qmr(A,b,tol,maxit,M)qmr(A,b,tol,maxit,M1,M2) は、前処理行列 M または M = M1*M2 を使い、方程式 inv(M)*A*x = inv(M)*bx について効率よく解きます。M[] の場合、qmr は前提条件を適用しません。M は、mfun(x,'notransp')M\x を返し、mfun(x,'transp')M'\x を返すような関数ハンドル mfun です。

qmr(A,b,tol,maxit,M1,M2,x0) は、初期推定値を指定します。x0[] の場合、qmr は既定の設定のすべてゼロのベクトルを使用します。

[x,flag] = qmr(A,b,...) は、収束フラグも返します。

フラグ

収束

0

qmr は、maxit 回の反復の中で、指定の許容誤差 tol に収束しました。

1

qmr は、maxit 回の反復を行いましたが、収束しませんでした。

2

前提条件 M は、条件数が良くありません。

3

qmr は、計算を進めていません(連続する 2 回の計算で、結果がまったく同じでした)。

4

qmr の実行中に計算されたスカラー量の 1 つが、計算を続けるには大きすぎるか、または小さすぎます。

flag0 でない場合は、返される解 x は、反復全体に渡り計算される最小のノルム残差内にあります。flag 出力が設定されている場合、メッセージは表示されません。

[x,flag,relres] = qmr(A,b,...) は相対残差 norm(b-A*x)/norm(b) も返します。flag0 の場合は、relres <= tol になります。

[x,flag,relres,iter] = qmr(A,b,...) は、x が計算されたときの反復回数も返します。ここで、0 <= iter <= maxit です。

[x,flag,relres,iter,resvec] = qmr(A,b,...) は、norm(b-A*x0) を含め、個々の反復における残差ノルムのベクトルも返します。

行列入力と qmr の使用

この例では、行列入力で qmr を使用する方法を示します。以下のコードを入力するとします。

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 = qmr(A,b,tol,maxit,M1,M2);

以下のメッセージが表示されます。

qmr converged at iteration 9 to a solution...
with relative residual 
5.6e-009

関数ハンドルと qmr の使用

この例では、前述の例の行列 A に代えて、行列-ベクトル積関数 afun のハンドルを使用します。この例は、以下を行うファイル run_qmr に含まれています。

  • 最初の引数に関数ハンドル @afun を使用して、qmr を呼び出します。

  • run_qmr のすべての変数が afun に適用できるように、入れ子関数として afun を含みます。

以下に run_qmr のコードを示します。

function x1 = run_qmr
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 = qmr(@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_qmr;

MATLAB® ソフトウェアが以下のメッセージを表示します。

qmr converged at iteration 9 to a solution with relative residual 
5.6e-009

前提条件子と qmr の使用

この例は、前提条件の使用方法を示します。

479 行 479 列の非対称実スパース行列 A = west0479 を読み込みます。

load west0479;
A = west0479;

真の解がすべて 1 のベクトルになるように、b を定義します。

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

許容誤差と反復の最大数を設定します。

tol = 1e-12; maxit = 20;

qmr を使用して、要求された許容誤差と反復回数で解を求めます。

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

fl0 は、qmr が要求した反復回数 20 回以内に要求した許容誤差 1e-12 に収束しなかったため、1 となります。17 番目の反復が最良の近似解であり、it0 = 17 の指定によって返されます。MATLAB は残差履歴を rv0 に格納します。

qmr の動作をプロットします。

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

プロットでは、解が収束しないことが示されます。前提条件子を使用して結果を改善できます。

ilu で前提条件子を作成します。これは行列 A が非対称であるためです。

[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 を構成できません。前提条件子では無意味な特異因子が生成されるためです。

エラー メッセージで示されるように、減少させた棄却許容誤差でもう一度試すことができます。

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

qmr4.1410e-014 (rr1 の値) に相対残差を導き出すため、fl1 は 0 です。相対残差は、棄却許容誤差 1e-6 で不完全 LU 分解を前提条件とした場合、6 回目の反復で指定の許容誤差 1e-12 より小さくなります (it1 の値)。出力 rv1(1)norm(b)、出力 rv1(7)norm(b-A*x2) となります。

初期推定 (反復回数が 0) から始まる各反復での残差の相対残差をプロットして、関数 qmr の進行状況を見ることができます。

semilogy(0:it1,rv1/norm(b),'-o');
xlabel('Iteration number');
ylabel('Relative residual');

参照

[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] Freund, Roland W. and Nöel M. Nachtigal, “QMR: A quasi-minimal residual method for non-Hermitian linear systems,” SIAM Journal: Numer. Math. 60, 1991, pp. 315–339.

この情報は役に立ちましたか?