解决一个非常大的线性系统(关于图书馆线性代数的问题)

计算科学 线性系统 图书馆
2021-11-30 18:08:22

我需要解决一个非常大的线性系统(来自有限元方法)。我目前正在使用英特尔 MKL 库,但系统延迟了 20 多个小时。

系统的矩阵是稀疏的,用莫尔斯(CRS)写成

我正在用 Fortran 90 编程,但我想库的语言并不重要。

更多信息:

  • 大矩阵:5636087x5636087 或更大。
  • 类型:稀疏(CRS),实数,非对称。
  • 矩阵的非零元素个数:202516857
  • 矩阵是非对称的,我认为这是条件良好的(来自有限元方法)。
2个回答

由于矩阵相当稀疏且条件良好(如果为真),我建议您可以尝试使用 Krylov 子空间方法,该方法只能使用矩阵向量积的信息;例如 GMRES(m)、CGS、BiCGSTAB 和 IDR(s)。就内存和条件良好的矩阵而言,BiCGSTAB、CGS 和 IDR(s) 可能更可取。网上有这四个求解器的很多FORTRAN代码。甚至,您可以尝试使用 AGMG 方法,该方法在网站http://homepages.ulb.ac.be/~ynotay/AGMG/中有一个 FORTRAN 代码 ,其他方法是http://www.hsl.rl。 ac.uk/catalogue/hsl_mi20.html

LSQR仅使用 MEMORY 的 4 个 N 向量。如果必须最小化存储,这可能是您的选择。否则它也相当好,但可能不是最好的(除非你的矩阵是非正方形的;那么下面的那些不适用 bot LSQR )。LSQR 是 CG 的AA但在数值上更稳健等 1DOTs/MatVec、3AXPYs/MatVec (2 MatVec)。 https://web.stanford.edu/group/SOL/software/lsqr/lsqr-toms82a.pdf

[1] 的幻灯片 3仅在您拥有良好的预调节器(以及大量内存!)时才建议使用GMRES 。然后 GMRES 通常根据 MatVec(Ax 矩阵向量积)(而不是根据 DOT 和 AXPY)快速收敛,但如果您在 m 处重新开始,则使用 m+3 MEMORY(N 向量)。

如果矩阵不是强不定的(重新xAx通常是大致0或通常大致0,其中“通常”表示“对于大多数随机 x”),使用BiCGSTAB(或BiCGSTAB(l),如果其特征值具有较大的虚部)。

否则使用IDR(或IDRstab,如果您的矩阵是实数并且其特征值具有较大的虚部 - 我想没有类似的快速测试?)。

[1] https://www.staff.science.uu.nl/~sleij101/Opgaven/NumLinAlg/Transparancies/LectureHandouts11.pdf

当然,在任何情况下都推荐使用好的预调节器。

IDR(s):最好的代码是IDR(s)BiOrtho,即“算法913”。尝试 s=4。如果收敛速度不够快,则增加 s。如果是,则减小 s。或者如果您缺乏记忆,则从 s=1 开始。

IDR(s)BIO =s+2s+1点/MatVec,2s+2s+1AXPYs/MatVec,3s+4MEMORY (N-vectors), by page 5:11 of [ https://dl.acm.org/doi/10.1145/2049662.2049667] 其中还包含 Matlab 代码(和算法)。更多信息可以在这里找到:[ https://web.archive.org/web/20190522043534/http://ta.twi.tudelft.nl/nw/users/gijzen/IDR.html]

IDRstab (IDR(s)stab(L)):目前最好的 Matlab 代码(和算法)可能是 Martin Neuenhofen 的代码(根据 van Gijzen 的说法,它比他的更好,也是他所知道的最好的)。在 Neuenhofen 的实验中,L2总是足够的。

IDR(s)stab(2) =s1+92(s+1)点/MatVec, 52s+2AXPYs/MatVec,5(s+1)1内存(N 向量),第 35-37 页:https ://arxiv.org/pdf/1708.01926.pdf

Matlab 代码: http: //www.martinneuenhofen.de/GMstab/GMstab.html 它还包含Mstab,它是 IDRstab,用于解决多个问题bA.

所有这些代码都适用于一般复合体 A 和 b。IDR(s)(与 IDRstab 相比)的问题可能不太可能,除非 A 是实数但其特征值远非实数。

对于随机矩阵,GMRES 趋向于线性收敛(即,太慢了),而其他的则更慢。幸运的是,即使没有预处理,您也很少遇到随机矩阵。