按主要贡献对特征值进行排序

计算科学 模拟 本征系统 特征值 排序
2021-12-16 22:02:41

[编辑以简化问题]

我正在尝试关联特征值E矩阵的H到矩阵的原始行。

此外,按升序对特征值进行排序是微不足道的,但这会丢弃一些信息。出于我的目的,矩阵是哈密顿量,其中不同的行具有物理意义。总是想要与给定行对应的特征值。

我试图根据主要贡献对特征值进行排序为此,我得到每一行的特征向量的大小(它们很复杂)并选择最大的。我使用这个索引对特征值进行排序。

# Get eigenvalues and vector of the Hamiltonian
E, V = eig(H) 

# Now sort the eigenvalues by dominant contribution
sorted_order = []
for i in range(len(E)):
    row = V[i,:]
    row = np.absolute(row)           # length of complex number <-- correct?
    largest_index = np.argmax(row)   # the index of the largest value
    sorted_order.append(largest_index)

E_sorted = E[sorted_order]

当特征向量矩阵由对角线支配时,排序方法效果很好。但是,如果矩阵更均匀,则此排序方法将失败。

这让我相信我的排序方法可能是不正确的。或者我遇到了该eig功能的准确性问题。

有人对按主要贡献排序的替代方法有建议吗?


背景

我正在做一个kp半导体能带结构的模拟。的特征值 kp哈密​​顿量(下面的 8x8 矩阵)对应于不同的半导体能带,特征向量是波函数。

10 波段哈密顿量,<code>http://dx.doi.org/10.1103/PhysRevB.73.125348</code>

注意我已经删除了两行和两列,因为我对它们的效果不感兴趣。)

排序错误。

图: 在图中,y 轴是特征值,x 轴对应于改变哈密顿量值的 k 空间向量。定义:在k=0.5系统不受干扰,特征向量由对角项控制。这也说明了为什么我不能进行简单的能量排序:因为在某些点上带交叉。这些乐队有不同的物理意义,我想保留这些意义。

评论。排序方法(上面的 Python 代码)在以下情况下效果很好k=0.5因为贡献主要由特征向量的对角线决定。然而,远离 k 空间的中心 (k>0.5k<0.5) 特征向量矩阵变得更加均匀,这种排序方法失败了。我很惊讶它间歇性地失败。

1个回答

您希望在通过动量时以连续的方式对特征值/特征向量进行排序。这高度限制了排序 - 对于大多数 k 点,您必须将特征值排序为尽可能接近相邻 k 点的特征值。只有在特征值交叉处才允许置换波段的顺序。此外,在许多情况下,实际上不会发生交叉 - 相反,如果有足够的分辨率,您会看到“避免交叉”,并且特征值的真正连续性将要求特征值始终保持递增顺序。在避免交叉的情况下,根据您的情况,允许波段分配交换可能仍然有意义。

发生真正交叉的一种情况是,如果您的波段具有不同的对称表示,因此不能混合。在这种情况下,您可以先按对称扇区排序特征向量,然后再增加特征值。

如果您不能使用对称性,那么我建议您采用以下策略:

选择一个初始动量点,并根据增加的能量对该点的特征向量进行排序。对于每个额外的动量,通过找到最大重叠,将每个特征向量与前一个动量点的一个特征向量匹配。如果动量间距非常小,这些识别应该只允许在一个水平交叉口的顺序变化。