scipy.sparse.linalg.eigsh()特征值排序异常及相关问题咨询
scipy.sparse.linalg.eigsh()求解厄米矩阵特征值的排序疑问 问题1:指定which='SA'不返回特征向量时,结果为何是升序还需重新排序?
官方文档明确说明:当which='SA'且不返回特征向量时,特征值按绝对值排序。你给出的E1是[-5.8445426, -5.87106398, ..., -6.42135482],观察绝对值的话,是从5.8445到6.4213的升序排列——也就是绝对值最小的特征值在前。但SA的字面意思是"最小代数值",这里的矛盾源于底层ARPACK算法的实现优化:不返回特征向量时,算法会采用更高效的方式跟踪特征值,此时默认按绝对值排序而非代数值。
如果你需要的是代数值最小的特征值(比如E1中的-6.4213),必须对结果手动重新排序,不能依赖默认输出的顺序。
问题2:返回特征向量时E2无明显顺序,代数值排序的含义是什么?是否需要重排?
返回特征向量时,eigsh会按代数值返回最小的k个特征值,但存在简并特征值时,简并子空间内的特征值顺序不做保证。你给出的E2中,-6.39249619、-5.87106398都是简并特征值(重复出现),这些值的相对位置由算法内部的正交化过程决定,没有固定顺序,所以整体看起来像是乱序,但非简并的特征值其实是符合"从最小到次小"的趋势的(比如开头的-6.4213是代数值最小的,接着是-6.3975等)。
代数值排序的核心是:返回的k个特征值是整个矩阵中代数值最小的k个,但简并特征值的顺序无法保证。如果需要严格的升序/降序排列,必须手动对特征值和对应的特征向量同步排序(比如用np.argsort(E2)获取排序索引,再用该索引重新排列E2和特征向量矩阵)。
问题3:特征向量如何影响特征值排序?物理应用角度的解释
特征向量本身不会"影响"特征值的排序,而是eigsh在返回特征向量时的算法逻辑与不返回时不同:
- 不返回特征向量时,算法优先追求效率,仅跟踪特征值的绝对值,因此按绝对值排序;
- 返回特征向量时,算法需要完整处理特征子空间(包括简并情况),此时严格遵循"代数值最小优先"的规则,但简并子空间内的特征值顺序由正交化步骤决定,无固定性。
从量子力学的物理场景来看,厄米矩阵通常对应哈密顿量,特征值是能量本征值,特征向量是本征态:
- 基态对应代数值最小的能量本征值(因为哈密顿量的能量有下界)。此时无论是否返回特征向量,你都需要确保拿到的是代数值最小的特征值:
- 不返回特征向量时,必须手动排序找到代数值最小的;
- 返回特征向量时,虽然简并特征值顺序乱,但所有返回的都是代数值最小的k个,排序后即可得到从基态到激发态的能量序列,对应的特征向量也会同步对应到各本征态。
内容的提问来源于stack exchange,提问作者WikawTirso

