主要内容

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.默认值是一个0的向量。

例子

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

例子

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

例子

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

例子

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

例子

全部折叠

用。解一个平方线性方程组pcg使用默认设置,然后调整解决方案流程中使用的容忍度和迭代次数。

创建一个随机对称稀疏矩阵一个.还要创建一个矢量b的行和一个右边的 斧头 b 这就是真正的解 x 是一个1的向量。

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

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

x = pcg (A, b);
PCG在迭代20时停止,没有收敛到期望的公差1e-06,因为已经达到了最大的迭代次数。返回的iterate(编号20)的相对残差为3.6e-06。

默认情况下pcg使用20次迭代和一个公差1 e-6,算法在这20次迭代中无法收敛。但是残差与容差很接近,所以算法可能只是需要更多的迭代才能收敛。

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

x = pcg (A, b, 1 e - 7150);
PCG在第129次迭代时收敛到一个相对残差为1e-07的解。

用下列方法检查使用预处理矩阵的效果pcg解线性方程组。

建立对称正定带状系数矩阵。

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

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

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

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

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

使用pcg在要求的容忍度和迭代次数下找到解决方案。指定五个输出以返回关于解决方案流程的信息:

  • 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

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

现在,使用michol选项创建修改后的不完整Cholesky预调节器。

L = ichol(结构体(“michol”“上”));(x2, fl2 rr2、it2 rv2] = pcg (A, b,托尔,麦克斯特,L, L ');fl2
fl2 = 0
rr2
rr2 = 9.9565 e-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(托尔,“r——”);传奇(“没有预调节器”“默认ICHOL”“修改ICHOL”“宽容”“位置”“东”)包含(的迭代次数) ylabel (的相对剩余的)

图中包含一个轴对象。坐标轴对象包含4个类型为line、constantline的对象。这些对象代表无预处理、默认ICHOL、修改ICHOL、容忍。

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

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

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

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

麦克斯特= 200;x1 = pcg (A, b,[],麦克斯特);
PCG在第35次迭代时收敛到一个相对残差为9.5e-07的解。
x0 = 0.99 * e;x2 = pcg (A, b,[],麦克斯特[],[],x0);
PCG在迭代7时收敛到一个相对残差为8.7e-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 × 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 0000000000 0 0 0 0 0 0 0 0 1 11 1 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(20分);0);结束

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

现在,解线性方程组 斧头 b 通过提供pcg使用计算的函数句柄* x.使用公差1 e-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.0526 0.0555 0.0588 0.0625 0.0666 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⋮

本地函数

函数Y = [0;x (19)) +...[(20: 1:1)]。* x +...[x(20分);0);结束

输入参数

全部折叠

系数矩阵,指定为对称正定矩阵或函数句柄。这个矩阵是线性方程组的系数矩阵A * x =.一般来说,一个是一个大型稀疏矩阵或返回大型稀疏矩阵和列向量乘积的函数句柄。看到确定矩阵是否对称正定来了解如何确认一个是对称正定的。

指定一个作为函数句柄

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

要使用函数句柄,请使用函数签名函数y = fun(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] Barrett, R., M. Berry, t.f. Chan, et al.,线性系统解的模板:迭代方法的构建块, SIAM,费城,1994。

扩展功能

之前介绍过的R2006a