本征态在python中具有特定的特征值
我有一个非常大的矩阵,但我只想找到具有一个特定特征值的特征向量(大于1)。如何在不解决python中这个矩阵的整个特征值和特征向量的情况下得到这个结果?本征态在python中具有特定的特征值
一个选项可能可能是使用shift-invert方法。在SciPy的方法eigs
具有sigma
使用其中能够接近指定值,该要搜索的特征值的可选参数:
import numpy as np
from scipy.sparse.linalg import eigs
np.random.seed(42)
N = 10
A = np.random.random_sample((N, N))
A += A.T
A += N*np.identity(N)
#get N//2 largest eigenvalues
l,_ = eigs(A, N//2)
print(l)
#get 2 eigenvalues closest in magnitude to 12
l,_ = eigs(A, 2, sigma = 12)
print(l)
这产生:
[ 19.52479260+0.j 12.28842653+0.j 11.43948696+0.j 10.89132148+0.j
10.79397596+0.j]
[ 12.28842653+0.j 11.43948696+0.j]
编辑: 万一你事先知道特征值,那么你可以尝试计算相应的基础。例如:
import numpy as np
from numpy.linalg import eig, svd, norm
from scipy.sparse.linalg import eigs
from scipy.linalg import orth
def nullspace(A, atol=1e-13, rtol=0):
A = np.atleast_2d(A)
u, s, vh = svd(A)
tol = max(atol, rtol * s[0])
nnz = (s >= tol).sum()
ns = vh[nnz:].conj().T
return ns
np.random.seed(42)
eigen_values = [1,2,3,3,4,5]
N = len(eigen_values)
D = np.matrix(np.diag(eigen_values))
#generate random unitary matrix
U = np.matrix(orth(np.random.random_sample((N, N))))
#construct test matrix - it has the same eigenvalues as D
A = U.T * D * U
#get eigenvectors corresponding to eigenvalue 3
Omega = nullspace(A - np.eye(N)*3)
_,M = Omega.shape
for i in range(0, M):
v = Omega[:,i]
print(i, norm(A*v - 3*v))
如果我想找到所有带有特征值2的特征向量,但我不知道这些特征向量有多少? – JoeJackJessieJames
此外,如果我用我的正常矩阵eigs,错误消息说:ValueError:矩阵类型必须是'f','d','F'或'D' – JoeJackJessieJames
您可以使用具有上限的eigs估计特征向量的数量,然后手动过滤结果,或者例如直接使用svd确定“A - \ lambda”的基础。至于错误,矩阵的“类型”是什么? – ewcz
,我不知道如何我np.mat(A)矩阵转换为稀疏矩阵... – JoeJackJessieJames
它没有必要用一个稀疏矩阵,我已经发布了一个例子... – ewcz