主要内容

线性系统的迭代方法

数值线性代数最重要和共同的应用之一是可以以形式表示的线性系统的解决方案a * x = b。什么时候A.是一个大的稀疏矩阵,可以使用迭代方法解决线性系统,使您可以在计算的运行时间和解决方案的精度之间进行权衡。本主题介绍MATLAB中可用的迭代方法®解决方程a * x = b

直接与迭代方法

求解线性方程有两种类型的方法a * x = b

  • 直接方法是高斯消除的变体。这些方法直接使用单个矩阵元素,通过矩阵操作,例如LU,QR或Cholesky分解。您可以使用直接方法来解决具有高精度水平的线性方程,但在大稀疏矩阵上运行时,这些方法可能会慢。用直接方法求解线性系统的速度强烈取决于系数矩阵的密度和填充图案。

    例如,该代码解决了一个小的线性系统。

    a =魔术(5);b = sum(a,2);x = a \ b;常态(A * X-B)
    ans = 1.4211e-14

    Matlab通过矩阵分割运算符实现直接方法/\以及诸如此类的功能分解lsqminnorm.,和Linsolve.

  • 迭代方法在有限的步骤之后为线性系统产生近似解决方案。这些方法对于大型方程式有用,在那里可以合理地对较短的运行时间进行权衡精度。迭代方法仅通过矩阵矢量产品或抽象线性操作员间接地使用系数矩阵。可以与任何矩阵一起使用迭代方法,但它们通常应用于大稀疏矩阵,用于直接求解速度。用间接方法求解线性系统的速度不依赖于系数矩阵的填充图案作为直接方法。然而,使用迭代方法通常需要调整每个特定问题的参数。

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

    a = delsq(numgrid('L',400));b =α(大小(a,1),1);x = PCG(A,B,[],1000);常态(B-A * x)
    PCG将迭代796融合到具有相对残留的9.9E-07的溶液。ans = 3.4285e-04

    Matlab实现了各种迭代方法,这取决于系数矩阵的性质的不同优点和缺点A.

如果有足够的存储可用以将它们输出,直接方法通常比间接方法更快更普遍适用。一般来说,您应该尝试使用x = a \ b首先。如果直接解决太慢,那么您可以尝试使用迭代方法。

通用迭代算法

解决线性方程的最迭代算法遵循类似的过程:

  1. 从初始猜测开始解决方案矢量X0.。(这通常是零的向量,除非您指定更好的猜测。)

  2. 计算残余标准RES = NOM(B-A * X0)

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

  4. 申请a * x0.并更新向量的幅度和方向X0.基于残差和其他计算量的值。这是大多数计算完成的步骤。

  5. 重复步骤2到4,直到值X0.足以满足容忍度。

迭代方法在他们如何更新的幅度和方向的不同之处X0.在步骤4中,有些在步骤2和3中具有略微不同的收敛标准,但这捕获了所有迭代求解器遵循的基本过程。

迭代方法综述

MATLAB有几种功能,可以实现线性方程系统的迭代方法。这些方法旨在解决A.X.=B.或最小化常态||B.-A.X.||。这些方法中的几种具有相似之处,并且基于相同的底层算法,但是每个算法在某些情况下都有益处[1][2]

描述

注意事项

PCG.(预处理的共轭梯度)

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

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

LSQR.(最小二乘)

  • 矩形系统可用的唯一求解器。

  • 分析等同于应用于正常方程的共轭梯度(PCG)的方法('* a)* x = a'* b

min(最小剩余)

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

  • 每次迭代最小化2-NOM中的剩余误差,因此算法保证从步骤到步骤进行进度。

  • 不遭受故障(当算法无法朝向解决方案和停止时)。

symmlq.(对称LQ)

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

  • 解决了一个投影系统,并将残留正交与以前的系统。

  • 不遭受故障(当算法无法朝向解决方案和停止时)。

BICG.(Biconjugate渐变)

  • 系数矩阵必须是正方形。

  • BICG.是计算方式便宜,但收敛不规则和不可靠。

  • BICG.历史上很重要,因为许多其他迭代算法被开发为它的改进。

Bicgstab.(Biconjugate梯度稳定)

  • 系数矩阵必须是正方形。

  • 使用BICG步骤与GMRES交替交替(1)步骤以获得额外的稳定性。

BICGSTABL.(Biconjugate梯度稳定(L))

  • 系数矩阵必须是正方形。

  • 使用BICG步骤与GMRES交替(2)步骤进行额外稳定性。

CGS.(共轭梯度平方)

  • 系数矩阵必须是正方形。

  • 每次迭代需要相同数量的操作BICG.,但避免使用平方残留的转置。

GMRES.(广义最低剩余)

  • 系数矩阵必须是正方形。

  • 其中一个最可靠的算法,因为在每次迭代中最小化残差规范。

  • 使用迭代计数线性工作和所需的存储。

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

QMR.(准剩余剩余)

  • 系数矩阵必须是正方形。

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

TFQMR.(无转置的准剩余残余)

  • 系数矩阵必须是正方形。

  • 最佳求解器,以尝试当内存有限时对称无限系统。

选择迭代求解器

Matlab中的迭代求解器的这种流程图给出了每个求解器有用的情况的粗略概念。你通常可以使用GMRES.几乎所有广场,非对称问题。Biconjugate梯度算法有一些情况(BICG.Bicgstab.CGS.等等)比效率更高GMRES.,但他们不可预测的收敛行为通常会产生GMRES.更好的初始选择。

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

预处理者

迭代方法的收敛速率取决于系数矩阵的光谱(特征值)。因此,您可以通过将线性系统转换为具有更有利的频谱(聚类特征值或附近的条件号)来改善大多数迭代方法的收敛性和稳定性。通过应用第二个矩阵来执行该转换,称为a预处理器,系统。该过程转换了线性系统

A. X. = B.

进入等同的系统

A. X. = B.

理想的预处理器转换系数矩阵A.进入身份矩阵,由于任何迭代方法将与这种预处理器的一次迭代收敛。在实践中,找到一个好的预处理者需要权衡。转换以三种方式之一执行:左侧预处理,右预处理或分割预处理。

第一个案例被称为离开预处理由于预处理器矩阵m出现在左边A.

m - 1 A. X. = m - 1 B.

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

in.右预处理m出现在右边A.

A. m - 1 m X. = B.

这些迭代求解器使用右预处理:

最后,对于对称系数矩阵A.分裂预处理确保转换系统仍然对称。预处理器 m = H. H. T. 拆分,因素出现在不同的两侧A.

H. - 1 A. H. - T. H. T. X. = H. - 1 B.

拆分后台系统的求解器算法基于上述等式,但实际上没有必要计算H.。求解器算法乘以和解决m直接。

这些迭代求解器使用分裂预处理:

在所有情况下,预处理器m选择加速迭代方法的收敛。当迭代解决方案的剩余错误停止或在迭代之间进行了很少的进展时,通常意味着您需要生成一个预处理器矩阵以结合到问题中。

MATLAB中的迭代求解器允许您指定单个预处理器矩阵m或两个预处理器矩阵因子,使其如此m=m1m2。这使得简单地以其分解形式指定预处理器,例如m=L.。请注意,在拆分预处理情况下,在哪里m=H.H.T.也持有,没有关系M1M2投入和意见H.因素。

在某些情况下,预处理者在给定问题的数学模型中自然发生。在没有自然的预处理器的情况下,您可以使用该表中的一个不完整的分解构件之一来生成预处理器矩阵。不完全的因子基本上是不完整的直接解决,即快速计算。

功能 分解 描述
ilu

A.

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

A. L. L. *

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

不完全的因素有关的更多信息iluichol.

预处理者例子

将五点有限差分近似为LAPPALL在正方形,二维域上的等式。以下命令用预处理器使用预处理的共轭梯度(PCG)方法m = l * l',在哪里L.是零填充不完整的弦系因子A.。对于这个系统,PCG.在不指定前提条件矩阵的情况下无法找到解决方案。

a = delsq(numgrid(',250));b =α(大小(a,1),1);tol = 1e-3;maxit = 100;l = iChol(a);x = PCG(a,b,tol,maxit,l,l');
PCG在迭代92融合到具有相对残留的0.00076的溶液。

PCG.需要92个迭代来实现指定的公差。但是,使用不同的预处理器可以产生更好的结果。例如,使用ichol.构建修改后的不完整的Cholesky允许PCG.仅在39次迭代后满足指定的公差。

l = iChol(a,struct('类型''nofill''michol''开'));x = PCG(a,b,tol,maxit,l,l');
PCG将迭代39收敛到具有相对残留的0.00098的溶液。

平衡和重新排序

对于计算棘手的问题,您可能需要更好的预处理器而不是由生成的持续矛盾者ilu或者ichol.直接。例如,您可能希望生成更好的质量预处理器或最小化正在完成的计算量。在这些情况下,您可以使用平衡使系数矩阵更加对角占主导地位(这可能导致更好的质量预处理器)和重新排序为了最小化矩阵因子中的非安利斯数量(这可以降低内存要求,并可以提高后续计算的效率)。

如果使用平衡和重新排序以生成预处理器,则该过程是:

  1. 使用平衡在系数矩阵上。

  2. 使用稀疏矩阵重新排序功能重新排序平衡矩阵,例如解剖或者Symrcm.

  3. 使用最终的预处理器使用ilu或者ichol.

以下是一个使用平衡和重新排序以生成用于稀疏系数矩阵的预处理器的示例。

  1. 创建系数矩阵A.和一个矢量B.对于线性方程的右侧。计算条件号的估计A.

    加载West0479.;A = West0479;b =α(大小(a,1),1);恩誉(a)
    ans = 1.4244e + 12

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

    [p,r,c] =平衡(a);自身= r * p * a * c;bnew = r * p * b;恩惠(重新)
    ans = 5.1042e + 04
  2. 使用重新排序平衡矩阵解剖

    q =解剖(重新);自述=重新(q,q);bnew = bnew(q);
  3. 使用不完整的LU分解生成预处理器。

    [l,u] = ilu(重新);
  4. 解决线性系统GMRES.使用预处理器矩阵,容忍1E-10,50个最大外部迭代和30个内部迭代。

    tol = 1e-10;maxit = 50;重启= 30;[Xnew,Flag,Relres] = GMRES(重新,BNew,Restart,Tol,Maxit,L,U);x(q)= xnew;x = c * x(:);

    现在,比较相对残留返回GMRES.(包括预处理器)到没有预处理者的相对残差夺回和无需平衡的相对残差res.。结果表明,即使线性系统都是等效的,不同的方法也适用于每个元素的不同权重,这可以显着影响残差的值。

    RERRES RESNEW = NORM(简单* XNEW  -  BNEW)/ NORM(BNEW)RES = NOM(a * x  -  b)/ norm(b)
    Relres = 8.7537E-11 Resnew = 3.6805E-08 Res = 5.1415e-04

使用线性运算符而不是矩阵

Matlab中的迭代溶剂不会要求您提供了一个数字矩阵A.。由于求解器执行的计算使用矩阵矢量乘法的结果a * x.或者A'* x,您可以改为提供一个计算这些线性操作结果的函数。计算这些数量的函数通常被称为a线性运营商

除了使用线性运算符而不是系数矩阵A.,您还可以使用线性运算符而不是预处理程序的矩阵m。在这种情况下,该功能需要计算m \ x.或者m'\ x,如解决方案的参考页面所示。

使用线性运算符使您能够利用模式A.或者m为了更有效地计算线性操作的值,而不是如果求解器明确地使用矩阵来执行完整的矩阵矢量乘法。这也意味着您不需要存储系数或预处理器矩阵的存储器,因为线性操作员通常计算矩阵矢量乘法的结果而不形成矩阵。

例如,考虑系数矩阵

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 0 -1 2];

什么时候A.乘以向量,得到的矢量中的大多数元素是零。结果中的非零元素对应于非零三角形元素A.。所以,对于给定的向量X.,线性操作员功能只需添加三个向量来计算值a * x.

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

大多数迭代求解器需要线性操作员功能A.返回价值a * x.。同样,对于前提者矩阵m,该功能一般必须计算m \ x.。对于求解器LSQR.QMR.,和BICG.,线性操作员功能也必须返回值A'* x或者m'\ x当请求时。有关线性操作员功能的示例和描述,请参阅迭代求解器参考页面。

参考资料

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

[2] Saad,Yousef,稀疏线性方程的迭代方法。PWS出版公司,1996年。

相关主题