密集矩阵两步迭代的预处理

计算科学 线性代数 Python scipy 预处理 密集矩阵
2021-12-16 10:34:23

我想以 python 我认为明确计算的倒数是个好主意。因此,我实现了算子来解决使用 Krylov 方法,如cggmres我正在为操作员使用该类,请参阅此处的文档

L(x):=[γ+[A+12B1]+γ[A12B1]]x=b
BLL(x)=bscipy.sparse.linalg.LinearOperatorB1x由另一个 Krylov 迭代或 LU 分解计算,具体取决于系统大小。

但是,对于更大的问题,我想提高外迭​​代的收敛速度。我既没有稀疏矩阵,也没有矩阵的显式表示。因此,据我所知,像iluJacobi方法这样的 Krylov 方法的经典前置条件不适用。

还有其他可以使用的方法吗?这些方法是否有 python 库?

1个回答

我会尝试通过替换完全规避这个问题。然后你的方程简化为 如果是稀疏的,那么我将首先尝试直接求解,如果失败,我将使用稀疏预处理器应用 GMRES。如果成功,那么您可以使用当前策略x=By

[(γ++γ)AB+12(γ+γ)I]y=b.
ABxy

的属性的任何额外信息对于选择最优解策略至关重要。很高兴知道生成矩阵的物理问题、它们的维度、稀疏模式以及从基础问题继承的任何特殊数学属性。AB

编辑:在桌面上,我想避免使用大的密集矩阵。在更大的并行机器上,我会尝试 ScaLAPACK,因为 LU 分解算法是建立在矩阵-矩阵乘法运算之上的。这是与当今硬件兼容的少数内核之一。它具有高算术强度,因此处理器可以以峰值翻转率的大部分运行。

话虽如此,我还将调查我的密集矩阵是否承认良好的稀疏近似。我会将我的矩阵视为一个向量,并按其绝对值对所有组件进行排序。这将立即揭示绝大多数条目相对于其他条目是否很小。我会通过将所有条目放到合适的阈值以下来为我的密集矩阵构建一个预处理器。