gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:25:59 26 4
gpt4 key购买 nike

使用有什么区别

 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com