主要内容

巨磁电阻

求解线性方程系统 - 广义最小残余方法

描述

例子

x= gmr (一个b试图解决线性方程系统a * x = b为了x使用广义最小残余方法.当尝试成功时,巨磁电阻显示确认收敛的消息。如果巨磁电阻由于任何原因,未能在最大迭代次数或停止之后收敛,它显示包含相对残差的诊断消息常态(B-A * X)/ NOM(B)和该方法停止的迭代号。对于这个语法,巨磁电阻不重新启动;最大迭代次数为min(大小(1)10)

例子

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

例子

x= gmr (一个b重新开始指定方法的容忍度。默认的容忍度是1 e-6

例子

x= gmr (一个b重新开始max指定最大数量外层迭代这样的迭代总数不超过重新启动* maxit..如果max[]然后巨磁电阻使用默认的,min(大小(1)/重新启动,10).如果重新开始大小(1)[],则总迭代次数的最大值为max(而不是重新启动* maxit.).巨磁电阻如果未能在最大迭代次数内收敛,则显示诊断消息。

例子

x= gmr (一个b重新开始max指定一个预安全载体矩阵和计算x通过有效求解系统 1 一个 x 1 b .采用预调节器矩阵可以改善问题的数值性质,提高计算效率。

例子

x= gmr (一个b重新开始maxM1M2指定预处理矩阵的因子这样M = M1 *平方米

例子

x= gmr (一个b重新开始maxM1M2x0指定解决方案向量的初始猜测x.默认值是零的向量。

例子

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

例子

x旗帜) = gmr (___还返回相对残差规范(M \ (b * x)) /规范(M \ b),其中包括预处理器矩阵.如果旗帜0,然后Relres <= tol

例子

x旗帜it) = gmr (___还返回内部和外部迭代号码x是作为一个矢量计算的吗(外内).外部迭代号码位于范围内0 <= iter(1) <= maxit内部迭代次数在这个范围内0 <= iter(2) <= restart

例子

x旗帜itresvec) = gmr (___还返回每个内部迭代的残差范数的向量,包括第一个残差规范(M \ (b * x0)).这些是预处理系统的剩余规范。

例子

全部收缩

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

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

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

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

x = GMRES(A,B);
GMRES在迭代10中停止,而不会聚到所需的公差1E-06,因为达到了最大迭代次数。迭代返回(10)具有相对残留的0.35。

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

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

托尔= 1的军医;麦克斯特= 100;x = gmr (A, b,[],托尔,麦克斯特);
Gmres在迭代100时停止,没有收敛到期望的公差0.0001,因为达到了最大迭代数。返回的迭代(数100)相对剩余0.0045。

即使具有宽松的公差和更多的迭代,残余错误也不会提高收敛。当以这种方式迭代算法停止时,它是需要预处理器矩阵的良好指示。然而,巨磁电阻还具有控制内部迭代的数量的输入。通过指定内部迭代的值,巨磁电阻在每个外部迭代中做更多的工作。

使用a再次解决系统重新开始价值100和amax值20.而不是一次迭代,巨磁电阻在重新启动之间执行100个迭代并重复此20次。

重启= 100;麦克斯特= 20;x = gmr (A, b,重启,托尔,麦克斯特);
GMRES(100)在外迭代2(内迭代75)以相对残留9.3E-05的溶液中聚集在溶液中。

在这种情况下,指定了大重启值巨磁电阻使其能够收敛到允许的迭代次数内的解决方案。但是,大重启值可以消耗很多内存一个也大。

使用预先启动的前提者矩阵来检查使用预处理器矩阵的效果巨磁电阻来解线性方程组。

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

加载West0479.A = West0479;

定义b所以真正的解 斧头 b 是所有的矢量。

b =和(2);

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

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

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

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

  • fl0表示算法是否收敛的标志。

  • rr0是计算答案的相对残余x

  • it0是一个两个元素的矢量(外内)时指示内部和外部迭代数x是计算。

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

[x,fl0,rr0,it0,rv0] = gmres(a,b,[],tol,maxit);fl0
fl0 = 1
rr0
rr0 = 0.7603
it0
it0 =1×21 20

fl0是1,因为巨磁电阻不收敛到所请求的公差1 e-12在请求的20次迭代中。最好的近似解巨磁电阻Returns是最后一个(如it0 (2) = 20).MATLAB将剩余历史存储在rv0

为了帮助缓慢的收敛,您可以指定一个预处理器矩阵。自从一个非对称,使用ilu生成预处理器 l U .指定删除公差,以忽略小于的值的非透明条目1 e-6.解预处理系统 - 1 一个 x - 1 b 通过指定lU作为输入,巨磁电阻.请注意,当您指定预处理程序时,巨磁电阻计算输出预处理系统的残余标准rr1rv1

[l,u] = ilu(a,struct('类型''ilutp''droptol',1E-6));[X1,FL1,RR1,IT1,RV1] = GMRES(A,B,[],TOL,MAXIT,L,U);FL1.
fl1 = 0.
rr1
RR1 = 6.9008E-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')举行半径(0:长度(RV1)-1,RV1 / NORM(U \(L \ B)),'-O')yline(tol,'r--');传奇(“没有预调节器”'ilu preconditcher''宽容'“位置”'东方的')包含('迭代号') ylabel (“相对残差”

图中包含一个轴。坐标轴包含3个对象,类型分别为line和constantline。这些对象分别代表No preconditioner, ILU preconditioner, Tolerance。

使用重新启动的预处理器巨磁电阻

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

加载West0479.A = West0479;

定义b所以真正的解 斧头 b 是所有的矢量。

b =和(2);

构造一个不完全LU预调节器,其降容限为1 e-6

[l,u] = ilu(a,struct('类型''ilutp''droptol',1E-6));

使用重新启动的好处巨磁电阻是限制执行该方法所需的内存量。没有重启,巨磁电阻需要max保持Krylov子空间的基的存储向量。同时,巨磁电阻每一步都必须与之前所有的向量正交。重新启动会限制使用的工作区数量和每次外部迭代所完成的工作量。

执行gmr (3)GMRES(4),GMRES(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

fl3fl4,fl5全部0,因为在每种情况下重新启动巨磁电阻驱动相对剩余,以小于规定的公差1 e-12

以下绘图显示了每个重新启动的融合历史巨磁电阻方法。gmr (3)收敛于外部迭代5,内部迭代3 (IT3 = [5,3])与外迭代6,内迭代0相同,因此在最终刻度标记上的标记为6。

半径(1:1/3:6,RV3 / NOM(U \(L \ B)),'-O');甘氨胆酸h1 =;h1。XTick = (1:6);标题('GMRES(n)对于n = 3,4,5')包含(“外迭代数量”);ylabel (“相对残差”);抓住半机(1:1/4:3,RV4 / NOM(U \(L \ B)),'-O');semilogy (1:1/5:2.8 rv5 /规范(U \ \ b (L))'-O');yline(tol,'r--');抓住离开传奇('GMRES(3)''GMRES(4)''GMRES(5)''宽容') 网格

图中包含一个轴。具有标题GMRES(n)的轴为n = 3,4,5包含4个类型的型号,块线。这些物体代表GMRES(3),GMRES(4),GMRES(5),容忍度。

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

检查供应的效果巨磁电阻对解决方案进行初步猜测。

创建一个三对角稀疏矩阵。用每一行的和作为右边的向量 斧头 b 所以的期望解 x 是一个向量。

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

巨磁电阻来解决 斧头 b 两次:一次是默认的初始猜测,一次是对解决方案的良好初始猜测。对两种解决方案都使用200次迭代和默认的容错性。万博 尤文图斯指定第二个解中的初始猜测为所有元素都等于的向量0.99

maxit = 200;X1 = GMRES(A,B,[],[],MAXIT);
GMRES在迭代27融合到具有相对残留的9.5E-07的溶液。
x0 = 0.99 * e;x2 = gmr (A, b,[][],麦克斯特,[],[],x0);
GMRES在迭代7中融合到具有相对残留的6.7E-07的溶液。

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

返回中间结果

您还可以使用初始猜测通过调用来获得中间结果巨磁电阻在一个循环。每次对求解器的调用都会执行几次迭代,并存储计算出的解决方案。然后使用该解决方案作为下一批迭代的初始向量。

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

x0 =零(尺寸(a,2),1);tol = 1e-8;maxit = 100;为了k = 1:4 [x,国旗,relres] = gmr (A, b,[],托尔,麦克斯特,[],[],x0);X = X (:, k);R (k) = relres;x0 = x;结尾

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

通过提供来解决一个线性系统巨磁电阻用一个函数句柄进行计算斧头代替系数矩阵一个

威尔金森测试矩阵中的一个由画廊是一个21×21的三角形矩阵。预览矩阵。

a =画廊('威尔克', 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 0 0 1 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 1 1 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 0121000000 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 ⋮

威尔金森矩阵有一个特殊的结构,所以你可以表示运算斧头用函数句柄。当一个乘以向量,得到的矢量中的大多数元素是零。结果中的非零元素对应于非零三角形元素一个.此外,只有主对角线具有不等于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®中,写一个创建这些向量的函数并将它们添加在一起,从而提供值斧头

功能y = afun(x)y = [0;x(1:20)] +...[(10:-1:0)';(1:10)']。* x +...[x(2:21);0];结尾

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

现在,解线性方程组 斧头 b 通过提供巨磁电阻使用函数处理来计算斧头.使用公差1 e-12, 15个外部迭代,10个内部迭代,然后重新启动。

1 b = 1(21日);托尔= 1 e-12;麦克斯特= 15;重启= 10;x1 = gmr (@afun, b,重启,托尔,麦克斯特)
GMRES(10)在外迭代5(内迭代10)以相对残留5.3E-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)产生一个1的向量。

afun (x1)
ans =.21日×11.0000 1.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(2:21);0];结尾

输入参数

全部收缩

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

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

你可以选择指定系数矩阵作为函数句柄而不是矩阵。函数句柄返回矩阵-向量乘积,而不是形成整个系数矩阵,使计算更有效。s manbetx 845

要使用函数句柄,请使用函数签名函数y = afun(x)参数化功能说明如何向函数提供附加参数好玩儿,如果必要的。函数调用Afun(x)必须返回值斧头

数据类型:双倍的|function_handle
复数支持:万博1manbetx是的

线性方程的右边,用列向量表示。的长度b必须等于大小(1)

数据类型:双倍的
复数支持:万博1manbetx是的

重启前的内部迭代次数,指定为标量整数。使用此输入以及max控制最大迭代次数的输入,重新启动* maxit..如果重新开始[]大小(1),然后巨磁电阻不重新启动迭代的总次数是多少max

一个大的重新开始Value通常导致更好的收敛行为,但也有更高的时间和内存需求。

数据类型:双倍的

方法公差,指定为正标量。使用此输入来权衡计算中的准确性和运行时间。巨磁电阻必须在允许的迭代数量内满足公差才能成功。较小的值意味着答案必须更精确地计算成功。

数据类型:双倍的

外部迭代的最大次数,指定为一个正标量整数。增加价值max允许更多的迭代巨磁电阻满足公差.一般情况下,值越小,需要更多的迭代来成功完成计算。

如果是重新开始输入也指定,然后迭代的总数是重新启动* maxit..否则,总迭代次数为max

默认值max取决于重新开始指定:

  • 如果重新开始是未指定的,或指定为[]大小(1),然后是默认值maxmin(大小(1)10)

  • 如果重新开始指定为范围内的值1 <= restart < size(A,1),然后是默认值maxMin(CEIL(大小(A,1)/重启),10)

数据类型:双倍的

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

巨磁电阻将未指定的预处理程序视为单位矩阵。

指定作为功​​能手柄

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

要使用函数句柄,请使用函数签名函数y = mfun(x)参数化功能说明如何向函数提供附加参数mfun,如果必要的。函数调用mfun(x)必须返回值M \ xm2 \(m1 \ x)

数据类型:双倍的|function_handle
复数支持:万博1manbetx是的

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

数据类型:双倍的
复数支持:万博1manbetx是的

输出参数

全部收缩

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

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

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

标志值

收敛

0

成功——巨磁电阻收敛到所需的公差之内max迭代。

1

失败- - - - - -巨磁电阻迭代max迭代但没有收敛。

2

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

3.

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

4

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

相对残余错误,作为标量返回。相对残差误差Relres =常规(m \(b-a * x))/ norm(m \ b)可以看出答案有多准确。请注意,巨磁电阻包括预处理器矩阵在相对残差计算中,大多数迭代求解器没有做到这一点。如果计算收敛到公差之内max迭代,然后Relres <= tol

数据类型:双倍的

外部和内部迭代号,作为两个元素矢量返回(外内).此输出指示计算结果所在的内部和外部迭代数x计算:

  • 如果重新开始是未指定的,或指定为[]大小(1),然后外= 1所有迭代都被认为是内在的迭代。

  • 如果重新开始指定为范围内的值1 <= restart < size(A,1),则外部迭代数在该范围内0 <= outer <= maxit内部迭代次数在这个范围内0 <= INNE <= RESTART

数据类型:双倍的

残余错误,作为向量返回。剩余错误规范(M \ (b * x))揭示算法如何为给定值融合x.请注意,巨磁电阻包括预处理器矩阵在相对残差计算中,大多数迭代求解器没有做到这一点。中元素的个数resvec等于迭代的总次数(如果重新开始用过了,这最多是多少重新启动* maxit.).你可以检查的内容resvec帮助决定是否更改值重新开始,或max

数据类型:双倍的

更多关于

全部收缩

广义最小残余方法

将最小残差(MINRES)算法推广到非对称矩阵,提出了广义最小残差(GMRES)算法。

与共轭梯度(CG)方法一样,GMRES算法计算正交序列,但GMRES需要存储序列中所有之前的向量。如果不检查的话,之前的向量存储可能会消耗大量内存。该算法的“重启”版本通过定期清除中间序列并在另一次迭代中使用结果作为初始值来控制这些序列的存储。

选择一个合适的“重启”值对于良好的性能是至关重要的,但是选择这样的值主要取决于经验。如果重启前的迭代次数太少,可能会导致算法收敛速度很慢或无法完全收敛。但是如果重启值太大,那么算法就增加了存储需求,可能会做不必要的工作[1]

内外迭代

内心的迭代是迭代巨磁电阻在重新启动之前完成。您可以指定内部迭代的数量重新开始论点。

每一次巨磁电阻重新启动,外层迭代数字进步。您可以指定最大的外部迭代数max论点。外部迭代的默认数量是min(大小(1)/重新启动,10)

例如,如果您未指定重新开始,然后通过值确定最大迭代次数max,巨磁电阻不重启:

如果未指定重新启动参数并且maxit的值为4,则GMRES共执行4个迭代。

但是,当您指定时重新开始,巨磁电阻函数执行几个内部迭代(由重新开始),用于每个外部迭代(由max).在这种情况下,总迭代的最大次数为重新启动* maxit.

如果restart参数指定为4,maxit参数指定为2,那么gmres对每个外部迭代执行4次内部迭代,总共8次迭代。

尖端

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

  • 您可以使用矩阵重新排序功能,例如解剖Symrcm.对系数矩阵进行因子分解以生成预调节器时,对系数矩阵的行和列进行排列并使非零数最小化。这样可以减少后续求解预处理线性系统所需的内存和时间。

参考

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

[2] Saad,Yousef和Martin H. Schultz,“GMRES:求解非对称线性系统的广义最小的残余算法”暹罗j .科学。Stat。第一版。1986年7月,第7卷第3期,第856-869页。

扩展功能

之前介绍过的R2006a