numpy - scipy.sparse.linalg : what's the difference between splu and factorized?

标签 numpy scipy sparse-matrix linear-algebra equation-solving

使用有什么区别

 scipy.sparse.linalg.factorized(A)



 scipy.sparse.linalg.splu(A)

他们都用 .solve(rhs) 返回对象方法和两者都在文档中说他们使用 LU 分解。我想知道他们两个的性能差异。

更具体地说,我正在编写一个实现动态 FEM 模型的 python/numpy/scipy 应用程序。我需要解一个方程 Au = f在每个时间步。 A 是稀疏且相当大的,但不依赖于时间步长,因此我想事先投入一些时间以使迭代更快(可能有数千个)。我尝试使用 scipy.sparse.linalg.inv(A) ,但是当矩阵的大小很大时它会抛出内存异常。我用过 scipy.linalg.spsolve在每一步直到最近,现在我正在考虑使用某种分解来获得更好的性能。所以如果你有除了 LU 之外的其他建议,请随时提出!

最佳答案

假设 A,它们应该都能很好地解决您的问题。不会随着每个时间步长而改变。scipy.sparse.linalg.inv(A)将返回一个与 A 大小相同的密集矩阵,所以难怪它会抛出内存异常。scipy.linalg.solve也是一个密集的线性求解器,这不是你想要的。
假设 A稀疏,求解Au=f而你只想解决Au=f一次,您可以使用 scipy.sparse.linalg.spsolve .例如

u = spsolve(A, f)
如果您想为后续求解显着加快速度,您可以使用 scipy.sparse.linalg.factorizedscipy.sparse.linalg.splu .例如
A_inv = splu(A)
for t in range(iterations):
    u_t = A_inv.solve(f_t)
或者
A_solve = factorized(A)
for t in range(iterations):
    u_t = A_solve(f_t)
它们的速度应该相当,并且比以前的选项快得多。
正如@sascha 所说,您需要深入研究文档以了解 slu 和 factorize 之间的差异。但是,如果您已正确安装和设置,则可以使用 'umfpack' 而不是默认的 'superLU'。我认为 umfpack 在大多数情况下会更快。请记住,如果您的矩阵 A 太大或有太多非零值,LU 分解/直接求解器可能会在您的系统上占用太多内存。在这种情况下,您可能会坚持使用迭代求解器,例如 this .不幸的是,您将无法在每个时间步重复使用 A 的求解,但您可能能够为 A 找到一个好的预处理器(inv(A) 的近似值)来馈送求解器以加快速度。

关于numpy - scipy.sparse.linalg : what's the difference between splu and factorized?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57239217/

相关文章:

r - 如何在 R 中的稀疏矩阵中查找和命名连续的非零条目?

python - Python 中的高效数组替换

python - 子类化和扩展 numpy.ndarray

python - 在多维数组上使用 numpy.take 吗?

python - 如何检查 scipy 分布是否离散?

r - 带有 lme4 或其他包的稀疏混合模型

python - numpy 与 native Python - 最有效的方式

python - 汉宁窗值在 Python 和 Matlab 中不匹配

python - 如何为 Scipy 的 csr_matrix 指定行名和列名?

NumPy 矩阵到 SciPy 稀疏矩阵 : What is the safest way to add a scalar?