用于解决大型线性系统使用迭代方法,引入预处理通常很有趣,例如求解, 在哪里在这里用于系统的左预处理。通常,我们应该有与原始系统的解决方案(即当)。但是,我们应该使用哪些准则来选择预处理器?从业者如何针对他们的具体问题做到这一点?
在为特定问题寻找良好的预处理方法时,我应该使用哪些指南?
我原本不想给出答案,因为这值得很长时间的处理,希望其他人仍然会给出它。但是,我当然可以对推荐的方法进行一个非常简短的概述:
- 进行彻底的文献检索。
- 如果失败了,尝试每一个有意义的预处理器,你可以得到你的手。MATLAB、PETSc 和 Trilinos 是很好的环境。
- 如果失败了,你应该仔细考虑你的问题的物理原理,看看是否有可能想出一个便宜的近似解决方案,甚至可能是你问题的一个稍微改变的版本。
3 的例子是亥姆霍兹的位移拉普拉斯版本,以及Jinchao Xu最近关于用拉普拉斯算子预处理双谐波算子的工作。
其他人已经评论过预处理我称之为“单片”矩阵的问题,例如,标量方程的离散形式,如拉普拉斯方程、亥姆霍兹方程,或者,如果你想推广它,向量值弹性方程。对于这些事情,很明显,如果方程是椭圆的,多重网格(代数或几何)是赢家,而对于其他方程则不是很清楚——但像 SSOR 这样的东西通常工作得相当好(对于某些含义“合理的”)。
对我来说,最大的启示是如何处理非单一问题,例如斯托克斯算子
取而代之的是最初被称为“基于物理的预处理器”的东西,后来被简单地(也许更准确地)称为“块预处理器”,如 Silvester 和 Wathen 所提出的。这些通常基于块消除或 Schur 补码,其想法是构建一个预处理器,以便可以将预处理器重用于已知工作良好的单个块。例如,在 Stokes 方程的情况下,Silvester/Wathen 预条件子使用矩阵
这种使用构成矩阵的各个块并在各个块上重新使用预处理器的想法已被证明是非常强大的,并且已经完全改变了我们今天对预处理方程组的看法。当然,这是相关的,因为大多数实际问题实际上都是方程组。
Jack 给出了一个很好的程序来找到一个预处理器。我将尝试解决这个问题,“什么是好的预处理器?”。操作定义为:
Preconditioner M 加速了, 和与.
然而,这并没有让我们对设计预调节器有任何了解。大多数预调节器是基于对操作符谱的操纵。通常,当特征值被聚类时,Krylov 方法收敛得更快,请参阅矩阵迭代或亚纯函数和线性代数。有时我们可以证明预处理器的结果只是一些唯一的特征值,例如A Note on Preconditioning for Indefinite Linear Systems。
Multigrid 举例说明了一种常见的策略。诸如 SOR 之类的松弛预处理器(这里是平滑器)会去除误差中的高频分量。当残差投影到粗网格上时,较低频率的误差分量变为较高频率,并可能再次受到 SOR 的攻击。这种基本策略是更复杂的 MG 版本(例如 AMG)的基础。请注意,在底部,求解器必须准确解决误差中的最低频率。
另一种策略涉及在小子空间中求解方程,这正是 Krylov 求解器正在做的事情。在最简单的形式中,这是Kaczmarz 方法或Additive Schwarz 方法。这里的高级理论应变,域分解,集中于界面误差的光谱近似,因为域被假定为相当准确地求解。
然后有一堆东西生产运营商接近是某种意义上的,这很容易反转,但据我所知,不能保证实际改善 Krylov 迭代的收敛性。这些预处理器包括不完全分解(ICC、ILU)、稀疏近似逆(SPAI)和一些低秩近似。