这个问题已经开放了很长时间,但我认为它仍然值得回答。
在单个块上使用 Krylov 空间求解器作为内部预处理器的基本问题是它们不是线性算子。为了理解这一点,让我们用表示通过在线性系统最多次迭代得到的向量作为解或直到达到公差,使用预处理器。换句话说,您可以将视为作用于的运算符。x~=K(A,P,τ,N;b)KAx=bNτP≈A−1Kb
现在注意是一个线性算子:它需要精确求解,即中是线性的。在许多情况下,对从零向量开始的恰好一次迭代运行 Krylov 空间方法也是应用于的线性算子。但是因为 Krylov 向量的序列取决于起始残差K(A,P,0,∞;⋅)Ax=bK(A,P,0,∞;b)=A−1bbbr(0)=b−Ax(0), 运营商K(A,P,τ,N;⋅)通常不是有限的线性算子N和τ.
这意味着如果你使用K(A,P,τ,N;⋅)作为线性系统的预处理器的一部分,其中A是一个块,那么您最终会得到一个不充当线性运算符的预处理器。
这与用于预处理的许多其他方法形成对比:例如,一个 SSOR 步骤是对您应用它的向量的线性运算,所有其他方法都应用一个定点迭代的一个步骤。
现在的基本问题是大多数 Krylov 空间方法确实要求预条件子是线性算子。如果预处理器不是线性的,它们将根本不会收敛,从而解释您的观察。另一方面,有一些 Krylov 空间方法的变体——通常以单词“Flexible”为前缀,例如“Flexible GMRES”中的 F-GMRES——可以解决这个问题,并且可以处理非线性的预处理器运营商。原始方法的这些灵活变体仍然会收敛,并且在与良好(但非线性)的预处理器结合使用时通常是强大的方法。