ドキュメンテーション

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

構文

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

説明

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

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

関数 symmlq が収束する場合、その影響に関するメッセージが表示されます。関数 symmlq が、設定された最大反復回数に達しても収束しなかったり、何らかの理由で計算を停止したりすると、相対残差 norm(b-A*x)/norm(b) と停止したときの反復回数のある警告メッセージが表示されます。

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

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

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

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

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

フラグ

収束

0

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

1

関数 symmlq は、maxit 回の反復を実行しましたが、収束しませんでした。

2

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

3

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

4

関数 symmlq で計算されたスカラー量の 1 つが計算を続けるには、大きすぎるかまたは小さすぎます。

5

前提条件 M は、対称正定行列でありません。

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

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

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

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

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

例 1

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 = symmlq(A,b,tol,maxit,M1);
symmlq converged at iteration 49 to a solution with relative 
residual 4.3e-015

例 2

この例では、例 1 の行列 A を行列ベクトル作成関数 afun のハンドルで置き換えます。この例は、次の機能を果たす関数 run_symmlq に含まれています。

  • 最初の引数として関数ハンドル @afun を使用して関数 symmlq を呼び出す。

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

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

function x1 = run_symmlq
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 = symmlq(@afun,b,tol,maxit,M1);

       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_symmlq;

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

symmlq converged at iteration 49 to a solution with relative 
residual 4.3e-015

例 3

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

ただし、関数 symmlq は、無限行列 A を扱えます。

x = symmlq(A,b,1e-6,40);
symmlq 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.

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