tre*_*rog 5 python scipy eigenvalue sparse-matrix lapack
假设我们对依赖于参数 t 的厄密矩阵 h(t) 的特征值和特征向量感兴趣。我的矩阵又大又稀疏,因此需要进行数值处理。
一种简单的方法是在离散化参数值 t_k 处评估矩阵 h(t_k)。是否可以根据“特征向量的特征”对特征向量和特征值进行排序?
让我用下面的简单例子来说明我所说的“特征向量的特征”是什么意思(i 表示虚数单位)。
h(t) = {{1, i t}, {-i t, 1}}
特征值为 1-t 和 1+t,具有相应的特征向量 {-i, 1} 和 {i, 1}。因此,根据“特征向量特征”进行排序,特征值应该在 t = 0 处交叉。然而,大多数特征求解器通过增加特征值来对它们进行排序,将特征向量从负交换为正 t(参见代码和输出图)。
import numpy as np
import scipy.sparse.linalg as sla
import matplotlib.pyplot as plt
def h(t):
# parametrized hermitian matrix
return np.array([[1, t*1j], [-t*1j, 1]])
def eigenvalues(t):
# convert to tuple for np.vectorize to work
return tuple(sla.eigsh(h(t), k=2, return_eigenvectors=False))
eigenvalues = np.vectorize(eigenvalues)
t = np.linspace(-1, 1, num=200)
ev0, ev1 = eigenvalues(t)
plt.plot(t, ev0, 'r')
plt.plot(t, ev1, 'g')
plt.xlabel('t')
plt.ylabel('eigenvalues')
plt.show()
Run Code Online (Sandbox Code Playgroud)
想法 大多数特征求解器迭代地逼近特征向量和特征值。通过将矩阵 h(t_k) 的特征系统提供给求解器作为对角化 h(t_{k+1}) 的初始猜测,可能会获得按“特征向量的特征”排序的结果。
是否可以使用 scipy 或更普遍地使用 python 来实现这一点?最好将重对角化委托给专门的编译库(例如 scipy 中的 Lapack)。是否有合适的 Lapack 程序可能已经包含在 scipy 中?
有没有其他方法可以达到同样的效果?如何在python中实现?
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |