LAPACK 每次对特征值进行不同的排序

计算科学 C++ 特征值 矩阵 本征系统 拉帕克
2021-12-15 21:09:49

我正在使用 LAPACK zgeev 例程来获取 C++ 中对称矩阵的特征值和特征向量。问题是 zgeev 在循环中被调用,但它有时对特征值(和特征向量)进行不同的排序。

例如,这是第一轮循环的特征值:

(-1.29007e-5 - 5.207e-6*i) (1.28782e-5 + 7.40505e-6*i)

这是第二次的结果:

(1.28782e-5 + 7.40505e-6*i) (-1.29007e-5 - 5.207e-6*i)

我需要将这些特征值和向量的演变绘制为循环变量的函数,但它们每次都会被交换,并为我提供我需要的图的组合。

如何解决这个问题?

1个回答

您写道,您正在计算对称矩阵的特征值。矩阵有真实的条目吗?在这种情况下,所有特征值都是实数,您可以使用对称特征值求解器,它只返回实数项。因此,对它们进行排序应该不是问题。

当您的矩阵具有复杂的条目时,您必须跟踪特征值。我假设您的矩阵从循环的一次迭代到下一次迭代仅略有变化,这意味着特征值也仅略有变化。因此,您可以通过查找与当前迭代的特征值最接近的下一次迭代的特征值来找到与当前迭代的特征值对应的下一次迭代的特征值。

通常,对复杂特征值进行排序并不能解决您的问题。考虑矩阵 for该矩阵有两个特征值,都位于半径为 1 的圆上。这两个特征值位于圆的相对两侧,随着的增加,它们围绕零旋转。足够大时,第一个特征值到达第二个特征值所在的点,反之亦然。因此,任何排序技术将(最迟)在这一点上转换两个特征值的角色,即使第一个特征值缓慢移动到第二个特征值的位置,这意味着它没有改变它的角色。

A(t)=[eit00ei(t+π)]
t=[0,2π)tt

如果您的特征值变化很小,您可能会先按实部然后按虚部或按绝对值对特征值进行排序。但是,一般来说,这不起作用。