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)*b
为x
.如果米
是[]
然后bicgstab
不使用预处理。米
可以是函数句柄吗mfun
,以致于mfun (x)
返回M \ x
.
麦克斯特bicgstab (A, b,托尔,M1, M2, x0)
指定初始猜测。如果x0
是[]
,然后bicgstab
使用默认值,一个全零向量。
[x,flag] = bicgstab(A,b,…)
还返回一个收敛标志。
国旗 |
收敛 |
---|---|
|
|
|
|
|
预调节器 |
|
|
|
期间计算的标量之一 |
每当国旗
不是0
,解决方案x
返回的是在所有迭代中计算的最小范数残差。配置为国旗
指定输出。
[x,flag,relres] = bicgstab(A,b,…)
也返回相对残差规范(b * x) /规范(b)
.如果国旗
是0
,Relres <= tol
.
[x,flag,relres,iter] = bicgstab(A,b,…)
还返回所处的迭代数x
计算,其中0 <= iter <= maxit
.iter
可以是整数+
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页。