bicg

求解线性方程组-双梯度法

描述

X= BICG(一种b试图解决线性方程系统A * X = B对于X使用双共轭梯度方法。如果尝试成功,bicg显示确认收敛的消息。如果bicg在最大迭代次数后未能收敛或由于任何原因停止,则显示包含相对剩余量的诊断消息规范(b * x) /规范(b)和迭代号,在该方法停止。

X= BICG(一种b托尔指定方法的容忍度。默认容忍度为1 e-6

X= BICG(一种b托尔麦克斯特指定迭代使用的最大数量。bicg如果未能在内部收敛,则显示诊断消息麦克斯特迭代。

X= BICG(一种b托尔麦克斯特中号指定一个预条件矩阵中号和计算X通过有效地解决了系统 中号 1 一种 X = 中号 1 b 。使用预条件矩阵可以改善该问题的数值性质,计算的效率。

X= BICG(一种b托尔麦克斯特M1平方米指定预处理矩阵的因子中号这样M = M1 *平方米

X= BICG(一种b托尔麦克斯特M1平方米x0指定用于解向量的初始猜测X。默认值是零向量。

[X] = BICG(___返回一个标志,指定是否该算法成功收敛。什么时候国旗= 0,收敛成功。您可以使用此输出语法与任何先前的输入参数的组合。当您指定输出,bicg不显示任何诊断消息。

[Xrelres] = BICG(___还返回相对剩余值规范(b * x) /规范(b)。如果0, 然后relres < =托尔

[XrelresITER] = BICG(___也返回迭代次数ITER在这X被计算。

[XrelresITERresvec] = BICG(___还在每次迭代返回的残留规范的载体,包括第一残余规范(b * x0)

例子

全部折叠

解决一个平方线性系统使用bicg使用默认设置,然后调整在溶液方法中使用迭代的公差和数量。

创建一个随机稀疏矩阵一种用50%的密度。还创建一个随机向量b对于右手边 斧头 = b

rng默认的A = sprand(400400,0.5);A = A'* A;B =兰特(400,1);

解决 斧头 = b 使用bicg。输出显示器包括相对剩余误差的值 b - 斧头 b

X = BICG(A,B);
bicg在迭代20停止,没有收敛到期望的公差1e-06,因为达到了最大的迭代次数。返回的iterate(第7个)相对剩余值为0.45。

默认情况下bicg使用20次迭代和公差1 e-6,该算法对该矩阵在20次迭代中无法收敛。由于剩余值仍然很大,这是需要更多迭代(或预调节矩阵)的一个好指标。您还可以使用更大的容差来简化算法的收敛。

解决再次用宽容的系统1的军医和100的迭代。

X = BICG(A,B,1E-4100);
BICG停在迭代100而未收敛到所需的公差0.0001,因为达到迭代的最大数量。返回的iterate(第7个)相对剩余值为0.45。

即使有一个更宽松的容错和更多的迭代,残余误差并没有改善太多。当迭代算法以这种方式停滞时,这很好地表明需要一个预处理矩阵。

计算出的不完全Cholesky分解一种,并使用L '因子如预处理器输入到bicg

L = ichol(A);X = BICG(A,B,1E-4100,L');
BICG会聚在迭代60与相对残余9.9E-05的溶液。

使用预调节器可以充分改善问题的数值性质bicg可以收敛。

检查使用预调剂矩阵的效果bicg解一个线性系统。

加载west0479,一个479乘479的实非对称稀疏矩阵。

加载west0479A = west0479;

确定b所以,真正的解决方案 斧头 = b 是所有1的向量。

b =和(2);

设置宽容和最大迭代次数。

托尔= 1 e-12;麦克斯特= 20;

使用bicg发现在所要求的公差和迭代次数的解决方案。指定五个输出返回有关求解过程的信息:

  • X是所计算的解决方案A * X = B

  • FL0是指示该算法是否收敛的标志。

  • rr0计算结果的相对剩余值是多少X

  • IT0是迭代次数时X被计算。

  • rv0为残留历史的向量 b - 斧头

[X,FL0,RR0,IT0,RV0] = BICG(A,B,TOL,麦克斯特);FL0
fl0 = 1
rr0
rr0 = 1
IT0
it0 = 0

FL0是1,因为bicg不收敛到要求的容忍1 e-12在请求的20次迭代中。事实上,的行为bicg是如此的可怜以至于最初的猜测x0 = 0(大小(2),1)是最好的解决方案,并返回,由所指示的it0 = 0

为了帮助缓慢收敛,您可以指定一个预调节矩阵。自一种是不对称,利用ILU生成预条件 中号 = 大号 ü 。指定落忍忽略非对角项与值小于1 e-6。解决预处理系统 中号 - 1 一种 X = 中号 - 1 b 通过指定大号ü作为输入,bicg

安装=结构(“类型”'ilutp'“droptol”1 e-6);[L U] = ilu(一个,设置);(x1, fl1 rr1、it1 rv1] = bicg (A, b,托尔,麦克斯特,L, U);fl1
fl1 = 0
rr1
RR1 = 4.1374e-14
IT1
it1 = 6

an的用法ILU预调剂产生的相对残留小于规定的耐受性1 e-12在第六次迭代。输出RV1(1)规范(b),以及输出RV1(端部)规范(b * x1)

您可以按照进度bicg通过在每一次迭代绘制的相对残差。绘制每个解决方案的剩余历史与指定容忍线。

semilogy(0:长度(RV0)-1,RV0 /范数(b)中,'-o')举行semilogy(0:长度(rv1) 1, rv1 /规范(b),'-o')YLINE(TOL,'R--');传说(“不预条件”“ILU预调节器”'公差'“位置”“东”)包含(“迭代次数”) ylabel (“相对残存”

检查供应的效果bicg对解决方案有初步的猜测。

创建一个三对角稀疏矩阵。用每一行的和作为的右边的向量 斧头 = b 所以的期望解 X 是那些的向量。

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

使用bicg解决 斧头 = b 两次:一次用默认的初始猜测,有一次与解决方案的一个很好的初始猜测。使用200次迭代,两种解决方案的默认公差。金宝搏官方网站指定在第二溶液作为载体的初始猜测与所有元素等于0.99

麦克斯特= 200;x1 = bicg (A, b,[],麦克斯特);
BICG会聚在迭代35与相对残余9.5e-07的溶液。
x0 = 0.99 * e;x2 = bicg(麦克斯特,A, b, [] [], [], x0);
BICG会聚在迭代7与相对残余8.7E-07的溶液。

在这种情况下,提供一个初始猜测将启用bicg更快地收敛。

返回中间结果

您也可以使用初始猜测得到通过调用中间结果bicg在一个for循环。在求解器每次调用执行几次迭代并将计算出的解决方案。然后,您使用的溶液,作为下一批迭代的初始向量。

例如,这段代码执行了4次100次迭代,并在每次循环结束后存储解向量:

X0 =零(尺寸(A,2),1);TOL = 1E-8;麦克斯特= 100;对于k = 1:4 [x,国旗,relres] = bicg (A, b,托尔,麦克斯特[],[],x0);X = X (:, k);R (k) = relres;x0 = x;结束

X (:, k)是否在迭代时计算解向量ķ的for循环,和R (k)是,溶液的相对残留。

通过提供解一个线性系统bicg带有一个可计算的函数句柄* x斧头代替系数矩阵的一种

创建一个非对称三对角矩阵。预览矩阵。

A =画廊(“威尔克”21) +诊断接头(1(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 2 1 9 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 1 7 2 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 1 2 5 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 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0⋮

因为这个三对角矩阵有一个特殊的结构,你可以表示这个操作* x带有函数句柄。什么时候一种乘以一个向量,大多数在所得矢量的元素是零。在结果所对应的非零元素具有非零三对角元素一种

表达式 一种 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 ]

将得到的载体可被写为三个矢量的总和:

一种 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 ]

同样,表达式为 一种 Ť X 变为:

一种 Ť 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 ]

一种 Ť 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 ]

在MATLAB®中,编写一个函数,创建这些向量并将它们加在一起,给出的值* x斧头,视标志输入而定:

函数Y = afun(X,标志)如果比较字符串(国旗,“notransp”%计算* x(y = 0;x (1:20))+ ((10: 1:0) ';(1:10)”)。* x+ 2 * [X(2:结束);0);elseif比较字符串(国旗,“运输”%计算A'* Xy = 2 * [0;x (1:20))+ ((10: 1:0) ';(1:10)”)。* x+ (x(2:结束);0);结束结束

(在示例的最后,该函数被保存为一个本地函数。)

现在,解这个线性方程组 斧头 = b 通过提供bicg用函数处理计算* x斧头。使用的公差1 e-6和25次迭代。指定 b 的行和 一种 因此,对于真正的解决办法 X 是那些的向量。

B =全(总和(A,2));TOL = 1E-6;麦克斯特= 25;X1 = BICG(@ afun,B,TOL,麦克斯特)
bicg在第19次迭代时收敛到相对残差为4.8e-07的解。
X1 =21×11.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000⋮

本地函数

函数Y = afun(X,标志)如果比较字符串(国旗,“notransp”%计算* x(y = 0;x (1:20))+ ((10: 1:0) ';(1:10)”)。* x+ 2 * [X(2:结束);0);elseif比较字符串(国旗,“运输”%计算A'* Xy = 2 * [0;x (1:20))+ ((10: 1:0) ';(1:10)”)。* x+ (x(2:结束);0);结束结束

输入参数

全部折叠

系数矩阵,指定为方阵或函数句柄。该矩阵为线性系统中的系数矩阵A * X = B。一般来说,一种是一个大型稀疏矩阵或函数句柄,它返回大型稀疏矩阵与列向量的乘积。

指定一种作为一个功能处理

您可以选择将系数矩阵指定为函数句柄而不是矩阵。函数句柄返回矩阵-向量的乘积,而不是形成整个系数矩阵,使计算更加高效。下载188bet金宝搏

要使用函数句柄,请使用函数签名函数y = afun(x,opt)参数化功能介绍了如何给函数提供额外的参数afun,如果必要的。功能afun必须满足以下条件:

  • afun (x, notransp)返回的产品* x

  • afun(X, '运输')返回的产品斧头

可接受的函数的一个例子是:

函数Y = afun(X,选择,B,C,N)如果比较字符串(选择,“notransp”)Y = [B * X(N + 1:结束);C *×(1:N)];其他的Y = [C'* X(N + 1:结束);B'* X(1:N)];结束
功能afun使用C来计算* x斧头(取决于指定的标志),而不是实际形成整个矩阵。

数据类型:|function_handle
复数支持:金宝app是的

线性方程的右手侧,指定为列向量。长度b必须等于大小(1)

数据类型:
复数支持:金宝app是的

方法容忍,指定为正标量。使用此输入权衡计算精度和运行。bicg必须满足允许迭代次数以内的容忍度才能成功。更小的值托尔指的答案必须更加精确的计算是成功的。

数据类型:

最大迭代次数,指定为正标量整数。增加的价值麦克斯特允许更多的迭代bicg满足公差托尔。一般来说,较小的值托尔意味着更多的迭代都需要成功地完成计算。

预处理矩阵,指定为矩阵或函数句柄的单独参数。您可以指定预调节矩阵中号或者它的矩阵因子M = M1 *平方米改进线性系统的数值方面,使其更容易bicg快速收敛。对于正方形系数矩阵时,可以使用不完全矩阵分解功能ILUichol以产生预条件矩阵。您还可以使用均衡对分解前的系数矩阵的条件数进行改进。有关预调节器的更多信息,请参见迭代法线性系统

bicg把未指定的预条件为单位矩阵。

指定中号作为一个功能处理

您可以选择指定任何中号M1,或平方米作为函数处理,而不是矩阵。功能句柄执行矩阵向量运算,而不是形成在整个预条件矩阵,使得计算更加有效。

要使用函数句柄,首先创建一个带有签名的函数函数y = mfun(x,opt)参数化功能介绍了如何给函数提供额外的参数mfun,如果必要的。功能mfun必须满足以下条件:

  • mfun (x, notransp)返回值中号\ XM2 \(M1 \ X)

  • mfun (x,“透明”)返回值M ' \ xM1 '\(M2' \ X)

可接受的函数的一个例子是:

函数Y = MFUN(X,选择,A,B)如果比较字符串(选择,“notransp”)Y = X *一个。其他的y = x。* b;结束结束
在该例子中,函数mfun使用一种b来计算中号\ X = X *一M'\ X = X * B(根据所指定的标志)没有实际形成整个矩阵中号

数据类型:|function_handle
复数支持:金宝app是的

初始猜测,指定为与长度的列向量等于大小(2)。如果您可以提供bicg一个更合理的初始猜测x01比0的默认矢量,那么它可以节省计算时间,并帮助该算法收敛速度更快。

数据类型:
复数支持:金宝app是的

输出参数

全部折叠

线性方程组解,返回为列向量。这个输出给出了线性系统的近似解A * X = B。如果计算成功(国旗= 0), 然后relres小于或等于托尔

计算不成功时(标志〜= 0),解决方案X通过返回bicg是一个具有上计算所有的迭代微小残留标准。

收敛标志,作为此表中的标量值之一返回。收敛标志表明计算是否成功,并区分几种不同形式的失败。

标志值

收敛

0

成功 -bicg收敛到期望的公差托尔麦克斯特迭代。

1

失败- - - - - -bicg迭代麦克斯特迭代但没有收敛。

2

失败-预处理矩阵中号M = M1 *平方米是病态的。

3

失败- - - - - -bicg停滞后,连续两次迭代是一样的。

4

故障-计算的标量之一bicg算法变得过小或过大,继续计算。

相对残差,返回一个标量。相对残余误差relres =规范(b * x) /规范(b)是的答案如何准确的指示。如果计算收敛于宽容托尔麦克斯特迭代,然后relres < =托尔

数据类型:

迭代数,作为标量返回。此输出表明迭代数,计算结果为X计算了。

数据类型:

残差,作为向量返回。剩余误差范数(B-A * x)的揭示了算法有多接近收敛为给定值X。元素的数量resvec等于迭代的次数。您可以检查的内容resvec来帮助决定是否改变的值托尔麦克斯特

数据类型:

更多关于

全部折叠

双共轭梯度方法

的双共轭梯度(BICG)算法被开发用于共轭梯度(CG)的方法推广到非对称系统。BICG不仅解决了原来的线性系统 一种 X = b 而且共轭体系 一种 Ť X * = b * 。这导致两组共轭残差在系数矩阵的转置来定义。

对于对称正定系统,CG算法是为其设计的,BiCG算法提供相同的结果,但每次迭代的代价是原来的两倍。BiCG的精度可以与gmg相比较,但只有gmg的精度才能使残差达到最小。BiCG算法的几个变种被开发来解决它所显示的不规则收敛行为(参见BiCGSTAB, BiCGSTABL和CGS)[1]

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,COND(A)。您可以使用均衡改善的条件数一种,并在自己的这使得它更容易为大多数迭代求解收敛。但是,使用均衡也带来更好的质量预条件矩阵,当您随后因素将平衡矩阵B = R * P *甲* C

  • 您可以使用矩阵重新排序功能,如解剖symrcm在对系数矩阵进行分解生成预调节器时,对系数矩阵的行和列进行排列,使非零的数目最小化。这可以减少后续求解预条件线性系统所需的内存和时间。

参考

bb0 Barrett, R., M. Berry, T.F. Chan,等人,解决线性系统的模板:迭代方法的构建模块1994年,暹罗,费城。

扩展功能

之前介绍过的R2006a