在 MATLAB 或 C 中求解大型线性系统的搜索解决方案

计算科学 matlab C
2021-12-02 19:56:32

我遇到了一个问题,我的 MATLAB 代码运行并发生错误并显示内存不足。我的代码是使用有限元法求解一些复杂的积分方程,元素的数量可以达到 100,000 以上。我使用稀疏存储刚度矩阵并在我们的学校集群上并行运行代码。我不确定数据是否太大或我的代码没有很好地编程导致内存不足问题。我也有代码的c版本并且发生了同样的问题(错误显示为segmentaion错误)。对于小数据,我的代码没有任何问题。由于是2d FEM码,假设每个坐标的未知数为n(所以总数为n^2),那么矩阵的带宽大约小于2*n。是对称正定的。当我使用 MATLAB 时,我只是使用 \ 来解决线性系统。对于 c 版本,我使用 CLAPACK 中带状矩阵的子程序。这是大数据问题,我的代码不起作用,那么有没有人愿意帮助我并告诉我应该怎么做才能修复它,无论是在 c 还是 MATLAB 中?对于c,是否有任何软件包可用于解决大数据线性系统?非常感谢!

3个回答

虽然 Bill 和 tbirdal 关于查看其他稀疏求解器的建议很好,但我建议先尝试 Matlab 自己的稀疏迭代方法,因为您已经有了一些工作。通过查看 matlab 关于 A\b 运算符的文档,它总是会使用直接分解方法,正如比尔所说,100k 未知数可能太大了。由于 A 是对称正定的,请尝试预处理共轭梯度法 ——x = pcg(A,b)。

FEM 的 100k 行足够大并且可能足够稀疏,您可能应该尝试使用PETScTrilinos等稀疏迭代求解器包。

看看英特尔 MKL 或 ACML。特别是 MKL 在 CPU 上提供了高效和并行的稀疏求解器。直接的和间接的都有。作为第二种选择,还可以在此处查看 PARDISO 求解器。