针对小问题的线性求解器推荐

计算科学 线性代数 数字 线性求解器
2021-12-23 15:51:40

我有兴趣解决许多线性系统,其中是对称正定且(即少于 25,000 行)---会发生变化。我们可以假设来自于任意形状域的非结构化网格上的 3D 弹性方程的 FEM 离散化。Ax=bAbA

我正在寻找一种方法,它比稀疏求解器使用更少的内存,并且一个解决方案所需的时间不到两倍的向前向后。

在这些假设下,您会推荐哪种算法?

如果您能提及为什么它对小矩阵(即少于 25,000 行)有效,我将不胜感激。对于这样的矩阵大小,我相信,即使算法是前面的常数也很重要。O(n)n

3个回答

对于单个(可能是几个),我发现 Conjugate Gradient 可以击败 Cholesky factorization 。为此,我使用了 MKL 的 Inspector-Executor 稀疏矩阵向量乘积和以下内容:bLLTmkl_sparse_d_mv

  1. 一个很好的重新排序(COLAMDMETIS为我工作)。这加快了每个矩阵向量乘积。为了避免每次都进行置换操作,我重新排序了我的 FEM 网格的节点,以便我是“预先重新排序的”。这也可能对您的直接方法有所帮助。Ab
  2. 在解决之前,我打电话给mkl_sparse_set_mv_hint,这对性能有巨大的影响。为此,您需要对收敛所需的迭代进行良好估计。最好的估计是使用之前解决方案所需的任何内容(简单!)。因此,第一次求解会慢一些,但会通知后续求解。我怀疑这必须付出一些代价,尽管我不确定它是什么。
  3. Jacobi(对角线)预处理器。简单,几乎没有成本。
  4. 放宽剩余范数停止标准。我不需要机器 epsilon,而是使用更大一点的东西,但没有太多以至于我什至可以注意到差异。
  5. 使用一个不错的初始猜测可以减少一两次迭代。如果您能够获得一个非常好的初始猜测,那么它可能很重要。

通过所有这些技巧,超节点 Cholesky 分解(使用CHOLMOD)在速度方面非常接近。但是,它有它的用途。

对于这个小的、稀疏的直接求解器比大多数迭代求解器更快的问题,即使您包括分解的成本因此,我不相信您将能够为迭代求解器找到一个预处理器,它的工作成本低于前向后向求解器的两倍。您要么必须支付稀疏直接求解器的内存成本,要么支付迭代方法的运行时成本,但您不能同时拥有这两种方式。

您可以将 Krylov 迭代求解器与预处理器一起使用。由于您提到您感兴趣的问题是线性弹性,因此假设您使用标准技术,您最终会得到对称的正定矩阵。对于这种情况,您可以将共轭梯度方法与 ILU 预条件器一起使用。

这些求解器有多种语言版本。如果您使用 MATLAB,那么您可以调用MATLAB中的内置函数对于 Python,您可以使用SciPy对于 C++,您可以使用Eigen库。