预条件共轭梯度法
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)*b
为x
.如果米
是[]
然后pcg
适用于没有预调节器。米
可以是函数句柄mfun
这样mfun (x)
返回M \ x
.
pcg (A, b,托尔,麦克斯特,M1, M2, x0)
指定初始猜测。如果x0
是[]
,然后pcg
使用默认的全零向量。
[x,标志]=pcg(A,b,…)
也返回收敛标志。
旗帜 |
汇聚 |
---|---|
|
|
|
|
|
预调节器 |
|
|
|
期间计算的标量之一 |
每当旗帜
不是0
,解决方案x
返回的是在所有迭代中计算的最小范数残差。如果没有显示任何消息旗帜
指定了输出。
[x,国旗,relres] = pcg (A, b,…)
还返回相对残差范数(b-A*x)/范数(b)
.如果旗帜
是0
,relres<=tol
.
[x,flag,relres,iter]=pcg(A,b,…)
也返回其所在的迭代数x
是计算出来的,在哪里0 <= iter <= maxit
.
[x,flag,relres,iter,resvec]=pcg(A,b,…)
还返回每个迭代中剩余范数的向量,包括规范(b * x0)
.
此示例演示如何将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);
fl0
是1
因为pcg
不收敛到要求的公差1 e-8
在要求的最大100次迭代之内。预处理器可以使系统更快地收敛。
使用ichol
仅使用一个输入参数构造具有零填充的不完全Cholesky分解。
L=ichol(A);[x1,fl1,rr1,it1,rv1]=pcg(A,b,1e-8100,L,L');
fl1
是0
因为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年。