文档

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)指定初始猜测。如果x0Is [] thenbicgstabl使用默认值,一个全零向量。

[x,flag] = bicgstabl(A,b,…)也返回一个收敛国旗

国旗

收敛

0

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

1

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

2

预调节器坏脾气的。

3.

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

4

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

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

[x,flag,relres,iter] = bicgstabl(A,b,…)还返回所处的迭代数x计算,其中0 <= iter <= maxititer可以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 (的相对剩余的);

这个话题有用吗?