例如,在 MUMPS 中,可以选择缩放矩阵,所有行/列都具有相同的范数。这声称可以减少条件数并改善矩阵的数值属性:ftp: //cuter.rl.ac.uk/pub/reports/adruRAL2008013.pdf
谁能解释它是否可以用作预处理器以及它的效率如何?
例如,在 MUMPS 中,可以选择缩放矩阵,所有行/列都具有相同的范数。这声称可以减少条件数并改善矩阵的数值属性:ftp: //cuter.rl.ac.uk/pub/reports/adruRAL2008013.pdf
谁能解释它是否可以用作预处理器以及它的效率如何?
大多数预处理器在内部有效地进行了这种缩放。Jacobi 缩放以将 1 放在对角线上(或绝对行总和为 1)。当使用更复杂的预处理器时,缩放更重要,例如几何多重网格或基于近似舒尔补的预处理器(其中矩阵条目不可用于代数缩放)。此外,即使预处理器纠正了缩放比例,未预处理的范数(和非线性残差)仍然会产生误导。
对于分解,在开始分解之前应用前缩放和后缩放可能有助于数值稳定性。您可以对迭代求解执行相同的操作,但与执行很多操作的直接求解器相比,它相对更昂贵(因为缩放 - 如果您想检查最终残差,则稍后取消缩放 - 类似于迭代的成本)更多的工作。这种缩放也使得难以使用“基于物理的”预处理器。
只要有可能,我建议您将最初的问题制定为可以很好地扩展。如果这是不可能的,或者您想尝试将线性代数应用于遗留应用程序,在该应用程序中需要花费大量精力才能正确扩展,那么扩展是一个有用的工具。
稀疏直接 LU 因式分解包(如 MUMPS 等)涉及将大型条目缩放和置换到对角线上的预处理步骤的主要原因是,它通常减少了因式分解中所需的动态旋转操作的数量。
当旋转仅限于对角线(或超节点意义上的对角线块)时,可以对分解执行静态符号分析作为初始化步骤。一般来说,这通常更快,但对于并行实现尤其重要——查看这篇讨论并行含义的 SuperLU 论文。