主要内容

QMR.

求解线性方程系统 - 准剩余残余方法

描述

例子

X= qmr(一种B.试图解决线性方程系统a * x = b为了X使用准剩余残余方法.当尝试成功时,QMR.显示确认收敛的消息。如果QMR.由于任何原因,未能在最大迭代次数或停止之后收敛,它显示包含相对残差的诊断消息常态(B-A * X)/ NOM(B)和该方法停止的迭代号。

例子

X= qmr(一种B.指定该方法的公差。默认容差是1 e-6

例子

X= qmr(一种B.max指定要使用的最大迭代次数。QMR.如果无法在内部收敛,则显示诊断消息max迭代。

例子

X= qmr(一种B.maxm指定一个预安全载体矩阵m和计算X通过有效解决系统 m 1 一种 X = m 1 B. .使用预处理器矩阵可以提高问题的数度和计算效率。

例子

X= qmr(一种B.maxM1M2指定预处理矩阵的因子m这样M = M1 *平方米

例子

X= qmr(一种B.maxM1M2x0指定解决方案矢量的初始猜测X.默认值是零的向量。

例子

[X旗帜] = qmr(___返回一个标志,指定算法是否成功融合。什么时候国旗= 0,收敛成功。您可以使用此输出语法与任何先前的输入参数组合。当您指定时旗帜输出,QMR.不显示任何诊断消息。

例子

[X旗帜] = qmr(___还返回相对残差常态(B-A * X)/ NOM(B).如果旗帜0., 然后Relres <= tol

例子

[X旗帜it] = qmr(___也返回迭代号码it在这X被计算了。

例子

[X旗帜itresvec] = qmr(___还返回每次迭代的残余标准的向量,包括第一个残差规范(b * x0)

例子

全部收缩

解决方形线性系统使用QMR.使用默认设置,然后调整解决方案过程中使用的迭代次数和迭代次数。

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

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

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

x = qmr(a,b);
QMR在迭代20处停止而不会聚到所需的公差1E-06,因为达到了最大迭代次数。迭代返回(数20)具有相对残差0.12。

默认情况下QMR.使用20个迭代和容忍度1 e-6,算法在这40次迭代中无法收敛。由于残差仍然很大,这是一个很好的指示,说明需要更多的迭代(或预处理矩阵)。您还可以使用更大的容忍度,以使算法更容易收敛。

再次使用容差来解决系统1的军医和100的迭代。

X = QMR(A,B,1E-4,100);
QMR在迭代100时停止,而不会聚到所需的公差0.0001,因为达到了最大迭代次数。迭代返回(数字100)具有相对残差0.063。

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

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

L = ichol(一个);x = qmr (A, b, e - 4100 L ');
QMR在迭代57处收敛到具有相对残留的6.1E-05的溶液。

使用预处理器可以充分改善问题的数值性质QMR.能够收敛。

用下列方法检查使用预处理矩阵的效果QMR.解决线性系统。

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

加载West0479.A = West0479;

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

b = sum(a,2);

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

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

QMR.在请求的容忍和迭代次数找到解决方案。指定五个输出以返回有关解决方案过程的信息:

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

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

  • RR0.是计算答案的相对残余X

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

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

[x,fl0,rr0,it0,rv0] = qmr(a,b,tol,maxit);FL0.
fl0 = 1
RR0.
rr0 = 0.7984
IT0.
IT0 = 17.

FL0.是1,因为QMR.不收敛到所请求的公差1 e-12在请求的20次迭代中。第17届迭代是最好的近似解决方案,是如所示返回的解决方案IT0 = 17.

为了帮助缓慢的收敛,您可以指定一个预处理器矩阵。自从一种不对称,使用ilu生成预处理程序 m = L. .指定删除公差,以忽略小于的值的非透明条目1 e-6.解决预处理系统 m - 1 一种 X = m - 1 B. 通过指定L.作为输入QMR.

setup = struct('类型''ilutp''droptol'1 e-6);[L U] = ilu(一个,设置);(x1, fl1 rr1、it1 rv1] = qmr (A, b,托尔,麦克斯特,L, U);fl1
fl1 = 0.
RR1.
RR1 = 4.1114E-14
IT1
IT1 = 6.

使用ilu预处理器产生比规定的耐受性更少1 e-12在第六次迭代。输出RV1(1)规范(b),输出RV1(结束)规范(b * x1)

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

半径(0:长度(RV0)-1,RV0 / NORM(B),'-o') 抓住semilogy(0:长度(rv1) 1, rv1 /规范(b),'-o')yline(tol,'r--');传奇('没有预处理者''ilu preconditcher''宽容''地点''东')xlabel('迭代号')ylabel(“相对残差”

图中包含一个坐标轴。轴包含三个对象的类型线,恒线。这些对象代表No preconditioner、ILU preconditioner、Tolerance。

检查供应的效果QMR.对解有一个初步的猜测。

创建一个三对角稀疏矩阵。用每一行的和作为右边的向量 斧头 = B. 所以预期的解决方案 X 是一个矢量。

n = 900;e =那些(n,1);a = spdiags([e 2 * e e], -  1:1,n,n);b = sum(a,2);

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

maxit = 200;x1 = qmr(a,b,[],maxit);
QMR在迭代27处收敛到具有相对残留的9.5E-07的溶液。
x0 = 0.99 * e;x2 = qmr(a,b,[],maxit,[],[],x0);
QMR在迭代7时收敛到一个相对残差为6.7e-07的解。

在这种情况下,提供初始猜测QMR.更快地聚合。

返回中间结果

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

例如,这段代码执行四次100次迭代,并在For循环中每次传递后存储解决方案向量:

x0 =零(尺寸(a,2),1);tol = 1e-8;maxit = 100;为了k = 1:4 [x,标志,relres] = qmr(a,b,tol,maxit,[],[],x0);x(:,k)= x;r(k)= relres;x0 = x;结尾

X (:, k)迭代时是否计算了解向量K.for-loop,和r(k)是该解决方案的相对残余。

通过提供解一个线性方程组QMR.使用计算的函数句柄斧头斧头代替系数矩阵一种

创建一个非对称三对角矩阵。预览矩阵。

a =画廊('威尔克'21) +诊断接头(1(20日1),1)
A =21×2110 2 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 2 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 2 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 2 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 0 0 1 1 20 0 0 0 0 0 0 0 0 0⋮

因为这个三对角矩阵有一个特殊的结构,你可以表示这个操作斧头使用函数句柄。什么时候一种乘以向量,得到的矢量中的大多数元素是零。结果中的非零元素对应于非零三角形元素一种

表达方式 一种 X 成为:

一种 X = [ 10 2 0. 0. 1 9. 2 0. 0. 1 2 0. 0. 1 0. 0. 1 0. 2 0. 0. 1 10 ] [ X 1 X 2 X 3. X 21 ] = [ 10 X 1 + 2 X 2 X 1 + 9. X 2 + 2 X 3. X 19 + 9. X 20. + 2 X 21 X 20. + 10 X 21 ]

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

一种 X = [ 10 X 1 + 2 X 2 X 1 + 9. X 2 + 2 X 3. X 19 + 9. X 20. + 2 X 21 X 20. + 10 X 21 ] = [ 0. X 1 X 2 X 20. ] + [ 10 X 1 9. X 2 9. X 20. 10 X 21 ] + 2 [ X 2 X 3. X 21 0. ]

同样,for的表达式 一种 T. X 成为:

一种 T. X = [ 10 1 0. 0. 2 9. 1 0. 0. 2 1 0. 0. 2 0. 0. 1 0. 1 0. 0. 2 10 ] [ X 1 X 2 X 3. X 21 ] = [ 10 X 1 + X 2 2 X 1 + 9. X 2 + X 3. 2 X 19 + 9. X 20. + X 21 2 X 20. + 10 X 21 ]

一种 T. X = [ 10 X 1 + X 2 2 X 1 + 9. X 2 + X 3. 2 X 19 + 9. X 20. + X 21 2 X 20. + 10 X 21 ] = 2 [ 0. X 1 X 2 X 20. ] + [ 10 X 1 9. X 2 9. X 20. 10 X 21 ] + [ X 2 X 3. X 21 0. ]

在Matlab®中,写一个创建这些向量的函数并将它们添加在一起,从而提供值斧头或者斧头,取决于标志输入:

功能y = afun (x,国旗)如果Strcmp(旗帜,“notransp”%compute a * xy = [0;x(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+ 2 * [x(2:结束);0);elseifStrcmp(旗帜,“透明”%compute'* xy = 2 * [0;x(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+ (x(2:结束);0);结尾结尾

(此函数在示例结束时保存为本地功能。)

现在,解线性方程组 斧头 = B. 通过提供QMR.使用函数处理来计算斧头斧头.使用宽容1 e-6和25次迭代。指定 B. 的行和 一种 这样真正的解决方案 X 是一个矢量。

b =全(sum (A, 2));托尔= 1 e-6;麦克斯特= 25;x1 = qmr (@afun, b,托尔,麦克斯特)
QMR在迭代19融合到具有相对残差4.7E-07的溶液。
x1 =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⋮

本地功能

功能y = afun (x,国旗)如果Strcmp(旗帜,“notransp”%compute a * xy = [0;x(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+ 2 * [x(2:结束);0);elseifStrcmp(旗帜,“透明”%compute'* xy = 2 * [0;x(1:20)]...+ ((10: 1:0) ';(1:10)”)。* x...+ (x(2:结束);0);结尾结尾

输入参数

全部收缩

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

指定一种作为功​​能手柄

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

要使用函数句柄,请使用函数签名函数y = afun(x,选择)参数化功能解释了如何为函数提供额外的参数好玩儿,如有必要。功能好玩儿必须满足这些条件:

  • Afun(x,'notransp')返回的产品斧头

  • Afun(x,'transp')返回的产品斧头

可接受功能的示例是:

功能y = afun(x,opt,b,c,n)如果Strcmp(选择,“notransp”)y = [b * x(n + 1:结束);c * x(1:n)];别的y = [c'* x(n + 1:结束);b'* x(1:n)];结尾
功能好玩儿使用B.C要计算斧头或者斧头(取决于指定的标志)而不是实际形成整个矩阵。

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

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

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

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

数据类型:双倍的

最大迭代次数,指定为正标量整数。增加价值max允许更多的迭代QMR.满足宽容.一般来说,较小的值意味着需要更多的迭代来成功完成计算。

预处理器矩阵,指定为矩阵或函数句柄的单独参数。您可以指定一个预请词矩阵m或者它的矩阵因子M = M1 *平方米改进线性系统的数值方面,使之更容易QMR.快速收敛。对于方形系数矩阵,您可以使用不完整的矩阵分解功能iluichol.生成预处理器矩阵。你也可以使用平衡在因数分解之前改进了条件数的系数矩阵。有关前置条件的更多信息,请参见线性系统的迭代方法

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

指定m作为功​​能手柄

您可以任意指定mM1,或M2作为函数处理而不是矩阵。功能手柄执行矩阵矢量操作,而不是形成整个预处理器矩阵,使得计算更高效率。

要使用函数句柄,首先要创建一个带有签名的函数函数y = mfun(x,opt)参数化功能解释了如何为函数提供额外的参数MFUN.,如有必要。功能MFUN.必须满足这些条件:

  • mfun(x,'notransp')返回m \ x.或者m2 \(m1 \ x)

  • mfun(x,'transp')返回M ' \ x或者m1'\(m2'\ x)

可接受功能的示例是:

功能y = mfun(x,opt,a,b)如果Strcmp(选择,“notransp”)y = x。* a;别的y = x。* b;结尾结尾
在此示例中的功能MFUN.使用一种B.要计算m \ x = x * a或者m'\ x = x * b(取决于指定的标志)而不实际形成整个矩阵m

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

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

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

输出参数

全部收缩

线性系统解,返回为列向量。这个输出给出了线性系统的近似解a * x = b.如果计算成功(国旗= 0), 然后小于或等于

每当计算不成功时(国旗〜= 0),解决方案X返回的QMR.是在所有迭代中计算的残余规范最小的那个。

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

标志值

收敛

0.

成功 -QMR.收敛到期望的公差之内max迭代。

1

失败- - - - - -QMR.迭代max迭代但没有收敛。

2

失败 - 预处理器矩阵m或者M = M1 *平方米是病态的。

3.

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

4.

失败 - 由此计算的标量数之一QMR.算法变得太小或太大而无法继续计算。

相对残余错误,作为标量返回。相对残差误差Relres = Norm(B-A * x)/常规(b)表明答案是多么准确的。如果计算会聚到容差之内max迭代,然后Relres <= tol

数据类型:双倍的

迭代数,作为标量返回。该输出指示计算的答案所在的迭代数X计算了。

数据类型:双倍的

残余错误,作为向量返回。剩余错误常态(B-A * x)揭示算法如何为给定值融合X.元素的数量resvec等于迭代的数量。您可以检查内容resvec帮助决定是否更改值或者max

数据类型:双倍的

更多关于

全部收缩

准剩余残余方法

QMR算法被开发为BICG的改进。虽然GMRES对Krylov子空间使用正交基础并计算最小剩余解决方案,但QMR使用双正交基础,因此仅计算了准剩余的残余解决方案。

QMR通常比BiCG收敛得更流畅,而且它还使用了提前技术来避免几乎所有情况下的故障。QMR的计算成本仅略高于BiCG[1]

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,COND(a).您可以使用平衡改善条件数一种,并自己这使得大多数迭代求解器更容易收敛。但是,使用平衡当您随后因素为平衡的矩阵时也会导致更好的质量预处理器矩阵b = r * p * a * c

  • 您可以使用矩阵重新排序功能,例如解剖Symrcm.为了释放系数矩阵的行和列,并使系数矩阵被考虑为生成预处理器时最小化非安利斯数的数量。这可以减少随后解决预处理线性系统所需的存储器和时间。

参考文献

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

[2]弗氏,罗兰W.和NöelM.Nachtigal,“QMR:非封闭式线性系统的准剩余残余方法”,暹罗杂志:号码。数学。60,1991,第315-339页。

扩展功能

在R2006A之前介绍