主要内容

pcg

解线性方程组的先决条件——共轭梯度方法

描述

例子

x= pcg (一个,b)试图解决线性方程组A * x =x使用预处理共轭梯度法。当尝试成功,pcg显示一条消息确认收敛。如果pcg无法收敛后最大迭代次数或停止任何理由,它显示诊断消息,其中包括相对剩余规范(b * x) /规范(b)停止和迭代次数的方法。

例子

x= pcg (一个,b,托尔)指定的公差的方法。默认的公差是1 e-6

例子

x= pcg (一个,b,托尔,麦克斯特)指定要使用的最大迭代数。pcg显示诊断消息如果不能收敛麦克斯特迭代。

例子

x= pcg (一个,b,托尔,麦克斯特,)指定一个预处理矩阵和计算x通过有效地解决系统 H 1 一个 H T y = H 1 b y,在那里 y = H T x H = 1 / 2 = ( 1 2 ) 1 / 2 。算法不形式H明确。使用一个预调节器矩阵可以提高问题的数值属性和计算的效率。

例子

x= pcg (一个,b,托尔,麦克斯特,M1,平方米)指定预处理矩阵的因素这样M = M1 *平方米

例子

x= pcg (一个,b,托尔,麦克斯特,M1,平方米,x0)指定一个初始猜解向量x。默认是零的向量。

例子

(x,国旗)= pcg (___)返回一个标记,用于指定是否该算法成功地融合。当国旗= 0,收敛是成功的。您可以使用这个输出语法与任何以前的输入参数组合。当你指定国旗输出,pcg不显示任何诊断消息。

例子

(x,国旗,relres)= pcg (___)还返回相对剩余规范(b * x) /规范(b)。如果国旗0,然后relres < =托尔

例子

(x,国旗,relres,iter)= pcg (___)返回迭代的数量iter在这x是计算。

例子

(x,国旗,relres,iter,resvec)= pcg (___)还返回一个向量的残留标准在每个迭代中,包括第一个残留规范(b * x0)

例子

全部折叠

解决一个平方线性系统使用pcg默认设置,然后调整解决方案中使用的宽容和迭代次数的过程。

创建一个随机的对称稀疏矩阵一个。还创建一个向量b行总结的一个的右边 斧头 = b 所以,真正的解决方案 x 是一个向量的。

rng默认的5 = sprand (400400);=“*;b =和(2);

解决 斧头 = b 使用pcg。输出显示包括相对残留误差的值 b - - - - - - 斧头 b

x = pcg (A, b);
pcg停在迭代20不收敛所需的公差1 e-06因为迭代的最大数量。返回的迭代(20)数量相对剩余3.6 e-06。

默认情况下pcg使用20个迭代和宽容的1 e-6,该算法无法在这20个迭代收敛这个矩阵。然而,剩余接近公差,所以只需要更多的迭代算法容易收敛。

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

x = pcg (A, b, 1 e - 7150);
pcg聚集在迭代相对剩余1 e-07 129到一个解决方案。

检查使用预处理矩阵的影响pcg解决一个线性系统。

创建一个对称正定,联合系数矩阵。

一个= delsq (numgrid (“年代”,102));

定义b右边的线性方程 斧头 = b

b = 1(大小(A, 1), 1);

宽容和最大迭代数。

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

使用pcg找到一个解决方案在请求的宽容和迭代次数。指定返回5个输出的信息解决方案过程:

  • x计算解决方案吗A * x =

  • fl0是一个标志指示是否算法融合。

  • rr0的相对剩余计算答案x

  • it0迭代数是什么时候x是计算。

  • rv0是一个向量的残余历史 b - - - - - - 斧头

[x, fl0 rr0, it0 rv0] = pcg (A, b,托尔,麦克斯特);fl0
fl0 = 1
rr0
rr0 = 0.0131
it0
it0 = 100

fl01因为pcg不收敛到所请求的公差1 e-8在请求的100次迭代。

援助与收敛速度慢,您可以指定一个预处理矩阵。自一个是对称的,使用ichol生成预调节器 = l l T 。解决通过指定的预处理系统lL '作为输入,pcg

L = ichol(一个);(x1, fl1 rr1、it1 rv1] = pcg (A, b,托尔,麦克斯特,L, L ');fl1
fl1 = 0
rr1
rr1 = 8.0992 e-09
it1
it1 = 79

的使用ichol预调节器产生一个相对剩余不到规定的公差1 e-8在第79届迭代。输出rv1 (1)规范(b)rv1(结束)规范(b * x1)

现在,使用michol选择创建一个修改的不完整的柯列斯基预调节器。

L = ichol(结构体(“michol”,“上”));(x2, fl2 rr2、it2 rv2] = pcg (A, b,托尔,麦克斯特,L, L ');fl2
fl2 = 0
rr2
rr2 = 9.9614 e-09
it2
it2 = 47

这个预调节器比产生的一个不完整的柯列斯基分解的填零系数矩阵在这个例子中,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(托尔,“r——”);传奇(“没有预调节器”,“默认ICHOL”,“修改ICHOL”,“宽容”,“位置”,“东”)包含(的迭代次数)ylabel (的相对剩余的)

图包含一个坐标轴对象。坐标轴对象包含迭代数,ylabel相对剩余包含4线类型的对象,constantline。这些对象代表没有预调节器,默认ICHOL,修改ICHOL、宽容。

检查供应的影响pcg解决方案的初始猜测。

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

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

使用pcg来解决 斧头 = b 两次:一次使用默认初始猜测,和一个解决方案的时间和一个很好的初始估计。使用200次迭代和默认的对这两个解决方案。金宝搏官方网站指定初始猜测第二个解决方案作为一个向量的所有元素等于0.99

麦克斯特= 200;x1 = pcg (A, b,[],麦克斯特);
pcg聚集在迭代35与相对剩余9.5 e-07解决方案。
x0 = 0.99 * e;x2 = pcg (A, b,[],麦克斯特[],[],x0);
pcg聚集在迭代7与相对剩余8.7 e-07解决方案。

在这种情况下提供一个初始猜测使pcg更快地收敛。

返回中间结果

你也可以使用初始猜得到中间结果通过调用pcg在一个循环。每次调用解算器执行几个迭代计算并存储解决方案。然后使用这个解决方案的初始矢量迭代的下一批。

例如,这段代码执行四次100次迭代和存储解决方案向量每次通过For循环:

x0 = 0(大小(2),1);托尔= 1 e-8;麦克斯特= 100;k = 1:4 [x,国旗,relres] = pcg (A, b,托尔,麦克斯特[],[],x0);X = X (:, k);R (k) = relres;x0 = x;结束

X (:, k)在迭代解向量计算吗kfor循环的R (k)是解决方案的相对剩余。

解一个线性系统通过提供pcg计算一个函数处理* x的系数矩阵一个

使用画廊生成一个20-by-20正定三对角矩阵。超级和副斜杆的,而主对角线元素计数低于20比1。预览矩阵。

n = 20;一个=画廊(“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 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 0 0 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 0 0 0 15 0 0 1 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 0 0 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一个函数处理。当一个乘以一个向量,大部分结果向量中的元素是0。结果中的非零元素对应的非零三对角元素一个。此外,只有主对角线的非零不等于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 = afun (x) y = 0;x (19)) +[(20:1:1)]。* x +[x(20分);0);结束

(这个函数保存为本地函数结束时的例子。)

现在,解决线性系统 斧头 = b 通过提供pcg计算的函数处理* x。使用一个公差1 e-12和50迭代。

1 b =(20日);托尔= 1 e-12;麦克斯特= 50;x1 = pcg (@afun, b,托尔,麦克斯特)
pcg聚集在迭代20与相对剩余4.4 e-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 (19)) +[(20:1:1)]。* x +[x(20分);0);结束

输入参数

全部折叠

系数矩阵,指定为对称正定矩阵或函数句柄。这个矩阵是线性系统的系数矩阵A * x =。一般来说,一个是一个大型稀疏矩阵或函数句柄返回产品大型稀疏矩阵的列向量。看到判断矩阵是对称正定的如何确认信息一个是对称的正定。

指定一个作为处理函数

您可以选择性地指定系数矩阵作为处理函数,而不是一个矩阵。函数处理返回矩阵向量的产品,而不是形成整个系数矩阵,计算效率更高。下载188bet金宝搏

要使用一个函数处理,使用函数签名函数y = afun (x)参数化功能解释如何提供额外的参数函数afun,如果必要的。函数调用afun (x)必须返回的值* x

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

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

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

公差的方法,指定为一个积极的标量。使用该输入平衡精度和运行时的计算。pcg必须符合公差在允许迭代的数量才能成功。一个较小的值托尔意味着答案必须更精确的计算才能成功。

数据类型:

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

预处理矩阵,矩阵或作为单独的参数指定的函数处理。您可以指定一个预处理矩阵或其矩阵因素M = M1 *平方米提高数值方面的线性系统和方便pcg快速收敛。您可以使用不完整的矩阵分解的功能iluichol生成预调节器矩阵。你也可以使用平衡分解前改善系数矩阵的条件数。有关预调节器的更多信息,请参阅线性系统的迭代方法

pcg将未指明的预调节器视为单位矩阵。

指定作为处理函数

你可以指定任何,M1,或平方米作为函数处理代替矩阵。函数处理执行矩阵向量操作而形成整个预处理矩阵,使计算更加高效。

要使用一个函数处理,使用函数签名函数y = mfun (x)参数化功能解释如何提供额外的参数函数mfun,如果必要的。函数调用mfun (x)必须返回的值M \ xM1、M2 \ (x)

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

最初的猜测,指定为一个列向量长度等于大小(2)。如果你能提供pcg更合理的初始猜测x0比默认的零向量,那么它可以节省计算时间和帮助算法收敛更快。

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

输出参数

全部折叠

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

当计算不成功(国旗~ = 0),解决方案x返回的pcg是微小残留标准计算所有迭代。

收敛国旗,作为一个标量值的表返回。计算的收敛性标志指示是否成功和区分几种不同形式的失败。

标志值

收敛

0

成功——pcg聚集到所需的公差托尔麦克斯特迭代。

1

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

2

失败——预调节器矩阵M = M1 *平方米是病态的。

3

失败- - - - - -pcg停滞不前之后连续两个迭代是相同的。

4

失败——一个标量计算的pcg算法变得太小或太大继续计算。

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

数据类型:

迭代数,作为一个标量返回。这个输出表明迭代计算的答案x计算了。

数据类型:

剩余的错误,作为一个向量返回。剩余误差规范(b * x)揭示了如何接近给定值的算法是收敛的x。元素的数量resvec等于迭代的数量。您可以检查的内容resvec帮助决定是否更改的值托尔麦克斯特

数据类型:

更多关于

全部折叠

预处理共轭梯度法

预处理共轭梯度法(PCG)开发利用对称正定矩阵的结构。其他几个对称正定矩阵算法可以操作,但PCG最快的和最可靠的解决这些类型的系统[1]

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,气孔导度(A)。当一个是广场,你可以使用吗平衡自行改善其条件数,这使得大多数迭代解决者更容易收敛。然而,使用平衡时也会导致更好的质量矩阵预调节器随后因素平衡矩阵B = R * P * * C

  • 您可以使用矩阵重新排序等功能解剖symrcm来交换系数矩阵的行和列的数量,减少非零系数矩阵分解时生成一个预调节器。这可以减少所需的内存和时间随后预先处理解决线性系统。

引用

[1]巴雷特,R。,米。Berry, T. F. Chan, et al.,线性系统的解决方案模板:迭代方法的构建块、暹罗、费城1994人。

扩展功能

版本历史

之前介绍过的R2006a