主要内容

PCG.

求解线性方程系统 - 预处理共轭梯度法

描述

例子

X= pcg (一种B.试图解决线性方程系统a * x = b为了X使用预条件共轭梯度法.当尝试成功时,PCG.显示一条消息以确认融合。如果PCG.未能在最大迭代次数后收敛或因任何原因停止,则显示包含相对残差的诊断消息规范(b * x) /规范(b)和该方法停止的迭代号。

例子

X= pcg (一种B.托尔指定方法的公差。默认容忍度为1E-6

例子

X= pcg (一种B.托尔max指定要使用的最大迭代次数。PCG.如果收敛失败,则显示诊断消息max迭代。

例子

X= pcg (一种B.托尔maxm指定一个预安全载体矩阵m和计算X通过有效解决系统 H 1 一种 H T. y = H 1 B. 为了y, 在哪里 y = H T. X H = m 1 / 2 = m 1 m 2 1 / 2 .算法不形成H明确。利用预处理矩阵可以改善问题的数值性质,提高计算效率。

例子

X= pcg (一种B.托尔maxM1平方米指定预安全载体矩阵的因素m这样m = m1 * m2

例子

X= pcg (一种B.托尔maxM1平方米X0.指定解决方案矢量的初始猜测X.默认值是零的向量。

例子

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

例子

[X旗帜relres] = PCG(___也返回相对剩余规范(b * x) /规范(b).如果旗帜0., 然后relres < =托尔

例子

[X旗帜relresit] = PCG(___也返回迭代号码it在这X被计算了。

例子

[X旗帜relresitResvec.] = PCG(___还返回每次迭代的残余标准的向量,包括第一个残差常态(b-a * x0)

例子

全部折叠

用。解一个平方线性方程组PCG.使用默认设置,然后调整解决方案过程中使用的迭代次数和迭代次数。

创建一个随机对称稀疏矩阵一种.还创建一个向量B.排行的行一种对于右侧的右侧 斧头 = B. 所以真正的解决方案 X 是一个矢量。

rng默认a = sprand(400,400,.5);a ='* a;b = sum(a,2);

解决 斧头 = B. 使用PCG..输出显示包括相对残差误差的值 B. - 斧头 B.

x = pcg (A, b);
PCG在迭代20处停止而不会聚到所需的公差1E-06,因为达到了最大迭代次数。迭代返回(数20)具有相对残差3.6E-06。

默认情况下PCG.使用20个迭代和容忍度1E-6,并且该算法无法在此矩阵的那些迭代中收敛。然而,残差接近耐受性,因此算法可能只需要更多的迭代来汇聚。

再次使用容差来解决系统1E-7和150次迭代。

x = PCG(A,B,1E-7,150);
PCG在第129次迭代时收敛到一个相对残差为9.9e-08的解。

检查使用预处理器矩阵的效果PCG.解线性方程组。

创建一个对称的正面确定的带状系数矩阵。

a = delsq(numgrid(',102));

定义B.对于线性方程的右侧 斧头 = B.

b =α(大小(a,1),1);

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

托尔= 1 e-8;麦克斯特= 100;

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

  • X是计算的解决方案a * x = b

  • FL0.是指示算法是否会融合的标志。

  • rr0是计算答案的相对残差吗X

  • IT0.迭代次数是什么时候X被计算了。

  • RV0.是残余历史的矢量 B. - 斧头

[x,fl0,rr0,IT0,RV0] = PCG(A,B,TOL,MAXIT);FL0.
fl0 = 1
rr0
RR0 = 0.0131.
IT0.
IT0 = 100.

FL0.1因为PCG.不收敛到所要求的容忍度1E-8在请求的100次迭代中。

为了帮助缓慢的收敛,你可以指定一个预处理矩阵。自一种是对称的,使用ichol生成预处理器 m = L. L. T. .通过指定解决预处理系统L.L '作为输入,PCG.

l = iChol(a);[X1,FL1,RR1,IT1,RV1] = PCG(A,B,TOL,MAXIT,L,L');FL1.
fl1 = 0
rr1
RR1 = 8.0992E-09
IT1
IT1 = 79.

an的使用ichol预处理剂产生的相对残留小于规定的耐受性1E-8在第79次迭代中。输出RV1(1)规范(b)RV1(结束)常态(b-a * x1)

现在,使用米莫尔选项以创建修改后的不完整的Cholesky Preconditter。

L = ichol(结构体('michol''在'));[X2,FL2,RR2,IT2,RV2] = PCG(A,B,TOL,MAXIT,L,L');FL2.
fl2 = 0
rr2
RR2 = 9.9618E-09
IT2.
IT2 = 47.

这个预调式比本例中系数矩阵填充为零的不完全Cholesky分解所产生的预调式要好,所以PCG.能够更快地收敛。

您可以了解预处理者如何影响收敛速度PCG.通过绘制从初始估计(迭代数)开始的每个剩余历史0.)。为指定的公差添加一行。

半径(0:长度(RV0)-1,RV0 / NORM(B),'-O')举行半径(0:长度(RV1)-1,RV1 / NORM(B),'-O')半机(0:长度(RV2)-1,RV2 / NORM(B),'-O')yline(tol,'r--');传奇('没有预处理者'“默认ICHOL”'修改ichol''宽容'“位置”“东”)包含('迭代号') ylabel (“相对残差”

图包含轴。轴包含4个类型的型号矩形线。这些对象代表无预处理器,默认iChol,修改的iChol,容忍度。

检查供应的效果PCG.对解有一个初步的猜测。

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

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

使用PCG.解决 斧头 = B. 两次:有一次默认初始猜测,并且有一次初始猜测解决方案。使用200个迭代和两个解决方案的默认容差。万博 尤文图斯将第二种解决方案中的初始猜测指定为向量,其中所有元素等于0.99

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

在这种情况下,提供初始猜测是可行的PCG.要更快地收敛。

返回中间结果

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

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

x0 =零(尺寸(a,2),1);托尔= 1 e-8;麦克斯特= 100;为了k = 1:4 [x,标志,relres] = pcg(a,b,tol,maxit,[],[],x0);x(:,k)= x;r(k)= relres;x0 = x;结尾

x(:,k)是在迭代计算的解决方案矢量K.for-loop,和R (k)是该解决方案的相对残余。

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

使用画廊生成20×20正定的三角形矩阵。Super-and Subdiagonals有一个,而主要对角线元件从20到1.预览矩阵。

n = 20;a =画廊('tridiag'的(n - 1, 1), n: 1:1,的(n - 1, - 1));完整的(一个)
ans =20×2020 1 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 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 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 0 1 13 1 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 12 1 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⋮

由于这种三角形矩阵具有特殊结构,因此您可以代表操作* x使用函数句柄。什么时候一种乘以向量,得到的矢量中的大多数元素是零。结果中的非零元素对应于非零三角形元素一种.而且,只有主对角线上有不等于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 5. 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®中,写一个创建这些向量的函数并将它们添加在一起,从而提供值* x

函数Y = [0;x (19)) +......[(20:-1:1)']。* x +......[x(2:20);0];结尾

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

现在,解决线性系统 斧头 = B. 通过提供PCG.使用函数处理来计算* x.使用宽容1E-12和50次迭代。

1 b =(20日);托尔= 1 e-12;麦克斯特= 50;x1 = pcg (@afun, b,托尔,麦克斯特)
PCG将迭代20融合到具有相对残留的4.4E-16的溶液。
x1 =20×10.0476 0.0475 0.0500 0.0550 0.0555 0.0555 0.0555 0.0555 0.052200666 0.0714 0.0769 0.0714 0.0769 0.0714 0.0769

检查Afun(x1)产生一个1的向量。

Afun(x1)
ans =20×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 = [0;x (19)) +......[(20:-1:1)']。* x +......[x(2:20);0];结尾

输入参数

全部折叠

系数矩阵,指定为对称正定矩阵或功能手柄。该矩阵是线性系统中的系数矩阵a * x = b.一般来说,一种是一个大型稀疏矩阵或返回大型稀疏矩阵和列向量乘积的函数句柄。看到确定矩阵是否是对称正定的有关如何确认的信息一种是对称的积极明确。

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

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

要使用函数句柄,请使用函数签名函数y = afun(x)参数化功能解释了如何为函数提供额外的参数afun,如有必要。函数调用afun (x)必须返回值* x

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

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

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

方法容忍度,指定为正标量。使用此输入可以在计算中进行权衡准确性和运行时。PCG.必须满足允许的迭代次数内的公差,才能成功。较小的值托尔意味着答案必须更精确地计算成功。

数据类型:双倍的

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

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

PCG.将未指定的预处理器视为身份矩阵。

指定m作为功​​能手柄

您可以选择指定任何一个mM1, 或者平方米作为函数处理而不是矩阵。功能手柄执行矩阵矢量操作,而不是形成整个预处理器矩阵,使得计算更高效率。

要使用函数句柄,请使用函数签名函数y = mfun(x)参数化功能解释了如何为函数提供额外的参数mfun,如有必要。函数调用mfun(x)必须返回值m \ x.m2 \(m1 \ x)

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

初始猜测,指定为具有长度等于的列向量尺寸(a,2).如果您可以提供PCG.有更合理的初步猜测X0.而不是零的零旋钮,然后它可以节省计算时间并帮助算法收敛更快。

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

输出参数

全部折叠

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

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

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

标志价值

收敛

0.

成功 -PCG.融合到所需的耐受性托尔max迭代。

1

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

2

失败-预处理矩阵mm = m1 * m2没有病理。

3.

失败 -PCG.两次连续迭代后停滞不前。

4.

失败-一个标量计算PCG.算法变得太小或太大而无法继续计算。

相对残余错误,作为标量返回。相对残差误差relres =规范(b * x) /规范(b)表明答案是多么准确的。如果计算会聚到容差托尔max然后迭代relres < =托尔

数据类型:双倍的

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

数据类型:双倍的

剩余错误,返回为向量。剩余误差常态(B-A * x)揭示算法如何为给定值融合X.元素的数量Resvec.等于迭代的数量。您可以检查内容Resvec.帮助决定是否更改值托尔max

数据类型:双倍的

更多关于

全部折叠

预条件共轭梯度法

开发了预处理的共轭梯度方法(PCG)以利用对称正定矩阵的结构。其他几种算法可以在对称正明矩阵上运行,但PCG是解决这些类型的系统时最快,最可靠的[1]

提示

  • 大多数迭代方法的融合取决于系数矩阵的条件数量,COND(a).您可以使用平衡改善条件数一种,并自己这使得大多数迭代求解器更容易收敛。但是,使用平衡当您随后因素为平衡的矩阵时也会导致更好的质量预处理器矩阵b = r * p * a * c

  • 您可以使用矩阵重新排序功能,例如解剖Symrcm.将系数矩阵分解为预调节器时,对系数矩阵的行和列进行置换,使非零的数目最小化。这可以减少后续求解预处理线性系统所需的内存和时间。

参考

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

扩展能力

之前介绍过的R2006a