双共轭梯度方法
x = bicg (A, b)
bicg (A, b, tol)
bicg (A, b,托尔,麦克斯特)
bicg (A, b,托尔,麦克斯特米)
麦克斯特bicg (A, b,托尔,M1, M2)
麦克斯特bicg (A, b,托尔,M1, M2, x0)
[x,国旗]= bicg (A, b,…)
[x,国旗,relres] = bicg (A, b,…)
[x,国旗,relres, iter] = bicg (A, b,…)
[x,国旗,relres, iter resvec] = bicg (A, b,…)
x = bicg (A, b)
试图解线性方程组A * x =
为x
.的n
——- - - - - -n
系数矩阵一个
必须是方形的,并且应该是大而稀疏的。列向量b
一定的长度n
.一个
可以是函数句柄,afun
,这样afun (x, notransp)
返回* x
和afun (x,“透明”)
返回‘* x
.
参数化功能解释如何向函数提供附加参数afun
,以及预处理函数mfun
如有必要,请描述如下。
如果bicg
聚合时,它将显示具有此效果的消息。如果bicg
在最大迭代次数后未能收敛或因任何原因停止,则打印包含相对残留的警告消息规范(b * x) /规范(b)
以及方法停止或失败的迭代次数。
bicg (A, b, tol)
指定方法的公差。如果托尔
是[]
,然后bicg
使用默认的,1 e-6
.
bicg (A, b,托尔,麦克斯特)
指定最大迭代次数。如果麦克斯特
是[]
,然后bicg
使用默认的,分钟(n, 20)
.
bicg (A, b,托尔,麦克斯特米)
和麦克斯特bicg (A, b,托尔,M1, M2)
使用预调节器米
或M = M1 *平方米
并有效地解决了该系统发票(M) * * x =发票(M) * b
为x
.如果米
是[]
然后bicg
适用于没有预调节器。米
可以是函数句柄吗mfun
,这样mfun (x, notransp)
返回M \ x
和mfun (x,“透明”)
返回M ' \ x
.
麦克斯特bicg (A, b,托尔,M1, M2, x0)
指定初始猜测。如果x0
是[]
,然后bicg
使用默认的全零向量。
[x,国旗]= bicg (A, b,…)
也返回收敛标志。
国旗 |
收敛 |
---|---|
|
|
|
|
|
预调节器 |
|
|
|
期间计算的标量之一 |
每当国旗
不是0
,解决方案x
返回的是在所有迭代中计算的最小范数残差。如果没有显示任何消息国旗
输出指定。
[x,国旗,relres] = bicg (A, b,…)
也返回相对剩余规范(b * x) /规范(b)
.如果国旗
是0
,relres < =托尔
.
[x,国旗,relres, iter] = bicg (A, b,…)
也返回其所在的迭代数x
计算,0 <= iter <= maxit
.
[x,国旗,relres, iter resvec] = bicg (A, b,…)
还返回每个迭代的剩余规范向量,包括规范(b * x0)
.
这个例子展示了如何使用bicg
用矩阵输入。bicg
.下面的代码:
n = 100;= 1 (n, 1);A = spdiags([-2*on 4*on],-1:1,n,n);b =和(2);托尔= 1 e-8;麦克斯特= 15;M1 = spdiags([on/(-2) on],-1:0,n,n);M2 = spdiags([4*on -on],0:1,n,n);x = bicg (A, b,托尔,麦克斯特,M1, M2);
显示此消息:
在第9次迭代时,Bicg收敛到一个相对残差为5.3e-009的解
这个例子代替了矩阵一个
在前面的例子中,有一个矩阵向量乘积函数的句柄afun
.该示例包含在一个文件中run_bicg
那
调用bicg
与@afun
函数句柄作为其第一个参数。
包含afun
作为一个嵌套函数,以便所有的变量run_bicg
可用于afun
.
将下列内容放入一个名为run_bicg
:
函数x1 = run_bicg n = 100;= 1 (n, 1);b = afun (, ' notransp ');托尔= 1 e-8;麦克斯特= 15;M1 = spdiags([on/(-2) on],-1:0,n,n);M2 = spdiags([4*on -on],0:1,n,n);x1 = bicg (@afun, b,托尔,麦克斯特,M1, M2);函数y = afun(x,transp_flag) if strcmp(transp_flag,'trans ') % y = A'*x y = 4 *x;Y (1:n-1) = Y (1:n-1) - x(2:n); y(2:n) = y(2:n) - x(1:n-1); elseif strcmp(transp_flag,'notransp') % y = A*x y = 4 * x; y(2:n) = y(2:n) - 2 * x(1:n-1); y(1:n-1) = y(1:n-1) - x(2:n); end end end
当你进入
x1 = run_bicg;
MATLAB®软件显示消息
在第9次迭代时,Bicg收敛到一个具有…相对剩余5.3 e - 009
这个例子演示了前置条件的使用。
负载一个= west0479
,一个实的479 × 479非对称稀疏矩阵。
负载west0479;一个= west0479;
定义b
所以真解是所有1的向量。
b =全(sum (A, 2));
设置容忍和最大迭代次数。
托尔= 1 e-12;麦克斯特= 20;
使用bicg
在要求的容忍度和迭代次数下找到解决方案。
(x0, fl0 rr0、it0 rv0] = bicg (A, b,托尔,麦克斯特);
fl0
是1,因为bicg
不符合要求的公差1 e-12
在要求的20次迭代中。其实,这种行为bicg
是如此的可怜,以至于最初的猜测(x0 = 0(大小(2),1)
)是最好的解决方案,返回值由it0 = 0
.MATLAB®将残留历史存储在rv0
.
绘制bicg
.
semilogy(0:麦克斯特,rv0 /规范(b),“o”);包含(的迭代次数);ylabel (的相对剩余的);
该图表明解不收敛。您可以使用前置条件来改善结果。
创建前置条件withilu
,因为矩阵一个
非对称。
[L U] = ilu(一、结构(“类型”,“ilutp”,“droptol”, 1 e-5));
有一个主元等于零。考虑降低滴差或考虑使用“udiag”选项。
MATLAB不能构造不完整的逻辑单元,因为它会导致奇异因子,作为预处理是无用的。
正如错误消息所指示的那样,您可以使用降低的丢包容忍度再次尝试。
[L U] = ilu(一、结构(“类型”,“ilutp”,“droptol”, 1 e-6));(x1, fl1 rr1、it1 rv1] = bicg (A, b,托尔,麦克斯特,L, U);
fl1
是0,因为bicg
驱动相对残差到4.1410 e - 014
的值(rr1
).相对残留小于规定的公差1 e-12
在第六次迭代时(值it1
),以不完全LU分解为先决条件,滴差为1 e-6
.输出rv1 (1)
是规范(b)
,输出rv1 (7)
是规范(b * x2)
.
你可以跟着进度bicg
通过绘制从初始估计(迭代数0)开始的每个迭代的相对残差。
semilogy (0: it1 rv1 /规范(b),“o”);包含(的迭代次数);ylabel (的相对剩余的);
[1] Barrett, R., M. Berry, T.F. Chan等,线性系统解的模板:迭代方法的构建块, SIAM,费城,1994。