MATLAB Function Reference | ![]() ![]() |
表示
x = bicgstab(A,b) bicgstab(A,b,tol) bicgstab(A,b,tol,maxit) bicgstab(A,b,tol,maxit,M) bicgstab(A,b,tol,maxit,M1,M2) bicgstab(A,b,tol,maxit,M1,M2,x0) bicgstab(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,...) [x,flag] = bicgstab(A,b,...) [x,flag,relres] = bicgstab(A,b,...) [x,flag,relres,iter] = bicgstab(A,b,...) [x,flag,relres,iter,resvec] = bicgstab(A,b,...)
詳細
x = bicgstab(A,b)
は、線形方程式システムA*x = b
をx
について解きます。n
行n
列の係数行列A
は、正方である必要があり、列ベクトル b
は、長さがn
でなければなりません。A
は、afun(x)
が、A*x
を出力するような関数afun
です。
bicgstab
が収束する場合、その影響を示すメッセージが表示されます。bicgstab
が最大繰り返し回数に達した後、収束していないか、または、何らかの理由で、計算が停止した場合、ワーニングメッセージとして、相対残差 norm(b-A*x)/norm(b)
を表示し、停止したときの繰り返し回数を表示します。
bicgstab(A,b,tol)
は、手法の許容誤差tol
を指定します。tol
が、[]
の場合、bicgstab
はデフォルト1e-6
を使います。
bicgstab(A,b,tol,maxit)
は、繰り返し最大回数を指定します。maxit
を []
に設定すると、bicgstab
は、デフォルト値 min(n,20)
を使います。
bicgstab(A,b,tol,maxit,M)
と bicgstab(A,b,tol,maxit,M1,M2)
は、前提条件子 M
、または、M = M1*M2
を使って、x
に関して、システム inv(M)*A*x = inv(M)*b
を効率的に解きます。
M
が、[]
の場合、bicgstab
は、前提条件子を適用しません。M
は、M\x
を戻す関数です。
bicgstab(A,b,tol,maxit,M1,M2,x0)
は、初期推定値を設定します。x0
が、[]
の場合、bicgstab
は、すべての要素がゼロのベクトルを使います。
bicgstab(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,...)
は、パラメータ p1,p2,...
を関数 afun(x,p1,p2,...)
, m1fun(x,p1,p2,...)
, m2fun(x,p1,p2,...)
に渡します。
[x,flag] = bicgstab(A,b,...)
は、収束フラグも出力します。
flag
が0
でないとき、出力された解x
は、すべての繰り返しで計算された中で最小のノルム残差をもつ解です。flag
の出力が指定されている場合は、メッセージは表示されません。
[x,flag,relres] = bicgstab(A,b,...)
は、相対誤差norm(b-A*x)/norm(b)
も出力します。flag
が0
の場合、これはtol以下です。
[x,flag,relres,iter] = bicgstab(A,b,...)
は、x
が計算された点での繰り返し回数も出力します。ここで、0 <= iter <= maxit
です。iter
は、整数 +
0.5で、繰り返しを通して収束の半分を示します。
[x,flag,relres,iter,resvec] = bicgstab(A,b,...)
は、norm(b-A*x0)
を含み、各半分の繰り返しでの残差ノルムベクトルを出力します。
例題
A = gallery('wilk',21); b = sum(A,2); tol = 1e-12; maxit = 15; M1 = diag([10:-1:1 1 1:10]); x = bicgstab(A,b,tol,maxit,M1,[],[]); bicgstab converged at iteration 12.5 to a solution with relative residual 1.2e-014
function y = afun(x,n) y = [0; x(1:n-1)] + [((n-1)/2:-1:0)'; (1:(n-1)/2)'] .*x + [x(2:n); 0];
function y = mfun(r,n) y = r ./ [((n-1)/2:-1:1)'; 1; (1:(n-1)/2)'];
x1 = bicgstab(@afun,b,tol,maxit,@mfun,[],[],21);
afun
と mfun
は、bicgstab
の外部入力n = 21
を受け入れる必要があることに注意してください。
load west0479; A = west0479; b = sum(A,2); [x,flag] = bicgstab(A,b)
bicgstab
は、デフォルトの20回の繰り返しでデフォルトのトレランス 1e-6
で収束しないので、flag
は 1
になります。
[L1,U1] = luinc(A,1e-5); [x1,flag1] = bicgstab(A,b,1e-6,20,L1,U1)
上三角U1
は、対角要素に一つのゼロをもつので、flag1
は 2
になります。bicgstab
は最初の繰り返しで、失敗しているので、バックシュラッシュを使って、U1*y = r
のようなシステムを解こうとします。
[L2,U2] = luinc(A,1e-6); [x2,flag2,relres2,iter2,resvec2] = bicgstab(A,b,1e-15,10,L2,U2)
bicgstab
は、1e-6
のドロップトレランスをもち、不完全LU 分解を前提条件とした場合、6回の繰り返し(iter2
の値)で、3.1757e-016
のトレランス (relres2
の値)に収束するので、flag2
は 0
になります。resvec2(1) = norm(b)
と resvec2(13) = norm(b-A*x2)
です。ユーザは、中間点と初期推定(くり返し回数 0)からスタートして、各繰り返しの最後での相対残差プロットすることで、bicgstab
のプロセスをフォローすることができます。
semilogy(0:0.5:iter2,resvec2/norm(b),'-o')
xlabel('iteration number')
ylabel('relative residual')
参考
bicg
, 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.
van der Vorst, H. A., "BI-CGSTAB: A fast and smoothly converging variant of BI-CG for the solution of nonsymmetric linear systems", SIAM J. Sci. Stat. Comput., March 1992,Vol. 13, No. 2, pp. 631-644.
![]() | bicg | bin2dec | ![]() |