首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.sparse.linalg: splu和因式分解有什么区别?

scipy.sparse.linalg: splu和因式分解有什么区别?
EN

Stack Overflow用户
提问于 2019-07-28 08:37:16
回答 1查看 1.1K关注 0票数 5

使用的区别是什么

代码语言:javascript
复制
 scipy.sparse.linalg.factorized(A)

代码语言:javascript
复制
 scipy.sparse.linalg.splu(A)

它们都使用.solve(rhs)方法返回对象,并且在文档中都说它们使用LU分解。我想知道他们俩的表现有什么不同。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。例如

代码语言:javascript
复制
u = spsolve(A, f)

如果您想大大加快后续解决方案的速度,可以使用scipy.sparse.linalg.factorizedscipy.sparse.linalg.splu。例如

代码语言:javascript
复制
A_inv = splu(A)
for t in range(iterations):
    u_t = A_inv.solve(f_t)

代码语言:javascript
复制
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))找到一个很好的预条件,以满足求解器的速度。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57239217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档