MATLAB Function Reference    
bicg

双共役傾斜法

表示

詳細

x = bicg(A,b) は、線形方程式A*x = bxに対して解きます。nn 列の係数行列 A は、正方である必要があり、列ベクトル b は、長さ n である必要があります。A は、afun(x)が、A*xを出力し、afun(x,'transp')A'*xを出力する関数afunとすることもできます。

bicg が収束する場合、メッセージとして影響が表示されます。bicg は、設定している繰り返し回数に達しても収束せず、または、何らかの理由で失敗した場合、ワーニングメッセージは、残差norm(b-A*x)/norm(b)と停止した段階での繰り返し回数を示します。

bicg(A,b,tol) は、方法に対するトレランスを設定します。tol[]に設定すると、bicg はデフォルト値1e-6を使います。

bicg(A,b,tol,maxit) は、さらに最大繰り返し回数maxit を指定します。maxit[]に設定すると、bicg はデフォルト値 min(n,20)を使います。

bicg(A,b,tol,maxit,M)bicg(A,b,tol,maxit,M1,M2) は、左側の前提条件M または、M = M1*M2を使い、inv(M)*A*x = inv(M)*bxについて、効率的に解きます。M1 または、M2 が空行列 ([])の場合、前提条件は実行されません。M は、mfun(x)M\x を、mfun(x,'transp')M'\xを出力する関数mfunにすることができます。

bicg(A,b,tol,maxit,M1,M2,x0) は、初期推定 x0 を指定します。x0が空行列([])の場合、デフォルトの全要素がゼロのベクトルを使います。

bicg(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,...) は、パラメータp1,p2,...を関数 afun(x,p1,p2,...)afun(x,p1,p2,...,'transp') に渡し、前もって設定した関数m1funm2fun と同様にします。

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

フラグFlag
収束
0
bicg は、繰り返し回数 maxit 以内で、希望するトレランスtol 内に収束します。
1
bicg は、繰り返し回数が maxit に達しましたが、収束しませんでした。
2
前提条件子 M の条件数が悪い。
3
bicg は、計算を進めていません(連続する2回の繰り返しの結果が同じでした)。
4
bicgは、関数の中に計算されたスカラ量が、繰り返しを続行するのに小さすぎる、または大きすぎるため、この手法は停止されました。

flag0でないとき、出力された解 x は、すべての繰り返しで計算された中で最小のノルム残差をもつ解です。flagの出力が指定されている場合は、メッセージは表示されません。

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

[x,flag,relres,iter] = bicg(A,b,...) は、計算したxでの繰り返し回数も出力します。ここで、 iter maxitです。

[x,flag,relres,iter,resvec] = bicg(A,b,...) は、norm(b-A*x0)を含み、各繰り返しでの残差ノルムのベクトルも出力します。

例題

例題 1

また、つぎの行列-ベクトルの積を計算する関数を使います。

bicgへの入力として、

例題 2 A = west0479 で始め、すべての要素が1のベクトルを真の解にします。

A は、あまり大きくないので、バックスラッシュを使って、A*x = bを正確に解くことができます。

bicgを使って、 A*x = bを解きましょう。

flag の値は、デフォルト設定の20回の繰り返しで、収束しなかったことを意味します。iter の値は、手法が非常に悪い状態で行われたので、初期推定値のゼロの値が、それ以降のすべての繰り返しの結果よりも良かったことを示します。relresの値は、relres = norm(b-A*x)/norm(b) = norm(b)/norm(b)= 1 を提供します。下記のプロット semilogy(0:20,resvec/norm(b),'-o')は、前提条件なしの手法がかなり広範囲に振動したことを確認しています。

さて、前提条件子に関して、1e-5のドロップトレランスを使って、不完全LU 分解を行いましょう。

上三角行列 U1 の主対角上のゼロは、U1 が正則でないことを意味します。それを前提条件子として使う場合、つぎのようになります。

バックスラッシュを使って、正則でない U1 を含む方程式を解く場合、最初の繰り返しで失敗します。bicg は、他の繰り返しを起こさないで、初期推定値を出力しようとします。

わずかなスパース性しかもたない前提条件子を使って、再度、試してみます。

今度はワーニングメッセージは表示されません。 U2 の主対角のすべてのエントリはゼロではありません。

bicg は、繰り返し回数 8 回で希望する許容誤差に収束します。ドロップトレランス値を小さくすると不完全成分の要素もより多く満たされますが、オリジナルの行列の近似の精度も良くなります。したがって、LU が真の LU 成分の場合、前提条件付きシステムは、inv(L)*L*U*inv(U)*y = inv(L)*b に近づき、1 回の繰り返しで解により近づくようになります。

つぎのグラフは、前提条件として、6 個の異なる不完全 LU 分解を使って、bicg の進行を示します。グラフの各ラインは、bicgで使われる前提条件のドロップトレランスのラベルが付けられています。

これは不完全成分を作成して解を計算するために要する時間は考えていません。つぎのグラフには、不完全LU 分解のドロップトレランスに対して、前提条件の計算時間、前提条件が計算されてからの繰り返し時間、それらの合計である問題を解く時間の総計をプロットします。分解を行う時間は、要素を満たすに連れてそれほど速く増加しませんが、繰り返しに対する平均時間まで遅くなります。繰り返しの実行は少なくなるので、問題を解く総時間は減少します。west0479は 139行139列のかなり大きな行列なので、前提条件付きの bicg は、バックスラッシュよりも長く時間がかかります。

参考

bicgstab, cgs, gmres, 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.


 beta, betainc, betaln bicgstab