主要内容

Bicgstab.

线性方程组的求解-稳定的双共轭梯度法

描述

例子

X=biggstab(一种B.试图解决线性方程系统A * x =为了X使用Biconjugate梯度稳定方法.当尝试成功时,Bicgstab.显示一条消息以确认融合。如果Bicgstab.在最大迭代次数后无法收敛或由于任何原因停止,将显示包含相对残差的诊断消息范数(b-A*x)/范数(b)以及方法停止的迭代次数。

例子

X=biggstab(一种B.托尔指定方法的公差。默认公差为1E-6

例子

X=biggstab(一种B.托尔麦克斯特指定要使用的最大迭代次数。Bicgstab.如果无法在内部聚合,则显示诊断消息麦克斯特迭代。

例子

X=biggstab(一种B.托尔麦克斯特m指定一个预处理矩阵m和计算X通过有效解决系统 一种 m - 1 y = B. 为了y,在那里 y = m X .使用预处理器矩阵可以提高问题的数度和计算效率。

例子

X=biggstab(一种B.托尔麦克斯特M1平方米指定预安全载体矩阵的因素m这样m = m1 * m2

例子

X=biggstab(一种B.托尔麦克斯特M1平方米X0.指定解决方案矢量的初始猜测X.默认值是一个0的向量。

例子

[X国旗] = bicgstab(___返回一个标志,指定算法是否成功融合。什么时候标志= 0.,趋同是成功的。您可以将此输出语法与前面的任何输入参数组合一起使用。当你指定国旗产出,Bicgstab.不显示任何诊断消息。

例子

[X国旗] = bicgstab(___还返回相对残差范数(b-A*x)/范数(b).如果国旗0., 然后relres<=tol

例子

[X国旗iter] = bicgstab(___也返回迭代号码iter此时X被计算了。

例子

[X国旗iterResvec.] = bicgstab(___还返回每个迭代的残差规范向量,包括第一个残差常态(b-a * x0)

例子

全部崩溃

用迭代法求解一个平方线性系统Bicgstab.使用默认设置,然后调整解决方案过程中使用的迭代次数和迭代次数。

创建一个随机稀疏矩阵一种密度为50%。同时创建一个随机向量B.对于右侧的右侧 斧头 = B.

rng默认a = sprand(400,400,.5);a ='* a;b =兰特(400,1);

解决 斧头 = B. 使用Bicgstab..输出显示包括相对剩余误差的值 B. - 斧头 B.

x=biggstab(A,b);
Bicgstab在迭代20时停止,没有收敛到期望的容忍值1e-06,因为已经达到了最大的迭代次数。返回的iterate(编号20)的相对残差为0.12。

默认情况下Bicgstab.使用20次迭代和一个公差1E-6,并且该算法无法在此矩阵的20次迭代中收敛。由于残差仍然很大,这是一个很好的指标,表明需要更多的迭代(或预条件矩阵)。您还可以使用更大的容差,使算法更容易收敛。

再次使用容差来解决系统1E-4和100次迭代。

x = bicgstab (A, b, 1 e - 4100);
Bicgstab在迭代100时停止,没有收敛到期望的公差0.0001,因为已经达到了最大的迭代次数。迭代返回(编号100)的相对残差为0.044。

即使具有宽松的公差和更多的迭代,剩余错误也不会改善太多。当以这种方式迭代算法停止时,它是需要预处理器矩阵的良好指示。

计算不完整的粗心分解一种,并使用我是因素作为预处理器输入Bicgstab.

L = ichol(一个);x = bicgstab (A, b, e - 4100 L ');
BICGSTAB在迭代30.5融合到具有相对残留5.3E-05的溶液。

使用预处理器提高了问题的数值Bicgstab.能够融合。

检查使用预处理器矩阵的效果Bicgstab.解一个线性系统。

加载West0479,真正的479-by-479非对称稀疏矩阵。

加载West0479.一个= west0479;

定义B.这样真正的解决方案 斧头 = B. 是所有1的向量。

b = sum(a,2);

设置容忍和最大迭代次数。

tol = 1e-12;maxit = 20;

使用Bicgstab.在要求的容忍度和迭代次数下找到解决方案。指定五个输出以返回关于解决方案流程的信息:

  • X是计算的解决方案A * x =

  • FL0.是指示算法是否会融合的标志。

  • rr0是计算结果的相对残差X

  • IT0.是迭代号码何时X被计算了。

  • RV0.是残余历史的矢量 B. - 斧头

[x,fl0,rr0,it0,rv0] = bicgstab(a,b,tol,maxit);FL0.
fl0 = 1
rr0
Rr0 = 1
IT0.
it0=0

FL0.1因为Bicgstab.不收敛到要求的公差1E-12在请求的20次迭代中。事实上Bicgstab.是如此的糟糕以至于最初的猜测x0=零(尺寸(A,2),1)如所示,是最好的解决方案并返回it0=0

为了帮助缓慢收敛,您可以指定一个预条件器矩阵。自从一种不对称,使用ilu生成预处理程序 m = L. .指定一个drop tolerance以忽略值小于的非对角线项1E-6.解决预处理系统 一种 m - 1 m X = B. 通过指定L.作为输入Bicgstab.

设置=结构(“类型”“ilutp”“滴剂”,1E-6);[l,u] = ilu(a,设置);[X1,FL1,RR1,IT1,RV1] = BICGSTAB(A,B,TOL,MAXIT,L,U);FL1.
fl1=0
rr1
rr1 = 3.8661 e-14
IT1
it1=3

使用ilu预处理器产生的相对残差小于1E-12在第三次迭代。输出rv1 (1)规范(b)和输出RV1(结束)常态(b-a * x1)

你可以遵循的进步Bicgstab.通过在每次迭代时绘制相对残差。绘制每个解决方案的剩余历史,具有指定公差的线。

半径(0:长度(RV0)-1,RV0 / NORM(B),'-o')持有在…上半径(0:长度(RV1)-1,RV1 / NORM(B),'-o')yline(tol,“r——”);传奇('没有预处理者'ILU预处理的“宽容”“位置”“东方”)xlabel(的迭代次数)伊拉贝尔(的相对剩余的

图包含轴。轴包含3个类型的型号矩形线。这些对象没有任何预处理器,ILU预处理器,容忍度。

检查供应的效果Bicgstab.初步猜测解决方案。

创建一个Tridiacal稀疏矩阵。使用每行的总和作为右侧的向量 斧头 = B. 因此,预期的解决方案 X 是一个矢量。

n=900;e=一(n,1);A=spdiags([e2*ee],-1:1,n,n);b=总和(A,2);

使用Bicgstab.解决 斧头 = B. 两次:一次使用默认初始猜测,一次使用解决方案的良好初始猜测。两种解决方案都使用50次迭代和默认公差。将第二个解决方案中的初始猜测指定为所有元素都等于的向量金宝搏官方网站0.99

最大值=50;x1=bicgstab(A,b,[],maxit);
Bicgstab在迭代20.5时收敛到一个相对残差为9.3e-07的解。
x0 = 0.99 * e;x2 = bicgstab(a,b,[],maxit,[],[],x0);
BICGSTAB在迭代4下融合到具有相对残留的8.7E-07的溶液。

在这种情况下,提供初始猜测将启用Bicgstab.要更快地收敛。

返回中间结果

您还可以使用初始猜测来通过致电获取中间结果Bicgstab.在一个循环中。每个对求解器的呼叫执行一些迭代并存储计算的解决方案。然后,您将该解决方案用作下一批迭代的初始向量。

例如,此代码执行了100次迭代,并在For-Loop中的每次传递后存储解决方案向量:

x0 = 0(大小(2),1);托尔= 1 e-8;麦克斯特= 100;为了k = 1:4 [x,国旗,relres] = bicgstab (A, b,托尔,麦克斯特[],[],x0);X = X (:, k);R (k) = relres;x0 = x;结尾

x(:,k)是在迭代计算的解决方案矢量K.for-loop,和R(k)是这个解的相对剩余。

通过提供解决线性系统Bicgstab.使用计算的功能手柄A*x代替系数矩阵一种

其中一个威尔金森测试矩阵由画廊是一个21×21的三角形矩阵。预览矩阵。

a =画廊(“wilk”,21)
A =21×2110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 1 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0⋮

威尔金森矩阵具有特殊结构,因此您可以代表操作A*x功能手柄。什么时候一种乘一个向量,得到的向量中的大多数元素都是零。结果中的非零元素对应于的非零三对角元素一种. 此外,只有主对角线具有不等于1的非零。

表情 斧头 成为:

斧头 = [ 10. 1 0. 0. 0. 1 9. 1 0. 0. 0. 1 8. 1 0. 0. 1 7. 1 0. 0. 1 6. 1 0. 0. 1 5. 1 0. 0. 1 4. 1 0. 0. 1 3. 0. 0. 0. 1 0. 0. 0. 1 10. ] [ X 1 X 2 X 3. X 4. X 5. X 21. ] = [ 10. X 1 + X 2 X 1 + 9. X 2 + X 3. X 2 + 8. X 3. + X 4. X 19. + 9. X 20. + X 21. X 20. + 10. X 21. ]

得到的向量可以写成三个向量的总和:

斧头 = [ 0. + 10. X 1 + X 2 X 1 + 9. X 2 + X 3. X 2 + 8. X 3. + X 4. X 19. + 9. X 20. + X 21. X 20. + 10. X 21. + 0. ] = [ 0. X 1 X 20. ] + [ 10. X 1 9. X 2 10. X 21. ] + [ X 2 X 21. 0. ]

在MATLAB®中,编写一个函数来创建这些向量并将它们相加,从而得到值A*x

功能Y = [0;x (1:20)] +......[(10: 1:0) ';(1:10) ']。* x +......[x (21);0);结尾

(此函数在示例末尾另存为本地函数。)

现在,解决线性系统 斧头 = B. 通过提供Bicgstab.使用计算的函数句柄A*x.使用宽容1E-12和50次迭代。

b = ins(21,1);tol = 1e-12;maxit = 50;x1 = bicgstab(@ afun,b,tol,maxit)
Bicgstab在迭代11.5时收敛到一个相对残差为5.2 -13的解。
x1 =21×10.0910 0.0990 0.0999 0.1109 0.1109 0.1241 0.1443 0.1544 0.2383 0.1309 0.5000⋮

检查一下Afun(x1)生成一个1的向量。

Afun(x1)
ans =.21×11.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

本地功能

功能Y = [0;x (1:20)] +......[(10: 1:0) ';(1:10) ']。* x +......[x (21);0);结尾

输入参数

全部崩溃

系数矩阵,指定为平方矩阵或函数句柄。该矩阵是线性系统中的系数矩阵A * x =.一般来说,一种是大型稀疏矩阵或返回大型稀疏矩阵和列向量乘积的函数句柄。

指定一种作为函数句柄

可以选择将系数矩阵指定为函数句柄,而不是矩阵。函数handle返回矩阵向量积,而不是形成整个系数矩阵,从而提高计算效率。下载188bet金宝搏

要使用函数句柄,请使用函数签名函数y = afun(x)参数化功能解释如何向函数提供附加参数股骨头无菌性坏死,如有必要。函数调用阿方(x)必须返回值A*x

数据类型:|function_handle.
复数支持:金宝app是的

线性方程的右侧,指定为列向量。长度B.必须等于尺寸(a,1)

数据类型:
复数支持:金宝app是的

方法容忍度,指定为正标量。使用此输入可以在计算中进行权衡准确性和运行时。Bicgstab.必须在允许的迭代次数内满足公差才能成功。较小的值托尔意味着答案必须更精确,计算才能成功。

数据类型:

最大迭代次数,指定为正标量整数。增加价值麦克斯特允许更多的迭代Bicgstab.符合公差托尔.一般来说,值较小托尔意味着需要更多的迭代来成功完成计算。

预处理器矩阵,指定为矩阵或函数句柄的单独参数。您可以指定一个预条件矩阵m或其矩阵因子m = m1 * m2为了改善线性系统的数值方面,使其更容易Bicgstab.迅速会聚。可以使用不完全矩阵分解函数iluichol.生成预处理矩阵。你也可以用平衡在分解之前以改善系数矩阵的条件数。有关预处理者的更多信息,请参阅线性系统的迭代方法

Bicgstab.将未指定的预处理器视为身份矩阵。

指定m作为函数句柄

您可以选择指定任何一个mM1, 或者平方米作为函数句柄而不是矩阵。函数句柄执行矩阵向量运算,而不是形成整个预处理矩阵,使计算更加高效。

要使用函数句柄,请使用函数签名函数y=mfun(x)参数化功能解释如何向函数提供附加参数mfun,如有必要。函数调用mfun (x)必须返回值m \ x.M1、M2 \ (x)

数据类型:|function_handle.
复数支持:金宝app是的

初始猜测,指定为长度等于的列向量尺寸(a,2).如果你能提供Bicgstab.有更合理的初步猜测X0.而不是零的零旋钮,然后它可以节省计算时间并帮助算法收敛更快。

数据类型:
复数支持:金宝app是的

输出参数

全部崩溃

线性系统解决方案,作为列向量返回。此输出为线性系统提供了近似的解决方案A * x =.如果计算成功(标志= 0.),然后小于或等于托尔

每当计算不成功时(国旗~ = 0), 解决方案X返回的Bicgstab.是在所有迭代中计算出的残差范数最小的。

收敛标志,作为此表中的标量值之一返回。收敛标志指示计算是否成功,并区分几种不同形式的失败。

标志价值

收敛

0.

成功 -Bicgstab.融合到所需的耐受性托尔在内部麦克斯特迭代。

1

失败 -Bicgstab.迭代麦克斯特迭代却没有收敛。

2

故障-预条件矩阵mm = m1 * m2没有病理。

3.

失败 -Bicgstab.两次连续迭代后停滞不前。

4.

Failure(失败)-由计算的标量之一Bicgstab.算法变得太小或太大,无法继续计算。

相对剩余误差,作为标量返回。相对残差relres=norm(b-A*x)/norm(b)表明答案是多么准确的。如果计算会聚到容差托尔在内部麦克斯特然后迭代relres<=tol

数据类型:

迭代号,作为标量返回。此输出表示计算的答案的迭代号X是经过计算的。每个外部迭代Bicgstab.包括两个内部迭代,所以iter可以作为十进制迭代次数返回。

数据类型:

剩余错误,作为向量返回。残差常态(B-A * x)揭示了给定值时算法离收敛有多近X.元素的数量Resvec.等于迭代的数量。您可以检查内容Resvec.来帮助决定是否要改变托尔麦克斯特

数据类型:

更多关于

全部崩溃

Biconjugate梯度稳定方法

Biconjugate梯度稳定(BICGSTAB)算法是通过使用重启的GMRES步骤来改善BICG算法,以减轻BICG步骤中的不规则收敛行为。

BICGSTAB的GMRES(1)修复步骤仅利用程度 - 一个最小残留多项式,因此当这些低位步骤不足时,该方法可以停滞。使用高阶多项式导致其他方法(如BICGSTAB1)的开发[1]

提示

  • 大多数迭代方法的融合取决于系数矩阵的条件数量,气孔导度(A).您可以使用平衡改善条件数一种,它本身就使得大多数迭代求解器更容易收敛。然而,使用平衡当您随后因素为平衡的矩阵时也会导致更好的质量预处理器矩阵b = r * p * a * c

  • 您可以使用矩阵重新排序功能,例如解剖symrcm对系数矩阵进行分解以生成预条件时,排列系数矩阵的行和列,并最小化非零的数量。这可以减少后续求解预处理线性系统所需的内存和时间。

参考文献

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

[2] Van der Vorst,H.A.,“Bi-CGSTAB:用于非对称线性系统的解决方案的Bi-CG的快速和平滑地融合变体”暹罗J. SCI。统计。计算。,1992年3月,卷。13,2,第2页,第631-644页。

扩展能力

在R2006a之前引入