主要内容

线性系统的迭代方法

数值线性代数最重要和最常见的应用之一是线性系统的解可以用这种形式表示A*x=b.当一个是一个大型稀疏矩阵,可以使用迭代方法求解线性系统,这使您能够在计算的运行时间和解的精度之间进行权衡。本主题介绍MATLAB中可用的迭代方法®解方程A*x=b

直接法与迭代法

求解线性方程组有两种方法A*x=b

  • 直接的方法是高斯消去法的变体。这些方法通过矩阵运算(如LU、QR或Cholesky分解)直接使用单个矩阵元素。您可以使用直接方法以高精度求解线性方程组,但在处理大型稀疏矩阵时,这些方法可能会变慢。求解直线的速度采用直接法的ar系统强烈依赖于系数矩阵的密度和填充模式。

    例如,此代码求解一个小型线性系统。

    A=幻数(5);b=和(A,2);x=A\b;范数(A*x-b)
    ans = 1.4211 e-14

    MATLAB通过矩阵除法算子实现直接方法/,以及诸如分解lsqminorm,及符号解法

  • 迭代的方法在有限步数后,生成线性系统的近似解。这些方法对于大型方程组非常有用,因为在这些方程组中,为了缩短运行时间而牺牲精度是合理的。迭代方法仅通过矩阵向量积或抽象线性算子间接使用系数矩阵。迭代方法可以用于任何矩阵,但它们通常适用于直接求解速度较慢的大型稀疏矩阵。与直接法相比,用间接法求解线性系统的速度对系数矩阵填充模式的依赖性不强。但是,使用迭代方法通常需要针对每个特定问题调整参数。

    例如,这段代码解决了一个具有对称正定系数矩阵的大型稀疏线性系统。

    一个= delsq (numgrid (“我,400)); b=一(尺寸(A,1),1);x=pcg(A,b,[],1000);范数(b-A*x)
    pcg在迭代796收敛到一个相对残差为9.9e-07的解。ans=3.4285e-04

    MATLAB实现了各种迭代方法,根据系数矩阵的属性,这些方法具有不同的优缺点一个

如果有足够的存储空间,直接方法通常比间接方法更快,更普遍适用。一般情况下,您应该尝试使用x = A \ b第一。如果直接求解太慢,那么你可以尝试使用迭代方法。

通用迭代算法

求解线性方程组的大多数迭代算法遵循类似的过程:

  1. 从解向量的初始猜测开始x0.(这通常是一个零向量,除非你指定一个更好的猜测。)

  2. 计算剩余范数res =规范(b * x0)

  3. 将残余量与规定的公差进行比较。如果res<=tol,结束计算并返回的计算答案x0

  4. 应用A * x0并更新向量的大小和方向x0根据剩余的价值和其他计算的数量。这是完成大多数计算的步骤。

  5. 重复步骤2到步骤4,直到x0是足以满足宽容的。

迭代方法的不同之处在于它们如何更新数据的大小和方向x0在第4步中,有些人在第2步和第3步中的收敛标准略有不同,但这抓住了所有迭代解算器遵循的基本过程。

迭代方法综述

MATLAB有几个函数可以实现线性方程组的迭代方法。这些方法旨在解决一个xb或者最小化范数||b- - - - - -一个x||.其中一些方法有相似之处,并且基于相同的底层算法,但每种算法在某些情况下都有好处[1][2]

描述

笔记

pcg(条件共轭梯度)

  • 系数矩阵必须是对称正定的。

  • 对称正定系统最有效的求解器,因为只需要存储有限数量的向量。

最小二乘QR分解算法(最小二乘法)

  • 直角方程组的唯一解算器。

  • 解析等价于应用于正规方程组的共轭梯度法(PCG)(*) * x = A的b *

minres(最小剩余)

  • 系数矩阵必须是对称的,但不必是正定的。

  • 每次迭代都使2-范数中的剩余误差最小化,因此保证了算法能够一步一步地进行。

  • 不会出现故障(当算法无法向解决方案前进并停止时)。

symmlq(对称LQ)

  • 系数矩阵必须是对称的,但不必是正定的。

  • 解决一个投影系统,并保持残差与所有先前的正交。

  • 不会出现故障(当算法无法向解决方案前进并停止时)。

bicg(双共轭梯度)

  • 系数矩阵必须是平方的。

  • bicg在计算上是便宜的,但是收敛是不规则和不可靠的。

  • bicg在历史上很重要,因为许多其他迭代算法都是在它的基础上发展起来的。

bicgstab(双共轭梯度稳定)

  • 系数矩阵必须是平方的。

  • 使用BiCG步与GMRES(1)步交替使用,以提高稳定性。

bicgstabl(双共轭梯度稳定(l))

  • 系数矩阵必须是平方的。

  • 使用BiCG步骤与GMRES(2)步骤交替,以增加稳定性。

研究生院理事会(共轭梯度平方)

  • 系数矩阵必须是平方的。

  • 每次迭代所需的操作数与bicg,但通过使用平方残差避免使用转置。

巨磁电阻(广义最小残差)

  • 系数矩阵必须是平方的。

  • 最可靠的算法之一,因为残差范数在每次迭代中都是最小的。

  • 工作量和所需存储随迭代次数线性增加。

  • 选择一个合适的重新启动价值是避免不必要的工作和储存必不可少的。

qmr(拟最小残差)

  • 系数矩阵必须是平方的。

  • 每次迭代的开销略高于bicg,但这提供了更多的稳定性。

tfqmr(transpose-free quasi-minimal剩余)

  • 系数矩阵必须是平方的。

  • 当内存有限时,尝试对称不定系统的最佳解算器。

选择迭代求解器

MATLAB中迭代求解器的流程图给出了每个求解器有用的大致情况。您通常可以使用巨磁电阻对于几乎所有的平方非对称问题。在某些情况下,双共轭梯度算法(bicgbicgstab研究生院理事会等等)比巨磁电阻,但它们不可预测的收敛行为往往会导致巨磁电阻一个更好的初始选择。

为给定问题选择合适的迭代求解器的工作流程。

预调节器

迭代法的收敛速度依赖于系数矩阵的谱(特征值)。因此,通过将线性系统转换为更有利的谱(聚类特征值或1附近的条件数),可以提高大多数迭代方法的收敛性和稳定性。这种转换是通过应用第二个矩阵a来实现的预调节器,给系统。这个过程转换了线性系统

一个 x b

转化为等效系统

一个 ˜ x ˜ b ˜

理想预调节器对系数矩阵进行变换一个转化为单位矩阵,因为任何迭代方法在有这样一个前置条件的一次迭代中都会收敛。在实践中,找到一个好的预调节器需要权衡。转换以三种方式之一进行:左预处理、右预处理或分裂预处理。

第一种情况叫做离开了预处理由于预条件矩阵出现在。的左边一个

1 一个 x 1 b

这些迭代解算器使用左预处理:

正确的预处理出现在…的右边一个

一个 1 x b

这些迭代求解器使用了正确的预处理:

最后,对于对称系数矩阵一个分割预处理确保转换后的系统仍然是对称的 H H T 获取拆分,并且因子显示在一个

H 1 一个 H T H T x H 1 b

分裂预条件系统的求解算法是基于上述方程,但在实际应用中不需要计算H。解算器算法乘以直接。

这些迭代解算器使用分割预处理:

在所有情况下,都是前置条件,以加速迭代法的收敛。当迭代解决方案的残余误差在迭代之间停滞不前或进展甚微时,这通常意味着您需要生成一个预处理矩阵来合并到问题中。

MATLAB中的迭代求解器允许您指定单个预条件器矩阵,或两个预条件矩阵因子12.这使得以因式分解的形式指定前置条件变得很容易,例如lU. 注意,在拆分预处理的情况下,其中HHT也认为,两者之间没有关系M1平方米输入和H因素。

在某些情况下,预置条件在给定问题的数学模型中很自然地出现。在没有自然预因子的情况下,您可以使用该表中的一个不完全分解来生成预因子矩阵。不完全因子分解本质上是不完全的直接解,计算起来很快。

作用 因式分解 描述
伊鲁

一个

方形或矩形矩阵的不完全LU分解。
ichol

一个 l l

对称正定矩阵的不完全Cholesky分解。

看到不完全分解有关伊鲁ichol

预调节器的例子

考虑拉普拉斯方程在二维方域上的五点有限差分近似。下面的命令使用带有预处理因子的预处理共轭梯度法M = L * L ',在那里l的零填充不完全Cholesky因子一个.对于这个系统,pcg不能在不指定预处理矩阵的情况下找到解。

一个= delsq (numgrid (“年代”, 250));b = 1(大小(A, 1), 1);托尔= 1 e - 3;麦克斯特= 100;L = ichol(一个);x = pcg (A, b,托尔,麦克斯特,L, L ');
pcg在迭代92收敛到相对残差为0.00076的解。

pcg需要92次迭代才能达到指定的公差。但是,使用不同的预处理程序可以产生更好的结果。例如,使用ichol构造修改的不完全Cholesky允许pcg仅在39次迭代后满足规定公差。

L=ichol(A,结构(“类型”“nofill”“michol”“上”));x=pcg(A,b,tol,maxit,L,L');
PCG在迭代39时收敛到一个相对残差为0.00098的解。

平衡和重新排序

对于计算困难的问题,您可能需要一个比由伊鲁ichol直接。例如,您可能希望生成一个质量更好的预处理程序或最小化正在进行的计算量。在这些情况下,您可以使用平衡使系数矩阵对角占优(可以得到更好的预处理器)重新排序最小化矩阵因子中的非零数(这可以减少内存需求,并可能提高后续计算的效率)。

如果你同时使用平衡和重新排序来生成一个预处理程序,过程是:

  1. 使用平衡关于系数矩阵。

  2. 使用稀疏矩阵重排函数对平衡矩阵重新排序,例如解剖symrcm

  3. 使用伊鲁ichol

下面是一个使用平衡和重新排序来生成稀疏系数矩阵的预调节器的例子。

  1. 创建系数矩阵一个和一个1的向量b对于线性方程的右边。计算条件数的估计一个

    负载west0479;一个= west0479;b = 1(大小(A, 1), 1);康德(A)
    ans=1.4244e+12

    使用平衡改进了系数矩阵的条件数。

    [P,R,C]=平衡态(A);重新=R*P*A*C;b新=R*P*b;冷凝(重新)
    ans=5.1042e+04
  2. 重新排列平衡矩阵使用解剖

    q=解剖(重新);重新=重新(q,q);B新=B新(q);
  3. 使用不完全逻辑单元分解生成预处理程序。

    [L U] = ilu(重新);
  4. 求解线性方程组巨磁电阻使用预条件矩阵,公差为1平台以及,最大外部迭代次数为50次,内部迭代次数为30次。

    托尔= 1平台以及;麦克斯特= 50;重启= 30;[xnew, flag, relres] = gmres(new,bnew,restart,tol,maxit,L,U);x (q) = xnew;x = C * x (:);

    现在,比较一下relres返回的相对残差巨磁电阻(包括预处理子)到没有预处理子的相对残差新的和不平衡的相对剩余量res结果表明,即使线性系统都是等价的,但不同的方法对每个元素应用不同的权重,这会显著影响残差的值。

    reres renew = norm(new*xnew - bnew) / norm(bnew) res = norm(A*x - b) / norm(b)
    Relres = 8.7537e-11 resnew = 3.6805e-08 res = 5.1415e-04

用线性运算符代替矩阵

MATLAB中的迭代求解器不支持需要你提供了一个数值矩阵一个.因为求解器执行的计算使用矩阵向量乘法的结果A*x‘* x,您可以提供一个函数来计算这些线性操作的结果。计算这些量的函数通常称为A线性算子

除了用线性算子代替系数矩阵一个,也可以使用线性运算符而不是矩阵作为预条件器.在这种情况下,函数需要计算M \ xM ' \ x,如解算器参考页上所示。

使用线性运算符可以利用一个与解算器显式使用矩阵执行完整矩阵向量乘法相比,更高效地计算线性运算的值。这也意味着您不需要内存来存储系数或预处理矩阵,因为线性运算符通常计算矩阵向量乘法的结果n而根本不形成矩阵。

例如,考虑系数矩阵

A = [2 -1 0 0 0 0;1 2 1 0 0 0;0 -1 2 -1 0 0;0 0 -1 2 -1 0;0 0 0 -1 2 -1;0 0 0 1 2];

一个乘以一个向量,得到的向量中的大多数元素都是零。结果中的非零元素与向量中的非零三对角元素相对应一个. 对于给定的向量x,线性算子函数只需将三个向量相加即可计算出A*x

函数y=linearPropertora(x)y=-1*[0;x(1:end-1)]…+2*x…+-1*[x(2:end);0];结束

大多数迭代求解器都要求线性算子函数一个返回的值A*x.同样地,对于预处理矩阵,函数通常必须计算M \ x.为解决最小二乘QR分解算法qmr,及bicg,线性运算符函数还必须返回‘* xM ' \ x应要求。有关线性运算符函数的示例和说明,请参见迭代解算器参考页。

工具书类

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

[2]萨阿德,尤瑟夫稀疏线性方程的迭代方法.出版公司,1996。

相关话题