主要内容

巨磁电阻

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

描述

例子

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.默认值是一个零向量。

例子

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) <= restart

例子

x国旗relresiterresvec= gmres(___还返回每个内部迭代的残差范数的向量,包括第一个残差规范(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次迭代。

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次。

Restart = 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

fl01是因为巨磁电阻没有收敛到要求的公差1 e-12在请求的20次迭代中。最好的近似解是巨磁电阻Returns是最后一个(由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 (的相对剩余的

图中包含一个axes对象。坐标轴对象包含3个类型为line、constantline的对象。这些对象代表无预处理、ILU预处理、公差。

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

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

负载west0479A = west0479;

定义b这是真正的解 斧头 b 是一个全为1的向量。

b = sum(A,2);

构造一个落差公差为的不完全陆预处理器1 e-6

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

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

执行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);标题(' N = 3,4,5时的gmres(N) ')包含(“外部迭代数”);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)”“宽容”网格)

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

一般来说,内部迭代的次数越多,工作就越多巨磁电阻和收敛的速度。

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

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

N = 900;E = ones(n,1);A = spdiags([e 2*e 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循环中。对求解器的每次调用都要执行几次迭代并存储计算出的解。然后使用该解决方案作为下一批迭代的初始向量。

例如,这段代码执行了4次100次迭代,并在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)在迭代时计算解向量吗k的for循环,和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 = afun(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;Restart = 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 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 = b.一般来说,一个是一个大型稀疏矩阵或返回大型稀疏矩阵与列向量乘积的函数句柄。

指定一个作为函数句柄

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

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

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

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

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

重新启动之前的内部迭代次数,指定为标量整数。将此输入与麦克斯特输入控制最大迭代次数,重启*麦克斯特.如果重新启动[]大小(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
复数支持:万博1manbetx是的

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

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

输出参数

全部折叠

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

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

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

标志值

收敛

0

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

1

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

2

失败——预处理矩阵M = m1 * m2是病态的。

3.

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

4

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

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

数据类型:

外部和内部迭代数,作为双元素向量返回(外内).此输出指示计算结果的内迭代数和外迭代数x计算:

  • 如果重新启动是未指定的,或指定为[]大小(1),然后外层= 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.贝里,T. F.陈,等,线性系统解的模板:迭代方法的构建块, SIAM,费城,1994。

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

扩展功能

版本历史

R2006a之前介绍过