主要内容

CGS.

解线性方程组-共轭梯度的平方法

描述

X=研究生院理事会(一种B.试图解决线性方程系统A * x =为了X使用共轭梯度平方法.当尝试成功时,CGS.显示确认收敛的消息。如果CGS.未能在最大迭代次数后收敛或因任何原因停止,则显示包含相对残差的诊断消息规范(b * x) /规范(b)以及方法停止的迭代次数。

X=研究生院理事会(一种B.托尔指定方法的公差。默认容忍度为1 e-6

X=研究生院理事会(一种B.托尔麦克斯特指定要使用的最大迭代次数。CGS.如果收敛失败,则显示诊断消息麦克斯特迭代。

例子

X=研究生院理事会(一种B.托尔麦克斯特m指定一个预处理矩阵m和计算X通过有效解决系统 一种 m 1 y = B. 为了y,在那里 y = m X .使用预处理器矩阵可以提高问题的数度和计算效率。

例子

X=研究生院理事会(一种B.托尔麦克斯特M1平方米指定预处理矩阵的因子m这样M = M1 *平方米

X=研究生院理事会(一种B.托尔麦克斯特M1平方米x0指定解决方案矢量的初始猜测X.默认值是一个0的向量。

例子

[X国旗研究生院理事会]= (___返回一个标志,指定算法是否成功融合。什么时候国旗= 0,趋同是成功的。您可以将此输出语法与前面的任何输入参数组合一起使用。当你指定国旗输出,CGS.不显示任何诊断消息。

例子

[X国旗relres研究生院理事会]= (___也返回相对剩余规范(b * x) /规范(b).如果国旗0., 然后relres < =托尔

例子

[X国旗relresiter研究生院理事会]= (___也返回迭代号码iter在这X被计算了。

例子

[X国旗relresiterresvec研究生院理事会]= (___还返回每个迭代的残差规范向量,包括第一个残差规范(b * x0)

例子

全部折叠

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

创建一个随机稀疏矩阵一种密度为50%。也为右边创建一个随机向量 斧头 = B.

rng默认的5 = sprand (600600);A = A'*A + speye(size(A));b =兰德(600 1);

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

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

默认情况下CGS.使用20次迭代和一个公差1 e-6,算法在这20次迭代中无法收敛。由于残差仍然很大,这是一个很好的指示,说明需要更多的迭代(或预处理矩阵)。您还可以使用更大的容忍度,以使算法更容易收敛。

再次使用容差来解决系统1的军医和40迭代。

X = CGS(A,B,1E-4,40);
CGS在迭代40处停止而不会聚到所需的公差0.0001,因为达到了最大迭代次数。迭代返回(第40页)具有相对残差0.0024。

即使有宽松的宽容和更多的迭代CGS.不收敛。当迭代算法以这种方式停止时,很好地表明需要一个预处理矩阵。

计算不完整的粗心分解一种,并使用L.因素作为预处理器输入CGS.

L = ichol(一个);x =研究生院理事会(A, b, 1的军医,40岁,左);
CGS在迭代14时收敛到一个相对残差为1.4e-05的解。

使用预处理器可以充分改善问题的数值性质CGS.能够收敛。

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

加载west0479,一个实的479 × 479非对称稀疏矩阵。

加载west0479一个= west0479;

定义B.这样真正的解决方案 斧头 = B. 是所有1的向量。

b =和(2);

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

托尔= 1 e-12;麦克斯特= 20;

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

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

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

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

  • IT0.是迭代号码何时X被计算了。

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

[x, fl0 rr0, it0 rv0] =研究生院理事会(A, b,托尔,麦克斯特);FL0.
fl0 = 1
rr0
rr0 = 1
IT0.
it0 = 0

FL0.1因为CGS.不符合要求的公差1 e-12在要求的20次迭代中。其实,这种行为CGS.是如此的可怜以至于最初的猜测x0 = 0(大小(2),1)如所示,是最好的解决方案并返回it0 = 0

为了帮助缓慢的收敛,你可以指定一个预处理矩阵。自一种不对称,使用ilu生成预处理程序 m = L. .指定一个drop tolerance以忽略值小于的非对角线项1 e-6.解决预处理系统 一种 m - 1 m X = B. 通过指定L.作为输入,CGS.

设置=结构(“类型”“ilutp”“droptol”1 e-6);[L U] = ilu(一个,设置);(x1, fl1 rr1、it1 rv1] =研究生院理事会(A, b,托尔,麦克斯特,L, U);fl1
fl1 = 0
rr1
rr1 = 4.3850 e-14
IT1
it1 = 3

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

你可以遵循的进步CGS.通过绘制每个迭代的相对残差。用指定的公差线绘制每个溶液的残留历史图。

半径(0:长度(RV0)-1,RV0 / NORM(B),'-O')举行semilogy(0:长度(rv1) 1, rv1 /规范(b),'-O')yline(tol,“r——”);传奇('没有预处理者'ILU预处理的“宽容”“位置”“东”)包含(的迭代次数) ylabel (的相对剩余的

图中包含一个坐标轴。轴包含三个对象的类型线,恒线。这些对象代表No preconditioner、ILU preconditioner、Tolerance。

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

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

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

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

麦克斯特= 200;x1 =研究生院理事会(A, b,[],麦克斯特);
CGS在第17次迭代时收敛到一个相对残差为8.8e-07的解。
x0 = 0.99 * e;x2 = cgs(a,b,[],maxit,[],[],x0);
CGS在第4次迭代时收敛到一个相对残差为8e-07的解。

在这种情况下,提供初始猜测是可行的CGS.更快地聚合。

返回中间结果

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

例如,这段代码执行四次100次迭代,并在For循环中每次传递后存储解决方案向量:

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

X (:, k)迭代时是否计算了解向量K.for-loop,和R (k)是这个解的相对剩余。

通过提供解一个线性方程组CGS.使用计算的函数句柄* x代替系数矩阵一种

其中一个威尔金森测试矩阵由画廊是一个21乘21的三对角矩阵。预览矩阵。

a =画廊(“wilk”, 21)
A =21×2110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01210.0.0.0.0.0. 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 ⋮

威尔金森矩阵具有特殊结构,因此您可以代表操作* x使用函数句柄。什么时候一种乘一个向量,得到的向量中的大多数元素都是零。结果中的非零元素对应于的非零三对角元素一种.而且,只有主对角线上有不等于1的非零。

表达式 斧头 成为:

斧头 = [ 10 1 0. 0. 0. 1 9. 1 0. 0. 0. 1 8. 1 0. 0. 1 7. 1 0. 0. 1 6. 1 0. 0. 1 5. 1 0. 0. 1 4. 1 0. 0. 1 3. 0. 0. 0. 1 0. 0. 0. 1 10 ] [ X 1 X 2 X 3. X 4. X 5. X 21 ] = [ 10 X 1 + X 2 X 1 + 9. X 2 + X 3. X 2 + 8. X 3. + X 4. X 19 + 9. X 20. + X 21 X 20. + 10 X 21 ]

得到的向量可以写成三个向量的总和:

斧头 = [ 0. + 10 X 1 + X 2 X 1 + 9. X 2 + X 3. X 2 + 8. X 3. + X 4. X 19 + 9. X 20. + X 21 X 20. + 10 X 21 + 0. ] = [ 0. X 1 X 20. ] + [ 10 X 1 9. X 2 10 X 21 ] + [ X 2 X 21 0. ]

在MATLAB®中,编写一个函数来创建这些向量并将它们相加,从而得到值* x

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

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

现在,解线性方程组 斧头 = B. 通过提供CGS.使用计算的函数句柄* x.使用宽容1 e-12和50次迭代。

b = ins(21,1);托尔= 1 e-12;maxit = 50;x1 = cgs(@ afun,b,tol,maxit)
CGS在迭代11处于具有相对残留的1.3E-14的溶液。
x1 =21×10.0910 0.0899 0.0999 0.1109 0.1241 0.1443 0.1544 0.2383 0.1309 0.5000⋮

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

Afun(x1)
ans =.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⋮

本地功能

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

输入参数

全部折叠

系数矩阵,指定为方阵或函数句柄。这个矩阵是线性方程组的系数矩阵A * x =.一般来说,一种是一个大型稀疏矩阵或返回大型稀疏矩阵和列向量乘积的函数句柄。

指定一种作为函数句柄

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

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

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

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

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

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

数据类型:

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

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

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

指定m作为函数句柄

您可以任意指定mM1,或平方米作为函数句柄而不是矩阵。函数句柄执行矩阵向量运算,而不是形成整个预处理矩阵,使计算更加高效。

要使用函数句柄,请使用函数签名函数y = mfun(x)参数化功能解释如何向函数提供附加参数mfun,如果必要的。函数调用mfun (x)必须返回值m \ x.M1、M2 \ (x)

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

初始猜测,指定为长度等于的列向量大小(2).如果你能提供CGS.有一个更合理的初步猜测x0而不是零的零旋钮,然后它可以节省计算时间并帮助算法收敛更快。

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

输出参数

全部折叠

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

每当计算不成功时(国旗~ = 0),解决方案X返回的CGS.是在所有迭代中计算出的残差范数最小的。

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

标志值

收敛

0.

成功 -CGS.收敛到期望的公差托尔麦克斯特迭代。

1

失败- - - - - -CGS.迭代麦克斯特迭代却没有收敛。

2

失败-预处理矩阵mM = M1 *平方米是病态的。

3.

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

4.

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

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

数据类型:

迭代数,作为标量返回。该输出指示计算的答案所在的迭代数X计算了。

数据类型:

剩余错误,返回为向量。剩余误差常态(B-A * x)揭示了给定值时算法离收敛有多近X.元素的数量resvec等于迭代的数量。您可以检查内容resvec来帮助决定是否要改变托尔麦克斯特

数据类型:

更多关于

全部折叠

共轭梯度平方法

共轭梯度平方(CGS)算法是对双共轭梯度(BiCG)算法的改进。CGS算法不使用残差及其共轭,而是通过使用残差[1]的平方来避免系数矩阵的转置。

CGS的收敛速度与BiCG的收敛速度相当,但其收敛行为是不规则的,特别是当初始猜想与解接近时[1]

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,气孔导度(A).您可以使用平衡改善条件数一种,它本身就使得大多数迭代求解器更容易收敛。然而,使用平衡当您随后因素为平衡的矩阵时也会导致更好的质量预处理器矩阵b = r * p * a * c

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

参考文献

[1] Barrett, R., M. Berry, t.f. Chan, et al.,线性系统解的模板:迭代方法的构建块, SIAM,费城,1994。

[2] Sonneveld, Peter,“CGS:非对称线性系统的快速lanczos型求解器”暹罗j .科学。Stat。第一版。, 1989年1月,第10卷第1期,第36-52页。

扩展功能

之前介绍过的R2006a