主要内容

巨磁电阻

解决线性方程组广义最小剩余法

描述

例子

x= gmr (一个,b)试图解决线性方程组A * x =x使用广义最小剩余法。当尝试成功,巨磁电阻显示一条消息确认收敛。如果巨磁电阻无法收敛后最大迭代次数或停止任何理由,它显示诊断消息,其中包括相对剩余规范(b * x) /规范(b)停止和迭代次数的方法。对于这个语法,巨磁电阻不重新启动;迭代的最大数量min(大小(1)10)

例子

x= gmr (一个,b,重新启动)重启方法每重新启动内心的迭代。外层迭代的最大数量外= min(大小(1)/重新启动,10)。总迭代的最大数量重启*外,因为巨磁电阻执行重新启动内部为每个外层迭代的迭代。如果重新启动大小(1)[],然后巨磁电阻不重启,总迭代的最大数量是什么min(大小(1)10)

例子

x= gmr (一个,b,重新启动,托尔)指定的公差的方法。默认的公差是1 e-6

例子

x= gmr (一个,b,重新启动,托尔,麦克斯特)指定的最大数量外层迭代这样迭代的总数不超过重启*麦克斯特。如果麦克斯特[]然后巨磁电阻使用默认的,min(大小(1)/重新启动,10)。如果重新启动大小(1)[],然后总迭代的最大数量麦克斯特(而不是重启*麦克斯特)。巨磁电阻显示诊断消息如果不能收敛在总迭代的最大数量。

例子

x= gmr (一个,b,重新启动,托尔,麦克斯特,)指定一个预处理矩阵和计算x通过有效地解决系统 1 一个 x = 1 b 。使用一个预调节器矩阵可以提高问题的数值属性和计算的效率。

例子

x= gmr (一个,b,重新启动,托尔,麦克斯特,M1,平方米)指定预处理矩阵的因素这样M = M1 *平方米

例子

x= gmr (一个,b,重新启动,托尔,麦克斯特,M1,平方米,x0)指定一个初始猜解向量x。默认是零的向量。

例子

(x,国旗)= gmr (___)返回一个标记,用于指定是否该算法成功地融合。当国旗= 0,收敛是成功的。您可以使用这个输出语法与任何以前的输入参数组合。当你指定国旗输出,巨磁电阻不显示任何诊断消息。

例子

(x,国旗,relres)= gmr (___)还返回相对剩余规范(M \ (b * x)) /规范(M \ b),包括预处理矩阵。如果国旗0,然后relres < =托尔

例子

(x,国旗,relres,iter)= gmr (___)还返回的内外迭代数x作为一个向量计算吗(外内)。外层迭代数量位于范围0 < = iter(1) < =麦克斯特和内部迭代数量范围0 < = iter(2) < =重启

例子

(x,国旗,relres,iter,resvec)= gmr (___)还返回一个向量的残留标准在每个内迭代,包括第一个残留规范(M \ (b * x0))。预先处理这些剩余的规范体系。

例子

全部折叠

解决一个平方线性系统使用巨磁电阻默认设置,然后调整解决方案中使用的宽容和迭代次数的过程。

创建一个随机稀疏矩阵一个有50%的密度和主对角线上的非零。还创建一个随机向量b的右边 斧头 = b

rng默认的= sprandn (400400, 0.5) + 12 * speye (400);b =兰德(400 1);

解决 斧头 = b 使用巨磁电阻。输出显示包括相对残留误差的值 b - - - - - - 斧头 b

x = gmr (A, b);
gmr停在10迭代不收敛所需的公差1 e-06因为迭代的最大数量。返回的迭代(10号)相对剩余0.35。

默认情况下巨磁电阻使用10迭代和宽容1 e-6,该算法无法在这10收敛迭代矩阵。由于残余还大,这是一个很好的指标,需要更多的迭代(或预调节器矩阵)。您还可以使用更大的宽容使算法更容易收敛。

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

托尔= 1的军医;麦克斯特= 100;x = gmr (A, b,[],托尔,麦克斯特);
gmr停在100年迭代不收敛所需的公差0.0001因为达成的最大迭代数。返回的迭代(编号为100)相对剩余0.0045。

即使有较宽松的宽容和更多的迭代残差并不能提高足够的收敛。当一个迭代算法停滞在这种方式,它是一个好迹象,预处理矩阵是必要的。然而,巨磁电阻也有一个输入控制内心的迭代的数量。通过指定一个值为内部迭代,巨磁电阻每个外层迭代做更多的工作。

解决系统再次使用重新启动100的价值麦克斯特20的价值。而不是做100次迭代一次,巨磁电阻执行100次迭代之间重启和重复20次。

重启= 100;麦克斯特= 20;x = gmr (A, b,重启,托尔,麦克斯特);
gmr(100)聚集在外层迭代2(内迭代75)与相对剩余9.3 e-05解决方案。

在这种情况下,指定一个大的启动值巨磁电阻使它能够收敛到一个解决方案中允许的迭代次数。然而,大型重启值时可以消耗大量的内存一个也大。

检查与non-restarted使用预处理矩阵的影响巨磁电阻解决一个线性系统。

负载west0479,一个真正的479 - 479年-非对称稀疏矩阵。

负载west0479一个= west0479;

定义b所以,真正的解决方案 斧头 = b 是一个向量的。

b =和(2);

宽容和最大迭代数。

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

使用巨磁电阻找到一个解决方案在请求的宽容和迭代次数。指定返回5个输出的信息解决方案过程:

  • x计算解决方案吗A * x =

  • fl0是一个标志指示是否算法融合。

  • rr0的相对剩余计算答案x

  • it0是一个双元素向量(外内)表明内外迭代数据时x是计算。

  • rv0是一个向量的残余历史 b - - - - - - 斧头

[x, fl0 rr0, it0 rv0] = gmr (A, b,[],托尔,麦克斯特);fl0
fl0 = 1
rr0
rr0 = 0.7603
it0
it0 =1×21 20

fl0是1,因为巨磁电阻不收敛到所请求的宽容1 e-12在要求20迭代。最好的近似解巨磁电阻返回最后一个(如所示it0 (2) = 20)。MATLAB存储剩余历史rv0

援助与收敛速度慢,您可以指定一个预处理矩阵。自一个非对称,使用ilu生成预调节器 = l U 。指定公差忽略nondiagonal条目下降值小于1 e-6。解决了预处理系统 - - - - - - 1 一个 x = - - - - - - 1 b 通过指定lU作为输入,巨磁电阻。请注意,当您指定一个预调节器,巨磁电阻计算预处理系统的残留标准输出rr1rv1

[L U] = ilu(一、结构(“类型”,“ilutp”,“droptol”,1 e-6));(x1, fl1 rr1、it1 rv1] = gmr (A, b,[],托尔,麦克斯特,L, U);fl1
fl1 = 0
rr1
rr1 = 6.9008 e-14
it1
it1 =1×21 - 6

的使用ilu预调节器产生一个相对剩余不到规定的公差1 e-12在第六个迭代。第一个残留rv1 (1)规范(U \ \ b (L)),在那里M = L * U。最后剩余rv1(结束)规范(U \ (L \ (b * x1)))

你可以遵循的进步巨磁电阻通过绘制相对残差在每个迭代。情节的残余历史的每个解决方案指定的公差。

semilogy(0:长度(rv0) 1, rv0 /规范(b),“o”)举行semilogy(0:长度(rv1) 1, rv1 /规范(U \ \ b (L))“o”)yline(托尔,“r——”);传奇(“没有预调节器”,ILU预处理的,“宽容”,“位置”,“东”)包含(的迭代次数)ylabel (的相对剩余的)

使用预调节器和重新启动巨磁电阻

负载west0479,一个真正的479 - 479年-非对称稀疏矩阵。

负载west0479一个= west0479;

定义b所以,真正的解决方案 斧头 = b 是一个向量的。

b =和(2);

构造一个不完全LU预调节器与宽容的下降1 e-6

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

有利于使用重新启动巨磁电阻是限制所需的内存来执行该方法。没有重启,巨磁电阻需要麦克斯特向量存储保持维子空间的基础。同时,巨磁电阻必须使正交化对所有的向量在每个步骤。重新启动限制空间的使用量和每外迭代完成的工作量。

执行gmr (3),gmr (4),gmr (5)使用不完全LU因素作为预调节器。使用一个公差1 e-12最多20外迭代。

托尔= 1 e-12;麦克斯特= 20;[x3, fl3 rr3、it3 rv3] = gmr (A, b, 3,托尔,麦克斯特,L, U);[x4, fl4 rr4、it4 rv4] = gmr (A, b, 4,托尔,麦克斯特,L, U);[x5, fl5 rr5、it5 rv5] = gmr (A, b, 5,托尔,麦克斯特,L, U);fl3
fl3 = 0
fl4
fl4 = 0
fl5
fl5 = 0

fl3,fl4,fl5在每种情况下都是0,因为重新启动吗巨磁电阻驱动器相对剩余小于规定的公差1 e-12

下面的图显示了每个重新融合的历史巨磁电阻方法。gmr (3)在外层迭代收敛5,内迭代3 (it3 = (5, 3))这将是一样的外层迭代6,内部迭代0,因此6最后刻度线的标记。

semilogy (1:1/3:6 rv3 /规范(U \ \ b (L))“o”);甘氨胆酸h1 =;h1。XTick = (1:6);标题(“gmr (N) N = 3, 4, 5 ')包含(“外迭代数量”);ylabel (的相对剩余的);持有semilogy (1:1/4:3 rv4 /规范(U \ \ b (L))“o”);semilogy (1:1/5:2.8 rv5 /规范(U \ \ b (L))“o”);yline(托尔,“r——”);持有传奇(的巨磁电阻(3)的,“巨磁电阻(4)”,“巨磁电阻(5)”,“宽容”网格)

一般来说更大的内在的迭代的数量,更多的工作巨磁电阻是否每个外层迭代和它可以收敛越快。

检查供应的影响巨磁电阻解决方案的初始猜测。

创建一个三对角稀疏矩阵。使用每一行的总和作为向量的右边 斧头 = b 因此,预期的解决方案 x 是一个向量的。

n = 900;e =的(n - 1);一个= spdiags ([e 2 * e e], 1:1, n, n);b =和(2);

使用巨磁电阻来解决 斧头 = b 两次:一次使用默认初始猜测,和一个解决方案的时间和一个很好的初始估计。使用200次迭代和默认的对这两个解决方案。金宝搏官方网站指定初始猜测第二个解决方案作为一个向量的所有元素等于0.99

麦克斯特= 200;x1 = gmr (A, b,[][],麦克斯特);
gmr聚集在迭代27与相对剩余9.5 e-07解决方案。
x0 = 0.99 * e;x2 = gmr (A, b,[][],麦克斯特,[],[],x0);
gmr聚集在迭代7与相对剩余6.7 e-07解决方案。

在这种情况下提供一个初始猜测使巨磁电阻更快地收敛。

返回中间结果

你也可以使用初始猜得到中间结果通过调用巨磁电阻在一个循环。每次调用解算器执行几个迭代计算并存储解决方案。然后使用这个解决方案的初始矢量迭代的下一批。

例如,这段代码执行四次100次迭代和存储解决方案向量每次通过For循环:

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

X (:, k)在迭代解向量计算吗kfor循环的R (k)是解决方案的相对剩余。

解一个线性系统通过提供巨磁电阻计算一个函数处理* x的系数矩阵一个

威尔金森的测试矩阵生成的画廊是一个21-by-21三对角矩阵。预览矩阵。

一个=画廊(“wilk”,21)
一个=21日×2110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 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 6 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0⋮

威尔金森矩阵的特殊结构,所以可以代表操作* x一个函数处理。当一个乘以一个向量,大部分结果向量中的元素是0。结果中的非零元素对应的非零三对角元素一个。此外,只有主对角线的非零不等于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®,编写一个函数,创建这些向量并将它们添加在一起,从而赋予的价值* x:

函数y = afun (x) y = 0;x (1:20)] +[(10:1:0)';(1:10)']。* x +[x (21);0);结束

(这个函数保存为本地函数结束时的例子。)

现在,解决线性系统 斧头 = b 通过提供巨磁电阻计算的函数处理* x。使用一个公差1 e-1215外迭代,和10内迭代之前重新启动。

1 b = 1(21日);托尔= 1 e-12;麦克斯特= 15;重启= 10;x1 = gmr (@afun, b,重启,托尔,麦克斯特)
gmr(10)聚集在外层迭代5(内部迭代10)与相对剩余5.3 e-13解决方案。
x1 =21日×10.0910 0.0899 0.0999 0.1109 0.1241 0.1443 0.1544 0.2383 0.1309 0.5000⋮

检查afun (x1)产生一个向量的。

afun (x1)
ans =21日×11.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000⋮

本地函数

函数y = afun (x) y = 0;x (1:20)] +[(10:1:0)';(1:10)']。* x +[x (21);0);结束

输入参数

全部折叠

系数矩阵,指定为一个方阵或函数句柄。这个矩阵是线性系统的系数矩阵A * x =。一般来说,一个是一个大型稀疏矩阵或函数句柄返回产品大型稀疏矩阵的列向量。

指定一个作为处理函数

您可以选择性地指定系数矩阵作为处理函数,而不是一个矩阵。函数处理返回矩阵向量的产品,而不是形成整个系数矩阵,计算效率更高。下载188bet金宝搏

要使用一个函数处理,使用函数签名函数y = afun (x)参数化功能解释如何提供额外的参数函数afun,如果必要的。函数调用afun (x)必须返回的值* x

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

线性方程的右边,指定为一个列向量。的长度b必须等于大小(1)

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

数量的内部迭代重启之前,指定为一个标量整数。随着使用该输入麦克斯特输入控制的最大迭代数,重启*麦克斯特。如果重新启动[]大小(1),然后巨磁电阻不重启和迭代的总数吗麦克斯特

一个大的重新启动价值通常会导致更好的收敛行为,但也有更高的时间和内存要求。

数据类型:

公差的方法,指定为一个积极的标量。使用该输入平衡精度和运行时的计算。巨磁电阻必须符合公差在允许迭代的数量才能成功。一个较小的值托尔意味着答案必须更精确的计算才能成功。

数据类型:

最大数量的外层迭代,指定为一个积极的标量整数。增加的价值麦克斯特允许更多的迭代巨磁电阻为了满足公差托尔。一般来说,值越小托尔,成功完成所需的更多的迭代计算。

如果重新启动输入也指定,然后迭代的总数重启*麦克斯特。否则,迭代的总数麦克斯特

的默认值麦克斯特取决于重新启动指定:

  • 如果重新启动没有指定,或指定为[]大小(1)的默认值麦克斯特min(大小(1)10)

  • 如果重新启动被指定为一个值的范围1 < =启动<大小(1)的默认值麦克斯特分钟(装天花板(大小(1)/重启),10)

数据类型:

预处理矩阵,矩阵或作为单独的参数指定的函数处理。您可以指定一个预处理矩阵或其矩阵因素M = M1 *平方米提高数值方面的线性系统和方便巨磁电阻快速收敛。您可以使用不完整的矩阵分解的功能iluichol生成预调节器矩阵。你也可以使用平衡分解前改善系数矩阵的条件数。有关预调节器的更多信息,请参阅线性系统的迭代方法

巨磁电阻将未指明的预调节器视为单位矩阵。

指定作为处理函数

你可以指定任何,M1,或平方米作为函数处理代替矩阵。函数处理执行矩阵向量操作而形成整个预处理矩阵,使计算更加高效。

要使用一个函数处理,使用函数签名函数y = mfun (x)参数化功能解释如何提供额外的参数函数mfun,如果必要的。函数调用mfun (x)必须返回的值M \ xM1、M2 \ (x)

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

最初的猜测,指定为一个列向量长度等于大小(2)。如果你能提供巨磁电阻更合理的初始猜测x0比默认的零向量,那么它可以节省计算时间和帮助算法收敛更快。

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

输出参数

全部折叠

线性系统的解决方案,作为一个列向量返回。这个输出给出了近似解的线性系统A * x =。如果计算成功(国旗= 0),然后relres小于或等于什么托尔

当计算不成功(国旗~ = 0),解决方案x返回的巨磁电阻是微小残留标准计算所有迭代。

收敛国旗,作为一个标量值的表返回。计算的收敛性标志指示是否成功和区分几种不同形式的失败。

标志值

收敛

0

成功——巨磁电阻聚集到所需的公差托尔麦克斯特迭代。

1

失败- - - - - -巨磁电阻迭代麦克斯特迭代,但没有收敛。

2

失败——预调节器矩阵M = M1 *平方米是病态的。

3

失败- - - - - -巨磁电阻停滞不前之后连续两个迭代是相同的。

4

失败——一个标量计算的巨磁电阻算法变得太小或太大继续计算。

相对残差,作为一个标量返回。相对残差relres =规范(M \ (b * x)) /规范(M \ b)表明如何准确的答案是。请注意,巨磁电阻包括预处理矩阵相对剩余计算,而其他大多数迭代解决没有。如果计算收敛宽容托尔麦克斯特迭代,然后relres < =托尔

数据类型:

内部和外部迭代数,作为双元素返回向量(外内)。这个输出表明内外迭代计算答案的数字x计算:

  • 如果重新启动没有指定,或指定为[]大小(1),然后外= 1和所有迭代被认为是内部迭代。

  • 如果重新启动被指定为一个值的范围1 < =启动<大小(1),然后外层迭代数量范围麦克斯特。0外< < = =和内部迭代数量范围0 < =内部< =重启

数据类型:

剩余的错误,作为一个向量返回。剩余误差规范(M \ (b * x))揭示了如何接近给定值的算法是收敛的x。请注意,巨磁电阻包括预处理矩阵相对剩余计算,而其他大多数迭代解决没有。元素的数量resvec等于总的迭代次数(如果重新启动,这是最多重启*麦克斯特)。您可以检查的内容resvec帮助决定是否更改的值重新启动,托尔,或麦克斯特

数据类型:

更多关于

全部折叠

广义最小剩余法

广义最小残余(gmr)算法开发扩展的最小残余不对称矩阵(MINRES)算法。

像共轭梯度(CG)方法,gmr算法计算正交序列,但gmr需要存储所有先前的向量序列。这个存储以前的向量可以消耗很多内存如果任其发展。算法的“重启”版本控制存储这些序列的周期性地清除中间序列和使用结果作为初始值在另一个迭代。

选择一个适当的“重启”价值良好性能是至关重要的,但选择这样的价值主要是一个经验的问题。如果迭代之前启动的数量太小,算法可能会非常缓慢收敛或未能完全收敛。但是如果重新启动值太大,那么算法增加了存储需求和可能做不必要的工作[1]

内部和外部的迭代

内心的迭代的迭代巨磁电阻完成后会自动重启。您可以指定内部的迭代的数量重新启动论点。

每一次巨磁电阻重新启动,外层迭代许多进步。您可以指定的最大数量与外层迭代麦克斯特论点。默认的外层迭代的数量min(大小(1)/重新启动,10)

例如,如果您不指定重新启动,然后迭代的最大数量是由价值决定的麦克斯特,巨磁电阻不重启:

如果没有指定启动参数和麦克斯特的价值是4,然后gmr执行总共4次迭代。

然而,当您指定重新启动,巨磁电阻函数执行几个内部迭代(指定的重新启动为每个外层迭代(规定)麦克斯特)。在这种情况下,总迭代的最大数量重启*麦克斯特:

如果重新启动参数是指定为4,麦克斯特参数被指定为2,然后gmr执行4内迭代每个外层迭代总共8迭代。

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,气孔导度(A)。您可以使用平衡改善的条件数一个自己,这使得大多数迭代解决者更容易收敛。然而,使用平衡时也会导致更好的质量矩阵预调节器随后因素平衡矩阵B = R * P * * C

  • 您可以使用矩阵重新排序等功能解剖symrcm来交换系数矩阵的行和列的数量,减少非零系数矩阵分解时生成一个预调节器。这可以减少所需的内存和时间随后预先处理解决线性系统。

引用

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

[2]萨阿德,尤瑟夫和马丁·h·舒尔茨“gmr:广义极小剩余算法求解非对称线性系统,”暹罗j .科学。Stat。第一版。1986年7月,7卷,3号,第856 - 869页。

扩展功能

之前介绍过的R2006a