MATLAB Function Reference | ![]() ![]() |
表示
x = bicg(A,b) bicg(A,b,tol) bicg(A,b,tol,maxit) bicg(A,b,tol,maxit,M) bicg(A,b,tol,maxit,M1,M2) bicg(A,b,tol,maxit,M1,M2,x0) bicg(afun,b,tol,maxit,mfun1,mfun2,x0,p1,p2,...) [x,flag] = bicg(A,b,...) [x,flag,relres] = bicg(A,b,...) [x,flag,relres,iter] = bicg(A,b,...) [x,flag,relres,iter,resvec] = bicg(A,b,...)
詳細
x = bicg(A,b)
は、線形方程式A*x = b
をx
に対して解きます。n
行n
列の係数行列 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)*b
を x
について、効率的に解きます。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')
に渡し、前もって設定した関数m1fun
と m2fun
と同様にします。
[x,flag] = bicg(A,b,...)
は、収束フラグも出力します。
flag
が 0
でないとき、出力された解 x
は、すべての繰り返しで計算された中で最小のノルム残差をもつ解です。flag
の出力が指定されている場合は、メッセージは表示されません。
[x,flag,relres] = bicg(A,b,...)
は、相対残差norm(b-A*x)/norm(b)
も出力します。flag
が0
の場合、relres <= tol
になります。
[x,flag,relres,iter] = bicg(A,b,...)
は、計算したx
での繰り返し回数も出力します。ここで、0
iter
maxit
です。
[x,flag,relres,iter,resvec] = bicg(A,b,...)
は、norm(b-A*x0)
を含み、各繰り返しでの残差ノルムのベクトルも出力します。
例題
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 = bicg(A,b,tol,maxit,M1,M2,[]); bicg converged at iteration 9 to a solution with relative residual 5.3e-009
function y = afun(x,n,transp_flag) if (nargin > 2) & strcmp(transp_flag,'transp') 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); else 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
x1 = bicg(@afun,b,tol,maxit,M1,M2,[],n);
例題 2 A = west0479
で始め、すべての要素が1のベクトルを真の解にします。
load west0479; A = west0479; b = sum(A,2);
A
は、あまり大きくないので、バックスラッシュを使って、A*x = b
を正確に解くことができます。
x = A \ b; norm(b-A*x) / norm(b) ans = 1.2454e-017
[x,flag,relres,iter,resvec] = bicg(A,b) flag = 1 relres = 1 iter = 0
flag
の値は、デフォルト設定の20回の繰り返しで、収束しなかったことを意味します。iter
の値は、手法が非常に悪い状態で行われたので、初期推定値のゼロの値が、それ以降のすべての繰り返しの結果よりも良かったことを示します。relres
の値は、relres = norm(b-A*x)/norm(b
) = norm(b)/norm(b)
= 1
を提供します。下記のプロット semilogy(0:20,resvec/norm(b),'-o')
は、前提条件なしの手法がかなり広範囲に振動したことを確認しています。
semilogy(0:20,resvec/norm(b),'-o')
xlabel('iteration number')
ylabel('relative residual')
さて、前提条件子に関して、1e-5
のドロップトレランスを使って、不完全LU 分解を行いましょう。
[L1,U1] = luinc(A,1e-5); Warning: Incomplete upper triangular factor has 1 zero diagonal. It cannot be used as a preconditioner for an iterative method. nnz(A) ans = 1887 nnz(L1) ans = 5562 nnz(U1) ans = 4320
上三角行列 U1
の主対角上のゼロは、U1
が正則でないことを意味します。それを前提条件子として使う場合、つぎのようになります。
[x,flag,relres,iter,resvec] = bicg(A,b,1e-6,20,L1,U1) flag = 2 relres = 1 iter = 0 resvec = 7.0557e+005
バックスラッシュを使って、正則でない U1
を含む方程式を解く場合、最初の繰り返しで失敗します。bicg
は、他の繰り返しを起こさないで、初期推定値を出力しようとします。
わずかなスパース性しかもたない前提条件子を使って、再度、試してみます。
[L2,U2] = luinc(A,1e-6) nnz(L2) ans = 6231 nnz(U2) ans = 4559
今度はワーニングメッセージは表示されません。 U2
の主対角のすべてのエントリはゼロではありません。
[x,flag,relres,iter,resvec] = bicg(A,b,1e-15,10,L2,U2) flag = 0 relres = 2.0248e-16 iter = 8
bicg
は、繰り返し回数 8 回で希望する許容誤差に収束します。ドロップトレランス値を小さくすると不完全成分の要素もより多く満たされますが、オリジナルの行列の近似の精度も良くなります。したがって、L
と U
が真の 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 | ![]() |