文档

QMR

准最小残留方法

句法

x = qmr(a,b)
QMR(a,b,tol)
QMR(A,B,TOL,MAXIT)
QMR(A,B,TOL,MAXIT,M)
QMR(A,B,TOL,MAXIT,M1,M2)
QMR(A,B,TOR,MAXIT,M1,M2,X0)
[x,flag] = qmr(a,b,...)
[x,flag,relres] = qmr(a,b,...)
[x,flag,relres,iter] = qmr(a,b,...)
[x,flag,relres,iter,resvec] = qmr(a,b,...)

描述

x = qmr(a,b)试图求解线性方程的系统a*x = b为了X。这n-经过-n系数矩阵一个必须是正方形的,应该大且稀疏。列矢量b必须有长度n。您可以指定一个作为函数句柄,一个乐趣,这样afun(x,'notransp')返回斧头afun(x,'transp')返回斧头

参数化功能说明如何为功能提供其他参数一个乐趣,以及预处理功能mfun如下所述,如有必要。

如果QMR收敛,显示给该效果的消息。如果QMR出于任何原因,在最大迭代或停止数量后,未能收敛,打印警告消息,显示相对残差norm(b-a*x)/norm(b)以及该方法停止或失败的迭代编号。

QMR(a,b,tol)指定该方法的耐受性。如果托尔[], 然后QMR使用默认1E-6

QMR(A,B,TOL,MAXIT)指定最大迭代次数。如果最大[], 然后QMR使用默认最小(n,20)

QMR(A,B,TOL,MAXIT,M)QMR(A,B,TOL,MAXIT,M1,M2)使用预调整器m或者M = M1*M2并有效解决系统Inv(M)*A*X = Inv(M)*B为了X。如果m[]然后QMR不适用预处理。m可以是函数句柄mfun这样mfun(x,'notransp')返回m \ xmfun(x,'transp')返回m'\ x

QMR(A,B,TOR,MAXIT,M1,M2,X0)指定初始猜测。如果X0[], 然后QMR使用默认值,全零向量。

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

旗帜

收敛

0

QMR融合到所需的公差托尔最大迭代。

1

QMR迭代最大时代但没有融合。

2

预处理m不适合条件。

3

该方法停滞了。(连续两个迭代率相同。)

4

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

每当旗帜不是0, 解决方案X返回的是,在所有迭代中计算出最小的规范残差。如果旗帜指定输出。

[x,flag,relres] = qmr(a,b,...)还返回相对残差norm(b-a*x)/norm(b)。如果旗帜0,,,,relres <= tol

[x,flag,relres,iter] = qmr(a,b,...)还返回迭代编号X被计算在哪里0 <= iter <= maxit

[x,flag,relres,iter,resvec] = qmr(a,b,...)还返回每次迭代中残留规范的向量,包括规范(B-A*X0)

例子

将QMR与矩阵输入一起使用

此示例显示了如何使用QMR使用矩阵输入。编码:

n = 100;on =一个(n,1);a = spdiags([-2*on 4*on-on],-1:1,n,n);b = sum(a,2);TOL = 1E-8;最大值= 15;m1 = spdiags([on/(-2)on],-1:0,n,n);m2 = spdiags([4*on -on],0:1,n,n);x = qmr(a,b,tol,maxit,m1,m2);

显示消息:

QMR在迭代9中汇总到解决方案...相对残留5.6E-009

将QMR与函数句柄一起使用

此示例替换矩阵一个在上一个示例中,带有矩阵矢量产品功能的句柄一个乐趣。该示例包含在文件中run_qmr

  • 呼叫QMR使用功能句柄@一个乐趣作为第一个论点。

  • 包含一个乐趣作为嵌套函数,以便所有变量run_qmr可用于一个乐趣

以下显示了代码run_qmr

函数x1 = run_qmr n = 100;on =一个(n,1);a = spdiags([-2*on 4*on-on],-1:1,n,n);b = sum(a,2);TOL = 1E-8;最大值= 15;m1 = spdiags([on/(-2)on],-1:0,n,n);m2 = spdiags([4*on -on],0:1,n,n);x1 = qmr(@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_qmr;

MATLAB®软件显示消息

QMR在迭代9中收敛到具有相对残留5.6E-009的溶液

将QMR与预处理使用

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

加载A = West0479,一个真实的479 x 479非对称稀疏矩阵。

加载West0479;a = west0479;

定义b因此,真正的解决方案是所有矢量。

b = full(sum(a,2));

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

TOL = 1E-12;maxit = 20;

利用QMR以所需的公差和迭代次数找到解决方案。

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

FL0是1,因为QMR不收敛到请求的公差1E-12在请求的20次迭代中。第十七迭代是最佳的近似解决方案,是返回的解决方案IT0 = 17。MATLAB存储剩余历史RV0

绘制行为QMR

半学(0:Maxit,RV0/Norm(b),,'-o');Xlabel('迭代编号');ylabel(“相对残留”);

该图表明该解决方案不收敛。您可以使用预处理来改善结果。

伊卢,因为矩阵一个是非对称的。

[l,u] = ilu(a,struct(a,struct('类型',,,,'ilutp',,,,'Droptol',1E-5));
使用ILU的误差等于零。考虑降低降低耐受性或考虑使用“ udiag”选项。

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

如错误消息所示,您可以使用降低的降低公差重试。

[l,u] = ilu(a,struct(a,struct('类型',,,,'ilutp',,,,'Droptol',1E-6));[x1,fl1,rr1,it1,rv1] = qmr(a,b,tol,maxit,l,u);

FL1是0,因为QMR驱动相对残留到4.1410E-014(的价值RR1)。相对残差小于规定的公差1E-12在第六次迭代(价值IT1)当不完整的lu分解以降低耐受性为先进时1E-6。输出RV1(1)标准(b)和输出RV1(7)规范(B-A*X2)

您可以跟随QMR通过从初始估计开始(迭代号0)开始在每次迭代处绘制相对残差。

半学(0:IT1,RV1/NORM(B),,'-o');Xlabel('迭代编号');ylabel(“相对残留”);

参考

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

[2] Freund,Roland W.和NöelM。Nachtigal,“ QMR:一种用于非铁线线性系统的准最低残留方法,”暹罗期刊:Numer。数学。60,1991,第315-339页。

在R2006a之前引入

这个话题有帮助吗?