在 Julia 中求解线性系统

计算科学 线性代数 有限元 线性求解器
2021-12-12 10:09:54

为了给你一些背景,

我目前正在 Julia 中实现一个简单的有限元求解器。我得到的运行时间是 Matlab 代码的 70%。(这两个代码在结构上本质上是等效的。)我在我的 Julia 代码上运行了一些配置文件,我发现大部分运行时间都被线性系统求解器占用了(本质上是中的“\”运算符其中是稀疏对称正定矩阵,是向量。)KFKF

我尝试在 Julia 中查找有效的求解器。我遇到了 MUMPS 包,但我还没有使用它。(我打算尽快尝试一下,并会在我这样做时更新这个问题。)

更有趣的是,我在 julia-users google-group上遇到了这个线程,其中有很多关于 Matlab 如何实现其(非常有效的)求解器的内容。

我的问题是,在 Julia 中实现线性求解器的最有效方法是什么?反斜杠运算符是否选择最有效的求解算法?

2个回答

在有限元方法(尤其是对称问题)的上下文中,最常见的直接求解方法是 Cholesky 分解(加上以下替换)。每当反斜杠运算符的启发式遇到对称正定矩阵时,MATLAB 使用Tim Davis 的 CHOLMOD 包来计算 Cholesky 分解。

事实上,Julia 还通过其cholfact命令连接了 Davis 的 CHOLMOD 。我发现打电话就足够了

u=cholfact(K)\F

其中K是一个稀疏矩阵。

如果您使用的是基于 Linux 的操作系统,在具有 Intel CPU 的机器上,并且如果您可以访问 Intel MKL(您可以免费获得非商业副本),那么您可以拥有的最好的是 PARDISO MKL,它是 Intel Olaf Schenk的Pardiso求解器版本 。Julia 中有一个Pardiso 包装器,其性能平均比 UMFPACK 和 MUMPS 快。此外,您可以使用 BLAS 3 操作处理多个右手边。

然而,语法比反斜杠要复杂一些,但是您有足够的示例可以很好地了解它的工作原理,并且您可以查看在线文档以查看所有可能的选项。使用反斜杠,Julia 将检查矩阵的类型并使用最佳选项,而使用 PARDISO,您需要自己指定矩阵的类型。