我试图用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>
首先我试过了scipy.sparse.linalg.eigsh(我寻找0左右的特征值,因此:sigma=0):
^{pr2}$结果:
W = array([ 0.00021787, 0.00054466, 0.00054466, 0.00087145, 0.00108927, 0.00108927, 0.00141606, 0.00141606, 0.00185164])
接下来,我试过了scipy.sparse.linalg.lobbcg公司
from scipy.sparse.linalg import lobpcg
W2, V2 = lobpcg(A, X, tol=1e-8, largest=False, maxiter=1000)
然而,整个1000次迭代(时间=171.66秒)才得到:
W2 = array([ 0.00021787, 0.00054466, 0.00054466, 0.00087145, 0.00108927, 0.00108927, 0.00141606, 0.00141606, 0.00185166])
战后,我试图用一个先决条件来更快地求解逆迭代。我用了pyamg.smooted_aggregation_解算器在
# 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()
在本例中,loppcg收敛得更快(31次迭代):
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
结果与eigsh相同:
W3 = array([ 0.00021787, 0.00054466, 0.00054466, 0.00087145, 0.00108927, 0.00108927, 0.00141606, 0.00141606, 0.00185164])
战后,我还尝试了一种先决条件的eigsh,为此必须计算OPinv。然而,求矩阵的逆运算耗费大量时间,效率低下。在
所以我的问题是,在python中是否有一种更快/更有效的方法来计算特征值问题(对于大型稀疏矩阵)?我读过一些关于petsc(petsc4py)和pysparse的东西,但还没有尝试过。在
目前没有回答
相关问题 更多 >
编程相关推荐