使用c ++ Eigen库的特征值顺序问题

计算科学 C++ 特征值 本征
2021-12-10 07:23:39

我有以下 6x6 矩阵(取自Google Books第 129 页):

在此处输入图像描述

背景信息:所有条目都取决于动量k. 获取每个矩阵的特征值k对应于 6 个不同电子带的电子的电子能量,特征向量是系数(我们称它们为a) 来计算电子波函数。

我也可以把这个特征值问题写成:

jHj,jLKaj=Ejaj

我知道哪个 j 是哪个电子乐队但是:当我引入一个数值网格并解决这个特征值问题(使用来自 Eigen 库的 c++ 和 ComplexEigenSolver)并且我查看第一个特征值时,它不对应于j=1(其值已知)。它更对应于另一个 j。这是因为特征求解器没有按特定顺序给出特征值。但我需要这个命令不要混淆不同的特征值或特征向量j. 原则上,特征值和向量都可以是复数。有没有办法获取特征值和向量,以便它们的顺序对应于我的矩阵定义?

1个回答

这与 Eigen 无关:如果您不能仅通过查看矩阵来确定应如何标记特征值,则不能指望 Eigen 为您做这件事。此外,您可以在数学上精确定义标签的分配方式。

从您的示例图来看,您似乎假设标记的特征值形成平滑曲线。因此,显而易见的尝试是从先前的网格点(在一维网格上)进行外推:在网格点k从预计下一个术语的两个或三个先前的网格点推断,

(Ak3,Ak2,Ak1)Akextrap,(Bk3,Bk2,Bk1)Bkextrap.
然后计算你的特征值λ1,2并将每个分配给A要么B取决于它更接近哪个。例如,您可以尝试分配标签以最小化
|λaAkextrap|+|λbBkextrap|.
这将适用于您的示例图,甚至可能只是线性外推。

您可能还需要调整外推顺序,或尝试不同类型的外推以查看有效的方法。

编辑 (问题改变了)。所以如果你有你的特征值Ej(k)作为函数k,基本上相同的方法可能有效。如果你假设Ej(k)是一个平滑函数k, 对于每个j,然后在分配标签时j在下一个值k您可以将每个过去的特征值外推为Ej(k),然后根据最小化诸如平方外推误差之和之类的东西来分配标签,

j|λσ(j)Ej|2,
在哪里σ是将标签分配给未标记的特征值的排列。