bicgstabl
双共轭梯度稳定(l)法
语法
x = bicgstabl(A,b)
X = bicgstabl(fun,b)
x = bicgstabl(A,b,tol)
x = bicgstabl(A,b,tol,maxit)
x = bicgstabl(A,b,tol,maxit,M)
x = bicgstabl(A,b,tol,maxit,M1,M2)
x = bicgstabl(A,b,tol,maxit,M1,M2,x0)
[x,flag] = bicgstabl(A,b,…)
[x,flag,relres] = bicgstabl(A,b,…)
[x,flag,relres,iter] = bicgstabl(A,b,…)
[x,flag,relres,iter,resvec] = bicgstabl(A,b,…)
描述
x = bicgstabl(A,b)
试图解线性方程组A * x =
为x
.的n
——- - - - - -n
系数矩阵一个
一定是平方和右边的列向量b
一定要有长度n
.
X = bicgstabl(fun,b)
接受函数句柄afun
而不是矩阵一个
.afun (x)
接受矢量输入x
然后返回矩阵和向量的乘积* x
.在以下所有语法中,都可以替换一个
通过afun
.
x = bicgstabl(A,b,tol)
指定方法的公差。如果托尔
Is [] thenbicgstabl
使用默认值1e-6。
x = bicgstabl(A,b,tol,maxit)
指定最大迭代次数。如果麦克斯特
Is [] thenbicgstabl
使用默认值,分钟(N, 20)
.
x = bicgstabl(A,b,tol,maxit,M)
而且x = bicgstabl(A,b,tol,maxit,M1,M2)
使用预调节器米
或M = M1 *平方米
并有效地解决了该系统A*inv(M)*x = b
,如果米
是[],则不应用预处理条件。米
可能是函数句柄返回M \ x
.
x = bicgstabl(A,b,tol,maxit,M1,M2,x0)
指定初始猜测。如果x0
Is [] thenbicgstabl
使用默认值,一个全零向量。
[x,flag] = bicgstabl(A,b,…)
也返回一个收敛国旗
:
国旗 |
收敛 |
---|---|
|
bicgstabl 收敛到期望的公差托尔 在麦克斯特 迭代。 |
|
bicgstabl 迭代麦克斯特 时代却没有趋同。 |
|
预调节器米 坏脾气的。 |
|
|
|
期间计算的标量之一 |
[x,flag,relres] = bicgstabl(A,b,…)
也返回相对残差规范(b * x) /规范(b)
.如果国旗
是0
,Relres <= tol
.
[x,flag,relres,iter] = bicgstabl(A,b,…)
还返回所处的迭代数x
计算,其中0 <= iter <= maxit
.iter
可以k / 4
在哪里k
是某个整数,表示给定四分之一迭代的收敛性。
[x,flag,relres,iter,resvec] = bicgstabl(A,b,…)
还返回每个四分之一迭代中剩余范数的向量,包括规范(b * x0)
.
例子
在输入或函数中使用bicgstabl
您可以将输入直接传递给bicgstabl
:
N = 21;A =画廊('wilk',n);b = sum(A,2);Tol = 1e-12;Maxit = 15;M = diag([10:-1:1 1 1:10]);x = bicgstabl(A,b,tol,maxit,M);
你也可以使用矩阵-向量乘积函数:
函数y = fun(x,n) y = [0;X (1:n-1)] + [((n-1)/2:-1:0)';(1: (n - 1) / 2)”)。* x + [x (2: n);0);
和一个预处理反求解函数:
函数y = mfun y = r (r, n)。/ (((n - 1) / 2: 1:1);1;(1: (n - 1) / 2) ');
作为输入bicgstabl
:
x1 = bicgstabl (@ (x) afun (x, n), b,托尔,麦克斯特,@ (x) mfun (x, n));
使用bicgstabl与预处理
这个例子演示了前置条件的使用。
负载west0479
,一个实的479 × 479非对称稀疏矩阵。
负载west0479;A = west0479;
定义b
所以真正的解是一个全是1的向量。
b = full(sum(A,2));
设置公差和最大迭代次数。
Tol = 1e-12;Maxit = 20;
使用bicgstabl
在要求的公差和迭代次数上找到解决方案。
[x0,fl0,rr0,it0,rv0] = bicgstabl(A,b,tol,maxit);
fl0
是1因为bicgstabl
不收敛到要求的公差1 e-12
在请求的20次迭代中。事实上,行为bicgstabl
是如此的可怜,以至于最初的猜测(x0 = 0 (size(A,2),1)
)为最佳解决方案,返回值为It0 = 0
.MATLAB®存储残差历史rv0
.
绘制的行为bicgstabl
.
semilogy(0:0.25:麦克斯特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] = bicgstabl(A,b,tol,maxit,L,U);
fl1
是0,因为bicgstabl
驱动相对残差到1.0257 e - 015
的价值(rr1
).相对残留量小于规定的公差1 e-12
在第六次迭代中(的值it1
)时,以不完全LU因式分解为前提,其降容差为1 e-6
.输出rv1 (1)
是规范(b)
,输出rv1 (9)
是规范(b * x2)
自bicgstabl
使用四分之一迭代。
你可以跟随的进度bicgstabl
通过绘制从初始估计(迭代0)开始的每次迭代的相对残差。
semilogy (0:0.25: it1 rv1 /规范(b),“o”);H = gca;h.XTick = 0:0.25:it1;包含(的迭代次数);ylabel (的相对剩余的);