ドキュメンテーション

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

tfqmr

転置なしの疑似的最小残差法

構文

x = tfqmr(A,b)
x = tfqmr(afun,b)
x = tfqmr(a,b,tol)
x = tfqmr(a,b,tol,maxit)
x = tfqmr(a,b,tol,maxit,m)
x = tfqmr(a,b,tol,maxit,m1,m2,x0)
[x,flag] = tfqmr(A,B,...)
[x,flag,relres] = tfqmr(A,b,...)
[x,flag,relres,y]y(A,b,...)
[x,flag,relres,iter,resvec] = tfqmr(A,b,...)

説明

x = tfqmr(A,b) は、線形方程式系 A*x=bx について解きます。nn 列の係数行列 A は正方でなければならず、右辺の列ベクトル b は、長さが n でなければなりません。

x = tfqmr(afun,b) は、行列 A の代わりに、関数ハンドル afun を使用します。関数 afun(x)は、ベクトル入力 x を受け入れ、行列とベクトルの積 A*x を返します。以下の構文のすべてにおいて、Aafun で置き換えることが可能です。関数のパラメーター化 には、関数 afun に追加パラメーターを指定する方法が説明されています。

x = tfqmr(a,b,tol) は、このメソッドの許容誤差を指定します。tol[] の場合、関数 tfqmr は 既定の設定の 1e-6 を使用します。

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

x = tfqmr(a,b,tol,maxit,m)x = tfqmr(a,b,tol,maxit,m1,m2) は、前提条件子 m または m=m1*m2 を使用して方程式 A*inv(M)*x = Bx について効率よく解きます。M[] の場合は、前提条件が適用されません。M は、mfun(x)m\x を返すような関数ハンドル mfun です。

x = tfqmr(a,b,tol,maxit,m1,m2,x0) は、初期推定を指定します。x0[] の場合、tfqmr は既定の設定のゼロ ベクトルを使用します。

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

フラグ

収束

0

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

1

関数 tfqmr は、maxit 回の反復に対して、収束しませんでした。

2

前提条件 M は悪条件です。

3

関数 tfqmr の出力結果に変化が見られません(連続する 2 回の計算で、結果がまったく同じでした)。

4

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

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

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

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

行列または関数ハンドル入力と tfqmr の使用

この例では、行列入力および関数入力で tfqmr を使用する方法を示します。

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

行列とベクトルの積の関数を入力として使用することもできます。

function y = afun(x,n)
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);
x1 = tfqmr(@(x)afun(x,n),b,tol,maxit,M1,M2);

applyOp が関数 qmr での使用に適した関数の場合、無名関数内に含めることで関数 tfqmr で使用することも可能です。

x1 = tfqmr(@(x)applyOp(x,'notransp'),b,tol,maxit,M1,M2);

前提条件子と tfqmr の使用

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

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

load west0479;
A = west0479;

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

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

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

tol = 1e-12;
maxit = 20;

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

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

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

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

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

bicgstabtfqmr は、反復を半分ごとに追跡することに注意してください。プロットでは、解が収束しないことが示されます。前提条件子を使用して結果を改善できます。

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] = tfqmr(A,b,tol,maxit,L,U);

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

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

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

拡張機能