scipy.sparse.linalg:splu 和 factorized 有什么区别?



使用

有什么区别
 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所说,您需要研究文档,以查看SPHU和分解之间的差异。但是,如果已安装并正确设置,则可以使用'umfpack'而不是默认的" superlu"。我认为在大多数情况下,UMFPACK会更快。请记住,如果您的矩阵A太大或没有太多的非零件,则LU分解/直接求解器可能会在系统上使用太多的内存。在这种情况下,您可能会坚持使用这样的迭代求解器。不幸的是,您将无法在每个时间步骤中重复使用A的求解,但是您也许可以找到一个良好的预处理,以供A(INV(a(近似值(以馈送求解器以加快求解。

相关内容

  • 没有找到相关文章

最新更新