许多右手边的稀疏线性求解器

计算科学 线性代数 宠物 线性求解器 稀疏矩阵
2021-12-05 02:11:54

我需要解决具有许多右手边(300 到 1000)的相同稀疏线性系统(300x300 到 1000x1000)。除了第一个问题,我还想解决不同的系统,但具有相同的非零元素(只是不同的值),即许多具有恒定稀疏模式的稀疏系统。我的矩阵是不确定的。

分解和初始化的性能并不重要,但求解阶段的性能很重要。目前我正在考虑 PaStiX 或 Umfpack,我可能会使用 Petsc(它支持这两种求解器)是否有库能够利用我的特定需求(矢量化、多线程)或者我应该依赖通用求解器,以及也许根据我的需要稍微修改它们?

如果稀疏矩阵更大怎么办,最多106×106?

3个回答

在不支持是否使用直接求解器或迭代求解器的讨论的情况下,我只想补充两点:

  1. 对于具有多个右手边的系统,存在 Krylov 方法(称为块 Krylov 方法)。作为一个额外的好处,这些通常比标准 Krylov 方法具有更快的收敛速度,因为 Krylov 空间是由更大的向量集合构建的。请参阅Dianne P. O'Leary,块共轭梯度算法和相关方法线性代数及其应用 29 (1980),第 239-322 页。Martin H. Gutknecht,具有多个右手边的线性系统的 Block Krylov 空间方法:介绍(2007 年)。

  2. 如果您有具有相同稀疏模式的不同矩阵,您可以预先计算第一个矩阵的符号分解,该分解可用于计算此矩阵和后续矩阵的数值分解。(在 UMFPACK 中,您可以使用umfpack di symbolic并将结果传递给umfpack_di_numeric.)

通常在为迭代求解器构建良好的预条件器所投入的工作量与在实际求解线性系统时使用良好的预条件器所节省的工作量之间进行权衡。在你的情况下,情况很清楚:尽可能多地投入构建一个好的预处理器,因为你必须解决这么多的线性系统。事实上,我认为花时间来获得完美的预处理器是合适的:LU 分解(例如,使用 UMFPACK,或作为英特尔 MKL 的一部分提供的 Pardiso 求解器)。然后只需根据需要多次应用此分解。如果你有O(N)线性系统要解决,没有什么能比精确的分解更好。

当您谈论“相同的非零元素(只是不同的值)”时,您对问题的陈述不是很清楚您是说矩阵具有恒定的稀疏模式但实际值会发生变化吗?或者,您是说矩阵实际上是恒定的?

假设稀疏矩阵是常数并且只有右侧在变化,那么您应该查看使用直接分解的方法(形式为PA=LU) 的矩阵,然后通过前向/后向替换求解每个右手边。一旦分解完成,每个解决方案都将非常快(O(n2)完全密集因子的时间,但对于稀疏因子,这将与因子中非零的数量成正比。)

对于这种大小的多个右手边和方程组,迭代方法通常不值得。

您提到的所有软件包都提供了直接分解方法(尽管 PetSc 以其迭代求解器而闻名。)但是,您的系统非常小,以至于您不太可能获得显着的并行加速,尤其是在分布式内存环境中。

我建议使用 Umfpack 来完成这项工作——PaStix 和 PetSc 太过分了。