BICG.

求解线性方程系统 - Biconjugate梯度法

描述

例子

x= bicg(一个b试图解线性方程组a * x = bx使用Biconjugate渐变方法.当尝试成功时,BICG.显示一条消息以确认融合。如果BICG.由于任何原因,未能在最大迭代次数或停止之后收敛,它显示包含相对残差的诊断消息常态(B-A * X)/ NOM(B)和该方法停止的迭代号。

例子

x= bicg(一个b指定该方法的公差。默认容差是1E-6

例子

x= bicg(一个bmax指定要使用的最大迭代次数。BICG.如果无法在内部收敛,则显示诊断消息max迭代。

例子

x= bicg(一个bmax指定一个预安全载体矩阵和计算x通过有效地求解该系统 - 1 一个 x - 1 b x.利用预处理矩阵可以改善问题的数值性质,提高计算效率。

例子

x= bicg(一个bmaxM1M2指定预安全载体矩阵的因素这样m = m1 * m2

例子

x= bicg(一个bmaxM1M2X0.指定解向量的初始猜测x.默认值是零的向量。

例子

x旗帜) = bicg (___返回指定算法是否成功收敛的标志。当标志= 0.,收敛成功。您可以使用此输出语法与任何先前的输入参数组合。当您指定时旗帜输出,BICG.不显示任何诊断消息。

例子

x旗帜) = bicg (___还返回相对残差常态(B-A * X)/ NOM(B).如果旗帜0,然后Relres <= tol

例子

x旗帜it) = bicg (___也返回迭代数it此时x是计算。

例子

x旗帜itResvec.) = 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个迭代和容忍度1E-6,并且该算法无法在此矩阵的那些迭代中收敛。由于剩余仍然很大,因此是一个良好的指标,即需要更多的迭代(或预处理器矩阵)。您还可以减少公差,以使算法更容易收敛。

用容差再次解系统1E-4和100次迭代。

X = BICG(A,B,1E-4,100);
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-by-479非对称稀疏矩阵。

负载West0479.A = West0479;

定义b这样真实解决方案是所有的解决方案。

b = sum(a,2);

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

tol = 1e-12;maxit = 20;

采用BICG.在请求的容忍和迭代次数找到解决方案。指定五个输出以返回有关解决方案过程的信息:

  • X0.算出的解是A * x0 =

  • fl0表示算法是否收敛。

  • RR0.是计算答案的残余X0.

  • it0迭代次数是什么时候X0.是计算。

  • RV0.是一个残存的历史向量吗 斧头 - b

(x0, fl0 rr0、it0 rv0] = bicg (A, b,托尔,麦克斯特);fl0
fl0 = 1
RR0.
Rr0 = 1
it0
IT0 = 0.

fl0是1因为BICG.不收敛到所请求的公差1E-12在请求的20次迭代中。事实上,行为BICG.是如此的可怜,以至于最初的猜测(X0 =零(尺寸(a,2),1))是最好的解决方案,并按照所示返回IT0 = 0.

为了帮助缓慢的收敛,您可以指定一个预处理器矩阵。自从一个非对称,使用ilu生成预处理器 l U .指定删除公差,以忽略小于的值的非透明条目1E-6.解预处理系统 - 1 一个 x - 1 b 通过指定lU作为输入BICG.

setup = struct('类型''ilutp''droptol',1E-6);[l,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预处理器产生比规定的耐受性更少1E-12在第六次迭代。输出RV1(1)规范(b)和输出RV1(结束)常态(b-a * x1)

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

semilogy(0:长度(rv0) 1, rv0 /规范(b),“o”) 抓住半径(0:长度(RV1)-1,RV1 / NORM(B),“o”) yline(托尔,'r--');传奇(“没有预调节器”'ilu preconditcher''宽容''地点''东方')Xlabel('迭代号')ylabel(“相对残差”

检查供应的效果BICG.初步猜测解决方案。

创建一个Tridiacal稀疏矩阵。使用每行的总和作为右侧的向量 斧头 b 所以预期的解决方案 x 是一个1的向量。

n = 900;e =那些(n,1);a = spdiags([e 2 * e e], -  1:1,n,n);b = sum(a,2);

采用BICG.来解决 斧头 b 两次:有一次默认初始猜测,并且有一次初始猜测解决方案。对两个解决方案使用200次迭代,并将初始猜测指定为带有等万博 尤文图斯于的所有元素的向量0.99

maxit = 200;x1 = bicg(a,b,[],maxit);
BICG将迭代35收敛到具有相对残留的9.5E-07的溶液。
x0 = 0.99 *(大小(A, 2), 1);x2 = bicg(麦克斯特,A, b, [] [], [], x0);
BICG将迭代7收敛到具有相对残留的8.7E-07的溶液。

在这种情况下,提供初始猜测BICG.要更快地收敛。

返回中间结果

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

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

x0 =零(尺寸(a,2),1);tol = 1e-8;maxit = 100;k = 1:4 [x,标志,relres] = bicg(a,b,tol,maxit,[],[],x0);x(:,k)= x;r(k)= relres;x0 = x;结束

x(:,k)是在迭代计算的解决方案矢量kfor循环的r(k)是该解决方案的相对残余。

通过提供解决线性系统BICG.使用计算的功能手柄斧头‘* x代替系数矩阵一个

创建非对称性三角形矩阵。预览矩阵。

一个=画廊('威尔克',21)+诊断((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 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 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 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 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 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,只有少数结果是非零(对应于Tridiagonals上的非洲国家)。

表达方式 一个 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(旗帜,'notransp'%compute a * xy = [0;x(1:20)]......+ [(10:-1:0)';(1:10)']。* x......+ 2 * [x(2:结束);0];eleesifStrcmp(旗帜,'transp'%compute'* xy = 2 * [0;x(1:20)]......+ [(10:-1:0)';(1:10)']。* x......+ [x(2:结束);0];结束结束

(此函数在示例结束时保存为本地功能。)

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

b =完整(总和(a,2));tol = 1e-6;maxit = 25;x1 = bicg(@ afun,b,tol,maxit)
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 1.0000 1.0000 1.0000 1.0000 1.0000

本地函数

功能y = afun(x,旗帜)如果Strcmp(旗帜,'notransp'%compute a * xy = [0;x(1:20)]......+ [(10:-1:0)';(1:10)']。* x......+ 2 * [x(2:结束);0];eleesifStrcmp(旗帜,'transp'%compute'* xy = 2 * [0;x(1:20)]......+ [(10:-1:0)';(1:10)']。* x......+ [x(2:结束);0];结束结束

输入参数

全部收缩

系数矩阵,指定为方矩阵或功能手柄。该矩阵是线性系统中的系数矩阵a * x = b.一般来说,一个是一个大的稀疏矩阵或函数句柄,返回大稀疏矩阵和列向量的乘积。

指定一个作为功​​能手柄

您可以将系数矩阵指定为函数句柄而不是矩阵,以节省计算中的内存。函数句柄返回矩阵向量乘积,而不是形成整个系数矩阵,使计算更有效率。s manbetx 845

要使用函数句柄,请使用函数签名函数y = afun(x,选择)参数化功能解释了如何为函数提供额外的参数一个乐趣,如果必要的。这个函数一个乐趣必须满足这些条件:

  • Afun(x,'notransp')返回产品斧头

  • Afun(x,'transp')返回产品‘* x

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

功能y = afun (x,选择,B, C, n)如果Strcmp(选择,'notransp')y = [b * x(n + 1:结束);c * x(1:n)];别的* x y = [C”(n + 1:结束);B * x (1: n)];结束
这个函数一个乐趣用途BC要计算斧头要么‘* x(取决于指定的标志)而不实际形成整个稀疏矩阵A = [0 (n) B;C 0 (n)).利用矩阵的稀疏性模式,在计算时节省内存斧头‘* x

数据类型:双倍的|function_handle
复数的支持:万博1manbetx是的

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

数据类型:双倍的
复数的支持:万博1manbetx是的

方法公差,指定为正标量。使用此输入来权衡计算的准确性和运行时间。BICG.必须在允许的迭代次数内达到容忍度。较小的价值意味着答案必须更精确地计算成功。

数据类型:双倍的

最大迭代次数,指定为正标量整数。增加价值max允许更多的迭代BICG.满足宽容.一般来说,值较小意味着需要更多的迭代才能成功完成计算。

预处理器矩阵,指定为矩阵或函数句柄的单独参数。您可以指定一个预请词矩阵或其矩阵因子m = m1 * m2为了改善线性系统的数值方面,使其更容易BICG.快速收敛。您可以使用不完整的矩阵分解功能iluichol.生成预处理器矩阵。你也可以使用平衡在分解之前以改善系数矩阵的条件数。有关预处理者的更多信息,请参阅线性系统的迭代方法

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

指定作为功​​能手柄

您可以指定任何一个M1, 要么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(选择,'notransp')y = x。* a;别的y = x。* b;结束结束
在这个例子中,函数MFUN.用途一个b要计算M \ x = x *要么M ' \ x = x * b(取决于指定的标志)而不实际形成整个稀疏矩阵

数据类型:双倍的|function_handle
复数的支持:万博1manbetx是的

初始猜测,指定为具有长度等于的列向量尺寸(a,2).如果您可以提供BICG.有更合理的初步猜测X0.与默认的零向量相比,它可以节省计算时间,帮助算法更快地收敛。

数据类型:双倍的
复数的支持:万博1manbetx是的

输出参数

全部收缩

线性系统解决方案,作为向量返回。此输出为线性系统提供了近似的解决方案a * x = b.如果计算成功(标志= 0.), 然后是小于还是等于

每当计算不成功时(国旗〜= 0), 解决方案x返回BICG.是在所有迭代中计算的残余规范最小的那个。

收敛标志,作为此表中的标量值之一返回。收敛标志指示计算是否成功并在几种不同形式的故障之间区分。

标志价值

收敛

0

成功——BICG.融合到所需的耐受性之内max迭代。

1

失败 -BICG.迭代max迭代但没有收敛。

2

失败 - 预处理器矩阵要么m = m1 * m2没有病理。

3.

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

4

失败 - 由此计算的标量数之一BICG.算法变得太小或太大而无法继续计算。

相对残余错误,作为标量返回。相对残差误差Relres = Norm(B-A * x)/常规(b)表明答案有多准确。如果计算收敛到公差之内max然后迭代Relres <= tol

数据类型:双倍的

迭代号,作为标量返回。此输出表示计算的答案的迭代号x计算出来。

数据类型:双倍的

残余错误,作为向量返回。剩余错误规范(b * x)揭示算法如何为给定值融合x.元素的数量Resvec.等于迭代次数。您可以检查的内容Resvec.帮助决定是否更改值要么max

数据类型:双倍的

更多关于

全部收缩

Biconjugate渐变方法

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

对于对称正定的系统,CG算法设计用于,BICG算法可提供相同的结果,但迭代的成本是两倍。BICG的准确性可以与GMRES相媲美,但在两个只有GMR之间真正最小化残留物。开发了BICG算法的几种变体来解决其显示的不规则收敛行为(参见BICGSTAB,BICGSTABL和CGS)[1]

提示

  • 大多数迭代方法的融合取决于系数矩阵的条件数量,COND(a).您可以使用平衡改进的条件数一个,并自己这使得大多数迭代求解器更容易收敛。但是,使用平衡当你随后分解均衡矩阵时,也会得到质量更好的预处理矩阵B = R * P * * C

  • 您可以使用矩阵重排序函数,例如解剖Symrcm.为了释放系数矩阵的行和列,并使系数矩阵被考虑为生成预处理器时最小化非安利斯数的数量。这可以减少随后解决预处理线性系统所需的存储器和时间。

参考

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

扩展能力

在R2006A之前介绍