我一直在尝试 Python 3 中可用的不同稀疏求解器,并比较它们之间的性能以及与 Octave 和 Matlab 的性能。我选择了直接和迭代方法,我将在下面更详细地解释这一点。
为了生成具有带状结构的适当稀疏矩阵,使用具有 N=250、N=500 和 N=1000 的方格网格的有限元来解决泊松问题。这导致矩阵 A=N^2xN^2 和向量 b=N^2x1 的维度,即最大的 NxN 是一百万。如果有人对复制我的结果感兴趣,我已经在以下链接中上传了矩阵 A 和向量 b(它将在 30 天后过期)在此处使用获取系统。矩阵存储在三元组 I,J,V 中,即前两列分别是行和列的索引,第三列是与这些索引对应的值。观察到 V 中有一些接近零的值是故意留下的。尽管如此,在 Matlab 和 Python 中的“间谍”矩阵命令之后仍保留带状结构。
为了进行比较,我使用了以下求解器:
Matlab 和 Octave,直接求解器:规范x=A\b.
Matlab 和 Octave,pcg 求解器:预处理共轭梯度,pcg 求解器pcg(A,b,1e-5,size(b,1))(不使用预处理器)。
Scipy (Python),直接求解器:linalg.spsolve(A, b)其中 A 先前已格式化为csr_matrixformat。
Scipy (Python),pcg 求解器: sp.linalg.cg(A, b, x0=None, tol=1e-05)
Scipy (Python)、UMFPACK 求解器:spsolve(A, b)使用from scikits.umfpack import spsolve. 这个求解器显然在 Linux 下可用(仅?),因为它使用了 libsuitesparse [Timothy Davis, …
python performance matlab scientific-computing sparse-matrix