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 \ x
和mfun(x,'transp')
返回m'\ x
。
QMR(A,B,TOR,MAXIT,M1,M2,X0)
指定初始猜测。如果X0
是[]
, 然后QMR
使用默认值,全零向量。
[x,flag] = qmr(a,b,...)
还返回收敛标志。
旗帜 |
收敛 |
---|---|
|
|
|
|
|
预处理 |
|
该方法停滞了。(连续两个迭代率相同。) |
|
计算的标量之一 |
每当旗帜
不是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页。