我正在尝试使用 Arpack 解决广义特征值问题,现在代码正在使用 LAPACK,但这太慢了,我们只需要几个特征值并且矩阵是稀疏的,所以使用 Arpack 应该是要走的路。
在开始使用原始代码之前,我决定使用 Arpack (eigs) 的 scipy 包装器来测试一个简单的案例,但我得到的结果是错误的,并且每次代码运行时都会发生变化。
最小工作示例:
import numpy as np
from scipy.linalg import eig
from scipy.sparse.linalg import eigs
n = 8
A = np.diag(np.arange(1,n+1,1.0))
B = np.eye(n) # We want symmetric but a non-diagonal B. eigs gives correct answer for B=np.eye(n)
B[0][n-1] = 2
B[n-1][0] = 2
evals,_ = eigs(A,k=3,M=B,which='LM')
print("The eigenvalues obtained by eigs (uses Arpack)")
print(evals)
print("Correct eigenvalues using eig (uses Lapack):")
evals_l,_ = eig(A,b=B)
print(evals_l)
```