使用的区别是什么
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,现在我正在考虑使用某种分解来提高性能。因此,如果你有其他的建议,除了鲁平,请随时提出!
发布于 2020-02-07 19:35:14
对于您的问题,它们都应该很好地工作,前提是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所言,您需要深入了解文档,以了解splu和分解之间的差异。但是,如果安装和设置正确,可以使用'umfpack‘代替默认的'superLU’。我认为umfpack在大多数情况下会更快。请记住,如果您的矩阵A太大或有太多的非零,一个LU分解/直接求解器可能占用太多的内存在您的系统。在这种情况下,您可能会继续使用迭代求解器(如这 )。不幸的是,您无法在每个时间步骤重用A的解决方案,但是您可能会为A(逼近inv(A))找到一个很好的预条件,以满足求解器的速度。
https://stackoverflow.com/questions/57239217
复制相似问题