文档

bicg

双共轭梯度方法

语法

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)返回* xafun (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) * bx.如果[]然后bicg适用于没有预调节器。可以是函数句柄吗mfun,这样mfun (x, notransp)返回M \ xmfun (x,“透明”)返回M ' \ x

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

[x,国旗]= bicg (A, b,…)也返回一个收敛标志。

国旗

收敛

0

bicg趋同到所需的公差托尔麦克斯特迭代。

1

bicg迭代麦克斯特时间却没有收敛。

2

预调节器坏脾气的。

3.

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

4

过程中计算的标量之一bicg变得太小或太大而无法继续计算。

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

[x,国旗,relres] = bicg (A, b,…)还返回相对残差规范(b * x) /规范(b).如果国旗0relres < =托尔

[x,国旗,relres, iter] = bicg (A, b,…)也返回迭代的次数x计算,0 <= iter <= maxit

[x,国旗,relres, iter resvec] = bicg (A, b,…)还在每次迭代时返回残差范数的向量,包括规范(b * x0)

例子

使用bicg与矩阵输入

这个例子展示了如何使用bicg用矩阵输入。bicg.下面的代码:

n = 100;= 1 (n, 1);A = spdiags([-2*on 4*on -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);

显示此消息:

Bicg在迭代9收敛到一个相对残差为5.3e-009的解

使用带有函数句柄的bicg

这个例子替换了矩阵一个在前面的例子中有一个矩阵向量乘积函数的句柄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) - 2 * 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®软件显示消息

Bicg在迭代9收敛到一个包含…相对剩余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 (的相对剩余的);

图表明解不收敛。你可以使用预调节器来改善结果。

使用创建预调节器ilu,因为矩阵一个非对称。

[L U] = ilu (A,结构(“类型”,“ilutp”,“droptol”,1 e-5));

错误使用ilu

主元等于0。考虑减少

删除容忍或考虑使用'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)时,用不完全逻辑单元分解预处理,且滴差为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等,线性系统解的模板:迭代方法的构建块1994年,暹罗,费城。

之前介绍过的R2006a

这个话题有用吗?