主要内容

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

bicg

线形方程式 -双 -双 -共役役倾斜法

说明

X= bicg(一种,,,,bは,双共役倾斜法を使用て,线形方程式系a*x = bXについて解きます。試行が正常に完了した場合、bicgは收束确认メッセージを表示し。。bicgが最大反复回数に達しても収束しないか、何らかの理由で実行を停止した場合は、相対残差norm(b-a*x)/norm(b)と停止のを含む诊断メッセージ表示されます。

X= bicg(一种,,,,b,,,,托尔は,の许容を指定し。のの误差误差は1e-6です。

X= bicg(一种,,,,b,,,,托尔,,,,最大は,する反复回数指定します。bicgは,最大以内の反復で収束しない場合、診断メッセージを表示します。

X= bicg(一种,,,,b,,,,托尔,,,,最大,,,,mは前処理行列mを指定し系 m 1 一种 X = m 1 b を実质に解くことによりXを計算します。前処理行列を使用すると、問題の数値的なプロパティと計算の効率を向上させることができます。

X= bicg(一种,,,,b,,,,托尔,,,,最大,,,,M1,,,,M2m=M1*m2となるような前処理行列mの因子指定します。

X= bicg(一种,,,,b,,,,托尔,,,,最大,,,,M1,,,,M2,,,,X0は解のベクトルXの初期推定を指定します。既定値はゼロのベクトルです。

[[X,,,,旗帜] = bicg(___は,アルゴリズムが正常に収束したかどうかを示すフラグを返します。旗帜=0の场合正常にされます。出力构文は,,前记のすべてのの入力引数のの组み合わせ组み合わせ组み合わせ。旗帜出力を指定场合,bicgは诊断を表示し。。

[[X,,,,旗帜,,,,重新] = bicg(___は,相対残差norm(b-a*x)/norm(b)も返します。旗帜0の场合は,relres <= tolになります。

[[X,,,,旗帜,,,,重新,,,,iter] = bicg(___は,Xが计算れたとき回数回数iterも返します。

[[X,,,,旗帜,,,,重新,,,,iter,,,,resvec] = bicg(___は,各反復で、最初の残差norm(b-A*x0)を含む残差ノルムのベクトルも返します。

すべて折りたたむ

既定の设定でbicgを使用正方システムをて,解法で使用される许容误差とと反复回数回数ししし

密度が 50% の乱数スパース行列一种を作成ます。また, 斧头 = b の右辺にのベクトルbを作成し。

rngdefaultA = Sprand(400,400,.5);a = a'*a;b = rand(400,1);

bicgを使用して 斧头 = b を解きます。出力の表示には相対残差誤差 b - 斧头 b の値含まれます。

x = bicg(a,b);
bicg stopped at iteration 20 without converging to the desired tolerance 1e-06 because the maximum number of iterations was reached. The iterate returned (number 7) has relative residual 0.45.

既定ではbicgは20回回とと1e-6の误差使用,アルゴリズムははについて,,,そのその,についてについて回回回反复内内ででで收束收束收束できできませませんんんんん。。。残差残差がががまだまだまだまだ大きい大きい大きい大きいためため,(より大きなをしてアルゴリズムの收束よりにすることもでき。。

1e-4100回回の反复使用し,再度システムを解き。。

X= bicg(一种,,,,b,,,,1e-4,100);
BICG在迭代100停止而没有收敛到所需的公差0.0001,因为达到了最大迭代次数。迭代返回(数字7)具有相对残留的0.45。

许容が反复回数が多い场合も,误差は向上しししませんんん。。反复アルゴリズムアルゴリズムがこのこの方法方法でするする场合,前前

一种の不コレスキー分解を,,bicgへの处理行列入ててL'因子を使用ます。

l = iChol(a);x = bicg(a,b,1e-4,100,l');
bicg converged at iteration 65 to a solution with relative residual 6.7e-05.

前处理を使用する,,bicgが收束できるまで問題の数値特性が向上します。

線形システムを解くために前処理行列をbicgと使用效果を调べ。。

479行479列の非実実ス行列行列行列行列行列行列をををを。

加载West0479a = west0479;

斧头 = b に対する真解すべてすべてすべてのベクトルによう,,bを定义し。

b=sum(A,2);

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

托尔=1e-12; maxit = 20;

bicgを使用,され许容许容回数で解を求めますます。。解法プロセスにに关する关する情报ををを返す返す返す返す出力出力出力出力

  • Xa*x = bの计算れた解。。

  • FL0はアルゴリズムが収束したかどうかを示すフラグです。

  • rr0は計算解Xの相対残差。

  • IT0Xが计算れたとき回数回数です。

  • rv0 b - 斧头 の残差履歴のベクトルです。

[x,fl0,rr0,it0,rv0] = bicg(a,b,tol,maxit);FL0
FL0=1
rr0
RR0 = 1
IT0
IT0=0

FL0は,bicg20回回数回回回以内要求した误差误差1e-12に收束なかった,,,ととます。実际,bicgの动作良好でないため推定推定X0=zeros(size(A,2),1)が最適解であり、IT0=0で示さとおりこれが返され。。

遅い収束への対応として、前処理行列を指定できます。一种は非対称ため,伊卢を使用て前处理行列 m = l を生成。弃许容误差をし,,,1e-6よりもをもつ対角エントリをし。。。bicgへの入力としてlおよびを指定して、前処理された系 m - 1 一种 X = m - 1 b を解きます。

setup = struct('类型',,,,'ilutp',,,,'Droptol',,,,1e-6); [L,U] = ilu(A,setup); [x1,fl1,rr1,it1,rv1] = bicg(A,b,tol,maxit,L,U); fl1
FL1 = 0
rr1
rr1 = 4.1409e-14
IT1
IT1 = 6

伊卢前处理を使用する,,6 回目の反復で1e-12の指定の許容誤差より少ない相対残差が生成されます。出力RV1(1)norm(b),出力rv1(end)norm(b-A*x1)になります。

各反復での相対残差をプロットして、bicgの进行确认ます。指定れ许容误差ラインととににに,それぞれの解のの残差履歴ををプロットプロット

半学(0:长度(RV0)-1,Rv0/norm(b),'-o')holdonsemilogy(0:length(rv1)-1,rv1/norm(b),'-o')yline(tol,'r--');传奇(“没有预处理”,,,,'ilu preponditioner',,,,'宽容',,,,'Location',,,,'东方')Xlabel('迭代编号')ylabel(“相对残留”

图包含一个轴对象。轴对象包含3个类型线的对象,常数线。这些对象不代表预处理,ILU预处理,耐受性。

bicgに解初期を指定效果を调べます。

三重対角スパース行列を作成します。 X の想定れるがががののとなる,, 斧头 = b の右辺のベクトルとして各行の合計を使用します。

n = 900; e = ones(n,1); A = spdiags([e 2*e e],-1:1,n,n); b = sum(A,2);

bicgを使用して 斧头 = b を2回解きます。1 回は既定の初期推定、もう 1 回は解の適切な初期推定を使用します。両方の解に対して 200 回の反復と既定の許容誤差を使用します。すべての要素が0.99と等価ベクトル初期推定ををを番目のに指定します。。

最大=200; x1 = bicg(A,b,[],maxit);
BICG以迭代35收敛到具有相对残留9.5E-07的溶液。
X0=0.99*e; x2 = bicg(A,b,[],maxit,[],[],x0);
BICG在迭代7中汇聚到具有相对残留8.7E-07的溶液。

この場合、初期推定を指定するとbicgをよりに收束せることができます。

中间结果を返す

为了ループでbicgを呼び出して、初期推定を使用して中間結果を取得することもできます。ソルバーを呼び出すたびに、数回の反復が行われ、計算された解が格納されます。その後、その解を次の反復のバッチに対する初期ベクトルとして使用します。

たとえば、次のコードは 100 回の反復を 4 回実行し、for ループを通過するたびに、解のベクトルを格納します。

x0 =零(size(a,2),1);TOL = 1E-8;最大值= 100;为了k=1:4 [x,flag,relres] = bicg(A,b,tol,maxit,[],[],x0); X(:,k) = x; R(k) = relres; x0 = x;结尾

X(:,k)は,ループのkで计算れたのベクトルであり,r(k)はそのの相対残差。。

bicgに,系数行列一种の代わりに斧头および斧头を计算ハンドルをて线形システム解き。。。

非対称の対角作成します。をプレビューします。

a =画廊('Wilk',,,,21)+diag(ones(20,1),1)
a =21×2110 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 1 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 20 0 0 0 0 0 0 0 0 0 0⋮

この三重行列特殊なであるため,演算斧头を关数ハンドルで表すことができます。一种がベクトルする,结果ののの要素はととなります。结果结果ののははは一种の非ゼロの三重対角要素に対応します。

一种 X は次のようになります。

一种 X = [[ 10 2 0 0 1 9 2 0 0 1 2 0 0 1 0 0 1 0 2 0 0 1 10 这是给予的 [[ X 1 X 2 X 3 X 21 这是给予的 = [[ 10 X 1 + 2 X 2 X 1 + 9 X 2 + 2 X 3 X 19 + 9 X 20 + 2 X 21 X 20 + 10 X 21 这是给予的

3つの,,つのベクトルの合计记述でき。。

一种 X = [[ 10 X 1 + 2 X 2 X 1 + 9 X 2 + 2 X 3 X 19 + 9 X 20 + 2 X 21 X 20 + 10 X 21 这是给予的 = [[ 0 X 1 X 2 X 20 这是给予的 + [[ 10 X 1 9 X 2 9 X 20 10 X 21 这是给予的 + 2 [[ X 2 X 3 X 21 0 这是给予的

同様に、 一种 t X の式次のになります。

一种 t X = [[ 10 1 0 0 2 9 1 0 0 2 1 0 0 2 0 0 1 0 1 0 0 2 10 这是给予的 [[ X 1 X 2 X 3 X 21 这是给予的 = [[ 10 X 1 + X 2 2 X 1 + 9 X 2 + X 3 2 X 19 + 9 X 20 + X 21 2 X 20 + 10 X 21 这是给予的

一种 t X = [[ 10 X 1 + X 2 2 X 1 + 9 X 2 + X 3 2 X 19 + 9 X 20 + X 21 2 X 20 + 10 X 21 这是给予的 = 2 [[ 0 X 1 X 2 X 20 这是给予的 + [[ 10 X 1 9 X 2 9 X 20 10 X 21 这是给予的 + [[ X 2 X 3 X 21 0 这是给予的

m一种tl一种b® で、これらのベクトルを作成してそれらを合算し、フラグの入力に応じて斧头または斧头の値を与える関数を記述します。

功能y = afun(x,flag)如果strcmp(标志,'notransp'% Compute A*xy = [0; x(1:20)]。。。+[[(10:-1:0)'; (1:10)'].*x。。。+2*[[X(2:end); 0];别的如果strcmp(标志,'transp'%计算A'*Xy = 2*[0; x(1:20)]。。。+[[(10:-1:0)'; (1:10)'].*x。。。+[[X(2:end); 0];结尾结尾

(この关数,关数例の最后保存さていますます)

ここで,bicg斧头および斧头を计算关数を与えて,システムシステム 斧头 = b を解きます。1e-6の許容誤差と 25 回の反復を使用します。 一种 の行のとして b を指定し, X の真のががのとなるようにます。。

b = full(sum(a,2));tol = 1e-6;最大值= 25;x1 = bicg(@afun,b,tol,maxit)
bicg converged at iteration 19 to a solution with relative residual 4.8e-07.
x1 =21×11。00001。0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 ⋮

ローカル関数

功能y = afun(x,flag)如果strcmp(标志,'notransp'% Compute A*xy = [0; x(1:20)]。。。+[[(10:-1:0)'; (1:10)'].*x。。。+2*[[X(2:end); 0];别的如果strcmp(标志,'transp'%计算A'*Xy = 2*[0; x(1:20)]。。。+[[(10:-1:0)'; (1:10)'].*x。。。+[[X(2:end); 0];结尾结尾

入力引数

すべて折りたたむ

系数行列行列关数ハンドルとして指定。この行列はシステムシステムa*x = bの系数です。一般,,一种は大規模なスパース行列、または大規模なスパース行列と列ベクトルの積を返す関数ハンドルです。

关数ハンドルとしての一种の指定

オプションで、係数行列を、行列ではなく関数ハンドルとして指定できます。この関数ハンドルは、係数行列全体を作成するのではなく、行列とベクトルの積を返し、計算をより効率的にします。

关数ハンドルを使用するには、関数シグネチャ功能y = afun(x,opt)を使用し。关数のパラメーター化では,な场合に关数好玩儿に追加のパラメーターを指定する方法を説明しています。関数好玩儿は,のを満たさばなりません。

  • afun (x, notransp)は,斧头の積を返します。

  • afun(x,'transp')は,斧头の積を返します。

许容さ关数例をに示します。

功能y = afun(x,opt,b,c,n)如果strcmp(opt,'notransp')y = [b*x(n+1:end);C*X(1:n)];别的y = [c'*x(n+1:end);b'*x(1:n)];结尾
关数好玩儿bおよびCの値を使用して、実際に行列全体を作成することなく、指定されたフラグに応じて斧头または斧头を計算します。

データ::double|function_handle
复素数サポート:あり

线形方程式右辺。列ベクトルとして指定します。bの长さはsize(A,1)と等しくなければなりません。

データ::double
复素数サポート:あり

メソッドの許容誤差。正のスカラーとして指定します。この入力を使用して計算の精度と実行時間とをトレードオフします。成功するには、bicgは,れる回数内に许容満たさなければなりませ。托尔を小さいする,解よりでなければが成功しないないことをを意味し

データ::double

最大。正スカラー整数としてし。。。最大の値を増やして、bicgが许容误差托尔を満たすためにより多くの反復を行えるようにします。一般に、托尔の値ほど计算をにするため反复がより多く必要であるとということことししし

前处理行列またはハンドルの个别引数指定します。前处理行列mまたはその行列因子m=M1*m2を指定线形システム数値的侧面改善,,,bicgでの收束をにます。系数行列场合,不完全完全行列因因关数关数关数伊卢およびIcholを使用前行列を生成できまた,因数分解のに平衡をし,行列の数をできます前处理行列の详细详细,,,線形方程式の反復法を参照してください。

bicgは指定なし前処理行列を単位行列として扱います。

关数ハンドルとしてのmの指定

オプションで、mM1またはM2のいずれ,ではなく关数ハンドルとしてとしてます。ハンドルはは,前前处理处理行列行列行列全体全体作成作成するのではなくのではなく行列行列行列ベクトルベクトルベクトル演算演算を

关数ハンドルを使用するには、まずシグネチャ功能y = mfun(x,opt)をもつを作成し。。关数のパラメーター化では,な场合に关数mfunに追加のパラメーターを指定する方法を説明しています。関数mfunは,のを満たさばなりません。

  • mfun(x,'notransp')m \ xまたはM2\(M1\x)の値をます。

  • mfun(x,'transp')m'\xまたはm1'\(m2'\ x)の値をます。

许容さ关数例をに示します。

功能y = mfun(x,opt,a,b)如果strcmp(opt,'notransp')y = x。*a;别的y = x.*b;结尾结尾
この例では、関数mfun一种およびbを使用て,実际行列行列m全体をするなく指定されフラグに応じてm \ x = x*aまたはm'\ x = x*bを計算します。

データ::double|function_handle
复素数サポート:あり

初期推定。size(A,2)に等しい長さの列ベクトルとして指定します。bicgに,既定値のゼロのベクトルではなく、より妥当な初期推定X0を与える,时间ができ,アルゴリズムより收束するようにでき。。

データ::double
复素数サポート:あり

出力引数

すべて折りたたむ

线形システム。列として返され。出力出力は线形システムa*x = bの近似をます。计算が正常完了し场合(旗帜=0),重新托尔以下になり。

計算が正常に完了しない場合 (标志〜= 0)は常に,bicgによって返される解Xは,すべての反復にわたり計算された最小残差ノルムをもちます。

收束。表のいずれかの値としてれます收束フラグフラグフラグは,,,计算计算が正常正常に実行実行さされかかどうかをを

フラグの値

收束

0

成功 —bicgは希望する許容誤差托尔に反復回数最大以内でしました。

1

失敗 —bicg最大回の反復を行いましたが収束しませんでした。

2

失败 - 前前行列mまたはm=M1*m2が悪になって。。

3

失敗 — 連続する 2 回の反復が同じであり、bicgは计算进めてい。。

4

失敗 —bicgアルゴリズムでれスカラー量のののつ,を続ける​​には大きすぎるすぎるかまたは小さ小さ

相対残差。として返さます。相対残差误差relres = norm(b-a*x)/norm(b)は解正确をています计算が许容误差托尔に反復回数最大以内で收束场合,relres <= tolになります。

データ::double

反复回数スカラー返され。この出力は,Xに対する計算解が計算された時点での反復回数を示します。

データ::double

残差误差ベクトル返されます。误差误差norm(b-a*x)によって,アルゴリズムがXの特定値收束どの程度近いがわかります。resvecの要素はの回数と同じ。。resvecの内容をて,托尔または最大の値するかかを决定ことができ。。。

データ::double

详细

すべて折りたたむ

双共役倾斜法

双共役傾斜 (BiCG) アルゴリズムは共役勾配 (CG) 法を非対称システムに一般化するために開発されました。BiCG は元の線形システム 一种 X = b だけでなく,共役役 一种 t X * = b * も解きます。これにより、係数行列の転置で定義された共役の残差が 2 セット生成されます。

cgアルゴリズム设计である対称正定値システムの场合场合场合アルゴリズムアルゴリズムによってがが得得られますますますががが,,反复反复反复反复あたりあたりあたりあたりのののコストコストコストはははははははははははははははははははははははは。gmresのみはははははのみのみのみのみ。されるれる不规则不规则不规则不规则なななな收束收束收束收束收束动作动作する,,,,,,,,,,,,,,,,,,,,,,,,,,,,)[1]

ヒント

  • 最大反复メソッド收束は系数行列の条件数cond(a)に依存します。平衡を使用して一种の条件数を改善することができ、それ自体で最大反復のソルバーが収束しやすくなります。ただし、平衡を使用ことも,化した行列b = r*p*a*cを次分解际に前处理品质が向上し。。

  • 解剖SYMRCMなど行列べ替え关数を使用て系数行列の行とを并べ替え并べ替え,,系数系数系数行列行列が因子因子分解さされれてて前处理处理行列がが生成生成生成さ际际际际后でを使用たシステムをのになメモリと时间时间を削减削减。。。

参照

[1]b一种rrett, R., M. Berry, T.F. Chan, et al., Templates for the Solution of Linear Systems: Building Blocks for Iterative Methods, SIAM, Philadelphia, 1994.

拡张机能

バージョン履歴

R2006Aよりに导入导入