主要内容

巨磁电阻

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

描述

例子

x= gmr (一个b试图解决线性方程系统A * x =为了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.默认值是一个0的向量。

例子

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

例子

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

例子

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

例子

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 =

  • 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 .指定删除公差,以忽略小于的值的非透明条目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预处理的'宽容'“位置”'东方')包含('迭代号') ylabel (“相对残差”

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

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

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

加载West0479.A = West0479;

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

b =和(2);

构建一个不完整的逻辑单元预处理器,其滴度公差为1 e-6

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

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

执行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 是一个1的向量。

n = 900;e =的(n - 1);A = spdiags([e 2*e 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的溶液。

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

返回中间结果

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

例如,这段代码执行四次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-loop,和r(k)是该解决方案的相对残余。

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

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

a =画廊(“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 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 1.0000 1.0000⋮

本地功能

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

输入参数

全部收缩

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

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

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

要使用函数句柄,请使用函数签名函数y = fun(x)参数化功能解释如何向函数提供附加参数一个乐趣,如果必要的。函数调用Afun(x)必须返回值斧头

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

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

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

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

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

数据类型:双倍的

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

数据类型:双倍的

外部迭代的最大次数,指定为正标量整数。增加价值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
复数支持:金宝app是的

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

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

输出参数

全部收缩

线性系统解,返回为列向量。这个输出给出了线性系统的近似解A * x =.如果计算成功(国旗= 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, et al.,线性系统解的模板:迭代方法的构建块,暹罗,费城,1994年。

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

扩展功能

之前介绍过的R2006a