文档

bicgstab

双共轭梯度稳定法

语法

x = bicgstab(A,b)
bicgstab (A, b, tol)
bicgstab (A, b,托尔,麦克斯特)
bicgstab (A, b,托尔,麦克斯特米)
麦克斯特bicgstab (A, b,托尔,M1, M2)
麦克斯特bicgstab (A, b,托尔,M1, M2, x0)
[x,flag] = bicgstab(A,b,…)
[x,flag,relres] = bicgstab(A,b,…)
[x,flag,relres,iter] = bicgstab(A,b,…)
[x,flag,relres,iter,resvec] = bicgstab(A,b,…)

描述

x = bicgstab(A,b)试图解线性方程组A * x =x.的n——- - - - - -n系数矩阵一个必须是方形的,应该是大而稀疏的。列向量b一定要有长度n一个可以是函数句柄,afun,以致于afun (x)返回* x

参数化功能解释如何向函数提供附加参数afun,以及预调节功能mfun如有必要,如下所述。

如果bicgstab收敛时,将显示一条消息。如果bicgstab在最大迭代次数之后未能收敛或由于任何原因停止,则打印一条警告消息,显示相对残差规范(b * x) /规范(b)以及方法停止或失败的迭代次数。

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

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

bicgstab (A, b,托尔,麦克斯特米)而且麦克斯特bicgstab (A, b,托尔,M1, M2)使用预调节器M = m1 * m2并有效地解决了该系统inv(M)*A*x = inv(M)*bx.如果[]然后bicgstab不使用预处理。可以是函数句柄吗mfun,以致于mfun (x)返回M \ x

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

[x,flag] = bicgstab(A,b,…)还返回一个收敛标志。

国旗

收敛

0

bicgstab收敛到期望的公差托尔麦克斯特迭代。

1

bicgstab迭代麦克斯特时代却没有趋同。

2

预调节器坏脾气的。

3.

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

4

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

每当国旗不是0,解决方案x返回的是在所有迭代中计算的最小范数残差。配置为国旗指定输出。

[x,flag,relres] = bicgstab(A,b,…)也返回相对残差规范(b * x) /规范(b).如果国旗0Relres <= tol

[x,flag,relres,iter] = bicgstab(A,b,…)还返回所处的迭代数x计算,其中0 <= iter <= maxititer可以是整数+0.5,表示迭代进行到一半时收敛。

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

例子

使用带有矩阵输入的bicgstab

这个例子首先解决了Ax = b通过提供一个预调理剂M1直接作为参数。

代码:

A = gallery('wilk',21);b = sum(A,2);Tol = 1e-12;Maxit = 15;M1 = diag([10:-1:1 1 1:10]);x = bicgstab(A,b,tol,maxit,M1);

显示消息:

Bicgstab在迭代12.5收敛到相对残差为2e-014的解。

使用带有函数句柄的bicgstab

这个例子替换了矩阵一个在前面的例子中,用句柄表示矩阵-向量乘积函数afun,和预调节剂M1与回解函数的句柄mfun.示例包含在一个文件中run_bicgstab

  • 调用bicgstab使用函数句柄@afun作为第一个参数。

  • 包含afun而且mfun作为嵌套函数,使所有变量都在run_bicgstab均可提供给afun而且mfun

的代码如下所示run_bicgstab

函数x1 = run_bicgstab n = 21;B = fun(ones(n,1));Tol = 1e-12;Maxit = 15;X1 = bicgstab(@afun,b,tol,maxit,@mfun);函数y = fun(x) y = [0;X (1:n-1) +…(((n - 1) / 2: 1:0) ';(1: (n - 1) / 2)”)。*x +…[x (2: n); 0]; end function y = mfun(r) y = r ./ [((n-1)/2:-1:1)'; 1; (1:(n-1)/2)']; end end

当你进入时

X1 = run_bicgstab;

MATLAB®软件显示消息

Bicgstab在迭代12.5收敛到相对残差为2e-014的解。

使用bicgstab与预处理

这个例子演示了前置条件的使用。

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

负载west0479;A = west0479;

定义b所以真正的解是一个全是1的向量。

b = full(sum(A,2));

设置公差和最大迭代次数。

Tol = 1e-12;Maxit = 20;

使用bicgstab在要求的公差和迭代次数上找到解决方案。

[x0,fl0,rr0,it0,rv0] = bicgstab(A,b,tol,maxit);

fl0是1因为bicgstab不收敛到要求的公差1 e-12在请求的20次迭代中。事实上,行为bicgstab是如此糟糕,以至于最初的猜测(x0 = 0 (size(A,2),1))为最佳解决方案,返回值为It0 = 0.MATLAB®存储残差历史rv0

绘制的行为bicgstab

semilogy(0:0.5:麦克斯特rv0 /规范(b),“o”);包含(的迭代次数);ylabel (的相对剩余的);

图显示解不收敛。你可以使用预处理来改善结果。

创建一个预处理ilu,因为一个非对称。

[L,U] = ilu(A,struct(“类型”“ilutp”“droptol”, 1 e-5));
有一个主元等于0。考虑降低跌落容忍度或考虑使用'udiag'选项。

MATLAB不能构造不完全逻辑单元,因为它将导致一个奇异因子,这是无用的前置条件。

如错误消息所示,您可以使用降低的跌落容忍度再次尝试。

[L,U] = ilu(A,struct(“类型”“ilutp”“droptol”, 1 e-6));[x1,fl1,rr1,it1,rv1] = bicgstab(A,b,tol,maxit,L,U);

fl1是0,因为bicgstab驱动相对残差到5.9829 e - 014的价值(rr1).相对残留量小于规定的公差1 e-12在第三次迭代中(的值it1)时,以不完全LU因式分解为前提,其降容差为1 e-6.输出rv1 (1)规范(b)以及输出rv1 (7)规范(b * x2)bicgstab使用半迭代。

你可以跟随的进度bicgstab通过绘制从初始估计(迭代0)开始的每次迭代的相对残差。

semilogy (0:0.5: it1 rv1 /规范(b),“o”);包含(的迭代次数);ylabel (的相对剩余的);

参考文献

[1]巴雷特,R., M. Berry, T.F. Chan等,线性系统解的模板:迭代方法的构建块, SIAM,费城,1994年。

[2] van der Vorst, h.a.,“BI-CGSTAB:求解非对称线性系统的快速平滑收敛的BI-CG变体,”SIAM j。Stat。第一版。1992年3月,第13卷第2期,第631-644页。

扩展功能

R2006a之前介绍