PCG

求解线性方程组的系统 - 预条件共轭梯度法

描述

X= PCG(一个b试图解决线性方程系统A * X = B对于X使用预处理共轭梯度法。如果尝试成功,PCG显示一个消息,以确认收敛。如果PCG未能迭代或暂停出于任何原因的最大数目后收敛,它显示包括所述相对残余诊断消息范数(B-A * X)/常态(b)中和迭代号,在该方法停止。

X= PCG(一个bTOL指定方法的耐受性。默认公差为1E-6

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

X= PCG(一个bTOL麦克斯特中号指定一个预条件矩阵中号并计算X通过有效地解决了系统 H - 1 一个 H - Ť ÿ = H - 1 b 对于ÿ,其中 ÿ = H Ť X H = 中号 1 / 2 = 中号 1 中号 2 1 / 2 。使用预条件矩阵可以改善该问题的数值性质,计算的效率。

X= PCG(一个bTOL麦克斯特M1M2指定预条件矩阵的因素中号这样M = M1 * M2

X= PCG(一个bTOL麦克斯特M1M2X0指定用于解向量的初始猜测X。默认值是零向量。

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

[Xrelres] = PCG(___还返回相对残余范数(B-A * X)/常态(b)中。如果0, 然后relres <= TOL

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

[XrelresITERresvec] = PCG(___还在每次迭代返回剩余范数的向量,其中包括第一残余范数(B-A * X0)

例子

全部收缩

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

创建一个随机稀疏矩阵一个用50%的密度。还创建矢量b排款项一个对于右手边 斧头 = b 所以,真正的解决方案 X 是那些的向量。

RNG默认A = sprand(400400,0.5);A = A'* A;B =总和(A,2);

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

X = PCG(A,B);
PCG停在迭代20而未收敛到所需的公差1E-06,因为达到迭代的最大数量。返回的迭代(数20)具有相对残余3.6E-06。

默认PCG使用20次迭代和公差1E-6和算法无法收敛在那些20次迭代这个矩阵。但是,剩余的接近性,所以算法可能只是需要更多的迭代收敛。

解决再次用宽容的系统1E-7和150次迭代。

X = PCG(A,B,1E-7150);
PCG会聚在迭代129与相对残余9.9E-08的溶液。

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

创建对称正定的,带状系数矩阵。

A = delsq(numgrid('S',102));

确定b为线性方程的右手侧。

B =酮(尺寸(A,1),1);

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

TOL = 1E-8;麦克斯特= 100;

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

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

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

  • RR0是残余计算答案的X0

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

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

[X0,FL0,RR0,IT0,RV0] = PCG(A,B,TOL,麦克斯特);FL0
FL0 = 1
RR0
RR0 = 0.0131
IT0
IT0 = 100

FL01因为PCG不收敛到所要求的公差1E-8所请求的100次迭代内。

与收敛速度慢的帮助,你可以指定一个预条件矩阵。以来一个是对称的,使用ichol生成预条件 中号 = 大号 大号 Ť 。通过指定解决所述预处理系统大号L”作为输入来PCG

L = ichol(A);[X1,FL1,RR1,IT1,RV1] = PCG(A,B,TOL,麦克斯特,L,L');FL1
FL1 = 0
另外,rr
RR1 = 8.0992e-09
IT1
IT1 = 79

使用的ichol预处理器产生一个相对残余小于规定公差1E-8第79次迭代。输出RV1(1)范数(b)中RV1(端部)范数(B-A * X1)

现在,使用michol选项来创建修改不完全的Cholesky预处理器。

L = ichol(A,结构('michol''上'));[X2,FL2,RR2,IT2,RV2] = PCG(A,B,TOL,麦克斯特,L,L');FL2
FL2 = 0
RR2
RR2 = 9.9618e-09
IT2
IT2 = 47

此预调节器比由不完全Cholesky因式分解以零填充了该示例中的系数矩阵所产生的一个比较好,所以PCG能够更快收敛。

你可以看到预条件如何影响收敛速度PCG通过绘制从每个初始估计开始剩余记录(而迭代数0)。添加一个行中指定的公差。

semilogy(0:长度(RV0)-1,RV0 /范数(b)中,'-o')保持semilogy(0:长度(RV1)-1,RV1 /范数(b)中,'-o')semilogy(0:长度(RV2)-1,RV2 /范数(b)中,'-o')YLINE(TOL,'R--');传说(“不预调节器”“默认ICHOL”“修改ICHOL”'公差''位置''东')xlabel(“迭代次数”)ylabel(“相对残存”

检查供应的影响PCG与溶液的初始猜测。

创建三对角稀疏矩阵。用每行的总和作为向量的右侧 斧头 = b 因此,对于期望的解决方案 X 是那些的向量。

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

PCG解决 斧头 = b 两次:一次用默认的初始猜测,有一次与解决方案的一个很好的初始猜测。使用200次迭代两种解决方案并指定初始猜测作为矢量与所有金宝搏官方网站元素等于0.99

麦克斯特= 200;X1 = PCG(A,B,[],麦克斯特);
PCG会聚在迭代35与相对残余9.5e-07的溶液。
X0 = 0.99 *酮(尺寸(A,2),1);X2 = PCG(A,B,[],麦克斯特,[],[],X0);
PCG会聚在迭代7与相对残余8.7E-07的溶液。

在这种情况下供给的初始猜测使PCG收敛更快。

返回的中间结果

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

例如,该代码执行100次迭代四次并存储该溶液矢量for循环每次通过后:

X0 =零(尺寸(A,2),1);TOL = 1E-8;麦克斯特= 100;对于K = 1:4 [X,旗,relres] = PCG(A,B,TOL,麦克斯特,[],[],X0);X(:,K)= X;R(k)的= relres;X0 = X;结束

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

通过提供解决的线性系统PCG与函数处理,计算斧头代替系数矩阵的一个

画廊以产生一个20×20正定三角矩阵。所述超和子对角线具有的,而主对角线元素从20向下计数到1预览矩阵。

N = 20;A =画廊('tridiag',酮(正1,1)中,n:-1:1,一(正 -  1,1));全(A)
ANS =20×2020 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 19 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 18 1 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 1 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 1 15 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 14 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 13 1 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 11 1 0 0 0 0 0 0 0 0 0⋮

由于这三对角矩阵具有特殊的结构,则可以显示操作斧头具有功能手柄。由于每一行一个乘中的元素X,只有少数的结果是非零的(对应于非零元素上tridiagonals)。而且,只有主对角线具有不等于1的表达的非零元素 斧头 变为:

[ 20 1 0 0 0 1 19 1 0 0 0 1 18 1 0 0 1 17 1 0 0 1 16 1 0 0 1 15 1 0 0 1 14 1 0 0 1 13 0 0 0 1 0 0 0 1 1 ] [ X 1 X 2 X 3 X 4 X X 20 ] = [ 2 0 X 1 + X 2 X 1 + 19 X 2 + X 3 X 2 + 18 X 3 + X 4 X 18 + 2 X 19 + X 20 X 19 + X 20 ]

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

[ 2 0 X 1 + X 2 X 1 + 19 X 2 + X 3 X 2 + 18 X 3 + X 4 X 18 + 2 X 19 + X 20 X 19 + X 20 ] = [ 0 X 1 X 19 ] + [ 20 X 1 19 X 2 X 20 ] + [ X 2 X 20 0 ]

在MATLAB®,编写创建这些矢量并将它们相加,由此得到的值的函数斧头

功能Y = afun(X)Y = [0;X(1:19)] +...[(20:1:1)'] * X +...[X(2:20);0];结束

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

现在,求解线性系统 斧头 = b 通过提供PCG用函数处理计算斧头。使用的公差1E-12和50次迭代。

B =酮(20,1);TOL = 1E-12;麦克斯特= 50;X1 = PCG(@ afun,B,TOL,麦克斯特)
PCG会聚在迭代20与相对残余4.4E-16的溶液。
X1 =20×10.0476 0.0475 0.0500 0.0526 0.0555 0.0588 0.0625 0.0666 0.0714 0.0769⋮

检查afun(X1)产生的人的向量。

afun(X1)
ANS =20×11.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000⋮

本地函数

功能Y = afun(X)Y = [0;X(1:19)] +...[(20:1:1)'] * X +...[X(2:20);0];结束

输入参数

全部收缩

系数矩阵,指定为对称正定矩阵或函数处理。该矩阵是线性系统的系数矩阵A * X = B。通常,一个是一个大的稀疏矩阵或函数句柄返回一个大稀疏矩阵和列向量的乘积。看到确定是否矩阵是对称正定关于如何确认信息一个是对称正定的。

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

可以指定系数矩阵作为一个功能句柄代替的矩阵保存存储器中的计算。功能句柄返回的矩阵矢量乘积,而不是形成在整个系数矩阵,使得计算更加有效。下载188bet金宝搏

要使用功能手柄,使用函数签名函数y = afun(x)的参数化功能介绍了如何给函数提供额外的参数好玩儿,如果必要的。函数调用afun(x)的必须返回的值斧头

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

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

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

方法容忍,指定为正标量。使用此输入权衡计算精度和运行。PCG必须符合允许的迭代次数内的公差是成功的。值越小TOL指的答案必须更加精确的计算是成功的。

数据类型:

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

预条件子矩阵,指定为矩阵或函数处理的单独的参数。你可以指定一个预条件矩阵中号或它的矩阵因子M = M1 * M2改善线性系统的数值方面更容易PCG快速收敛。您可以使用不完整的矩阵分解功能ILUichol以产生预条件矩阵。您还可以使用均衡之前因式分解改善系数矩阵的条件数。有关预处理器的更多信息,请参阅迭代法线性系统

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

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

您可以指定任何的中号M1, 要么M2作为函数处理,而不是矩阵保存存储器中的计算。功能句柄执行矩阵向量运算,而不是形成在整个预条件矩阵,使得计算更加有效。

要使用功能手柄,使用函数签名函数y = MFUN(x)的参数化功能介绍了如何给函数提供额外的参数MFUN,如果必要的。函数调用MFUN(x)的必须返回的值中号\ X要么M2 \(M1 \ X)

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

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

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

输出参数

全部收缩

线性系统解决方案,返回作为载体。该输出给出了近似解的线性系统A * X = B。如果计算成功(标志= 0), 然后relres小于或等于TOL

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

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

标志值

收敛

0

成功 -PCG收敛到所需的公差TOL麦克斯特迭代。

1

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

2

失败 - 预条件矩阵中号要么M = M1 * M2状态不好。

3

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

4

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

相对残差,返回一个标量。相对残余误差relres =规范(B-A * X)/常态(b)中是的答案如何准确的指示。如果计算收敛于宽容TOL麦克斯特次重复,则relres <= TOL

数据类型:

迭代次数,返回一个标量。该输出表示迭代次数,在该计算的答案X计算。

数据类型:

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

数据类型:

更多关于

全部收缩

预处理共轭梯度法

的预条件共轭梯度方法(PCG)的开发是为了利用对称正定矩阵的结构。其他一些算法可以在对称正定矩阵的操作,但PCG是解决这些类型的系统的最快和最可靠[1]

提示

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

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

参考

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

扩展功能

R2006a前推出