数值线性代数初等问题

计算科学 线性求解器 线性系统
2021-12-01 22:19:15

我一直面临解决由离散 PDE(特别是斯托克斯方程)引起的线性系统 Ax=b 的问题。Nively,只要 A 是稀疏的,似乎求解 Ax=b 不应该比简单地将矩阵 A 乘以某个向量 v 花费更多的时间。更具体地说,当对线性 PDE 进行离散化时,最终会得到一个稀疏矩阵 A,其第 i 行包含的非零元素与空间网格中节点 i 的最近邻居一样多,这通常是一个很小的数字。因此,求解这样一个系统似乎需要 O(n) 时间,其中 n 是(方)矩阵 A 的大小。然而,经验表明求解线性系统比执行矩阵乘法成本更高,即使在A 稀疏时的情况。在实践中,我使用在 PETSc 库中实现的 MUMPS 求解器(使用 LU 分解)。我发现当矩阵的大小超过 100,000 左右时,显式解决方案基本上不可行。另一方面,使用 100,000 个浮点数执行简单的算术运算似乎是一项微不足道的任务。我在 MATLAB 中对稀疏矩阵进行实验得出了相同的结论。例如:

A = sprand(100000,100000,0.0001) + speye(100000,100000);

v = 个(100000,1);

现在,将 A 乘以 v 需要 0.02 秒。然而,求解 A\v 需要更多的时间,即使 A 在每行大约有 10 个元素。

解决稀疏系统似乎比执行矩阵向量乘法更难有一个简单的原因吗?有什么解决办法吗?

1个回答

您可以查看 Duff、Erisman 和 Reid 的 Direct Methods for Sparse Matrices(已查看https://epubs.siam.org/doi/abs/10.1137/1031105),但这并不简洁。对于密集线性系统,分析乘法和 linsolve 的成本相对简单;您甚至可以证明 linsolve 的成本等于矩阵-矩阵乘法。这些都是不错的结果。

在稀疏线性代数的情况下,事情就没有那么简单了。您可以证明稀疏矩阵 - DENSE 向量乘法的成本为 O(nnz)。但是当你考虑稀疏矩阵 - 稀疏向量或稀疏矩阵 - 稀疏矩阵乘法时,它变得很棘手,因为现在你必须考虑分配新内存的成本,检查是否可以执行操作可能等于零,因此根本不存储,还有很多其他开销。AijBjkBjk

此外,进行稀疏直接求解的标准方法是使用 LU 分解(或 Cholesky 或 LDLT)。即使矩阵是稀疏的,它的因子也可能不是。我们尝试使用像 COLAMD 这样的保持稀疏性的排列或像 Markowitz 旋转这样的排列来尽可能地保证这一点。这是另一个成本。

许多其他问题,如批处理、缓存未命中、数据移动......在特殊(理想化)硬件上存在一些特殊情况(如带宽较小的带状矩阵),证明解决稀疏线性系统的成本为 O (nnz)。这就对了。