min

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

描述

例子

x= minres (一个b试图解线性方程组a * x = bx使用最小剩余方法.当尝试成功时,min显示一条消息以确认融合。如果min未能在最大迭代次数后收敛或因任何原因停止,则显示包含相对残差的诊断消息规范(b * x) /规范(b)和该方法停止的迭代号。

例子

x= minres (一个b托尔指定方法的公差。默认容忍度为1E-6

例子

x= minres (一个b托尔max指定要使用的最大迭代次数。min如果收敛失败,则显示诊断消息max迭代。

例子

x= minres (一个b托尔max指定对称正定预处理矩阵和计算x通过有效地求解该系统 H 1 一个 H T y H 1 b y, 在哪里 y H T x H 1 / 2 1 2 1 / 2 .利用预处理矩阵可以改善问题的数值性质,提高计算效率。

例子

x= minres (一个b托尔maxM1平方米指定预安全载体矩阵的因素这样m = m1 * m2

例子

x= minres (一个b托尔maxM1平方米X0.指定解向量的初始猜测x.默认值是零的向量。

例子

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

例子

x旗帜relres] = minres(___也返回计算解中的残差。如果旗帜0,然后relres < =托尔

例子

x旗帜relresit] = minres(___也返回迭代数it在这x是计算。

例子

x旗帜relresitResvec.] = minres(___还返回每次迭代的残余标准的向量,包括第一个残差常态(b-a * x0)

例子

x旗帜relresitResvec.Resveccg.] = minres(___还返回每个迭代的共轭梯​​度残余规范的向量。

例子

全部折叠

用。解一个平方线性方程组min使用默认设置,然后调整解决方案流程中使用的容忍度和迭代次数。

创建稀疏的三角形矩阵一个作为系数矩阵。使用的行和一个的向量b右边的 斧头 b 所以解决方案 x 应该是一个1的向量。

n = 400;On =那些(n,1);a = spdiags([ -  2 *在-2 *上4 *上], -  1:1,n,n);b =和(2);

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

x =迷人(A,B);
MINRES在迭代20处停止而不会聚到所需的公差1E-06,因为达到了最大迭代次数。迭代返回(20)相对残差0.017。

默认情况下min使用20个迭代和容忍度1E-6,算法在这20次迭代中无法收敛。因为剩余是1E-2,这是需要更多迭代的良好指示。您还可以降低容忍度,使算法更容易收敛。

用容差再次解系统1E-4和250次迭代。

X =迷人(A,B,1E-4,250);
Minres在迭代200时收敛到一个相对残差为7e-13的解。

检查使用预处理器矩阵的效果min解线性方程组。

创建一个对称的正面确定的带状系数矩阵。

a = delsq(numgrid(“年代”,102));

定义b所以真解是所有1的向量。

b =和(2);

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

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

使用min在要求的容忍度和迭代次数下找到解决方案。指定6个输出以返回关于解决方案流程的信息:

  • X0.算出的解是A * x0 =

  • fl0表示算法是否收敛。

  • rr0是计算答案的残余X0.

  • it0迭代次数是什么时候X0.是计算。

  • RV0.是一个残存的历史向量吗 斧头 - b

  • rvcg0是共轭渐变剩余历史的矢量 一个 T 一个 x - 一个 T b

(x0, fl0 rr0、it0 rv0, rvcg0] = minres (A, b,托尔,麦克斯特);fl0
fl0 = 1
rr0
RR0 = 0.0013.
it0
IT0 = 100.

fl0是1因为min不符合要求的公差1E-12在请求的100次迭代中。

为了帮助收敛,可以指定一个预处理矩阵。自一个是对称的,使用ichol生成预处理器 l l T .指定'ICT'使用具有阈值下降的不完整的Cholesky分解的选项,并指定对角线换档值1E-6避免非阳性枢轴。通过指定解决预处理系统lL '作为输入,min

setup = struct(“类型”'ICT''diagcomp'1 e-6“droptol”1 e-14);L = ichol(设置);(x1, fl1 rr1、it1 rv1, rvcg1] = minres (A, b,托尔,麦克斯特,L, L ');fl1
fl1 = 0
rr1
RR1 = 2.4539E-15
it1
it1 = 4

an的使用ilu预处理剂产生的相对残留小于规定的耐受性1E-12在第四次迭代。输出RV1(1)规范(b)和输出RV1(结束)常态(b-a * x1)

你可以跟着进度min通过绘制每个迭代的相对残差。用指定的公差线绘制每个溶液的残留历史图。

semilogy(0:长度(rv0) 1, rv0 /规范(b),“o”)举行半径(0:长度(RV1)-1,RV1 / NORM(B),“o”) yline(托尔,'r--');传奇(“没有预调节器”“ICHOL预处理”'宽容'“位置”“东”)包含('迭代号') ylabel (“相对残差”

检查供应的效果min对解有一个初步的猜测。

创建一个Tridiacal稀疏矩阵。使用每行的总和作为右侧的向量 斧头 b 所以预期的解决方案 x 是一个1的向量。

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

使用min来解决 斧头 b 两次:有一次默认初始猜测,并且有一次初始猜测解决方案。对两个解决方案使用200次迭代,并将初始猜测指定为带有等万博 尤文图斯于的所有元素的向量0.99

麦克斯特= 200;x1 = minres (A, b,[],麦克斯特);
喇叭喇叭在迭代27以相对残留的9.5E-07溶液聚集在溶液中。
x0 = 0.99 *(大小(A, 2), 1);x2 = minres(麦克斯特,A, b, [] [], [], x0);
Minres在迭代7时收敛到一个相对残差为6.7e-07的解。

在这种情况下,提供初始猜测是可行的min要更快地收敛。

返回中间结果

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

例如,此代码执行了100次迭代,并在For-Loop中的每次传递后存储解决方案向量:

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

x(:,k)是在迭代计算的解决方案矢量kfor循环的R (k)是该解决方案的相对残余。

通过提供解决线性系统min使用计算的功能手柄* x代替系数矩阵一个

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

一个=画廊('威尔克', 21)
一个=21日×2110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 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 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 1 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0⋮

威尔金森矩阵有一个特殊的结构,所以你可以表示这个操作* x使用函数句柄。每一行一个把元素乘进去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(2:21);0];结束

(这个函数在示例的最后保存为一个本地函数。)

现在,解决线性系统 斧头 b 通过提供min使用函数处理来计算* x.使用公差1E-12和50迭代。

1 b = 1(21日);托尔= 1 e-12;麦克斯特= 50;x1 = minres (@afun, b,托尔,麦克斯特)
在迭代11时,Minres收敛到一个相对残差为4.1e-16的解。
x1 =21日×10.0910 0.0990 0.0999 0.1109 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 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.一般来说,一个是一个大型稀疏矩阵或返回大型稀疏矩阵和列向量乘积的函数句柄。您可以使用issymmetric确认一个是对称的。

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

您可以将系数矩阵指定为函数句柄而不是矩阵,以节省计算中的内存。函数句柄返回矩阵向量乘积,而不是形成整个系数矩阵,使计算更有效率。s manbetx 845

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

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

线性方程的右侧,指定为列向量。b必须是长度等于的列向量尺寸(a,1)

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

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

数据类型:双倍的

最大迭代次数,指定为正标量整数。增加价值max允许更多的迭代min满足公差托尔.一般来说,值较小托尔意味着需要更多的迭代才能成功完成计算。

预处理矩阵,指定为矩阵或函数句柄的单独参数。可以指定一个前置条件矩阵或其矩阵因子m = m1 * m2为了改善线性系统的数值方面,使其更容易min快速收敛。你可以用不完全矩阵分解函数iluichol生成预处理器矩阵。你也可以使用平衡在分解之前以改善系数矩阵的条件数。有关预处理者的更多信息,请参阅线性系统的迭代方法

min将未指定的前置数视为单位矩阵。

指定作为功​​能手柄

您可以指定任何一个M1, 或者平方米作为函数处理而不是矩阵,以在计算中保存内存。功能手柄执行矩阵矢量操作,而不是形成整个预处理器矩阵,使得计算更高效率。

要使用函数句柄,请使用函数签名函数y = mfun(x)参数化功能解释了如何为函数提供额外的参数mfun,如有必要。函数调用mfun(x)必须返回值M \ xm2 \(m1 \ x)

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

初始猜测,指定为具有长度等于的列向量尺寸(a,2).如果你能提供min有更合理的初步猜测X0.与默认的零向量相比,它可以节省计算时间,帮助算法更快地收敛。

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

输出参数

全部折叠

线性系统解决方案,作为向量返回。此输出为线性系统提供了近似的解决方案a * x = b.如果计算成功(标志= 0.), 然后relres是小于还是等于托尔

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

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

标志价值

收敛

0

成功——min融合到所需的耐受性托尔max迭代。

1

失败 -min迭代max迭代但没有收敛。

2

失败-预处理矩阵m = m1 * m2没有病理。

3.

失败 -min连续两次迭代后都是相同的。

4

失败-一个标量计算min算法变得太小或太大而无法继续计算。

5

失败 - 预安全矩阵不是对称正定的。

相对残余错误,作为标量返回。相对残差误差是返回答案的准确性指示x是多少。min在解决方案过程中追踪在每个迭代的相对残差和共轭梯度残差,并且该算法会聚任何一个残余符合规定的公差托尔.的relres输出包含收敛残差的值,可以是相对残差,也可以是共轭梯度残差:

  • 相对残差等于规范(b * x) /规范(b)通常是满足公差的残余托尔什么时候min是收敛的。的Resvec.输出跟踪所有迭代中此残留的历史。

  • 共轭梯度残差等于常态(A'* a * x - a'* b).这种剩余原因min收敛比相对残差收敛得更少的Resveccg.输出跟踪所有迭代中此残留的历史。

数据类型:双倍的

迭代号,作为标量返回。此输出表示计算的答案的迭代号x计算了。

数据类型:双倍的

剩余错误,返回为向量。剩余误差规范(b * x)揭示算法如何为给定值融合x.元素的数量Resvec.等于迭代次数。您可以检查的内容Resvec.帮助决定是否更改值托尔max

数据类型:双倍的

共轭梯度剩余规范,返回为矢量。元素的数量Resveccg.等于迭代次数。

数据类型:双倍的

更多关于

全部折叠

最小剩余方法

MINRES和SYMMLQ方法是LANGZOS方法的变体,用于缀合格梯度方法PCG。与PCG一样,系数矩阵仍然需要对称,但MINRES和SYMMLQ允许它是无限期的(并非所有特征值都需要积极)。这是通过避免通常存在于Lanczos方法中的隐式LU分解来实现的,这在用无限矩阵遇到零枢轴时容易被击穿。

MINRES最小化了2-范数中的残差,而SYMMLQ使用LQ分解来解决投影系统,并保持残差与所有之前的残差正交。发展了GMRES方法,将MINRES推广到非对称问题[1]

提示

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

  • 您可以使用矩阵重排序函数,例如解剖Symrcm.将系数矩阵分解为预调节器时,对系数矩阵的行和列进行置换,使非零的数目最小化。这可以减少后续求解预处理线性系统所需的内存和时间。

参考

[1] Barrett,R.,M. Berry,T. F. Chan等人,用于线性系统解决方案的模板:用于迭代方法的构建块, SIAM,费城,1994。

[2] Paige,C. C.和M.A. Saunders,“线性方程稀疏无限系统的解。”暹罗j .号码。肛交。,第12卷,1975年,第617-629页。

扩展能力

之前介绍过的R2006a