文档

pcg

预条件共轭梯度法

语法

x=pcg(A,b)
pcg(A、b、tol)
pcg (A, b,托尔,麦克斯特)
pcg(A、b、tol、maxit、M)
pcg (A, b,托尔,麦克斯特,M1, M2)
pcg (A, b,托尔,麦克斯特,M1, M2, x0)
[x,标志]=pcg(A,b,…)
[x,国旗,relres] = pcg (A, b,…)
[x,flag,relres,iter]=pcg(A,b,…)
[x,flag,relres,iter,resvec]=pcg(A,b,…)

描述

x=pcg(A,b)试图解线性方程组A * x =x这个n-借-n系数矩阵一个必须是对称和正定的,并且应该是大的和稀疏的。列向量b一定的长度n. 您还可以指定一个作为一个函数句柄,股骨头无菌性坏死,以致阿方(x)返回A*x

参数化功能解释如何向函数提供附加参数股骨头无菌性坏死,以及预处理函数mfun如有必要,请描述如下。

如果pcg收敛时,将显示具有此效果的消息。如果pcg未能在最大迭代次数后收敛或因任何原因停止,将打印一个警告消息,显示相对残留范数(b-A*x)/范数(b)以及方法停止或失败的迭代次数。

pcg(A、b、tol)指定方法的公差。如果托尔[],然后pcg使用默认的,1 e-6

pcg (A, b,托尔,麦克斯特)指定最大迭代次数。如果马克西特[],然后pcg使用默认的,分钟(n, 20)

pcg(A、b、tol、maxit、M)pcg (A, b,托尔,麦克斯特,M1, M2)使用对称正定预条件M = M1 *平方米并有效地解决了该系统库存(M)*A*x=库存(M)*bx.如果[]然后pcg适用于没有预调节器。可以是函数句柄mfun这样mfun (x)返回M \ x

pcg (A, b,托尔,麦克斯特,M1, M2, x0)指定初始猜测。如果x0[],然后pcg使用默认的全零向量。

[x,标志]=pcg(A,b,…)也返回收敛标志。

旗帜

汇聚

0

pcg收敛到期望的公差托尔在内部马克西特迭代。

1

pcg迭代马克西特时代却没有收敛。

2

预调节器坏脾气的。

3.

pcg停滞不前。(两个连续的迭代是相同的。)

4

期间计算的标量之一pcg变得太小或太大而无法继续计算。

每当旗帜不是0,解决方案x返回的是在所有迭代中计算的最小范数残差。如果没有显示任何消息旗帜指定了输出。

[x,国旗,relres] = pcg (A, b,…)还返回相对残差范数(b-A*x)/范数(b).如果旗帜0relres<=tol

[x,flag,relres,iter]=pcg(A,b,…)也返回其所在的迭代数x是计算出来的,在哪里0 <= iter <= maxit

[x,flag,relres,iter,resvec]=pcg(A,b,…)还返回每个迭代中剩余范数的向量,包括规范(b * x0)

例子

使用pcg与大矩阵

此示例演示如何将pcg与矩阵输入和函数句柄一起使用。

n1 = 21;一个=画廊(硅藻土,n1);b1 =和(2);托尔= 1 e-6;麦克斯特= 15;M1 = spdiags ((1: n1)”,0,n1、n1);(x1, flag1 rr1、iter1 rv1] = pcg (b1,托尔,麦克斯特,M1);

或者,您可以使用下面的函数来代替矩阵一个

函数y = applyMoler(x) y = x;(end-1: 1:1) = y (end-1: 1:1) - cumsum (y(结束:1:2));Y (2:end) = Y (2:end) - cumsum(Y (1:end-1));

通过使用这个函数,您可以更有效地解决更大的系统,因为不需要存储整个矩阵一个

n2 = 21;b2 = applyMoler ((n2, 1));托尔= 1 e-6;麦克斯特= 15;M2 = spdiags ((1: n2)”,0,n2, n2);(x2, flag2 rr2、iter2 rv2] = pcg (@applyMoler, b2,托尔,麦克斯特,M2);

使用pcg用预调节器

这个例子演示了如何使用前置条件矩阵pcg

创建一个输入矩阵,并尝试使用pcg

一个= delsq (numgrid (“年代”, 100));b = 1(大小(A, 1), 1);(x0, fl0 rr0、it0 rv0] = pcg (A, b, 1 e - 8100);

fl01因为pcg不收敛到要求的公差1 e-8在要求的最大100次迭代之内。预处理器可以使系统更快地收敛。

使用ichol仅使用一个输入参数构造具有零填充的不完全Cholesky分解。

L=ichol(A);[x1,fl1,rr1,it1,rv1]=pcg(A,b,1e-8100,L,L');

fl10因为pcg驱动相对残差到9.8e-09的值(rr1,小于所要求的公差1 e-8在第七十七次迭代(值it1),前提条件为零填充的不完全乔里斯基分解。rv1(1) =规范(b)rv1(78) =规范(b * x1)

前面的矩阵表示在带有狄利克雷边界条件的100x100网格上的拉普拉斯算子的离散化。这意味着一个修改过的不完整的Cholesky预处理器可能会表现得更好。

使用米可选项创建修改的不完整Cholesky预条件器。

L=ichol(A,结构(“米切尔”“上”))[x2,fl2,rr2,it2,rv2]=pcg(A,b,1e-8100,L,L');

在这种情况下,您只需47次迭代即可实现收敛。

你可以看到预处理函数是如何影响收敛速度的pcg从初始估计开始绘制每个剩余历史(迭代次数0).

数字;符号学(0:it0,rv0/范数(b),“b”。);持有在…上;semilogy (0: it1 rv1 /规范(b),“r”。); 符号学(0:it2,rv2/范数(b),“k.”);传奇(“没有预调节器”“集成电路(0)”“麦克风(0)”);包含(的迭代次数);ylabel (“相对残差”);持有

工具书类

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

扩展功能

在R2006a之前引入