主要内容

巨磁电阻

求解线性方程组-广义最小残差法

描述

例子

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

例子

x= gmr (一个b重新启动每次重新启动方法重新启动内心的迭代.外部迭代的最大数量为outer = min(size(A,1)/restart,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 * m2

例子

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

例子

x国旗] = gmres(___返回一个标志,该标志指定算法是否成功收敛。当Flag = 0在美国,融合是成功的。您可以将此输出语法与前面的任何输入参数组合一起使用。当您指定国旗输出,巨磁电阻不显示任何诊断消息。

例子

x国旗relres] = gmres(___也返回相对残差规范(M \ (b * x)) /规范(M \ b),其中包括预处理因子矩阵.如果国旗0,然后Relres <= tol

例子

x国旗relresiter] = gmres(___还返回所处的内部和外部迭代数x是用矢量计算的(外内).外部迭代数位于范围内0 <= iter(1) <= maxit内部迭代数在范围内0 <= iter(2) <=重启

例子

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

例子

全部折叠

求解一个方形线性方程组巨磁电阻使用默认设置,然后调整解决过程中使用的公差和迭代次数。

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

rng默认的A = sprandn(400,400,0.5) + 12*speye(400);B = rand(400,1);

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

x = gmres(A,b);
Gmres在迭代10时停止,没有收敛到期望的公差1e-06,因为达到了最大迭代次数。返回的迭代(编号10)有相对残差0.35。

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

再用一个容差解系统1的军医100次迭代。

Tol = 1e-4;Maxit = 100;x = gmres(A,b,[],tol,maxit);
Gmres在迭代100处停止,没有收敛到期望的公差0.0001,因为达到了最大迭代次数。返回的迭代(数字100)的相对残差为0.0045。

即使有更宽松的公差和更多的迭代,残余误差的改善也不足以实现收敛。当迭代算法以这种方式停滞时,这是一个很好的迹象,表明需要一个预处理矩阵。然而,巨磁电阻也有一个控制内部迭代次数的输入。通过为内部迭代指定一个值,巨磁电阻每次外部迭代做更多的工作。

再次用a解方程组重新启动值为100和a麦克斯特值为20。与其一次迭代100次,巨磁电阻在重新启动之间执行100次迭代,并重复此操作20次。

重启= 100;Maxit = 20;x = gmres(A,b,restart,tol,maxit);
Gmres(100)在外部迭代2(内部迭代75)收敛到具有相对残差9.3e-05的解。

在本例中,为指定一个较大的重启值巨磁电阻使它在允许的迭代次数内收敛到解决方案。但是,大的重启值可能会消耗大量内存一个也很大。

检查使用非重启的预处理矩阵的效果巨磁电阻解一个线性方程组。

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

负载west0479A = west0479;

定义b这才是真正的解 斧头 b 都是1的向量。

b = sum(A,2);

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

Tol = 1e-12;Maxit = 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次迭代中。最好的近似解是巨磁电阻返回的是最后一个(由It0 (2) = 20).MATLAB将残差历史存储在rv0

为了帮助处理缓慢的收敛,您可以指定一个预处理矩阵。自一个是非对称的,用ilu生成前置条件 l U .指定一个落差公差以忽略值小于的非对角线项1 e-6.解预条件方程组 - 1 一个 x - 1 b 通过指定l而且U作为输入巨磁电阻.请注意,在指定预处理条件时,巨磁电阻为输出计算预条件系统的剩余范数rr1而且rv1

[L,U] = ilu(A,struct(“类型”“ilutp”“droptol”, 1 e-6));(x1, fl1 rr1、it1 rv1] = gmr (A, b,[],托尔,麦克斯特,L, U);fl1
Fl1 = 0
rr1
Rr1 = 1.3557e-13
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 (的相对剩余的

图中包含一个轴对象。axis对象包含3个类型为line、constantline的对象。这些对象表示无前置条件、ILU前置条件、容差。

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

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

负载west0479A = west0479;

定义b这才是真正的解 斧头 b 都是1的向量。

b = sum(A,2);

构造一个降容为的不完全LU预处理器1 e-6

[L,U] = ilu(A,struct(“类型”“ilutp”“droptol”, 1 e-6));

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

执行gmr (3)gmr (4),gmr (5)使用不完全LU因子作为预处理因子。使用的公差1 e-12以及最多20个外部迭代。

Tol = 1e-12;Maxit = 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。

semilogy (1:1/3:6 rv3 /规范(U \ \ b (L))“o”);H1 = gca;h1。XTick = (1:6);标题('gmres(N) for 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)”“宽容”网格)

图中包含一个轴对象。标题为gmres(N) for N = 3,4,5的axes对象包含4个类型为line, constantline的对象。这些对象代表gmres(3), gmres(4), gmres(5),公差。

一般来说,内部迭代次数越多,工作就越多巨磁电阻每次外部迭代,它收敛得就越快。

检查供给的效果巨磁电阻对解的初步猜测。

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

N = 900;E = ones(n,1);A = spdigs ([e 2*e],-1:1,n,n);b = sum(A,2);

使用巨磁电阻来解决 斧头 b 两次:一次是默认的初始猜测,另一次是正确的初始猜测。对两个解决方案都使用200次迭代和默认容差。金宝搏官方网站将第二个解中的初始猜测指定为所有元素都等于的向量0.99

Maxit = 200;x1 = gmres(A,b,[],[],maxit);
Gmres在迭代27时收敛到相对残差为9.5e-07的解。
X0 = 0.99*e;x2 = gmres(A,b,[],[],maxit,[],[],x0);
Gmres在迭代7收敛到相对残差为6.7e-07的解。

在这种情况下,提供一个初始猜测是可行的巨磁电阻收敛:更快地收敛

返回中间结果

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

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

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

X (:, k)解向量是在迭代时计算的吗kfor循环的,和R (k)是解的相对残差。

求解一个线性方程组巨磁电阻使用一个函数句柄进行计算* x代替系数矩阵一个

其中一个威尔金森检验矩阵由画廊是一个21 × 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使用函数句柄。当一个乘以一个向量,结果向量中的大部分元素都是零。结果中的非零元素对应于的非零三对角元素一个.而且,只有主对角线有不等于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 = [0];x (1:20)] +...[(10: 1:0) ';(1:10) ']。* x +...[x (21);0);结束

(该函数在示例末尾保存为本地函数。)

现在求解线性方程组 斧头 b 通过提供巨磁电阻使用函数句柄进行计算* x.使用的公差1 e-12, 15个外部迭代,10个内部迭代。

B = ones(21,1);Tol = 1e-12;Maxit = 15;重启= 10;X1 = gmres(@afun,b,restart,tol,maxit)
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

本地函数

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

输入参数

全部折叠

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

指定一个作为函数句柄

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

要使用函数句柄,请使用函数签名函数y = fun(x)参数化功能解释如何向函数提供附加参数afun,如有需要。函数调用afun (x)必须返回的值* x

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

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

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

重新启动前的内部迭代数,指定为标量整数。将此输入与麦克斯特控制最大迭代次数的输入,重启*麦克斯特.如果重新启动[]大小(1),然后巨磁电阻没有重新启动并且迭代的总数是麦克斯特

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

数据类型:

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

数据类型:

外部迭代的最大次数,指定为正标量整数。增加价值麦克斯特允许更多的迭代巨磁电阻满足公差托尔.的值一般越小托尔,则需要更多的迭代才能成功完成计算。

如果重新启动还指定了输入,则迭代的总次数为重启*麦克斯特.否则,迭代的总数为麦克斯特

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

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

  • 如果重新启动是否指定为范围中的值1 <= restart < size(A,1),则为默认值麦克斯特分钟(装天花板(大小(1)/重启),10)

数据类型:

预条件矩阵,指定为矩阵或函数句柄的单独参数。您可以指定一个预处理矩阵或者矩阵因子M = m1 * m2为了改进线性系统的数值方面,使它更容易巨磁电阻迅速汇合:迅速汇合你可以用不完全矩阵分解函数ilu而且ichol生成预处理矩阵。你也可以用平衡先对系数矩阵进行因数分解,以改善其条件数。有关预处理条件的更多信息,请参见线性系统的迭代方法

巨磁电阻将未指定的预处理条件作为单位矩阵处理。

指定作为函数句柄

您可以选择指定其中的任何一个M1,或平方米作为函数句柄而不是矩阵。函数句柄执行矩阵-向量运算,而不是形成整个预处理矩阵,使计算更高效。

要使用函数句柄,请使用函数签名函数y = mfun(x)参数化功能解释如何向函数提供附加参数mfun,如有需要。函数调用mfun (x)必须返回的值M \ xM1、M2 \ (x)

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

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

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

输出参数

全部折叠

线性系统解,作为列向量返回。这个输出给出了线性系统的近似解A*x = b.若计算成功(Flag = 0),然后relres小于或等于托尔

当计算不成功时(标志~= 0),解决方案x返回的巨磁电阻是在所有迭代中计算的剩余范数最小的一个。

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

标志值

收敛

0

成功——巨磁电阻收敛到期望的公差托尔麦克斯特迭代。

1

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

2

失败-预处理矩阵M = m1 * m2条件不好。

3.

失败- - - - - -巨磁电阻连续两次迭代后停滞不前。

4

方法计算的标量之一巨磁电阻算法变得太小或太大,无法继续计算。

相对残差,作为标量返回。相对残差relres = norm(M\(b- a *x))/norm(M\b)是对答案准确性的一种指示。请注意,巨磁电阻包括预处理矩阵在相对残差计算中,其他迭代求解器大多没有。如果计算收敛于公差托尔麦克斯特迭代,然后Relres <= tol

数据类型:

外部和内部迭代数,作为两元素向量返回(外内).此输出指示计算的答案所在的内部和外部迭代数x计算:

  • 如果重新启动未指定或指定为[]大小(1),然后Outer = 1并且所有的迭代都被认为是内部迭代。

  • 如果重新启动是否指定为范围中的值1 <= restart < size(A,1),则外部迭代数在范围内0 <= outer <= maxit内部迭代数在范围内0 <= inner <= restart

数据类型:

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

数据类型:

更多关于

全部折叠

广义最小残差法

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

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

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

内部和外部迭代

内心的迭代这些迭代巨磁电阻在重新启动前完成。方法指定内部迭代的次数重新启动论点。

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

例如,如果不指定重新启动,则最大迭代次数由的值决定麦克斯特,巨磁电阻不重启:

如果没有指定restart参数并且maxit的值为4,那么gmres总共执行4次迭代。

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

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

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,气孔导度(A).你可以使用平衡改善条件的数量一个,就其本身而言,这使得大多数迭代求解器更容易收敛。然而,使用平衡当你随后分解平衡矩阵时,也会导致更好质量的预处理矩阵B = r * p * a * c

  • 您可以使用矩阵重新排序函数,例如解剖而且symrcm当对系数矩阵进行因式分解以生成预处理条件时,对系数矩阵的行和列进行排列并使非零的数量最小化。这可以减少随后求解预条件线性系统所需的内存和时间。

参考文献

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

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

扩展功能

R2006a之前介绍