这是一个非常基本的主题,但是提出了许多不同的方法来求解线性方程组。我最近找到了一个非常好的来源,但无法真正理解它包含的所有内容。
如果我只能选择 5 种我应该彻底理解的方法来解决大型线性方程组,它们会是哪一种?每个选择的最重要原因是什么?
即直接方法?gauss-siedel?共轭梯度?...
在此先感谢您的帮助。
这是一个非常基本的主题,但是提出了许多不同的方法来求解线性方程组。我最近找到了一个非常好的来源,但无法真正理解它包含的所有内容。
如果我只能选择 5 种我应该彻底理解的方法来解决大型线性方程组,它们会是哪一种?每个选择的最重要原因是什么?
即直接方法?gauss-siedel?共轭梯度?...
在此先感谢您的帮助。
虽然很容易为您的问题找到次优解决方案,但通常更难(并且取决于问题)提出最优/稳健策略。从这个意义上说,您的问题非常广泛,要给出好的建议,了解您想要解决的问题至关重要。
在下文中,我将假设您谈到稀疏系统,并且您从组装矩阵开始。对于大型密集系统,如果您不能对问题的性质做出非常强有力的假设,我真的不知道您是否有任何选择。
对于稀疏系统,它几乎取决于系统的大小、稀疏性和结构。对于带状系统或多达几万个未知数的中等规模,稀疏直接求解器通常很难被击败。对于更大的系统,Krylov 子空间求解器是标准选择。在这里,您可以分类为对称正定(-> CG)或只是对称(MINRES 等)或根本不是对称的。如果你不能假设对称,那么 GMRES 是一个广泛使用的求解器。但是,由于它的内存需求随着每次迭代而增长,因此您必须在几次迭代后重新启动它(这通常是您可以调整的参数)。虽然从理论上讲,这会让您回到原点,但实际上它在大多数情况下都运行良好。就内存要求而言,另一个流行的选择是 BiCGStab,如果没有很好的预处理,这通常会导致困难。说到非对称系统,很难说哪种方法最好。事实上,文献中有一些例子表明某些方法明显优于其他方法。
除了 SparseLU、CG、MINRES、GMRES 和 BiCGStab 之外,还有很多方法,但如果你至少可以决定是否可以在你的问题上使用 CG 或 MINRES,那么你可能比其他许多人做得更好。
对于迭代方法,为您的问题选择合适的预处理器也很重要。几乎每个工具箱都有一些选择(对角线、不完整的 LU/Cholesky、AMG 变体等),它们在几乎每个工具箱中都实现或接口,但是当以有意义的(或物理感知的)方式完成时,预处理是最有效的。这显然不是一般容易回答的问题。
底线是:如果你不能花太多时间来阅读关于你的问题的好的求解器/预处理器,你有一些通用的选择可供选择。许多人只是尝试了他们使用的软件包中内置的几个求解器,并坚持选择能够提供最佳结果的选择。如果您遵循这种试错策略,您应该准备好等待不必要的长时间来计算您的解决方案。这个网站上有许多很好的问题和答案,如果您决定学习针对您的特定问题的最佳策略将在一段时间后获得回报,可以为您提供进一步的阅读。
正如您已经观察到的,直接与迭代当然是稀疏矩阵线性求解器中的关键问题之一。关于这个话题有很多误解和错误信息。所以我鼓励你从这个角度来处理这个问题,而不是寻找“5 种方法”。
以下是直接方法的主要贡献者之一的精彩介绍:
您可以参考 Saad 教授关于稀疏系统迭代方法的经典著作。在他在明尼苏达大学教授的课程中,他在直接方法和迭代方法上花费了大约相同的时间。他的笔记是信息的金矿。
几年前我对该主题进行了一些研究,我的结论是,如果该技术继续朝着分散计算方向发展(就像它正在做的那样),迭代方法会有一个更有希望的未来。除了直接和迭代方法之外,在使用蒙特卡罗方法求解非常大的矩阵方面也取得了一些进展,但在我看来,最好的选择是使用 Hadoop 实现。下面是我找到的一个 github 项目的链接:
https://github.com/JingenXiang/MatrixInversion
在这里您可以找到有关如何完成的更多详细信息: