Numpy scipy.sparse.linalg:什么&x27;splu和因式分解的区别是什么?

Numpy scipy.sparse.linalg:什么&x27;splu和因式分解的区别是什么?,numpy,scipy,sparse-matrix,linear-algebra,equation-solving,Numpy,Scipy,Sparse Matrix,Linear Algebra,Equation Solving,使用 scipy.sparse.linalg.factorized(A) 及 scipy.sparse.linalg.splu(A) 它们都使用.solve(rhs)方法返回对象,文档中说它们都使用LU分解。我想知道他们两人在表现上的差异 更具体地说,我正在编写一个python/numpy/scipy应用程序来实现动态有限元模型。我需要在每个时间步上解一个方程Au=f。A是稀疏的,相当大,但不依赖于时间步,所以我想在迭代之前投入一些时间来加快迭代(可能有数千次)。我尝试使用scipy.spa

使用

scipy.sparse.linalg.factorized(A)

scipy.sparse.linalg.splu(A)
它们都使用
.solve(rhs)
方法返回对象,文档中说它们都使用LU分解。我想知道他们两人在表现上的差异


更具体地说,我正在编写一个python/numpy/scipy应用程序来实现动态有限元模型。我需要在每个时间步上解一个方程
Au=f
。A是稀疏的,相当大,但不依赖于时间步,所以我想在迭代之前投入一些时间来加快迭代(可能有数千次)。我尝试使用
scipy.sparse.linalg.inv(A)
,但当矩阵的大小较大时,它会引发内存异常。直到最近,我还在每个步骤中使用了
scipy.linalg.spsolve
,现在我正在考虑使用某种分解来提高性能。所以,如果你有其他建议,除了吕,请随时提出

假设
A
不会随时间步长的变化而变化,那么这两种方法应该都能很好地解决您的问题

scipy.sparse.linalg.inv(A)
将返回一个与
A
大小相同的密集矩阵,因此抛出内存异常也就不足为奇了

scipy.linalg.solve
也是一个密集线性解算器,这不是您想要的

假设
A
是稀疏的,要求解
Au=f
并且只想求解
Au=f
一次,可以使用
scipy.sparse.linalg.spsolve
。比如说

u = spsolve(A, f)
A_inv = splu(A)
for t in range(iterations):
    u_t = A_inv.solve(f_t)
如果您想在后续求解中显著加快速度,您可以使用
scipy.sparse.linalg.factorized
scipy.sparse.linalg.splu
。比如说

u = spsolve(A, f)
A_inv = splu(A)
for t in range(iterations):
    u_t = A_inv.solve(f_t)

它们的速度应该相当,并且比以前的选项快得多


正如@sascha所说,您需要深入研究文档,以查看splu和factorize之间的差异。但是,如果安装和设置正确,可以使用“umfpack”而不是默认的“superLU”。我认为umfpack在大多数情况下会更快。请记住,如果矩阵A太大或非零太多,LU分解/直接解算器可能会占用系统太多内存。在这种情况下,您可能无法使用迭代解算器,例如。不幸的是,您无法在每个时间步重复使用A的解,但您可能能够找到一个好的预条件(近似于inv(A))来为解算器提供加速。

快速浏览代码,因此请谨慎对待:他们正在做相同的事,
分解后的
将计算转发给splu;对于这种情况,可以使用umfpack安装并设置正确的参数。