使用
有什么区别 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.factorized
或scipy.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(近似值(以馈送求解器以加快求解。