Matlab、Mathematica 和 LAPACK 返回 3 个不同的特征向量

计算科学 matlab C++ 特征值 拉帕克 数学
2021-12-17 05:03:54

(我不确定 math.se / stackoverflow / scicomp.se 中的哪一个是问这个问题的正确位置)

我有一个 C++ 代码,它生成一个复数矩阵,然后使用 LAPACK zgeev 计算其特征值和特征向量。例如,这是这些矩阵之一:

矩阵

我想测试我的代码,所以我在 Matlab 和 Mathematica 中输入了相同的矩阵,但我得到了另外两个不同的结果!它们都给出相同的特征值但不同的特征向量。这是我从三个程序中得到的结果。(请注意,Matlab 在列中给出特征向量,但其他两个在行中,Matlab 仅显示 5 个第一位数字,因此虚部显示为 0,但我已在脚本中输入它们)

数学

MATLAB

拉包

到底是怎么回事?!

2个回答

似乎你有一个重复的特征值。因此,您有两个特征对(λ1,x1)(λ2,x2)在哪里λ1=λ2. 表示λ=λ1=λ2. αβ是任意复数。然后

A(αx1+βx2)=αAx1+βAx2=αλx1+βλx2=λ(αx1+βx2).
因此似乎(λ,αx1+βx2)也是任意数的特征对αβ

如何选择要显示的特征对?您使用的程序必须以某种方式选择它。对于您使用的不同程序,该策略似乎有所不同。

这里有两个可能的问题。首先,正如 knl 在答案中指出的那样,与退化特征值相对应的特征向量的任何线性组合也是特征向量,如该答案所示。然而,即使对于非退化情况,即使输入矩阵相同,特征向量也可能在对角化器的不同调用之间有所不同。这是因为例程可以自由“选择”任意随机阶段,并且可能因调用而异。要看到这一点,请考虑特征值方程

Aq=λq
这里(λ,q)显然是特征对。让我们从左边乘以对角矩阵D其中所有对角线元素都相同并且形式为Dii=eiϕ. 这样的矩阵与任何其他矩阵可交换,因此它遵循
DAq=A(Dq)=λ(Dq)
然后让q=Dq我们可以看到
qq=qDDq=qq
因为形式D. 因此q也是一个特征向量A,并且进一步具有相同的规范化,因此对于(在您的情况下) zheev 返回任何值是一个完全有效的结果ϕ.

因此,检查特征向量的唯一好方法是确保qAq=λ任何可接受的容忍度;目视检查 og 元素不起作用。即使在实际情况下,仍然可以应用 -1 的因子。