主要内容

bicg

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

描述

例子

x= bicg(一个b)试图解线性方程组a * x = bx使用双共轭梯度方法.当尝试成功时,bicg显示确认收敛的消息。如果bicg未能迭代或暂停出于任何原因的最大数目后收敛,它显示包括所述相对残余诊断消息范数(B-A * X)/常态(b)中以及方法停止的迭代次数。

例子

x= bicg(一个bTOL)指定方法的公差。默认公差为1 e-6

例子

x= bicg(一个bTOL麦克斯特)指定要使用的最大迭代次数。bicg如果它不收敛内显示诊断信息麦克斯特迭代。

例子

x= bicg(一个bTOL麦克斯特)指定一个预处理矩阵并计算x通过有效地求解该系统 1 一个 x 1 b .利用预处理矩阵可以改善问题的数值性质,提高计算效率。

例子

x= bicg(一个bTOL麦克斯特M1M2)指定预处理矩阵的因子这样M=M1*M2

例子

x= bicg(一个bTOL麦克斯特M1M2x0)指定解向量的初始猜测x.默认值是一个0的向量。

例子

x国旗) = bicg (___)返回指定算法是否成功收敛的标志。当标志=0,趋同是成功的。您可以将此输出语法与前面的任何输入参数组合一起使用。当你指定国旗输出,bicg不显示任何诊断消息。

例子

x国旗relres) = bicg (___)还返回相对残余范数(B-A * X)/常态(b)中. 如果国旗0,然后relres <= TOL

例子

x国旗relresiter) = bicg (___)也返回迭代数iter在哪x是计算。

例子

x国旗relresiterresvec) = bicg (___)还返回每次迭代的残余规范的向量,包括第一个残差范数(b-A*x0)

例子

全部收缩

解决使用正方形线性系统bicg使用默认设置,然后调整解决方案流程中使用的容忍度和迭代次数。

创建一个随机稀疏矩阵一个密度为50%。还创建一个随机向量b右边的 斧头 b

RNG.违约5 = sprand (400400);=“*;b =兰德(400 1);

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

x = bicg (A, b);
BICG停在迭代20而未收敛到所需的公差1E-06,因为达到迭代的最大数量。返回的迭代(数7)具有相对残留0.45。

默认情况下bicg使用20次迭代和一个公差1 e-6,并且该算法无法在此矩阵的20次迭代中收敛。由于残差仍然很大,这是一个很好的指标,表明需要更多的迭代(或预条件矩阵)。您还可以使用更大的容差,使算法更容易收敛。

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

x = bicg (A, b, 1 e - 4100);
Bicg在迭代100时停止,没有收敛到期望的公差0.0001,因为已经达到了最大的迭代次数。返回的迭代(数7)具有相对残留0.45。

即使有更宽松的公差和更多的迭代,残余误差也不会有太大的改善。当迭代算法以这种方式暂停时,很好地表明需要一个预条件矩阵。

计算的不完全Cholesky分解一个,并使用L'作为预处理输入的因子bicg

L = ichol(一个);x = bicg (A, b, e - 4100 L ');
在第60次迭代时,Bicg收敛到一个相对残差为9.9e-05的解。

使用预条件子可以充分改善问题的数值性质,从而bicg能够收敛。

检查使用预条件矩阵的效果bicg求解线性系统。

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

负载west0479一个= west0479;

定义b所以真正的解 斧头 b 是全部为一向量。

B =总和(A,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,托尔,麦克斯特);fl0
fl0=1
rr0
rr0 = 1
it0
IT0 = 0

fl0是因为bicg不收敛到所需容限1 e-12中所要求的20次迭代。事实上,行为bicg这么差的初始猜测x0=零(尺寸(A,2),1)是最好的解决方案并被返回,如所示IT0 = 0

与收敛速度慢的帮助,你可以指定一个预条件矩阵。自从一个非对称,使用ilu生成预处理器 l U .指定一个drop tolerance以忽略值小于的非对角线项1 e-6.解预处理系统 - 1 一个 x - 1 b 通过指定lU作为输入来bicg

设置=结构('类型'“ilutp”'droptol',1e-6)[五十、 U]=ilu(A,设置)[x1,fl1,rr1,it1,rv1]=bicg(A,b,tol,maxit,L,U);fl1
FL1 = 0
rr1
RR1 = 4.1374E-14
it1
IT1 = 6

使用ilu预处理器产生一个相对残余小于规定公差1 e-12在第六次迭代。输出rv1 (1)标准(b),以及输出rv1(结束)范数(b-A*x1)

你可以跟着进度bicg通过绘制每个迭代的相对残差。用指定的公差线绘制每个溶液的残留历史图。

semilogy(0:长度(rv0) 1, rv0 /规范(b),“o”) 抓住符号学(0:长度(rv1)-1,rv1/范数(b),“o”) yline(托尔,“r——”);传奇(“没有预调节器”ILU预处理的“宽容”“位置”'东')xlabel(的迭代次数)ylabel(的相对剩余的)

图中包含一个轴。轴包含3个类型为line、constantline的对象。这些对象表示无预处理程序、ILU预处理程序和公差。

检查供应的影响bicg带着对解决方案的初步猜测。

创建一个三对角稀疏矩阵。用每一行的和作为右边的向量 斧头 b 因此,对于期望的解决方案 x 是一个1的向量。

N = 900;E =酮(N,1);A = spdiags([E 2 * E E], -  1:1,N,N);B =总和(A,2);

bicg来解决 斧头 b 两次:一次是默认的初始猜测,另一次是正确的初始猜测。对这两种解决方案使用200次迭代和默认容忍。金宝搏官方网站指定第二个解中的初始猜想为一个所有元素都等于的向量0.99

麦克斯特= 200;x1 = bicg (A, b,[],麦克斯特);
在第35次迭代时,Bicg收敛到一个相对残差为9.5e-07的解。
x0=0.99*e;x2=bicg(A,b,[],maxit,[],[],x0);
在第7次迭代时,Bicg收敛到一个相对残差为8.7e-07的解。

在这种情况下供给的初始猜测使bicg加快收敛速度。

返回的中间结果

您还可以通过调用初始猜测来获得中间结果bicg在一个循环。对求解器的每次调用都执行几次迭代,并存储计算出的解决方案。然后使用该解决方案作为下一批迭代的初始向量。

例如,此代码执行四次100次迭代,并在For循环中的每次传递后存储解决方案向量:

x0 =零(尺寸(a,2),1);tol = 1e-8;maxit = 100;k=1:4[x,flag,relres]=bicg(A,b,tol,maxit,[],[]和x0);X(:,k)=X;R(k)=relres;x0=x;结束

X (:, k)是迭代时计算的解向量kfor循环的R(k)的是这个解的相对剩余。

通过提供bicg具有计算斧头‘* x代替系数矩阵一个

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

一个=画廊('威尔克',21)+diag(一(20,1),1)
一个=21日×2110 2 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 1 8 2 0 0 0 00 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 00 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 1 4 2 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 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 20 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

得到的向量可以写成三个向量的和:

一个 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

在MATLAB®中,编写一个函数,创建这些向量并将它们相加,给出斧头或者‘* x取决于标志输入:

功能y = afun(x,旗帜)如果STRCMP(旗,“不运输”)%计算A * XY = [0;X(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+ 2 * (x(2:结束);0);埃尔塞夫STRCMP(旗,'transp')' * x %计算y=2*[0;x(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+[x(2:完);0];结束结束

(此功能被保存为在实施例的端部的局部的功能。)

现在,解线性系统 斧头 b 通过提供bicg使用计算的函数句柄斧头‘* x.使用公差1 e-6和25个迭代。指定 b 作为行的和 一个 所以真正的解 x 是一个1的向量。

b =全(sum (A, 2));托尔= 1 e-6;麦克斯特= 25;x1 = bicg (@afun, b,托尔,麦克斯特)
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,旗帜)如果STRCMP(旗,“不运输”)%计算A * XY = [0;X(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+ 2 * (x(2:结束);0);埃尔塞夫STRCMP(旗,'transp')' * x %计算y=2*[0;x(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+[x(2:完);0];结束结束

输入参数

全部收缩

系数矩阵,指定为正方形矩阵或函数处理。该矩阵是线性系统的系数矩阵a * x = b. 通常地一个是一个大的稀疏矩阵或函数句柄返回一个大稀疏矩阵和列向量的乘积。

指定一个作为函数句柄

可以选择将系数矩阵指定为函数句柄,而不是矩阵。函数handle返回矩阵向量积,而不是形成整个系数矩阵,从而提高计算效率。下载188bet金宝搏

要使用函数句柄,请使用函数签名函数y = afun(X,OPT)参数化功能解释如何向函数提供附加参数好玩儿,如果必要的。这个函数好玩儿必须满足以下条件:

  • afun(X, 'notransp')返回产品斧头

  • afun (x,“透明”)返回产品‘* x

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

功能y = afun (x,选择,B, C, n)如果STRCMP(选择,“不运输”) y = [B*x(n+1:end)];C * x (1: n)];其他的* x y = [C”(n + 1:结束);B * x (1: n)];结束
这个函数好玩儿使用中的值BC计算无论是斧头或者‘* x(取决于指定的标志)而不实际形成整个矩阵。

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

线性方程的右边,指定为列向量。的长度b必须等于尺寸(A,1)

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

方法公差,指定为正标量。使用此输入来权衡计算的准确性和运行时间。bicg必须符合允许的迭代次数内的公差是成功的。值越小TOL意味着答案必须更精确,计算才能成功。

数据类型:

最大迭代次数,指定为正标量整数。增加价值麦克斯特允许更多的迭代bicg符合公差TOL. 通常地一个smaller value ofTOL意味着需要更多的迭代才能成功完成计算。

预条件子矩阵,指定为矩阵或函数处理的单独的参数。你可以指定一个预条件矩阵或其矩阵因子M=M1*M2改进线性系统的数值方面,使其更易于bicg快速收敛。对于平方系数矩阵,可以使用不完全矩阵分解函数iluichol生成预处理矩阵。你也可以用平衡在因子分解之前改进系数矩阵的条件数。有关前置条件的更多信息,请参阅线性系统的迭代方法

bicg将未指定的前置数视为单位矩阵。

指定作为函数句柄

您可以任意指定M1M2作为函数句柄而不是矩阵。函数句柄执行矩阵向量运算,而不是形成整个预处理矩阵,使计算更加高效。

要使用函数句柄,首先创建一个带有签名的函数函数y = mfun(x,opt)参数化功能解释如何向函数提供附加参数MFUN,如果必要的。这个函数MFUN必须满足以下条件:

  • MFUN(X, 'notransp')返回的值M \ x或者M1、M2 \ (x)

  • mfun(x,'transp')返回的值M'\x或者M1 ' \”(M2 \ x)

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

功能y = mfun (x,选择a, b)如果STRCMP(选择,“不运输”) y = x.*a;其他的Y = X * B。;结束结束
在这个例子中,函数MFUN用途一个b计算无论是M \ x = x *或者M ' \ x = x * b(取决于指定的标志)而不是实际形成整个矩阵

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

初始猜测,指定为长度等于的列向量尺寸(A、2). 如果you can providebicg一个更合理的初步猜测x0与默认的零向量相比,它可以节省计算时间,帮助算法更快地收敛。

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

输出参数

全部收缩

线性系统解决方案,作为列向量返回。该输出给出了线性系统的近似解a * x = b. 如果the calculation is successful (标志=0),然后relres是小于还是等于TOL

每当计算不成功时(国旗~ = 0),解决方案x返回bicg是在所有迭代中计算出的残差范数最小的。

收敛标志,返回此表中的标值之一。收敛标志指示计算是否成功以及几种不同形式的故障之间进行区分。

标志值

收敛

0

成功——bicg收敛到期望的公差TOL之内麦克斯特迭代。

1

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

2

故障-预条件矩阵或者M=M1*M2他身体不适。

3.

失败-bicg连续两次迭代后都是相同的。

4

故障 - 一个由计算的标量的bicg算法变得太小或太大,无法继续计算。

相对剩余误差,作为标量返回。相对残差relres =规范(B-A * X)/常态(b)中表明答案有多准确。如果计算收敛到公差TOL之内麦克斯特那么迭代relres <= TOL

数据类型:

迭代编号,作为标量返回。此输出指示迭代次数,在该次数下,计算出的x是经过计算的。

数据类型:

残差,返回作为载体。残差规范(b * x)揭示了给定值时算法离收敛有多近x.元素的数量resvec等于迭代次数。您可以检查的内容resvec来帮助决定是否要改变TOL或者麦克斯特

数据类型:

更多关于

全部收缩

双共轭梯度方法

为了将共轭梯度法推广到非对称系统,提出了双共轭梯度算法。BiCG不仅求解原始线性方程组 一个 x b 而且还有共轭系统 一个 T x b .这就得到了由系数矩阵的转置所定义的两组共轭残差。

对于对称正定系统,其中CG算法被设计为,所述BICG算法提供了相同的结果,但每个迭代两次的费用。BICG的精确度可以媲美GMRES,但两人只GMRES之间真正最大限度地减少残留。在BICG算法的几个变种被开发,以解决不规则的收敛行为就显示(见的BiCGSTAB,BiCGSTABL和CGS)[1]

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,气孔导度(A).您可以使用平衡改进的条件数一个,它本身就使得大多数迭代求解器更容易收敛。然而,使用平衡当你随后分解均衡矩阵时,也会得到质量更好的预处理矩阵B = R * P * * C

  • 您可以使用矩阵重排序函数,例如解剖symrcm来排列所述系数矩阵的行和列,并尽量减少当系数矩阵因式分解,以产生预处理器非零元素的数量。这可以减少所需的随后的内存和时间解决预处理线性系统。

参考

[1]巴雷特,R.,M。莓果,T.F.Chan等人,线性系统解的模板:迭代法的构建块,SIAM,费城,1994年。

扩展功能

在R2006A之前介绍