lai*_*ila 13 python scipy umfpack
我试图反转一个大的(150000,150000)稀疏矩阵如下:
import scipy as sp
import scipy.sparse.linalg as splu
#Bs is a large sparse matrix with shape=(150000,150000)
#calculating the sparse inverse
iBs=splu.inv(Bs)
Run Code Online (Sandbox Code Playgroud)
导致以下错误消息:
Traceback (most recent call last):
iBs=splu.inv(Bs)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 134, in spsolve
autoTranspose=True)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 603, in linsolve
self.numeric(mtx)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 450, in numeric
umfStatus[status]))
RuntimeError: <function umfpack_di_numeric at 0x7f2c76b1d320> failed with UMFPACK_ERROR_out_of_memory
Run Code Online (Sandbox Code Playgroud)
我重新编写了程序来简单地求解线性微分方程组:
import numpy as np
N=Bs.shape[0]
I=np.ones(N)
M=splu.spsolve(Bs,I)
Run Code Online (Sandbox Code Playgroud)
我又遇到了同样的错误
我在具有16 GB RAM的计算机上使用此代码,然后将其移动到具有32 GB RAM的服务器上,仍然无济于事.
有没有人遇到过这个?
首先我要说的是,这个问题最好在http://scicomp.stackexchange.com上提出,那里有一个计算科学和数值线性代数方面的专家社区。
让我们从基础开始:永远不要反转稀疏矩阵,它完全没有意义。请参阅MATLAB Central 上的讨论,特别是 Tim Davis 的评论。
简而言之:没有用于对矩阵进行数值求逆的算法。每当您尝试以数值方式计算 NxN 矩阵的逆矩阵时,您实际上会求解 N 个线性系统,其中 N 个 rhs 向量对应于单位矩阵的列。
换句话说,当你计算
from scipy.sparse import eye
from scipy.sparse.linalg import (inv, spsolve)
N = Bs.shape[0]
iBs = inv(Bs)
iBs = spsolve(Bs, eye(N))
Run Code Online (Sandbox Code Playgroud)
最后两个语句 (inv(eye)和spsolve(Bs, eye(N))) 是等效的。请注意,单位矩阵 ( eye(N)) 不是您np.ones(N)错误假设的一个向量 ( ) 。
这里的要点是,矩阵逆在数值线性代数中很少有用:Ax = b 的解不是用 inv(A)*b 计算的,而是通过专门的算法计算的。
对于您的具体问题,对于大型稀疏方程组,没有黑盒求解器。仅当您充分了解矩阵问题的结构和属性时,您才能选择正确的求解器类别。矩阵的属性又是您试图解决的问题的结果。例如,当您通过有限元法离散椭圆偏微分方程组时,您最终会得到对称正稀疏代数方程组。一旦了解问题的属性,您就可以选择正确的解决策略。
在您的情况下,您尝试使用通用直接求解器,而不对方程重新排序。众所周知,这将生成填充,从而破坏iBs函数第一阶段spsolve(应该是因式分解)中矩阵的稀疏性。请注意,完整的双精度 150000 x 150000 矩阵需要大约 167 GB 内存。有很多技术可以对方程进行重新排序,以减少因式分解期间的填充,但是您没有提供足够的信息来给您提供合理的提示。
很抱歉,但是您应该考虑在http://scicomp.stackexchange.com上重新表述您的问题,明确说明您要解决的问题是什么,以便提供有关矩阵结构和属性的线索。
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |