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

2024-05-29 02:15:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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的东西,但还没有尝试过。在


Tags: fromimport矩阵scipyarraymlsparsepyamg

热门问题