【问题标题】:Eigenstates with specific eigenvalue in pythonpython中具有特定特征值的特征态
【发布时间】:2017-05-15 02:01:13
【问题描述】:

我有一个非常大的矩阵,但我只想找到具有一个特定特征值的特征向量(大于 1)。在python中不解决这个矩阵的整个特征值和特征向量,我怎么能得到这个?

【问题讨论】:

  • 我不知道如何将我的 np.mat(A) 矩阵转换为稀疏矩阵...
  • 不用稀疏矩阵,我贴了一个例子……

标签: python linear-algebra


【解决方案1】:

一种选择可能是使用移位反转方法。 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]

编辑: 如果您事先知道特征值,那么您可以尝试计算对应的nullspace 的基。例如:

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的特征向量,但我不知道这些是多少?
  • 另外,如果我将 eigs 与我的普通矩阵一起使用,错误消息会显示:ValueError: matrix type must be 'f', 'd', 'F', or 'D'
  • 您可以使用eigs 对特征向量数量进行上限估计,然后手动过滤结果,或者例如直接使用svd 确定A - \lambda 的基础。至于报错,你的矩阵的type是什么?
猜你喜欢
  • 2017-10-21
  • 2014-05-11
  • 2022-06-14
  • 2018-12-30
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多