我需要解决一个非常大的线性系统(来自有限元方法)。我目前正在使用英特尔 MKL 库,但系统延迟了 20 多个小时。
系统的矩阵是稀疏的,用莫尔斯(CRS)写成
我正在用 Fortran 90 编程,但我想库的语言并不重要。
更多信息:
- 大矩阵:5636087x5636087 或更大。
- 类型:稀疏(CRS),实数,非对称。
- 矩阵的非零元素个数:202516857
- 矩阵是非对称的,我认为这是条件良好的(来自有限元方法)。
我需要解决一个非常大的线性系统(来自有限元方法)。我目前正在使用英特尔 MKL 库,但系统延迟了 20 多个小时。
系统的矩阵是稀疏的,用莫尔斯(CRS)写成
我正在用 Fortran 90 编程,但我想库的语言并不重要。
更多信息:
由于矩阵相当稀疏且条件良好(如果为真),我建议您可以尝试使用 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 的但在数值上更稳健等 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 向量)。
如果矩阵不是强不定的(重新通常是大致或通常大致,其中“通常”表示“对于大多数随机 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 =点/MatVec,AXPYs/MatVec,MEMORY (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 的实验中,总是足够的。
IDR(s)stab(2) =点/MatVec, AXPYs/MatVec,内存(N 向量),第 35-37 页:https ://arxiv.org/pdf/1708.01926.pdf
Matlab 代码: http: //www.martinneuenhofen.de/GMstab/GMstab.html 它还包含Mstab,它是 IDRstab,用于解决多个问题同.
所有这些代码都适用于一般复合体 A 和 b。IDR(s)(与 IDRstab 相比)的问题可能不太可能,除非 A 是实数但其特征值远非实数。
对于随机矩阵,GMRES 趋向于线性收敛(即,太慢了),而其他的则更慢。幸运的是,即使没有预处理,您也很少遇到随机矩阵。