ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

構文

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

説明

x = minres(A,b) は、線形方程式 A*x=b の最小ノルム残差解 xを求めます。nn 列の係数行列 A は、対称でなければなりませんが、正定行列である必要はありません。この係数行列は、大規模なスパース行列である必要があります。列ベクトル b の長さは n でなければなりません。A は、関数ハンドル afun (たとえば、afun(x)A*x を返すなど) として指定することもできます。

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

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

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

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

minres(A,b,tol,maxit,M)minres(A,b,tol,maxit,M1,M2) は、正定値対称前提条件 M または M = M1*M2 を使用して、方程式 inv(sqrt(M))*A*inv(sqrt(M))*y = inv(sqrt(M))*by について効率的に解き、x = inv(sqrt(M))*y を返します。M[] の場合、関数 minres は前提条件を適用しません。M は、mfun(x)M\x を返すような関数ハンドル mfun です。

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

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

フラグ

収束

0

関数 minres は希望する許容誤差 tol に反復回数 maxit 以内で収束しました。

1

関数 minres は反復回数が maxit に達しましたが、収束しませんでした。

2

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

3

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

4

関数 minres の実行中に計算されたスカラー量のいずれかが小さすぎるか大きすぎる値となったため、計算を継続できませんでした。

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

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

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

[x,flag,relres,iter,resvec] = minres(A,b,...) は、各反復で、norm(b-A*x0) を含めて、minres残差ノルムの推定ベクトルも返します。

[x,flag,relres,iter,resvec,resveccg] = minres(A,b,...) は、各反復で共役勾配法の残差ノルムの推定ベクトルも返します。

行列入力と minres の使用

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

x = minres(A,b,tol,maxit,M1);
minres converged at iteration 49 to a solution with relative 
residual 4.7e-014

関数ハンドルと minres の使用

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

  • 第 1 引数として関数ハンドル @afun を指定し、関数 minres を呼び出す。

  • run_minres 内のすべての変数を afun が利用できるようにするため、afun を入れ子関数として含む

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

function x1 = run_minres
n = 100; 
on = ones(n,1); 
A = spdiags([-2*on 4*on -2*on],-1:1,n,n);
b = sum(A,2); 
tol = 1e-10; 
maxit = 50;
M = spdiags(4*on,0,n,n);
x1 = minres(@afun,b,tol,maxit,M);
 
       function y = afun(x)
          y = 4 * x;
          y(2:n) = y(2:n) - 2 * x(1:n-1);
          y(1:n-1) = y(1:n-1) - 2 * x(2:n);
       end
end

次のように入力した場合、

x1=run_minres;

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

minres converged at iteration 49 to a solution with relative 
residual 4.7e-014

pcg の代わりに minres を使用

pcg で失敗する対称無限行列を使用します。

A = diag([20:-1:1, -1:-1:-20]);
b = sum(A,2);      % The true solution is the vector of all ones.
x = pcg(A,b);      % Errors out at the first iteration.

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

pcg stopped at iteration 1 without converging to the desired
tolerance 1e-006 because a scalar quantity became too small or
too large to continue computing. 
The iterate returned (number 0) has relative residual 1

しかし、minres は、無限行列 A を扱えます。

x = minres(A,b,1e-6,40);
minres converged at iteration 39 to a solution with relative 
residual 1.3e-007

参照

[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, “Solution of Sparse Indefinite Systems of Linear Equations.” SIAM J. Numer. Anal., Vol.12, 1975, pp. 617-629.

参考

| | | | | | | | | |

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