Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大型对称稀疏矩阵特征值问题的求解_Python_Arrays_Performance_Matrix_Scipy - Fatal编程技术网

Python 大型对称稀疏矩阵特征值问题的求解

Python 大型对称稀疏矩阵特征值问题的求解,python,arrays,performance,matrix,scipy,Python,Arrays,Performance,Matrix,Scipy,我试图用python解决大型对称稀疏矩阵的特征值问题。我的主要关注点是结构动力学,所以我处理质量和刚度矩阵,并且通常对计算第一个“K”特征值(>0)感兴趣。目前我已经尝试了scipy.sparse.linalg函数eigsh和lobpcg。我做了以下测试: from pyamg.gallery import poisson N = 300 K = 9 A = poisson((N,N), format='csr') # <90000x90000 sparse matrix with

我试图用python解决大型对称稀疏矩阵的特征值问题。我的主要关注点是结构动力学,所以我处理质量和刚度矩阵,并且通常对计算第一个“K”特征值(>0)感兴趣。目前我已经尝试了scipy.sparse.linalg函数eigsh和lobpcg。我做了以下测试:

from pyamg.gallery import poisson

N = 300
K = 9

A = poisson((N,N), format='csr')  # <90000x90000 sparse matrix with 448800
                                  #  stored elements in CSR format> 
结果:

W=阵列([0.00021787,0.00054466,0.00054466,0.00087145, 0.00108927, 0.00108927,0.00141606,0.00141606,0.00185164])

接下来,我尝试了scipy.sparse.linalg.lobpcg

from scipy.sparse.linalg import lobpcg
W2, V2 = lobpcg(A, X, tol=1e-8, largest=False, maxiter=1000)
然而,整个1000次迭代(时间=171.66秒)才得到:

W2=阵列([0.00021787,0.00054466,0.00054466,0.00087145, 0.00108927, 0.00108927,0.00141606,0.00141606,0.00185166])

战后,我尝试使用预条件器来更快地求解逆迭代。我使用了pyamg.smooted_聚合_解算器

# create the AMG hierarchy
ml = smoothed_aggregation_solver(A)

# initial approximation to the K eigenvectors
X = scipy.rand(A.shape[0], K) 

# preconditioner based on ml
M = ml.aspreconditioner()
在这种情况下,lobpcg收敛得更快(31次迭代):

结果与eigsh相同:

W3=阵列([0.00021787,0.00054466,0.00054466,0.00087145, 0.00108927、0.00108927、0.00141606、0.00141606、0.00185164])

战后,我还尝试了预处理的eigsh,必须计算OPinv。然而,计算矩阵的逆矩阵需要花费大量的时间,而且效率低下


所以我的问题是,是否有一种更快/更有效的方法来计算python中的特征值问题(对于大型稀疏矩阵)?我读过一些关于petsc(petsc4py)和pysparse的文章,但还没有尝试过。

你可能对FEnics感兴趣。它用于结构力学,计算特征值,并使用PETSc:查看:Python绑定,用于特征值问题计算的可伸缩库,依赖于PETSc。(petsc4py)对于特征值>=0的对称矩阵的小特征值,请参见。
# create the AMG hierarchy
ml = smoothed_aggregation_solver(A)

# initial approximation to the K eigenvectors
X = scipy.rand(A.shape[0], K) 

# preconditioner based on ml
M = ml.aspreconditioner()
W3 ,V3 = lobpcg(A, X, M=M, tol=1e-8, largest=False, maxiter=1000)
%timeit -n10 eigsh(A=A, k=K, sigma=0, tol=1e-8, maxiter=1000)
# Result: 10 loops, best of 3: 4.45 s per loop