如何选择求解线性方程组的方法

计算科学 线性代数 线性求解器 迭代法
2021-11-27 19:58:10

据我所知,有 4 种方法可以求解线性方程组(如果有更多,请纠正我):

  1. 如果系统矩阵是满秩方阵,可以使用克莱默法则;
  2. 计算系统矩阵的逆或伪逆;
  3. 使用矩阵分解方法(高斯或Gauss-Jordan消除被认为是LU分解);
  4. 使用迭代方法,例如共轭梯度法。

事实上,您几乎从不想通过使用克莱默规则或计算逆或伪逆来求解方程,特别是对于高维矩阵,所以第一个问题是何时分别使用分解方法和迭代方法。我想这取决于系统矩阵的大小和属性。

第二个问题是,据您所知,从数值稳定性和效率的角度来看,哪种分解方法或迭代方法最适合某个系统矩阵。

例如,共轭梯度法用于求解矩阵对称且正定的方程,尽管它也可以通过转换应用于任何线性方程Ax=bATAx=ATb. 同样对于正定矩阵,可以使用 Cholesky 分解法求解。但是不知道什么时候选择CG方法,什么时候选择Cholesky分解。我的感觉是我们最好对大型矩阵使用 CG 方法。

对于矩形矩阵,我们可以使用 QR 分解或 SVD,但我也不知道如何选择其中之一。

对于其他矩阵,我现在不知道如何选择合适的求解器,例如 Hermitian/对称矩阵、稀疏矩阵、带状矩阵等。

3个回答

您的问题有点像根据驱动器(插槽,Phillips,Torx,...)询问选择哪种螺丝刀:除了太多之外,选择还取决于您是要拧紧一个螺丝还是组装一个全套图书馆书架。尽管如此,在部分回答您的问题时,这里有一些您在选择求解线性系统的方法时应牢记的问题一个X=b. 我也会限制自己使用可逆矩阵;系统过度或不足的情况是另一回事,应该是单独的问题。

正如您正确指出的那样,选项 1 和 2 是正确的:计算和应用逆矩阵是一个非常糟糕的主意,因为它比应用其他算法更昂贵并且通常在数值上更不稳定。这使您可以在直接方法和迭代方法之间进行选择。首先要考虑的不是矩阵一个,但是您对数值解的期望X~

  1. 它必须有多准确X~必须解决系统达到机器精度,还是您满意X~满足(说)X~-X*<10-3, 在哪里X*是确切的解决方案吗?
  2. 你需要多这里唯一相关的指标是机器上的时钟时间——如果你没有这些方法,那么在一个巨大的集群上完美扩展的方法可能不是最佳选择,但你确实有一张闪亮的新特斯拉卡。

由于没有免费的午餐,您通常必须在两者之间做出权衡。之后,您开始查看矩阵一个(和你的硬件)来决定一个好的方法(或者更确切地说,你可以找到一个好的实现的方法)。(注意我是如何避免在这里写“最好”的......)这里最相关的属性是

  • 结构一个对称?它是密集的还是稀疏的?带状?
  • 特征值:它们都是正数吗(即,一个肯定的)?它们是集群的吗?其中一些有非常小或非常大的幅度吗?

考虑到这一点,您必须搜索(大量)文献并评估针对特定问题找到的不同方法。以下是一些一般性说明:

  • 如果您的解决方案确实需要(接近)机器精度,或者您的矩阵很小(例如,高达1000行),很难击败直接方法,特别是对于密集系统(因为在这种情况下,每个矩阵乘法都将是(n2),如果你需要大量的迭代,这可能离(n3)一个直接的方法需要)。此外,与大多数迭代方法相反,LU 分解(带旋转)适用于任何可逆矩阵。(当然,如果一个是对称的和正定的,你会使用 Cholesky。)

    如果您没有遇到内存问题,对于(大)稀疏矩阵也是如此:稀疏矩阵通常没有稀疏 LU 分解,如果因子不适合(快速)内存,这些方法将变得不可用。

    此外,直接方法已经存在了很长时间,并且存在非常高质量的软件(例如,用于稀疏矩阵的 UMFPACK、MUMPS、SuperLU),可以自动利用一个.

  • 如果您需要较低的准确性,或者不能使用直接方法,请选择 Krylov 方法(例如,如果一个是对称正定的,如果不是,则为 GMRES 或 BiCGStab)而不是固定方法(例如 Jacobi 或 Gauss-Seidel):这些通常工作得更好,因为它们的收敛不是由光谱半径决定的一个但由(平方根)的条件数和不依赖于矩阵的结构。但是,要从 Krylov 方法中获得真正好的性能,您需要为您的矩阵选择一个好的预处理器 - 这更像是一门手艺而不是一门科学......

  • 如果您反复需要求解具有相同矩阵和不同右手边的线性系统,直接方法仍然比迭代方法更快,因为您只需要计算一次分解。(这假定了顺序解决方案;如果您同时拥有所有右手边,则可以使用块 Krylov 方法。)

当然,这些只是非常粗略的指导方针:对于上述任何陈述,都可能存在一个反之为真的矩阵......

由于您在评论中要求提供参考,因此这里有一些教科书和评论论文可以帮助您入门。(这些 - 也不是集合 - 都不是全面的;这个问题太宽泛了,并且过多地取决于您的特定问题。)

NAG 图书馆手册相关章节第 4 节中的决策树(部分)回答了您的一些问题。

Eigen 库文档也有一个很好的概述页面,其中包含许多关于不同矩阵分解的信息:

http://eigen.tuxfamily.org/dox/group__TopicLinearAlgebraDecompositions.html