文档

bicg

Biconjugate梯度方法

语法

x = bicg (A, b)
BICG(A,B,TOL)
bicg (A, b,托尔,麦克斯特)
BICG(A,B,TOL,MAXIT,M)
BICG(A,B,TOL,MAXIT,M1,M2)
BICG(A,B,TOL,MAXIT,M1,M2,X0)
[x,flag] = bicg(a,b,...)
[x,国旗,relres] = bicg (A, b,…)
[x,国旗,relres, iter] = bicg (A, b,…)
[x,国旗,relres, iter resvec] = bicg (A, b,…)

描述

x = bicg (A, b)试图解线性方程组a * x = bx.这n-经过-n系数矩阵一个必须是方形的,并且应该是大而稀疏的。列向量b一定的长度n一个可以是函数手柄,好玩儿,这样的Afun(x,'notransp')返回斧头Afun(x,'transp')返回‘* x

参数化功能解释如何向函数提供附加参数好玩儿,以及预处理函数MFUN.如有必要,请描述如下。

如果bicg聚合时,它将显示具有此效果的消息。如果bicg在最大迭代次数后未能收敛或因任何原因停止,则打印包含相对残留的警告消息规范(B-A * x)/常规(b)以及方法停止或失败的迭代次数。

BICG(A,B,TOL)指定方法的容差。如果[],然后bicg使用默认的,1 e-6

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

BICG(A,B,TOL,MAXIT,M)BICG(A,B,TOL,MAXIT,M1,M2)使用预调节器或者M = M1 *平方米并有效地解决了该系统inv(m)* a * x = inv(m)* bx.如果[]然后bicg适用于没有预调节器。可以是函数手柄MFUN.,这样的mfun (x, notransp)返回M \ xmfun(x,'transp')返回M ' \ x

BICG(A,B,TOL,MAXIT,M1,M2,X0)指定初始猜测。如果x0[],然后bicg使用默认的全零向量。

[x,flag] = bicg(a,b,...)也返回收敛标志。

旗帜

收敛

0

bicg收敛到期望的公差之内Maxit.迭代。

1

bicg迭代Maxit.时代却没有收敛。

2

预调节器坏脾气的。

3.

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

4

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

每当旗帜不是0, 解决方案x返回的是在所有迭代中计算的最小范数残差。如果没有显示任何消息旗帜输出已指定。

[x,国旗,relres] = bicg (A, b,…)还返回相对残差规范(B-A * x)/常规(b).如果旗帜0Relres <= tol

[x,国旗,relres, iter] = bicg (A, b,…)也返回其所在的迭代数x计算在哪里0 <= iter <= maxit

[x,国旗,relres, iter resvec] = bicg (A, b,…)还返回每次迭代的残差规范的向量规范(b * x0)

例子

使用BICG具有矩阵输入

这个例子展示了如何使用bicg用矩阵输入。bicg.下面的代码:

n = 100;= 1 (n, 1);A = spdiags([-2*on 4*on],-1:1,n,n);b =和(2);托尔= 1 e-8;麦克斯特= 15;M1 = spdiags([on/(-2) on],-1:0,n,n);M2 = spdiags([4*on -on],0:1,n,n);x = bicg (A, b,托尔,麦克斯特,M1, M2);

显示此消息:

在第9次迭代时,Bicg收敛到一个相对残差为5.3e-009的解

使用带有函数句柄的bicg

此示例替换矩阵一个在前面的例子中,有一个矩阵向量乘积函数的句柄好玩儿.该示例包含在文件中run_bicg

  • 调用bicg与之@afun函数句柄作为其第一个参数。

  • 包含好玩儿作为一个嵌套函数,以便所有的变量run_bicg可供选择好玩儿

将下列内容放入一个名为run_bicg

函数x1 = run_bicg n = 100;= 1 (n, 1);b = afun(上,'notransp');托尔= 1 e-8;麦克斯特= 15;M1 = spdiags([on/(-2) on],-1:0,n,n);M2 = spdiags([4*on -on],0:1,n,n);x1 = bicg(@ afun,b,tol,maxit,m1,m2);函数y = afun(x,transp_flag)如果strcmp(transp_flag,'transp')%y = a'* x y = 4 * x;Y(1:n-1)= y(1:n-1) -  2 * x(2:n); y(2:n) = y(2:n) - x(1:n-1); elseif strcmp(transp_flag,'notransp') % y = A*x y = 4 * x; y(2:n) = y(2:n) - 2 * x(1:n-1); y(1:n-1) = y(1:n-1) - x(2:n); end end end

当你进入

x1 = run_bicg;

MATLAB®软件显示消息

在第9次迭代时,Bicg收敛到一个具有…相对剩余5.3 e - 009

使用bicg和预处理剂

此示例演示了使用预处理器。

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

负载west0479;一个= west0479;

定义b所以真解是所有1的向量。

B =完整(总和(a,2));

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

托尔= 1 e-12;麦克斯特= 20;

bicg在要求的容忍度和迭代次数下找到解决方案。

[x0,fl0,rr0,it0,rv0] = bicg(a,b,tol,maxit);

fl0是1,因为bicg不收敛到所要求的容忍度1 e-12在请求的20次迭代中。事实上,行为bicg是如此的可怜,以至于最初的猜测(X0 =零(尺寸(a,2),1))是最好的解决方案,并如图所示返回IT0 = 0..MATLAB®存储残余历史rv0

绘制bicg

semilogy(0:麦克斯特,rv0 /规范(b),“o”);包含('迭代号');ylabel (“相对残差”);

绘图显示解决方案不收敛。您可以使用预处理程序来提高结果。

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

[L U] = ilu (A,结构(“类型”,“ilutp”,“droptol”,1 e-5));

错误使用ilu

有一个主元等于0。考虑减少

使用“udiag”选项的降低容差或考虑。

Matlab无法构建不完整的LU,因为它会导致一个奇异的因素,这是一个作为预处理者的唯一因素。

您可以重新尝试减少跌落公差,如错误消息所示。

[L U] = ilu(一、结构('类型''ilutp''droptol', 1 e-6));(x1, fl1 rr1、it1 rv1] = bicg (A, b,托尔,麦克斯特,L, U);

fl1是0,因为bicg驱动相对残差到4.1410E-014的值(RR1.).相对残留小于规定的公差1 e-12在第六次迭代时(值it1),以不完全LU分解为先决条件,滴差为1 e-6.输出RV1(1)规范(b),输出rv1 (7)规范(b * x2)

你可以跟着进度bicg通过从初始估计开始(迭代数字0)开始在每次迭代时绘制相对残差。

半机(0:IT1,RV1 / NORM(B),“o”);包含('迭代号');ylabel (“相对残差”);

参考

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

在R2006A之前介绍

这个主题有用吗?