求解大型稠密正定线性系统

计算科学 线性求解器 密集矩阵 半定规划
2021-12-01 17:16:01

我应该选择哪种方法来求解大型(约 20 000 个变量)密集对称正定、可能病态的线性方程组?该系统将求解两个向量。我对性能和数值准确性都感兴趣,因此我正在寻找可能的解决方案来选择最佳折衷方案。我想将它用作 OCTAVE/MATLAB 下专用 SDP 求解器的一部分,因此很可能它将被实现为带有单线程的 mex 文件。

编辑:感谢您的回复。我的意思是一个优化求解器,采用原始对偶内点法。在我的情况下,双重解决方案总是可行的,而且密集(我的意思是双重解决方案不是块对角线)。

EDIT2:我编写 SDP 求解器的原因是我想尝试获得一个更有效的工具来解决大型 NPA 问题(http://arxiv.org/abs/0803.4290)。这种情况允许一些简化,内部总是非空的,我可以找到一个好的初始对偶可行解(并因此保持这种可行性),并且该结构允许更容易地创建 dy 方程。问题是这个方程对于这些问题来说很大。

我尝试使用 SeDuMi 和 SDPT3,后者能够运行更大的程序。对于大型我得到的 SDPT3 错误说“舒尔补矩阵不是正定的”意味着 Cholesky 分解失败。

EDIT3:我观察到,通过这个热启动,解决程序需要大约 3-4 次迭代。问题是 Cholesky 对大型 Schur 补矩阵的失败。在这种情况下,它是完全密集的,但在最后一次迭代附近,它变得非常糟糕。这就是为什么我正在寻找一种能够解决它的方法。

EDIT4:感谢您的回复。我将尝试与 Cholesky 一起旋转。你推荐任何在 OCTAVE 下工作的包来完成这个任务吗?

2个回答

在双精度下,包含 20,000 个变量的 20,000 个方程的系统将需要 3.2 GB 的 RAM 来存储矩阵。按照当代标准,这并不“大”,并且在实践中相当容易解决。

为了让它运行得更快,您需要使用经过良好调整的线性代数库。此类工作的标准是使用 LAPACK 和 BLAS 例程,以及经过良好调整的多线程实现 BLAS。您将使用 LAPACK 中的 Cholesky 分解例程来计算 Cholesky 分解,然后使用其他 LAPACK 例程进行正向和反向求解。

在 MATLAB 环境中,最好的办法是搭载 MATLAB。Mathworks 为 MATLAB 提供高效的 BLAS/LAPACK 例程并处理任何许可问题。您可以从 MEX 例程中调用这些例程。

在 Octave 中,您应该希望安装 Octave 时附带一个良好的多线程 BLAS。尽管它们不如 Intel 的 MKL 或 AMD 的 ACML 库(它们不是开源的)那么好,但是有包括 Openblas 和 ATLAS 在内的开源替代品。

如果您正在为 SDP 实现原始对偶内点法,您应该知道需要一些特殊技巧才能使 Cholesky 分解工作良好。您还应该知道,在许多情况下,方程组实际上并不密集,因此值得使用稀疏的 Cholesky 因式分解例程。

如果矩阵是对称且正定的,则​​共轭梯度法是可证明最快的迭代法,需要O(κ)迭代收敛。根据您的矩阵的条件恶劣程度,这可能比使用像Cholesky 分解这样的直接方法来解决您的系统更有利。您可能需要某种预处理器,其选择取决于您的问题的性质。

一个 20,000 x 20,000 的密集矩阵越来越接近 32 位机器可以处理的极限。仅存储该矩阵将需要 3.2 GB 内存。许多迭代方法所需要的只是能够计算矩阵向量积Ax; 对于某些问题,这可以在不显式创建矩阵的情况下完成A逐项进入。如果你能够为你的问题做到这一点,我认为它会大大加快速度。

如果做不到这一点,我认为如果你想要良好的性能,你将需要使用多线程和优化的 BLAS/LAPACK 实现,如ATLAS 。您可能还想查看Elemental库,它执行分布式密集线性代数并具有 C 接口。