python中参数化的厄米矩阵的特征系统

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中实现?