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