LAPACK计算特征向量失败

LAPACK fails calculating eigenvectors

本文关键字:失败 向量 特征 计算 LAPACK      更新时间:2023-10-16

我写了一些代码来解决一般的特征值问题,现在我将我的结果与LAPACK的DSPGVX函数进行比较。我刚刚用了这个例子。

所以我得到了4个自动矢量

{
 {-0.0319133, -0.265466, -0.713483,  0.64765},
 {-0.425628,  -0.520961, -0.714215,  0.193227},
 { 0.32702,    0.565845, -0.37129,  -0.659561},
 {-0.682699,  -0.056645,  0.0771025, 0.724409}
}

和自动值

{-2.22545, 1.12704, -0.454756, 0.100076}

我的代码和Mathematica的结果都是一致的。

但在上一个链接中,从LAPACK报告的自动矢量完全不同。

 Eigenvalues
    -0.4548  0.1001
 Selected eigenvectors
          1       2
 1   0.3080  0.4469
 2   0.5329  0.0371
 3  -0.3496 -0.0505
 4  -0.6211 -0.4743

我应该信任谁?

附言:我还检查了我的自动值/自动向量是否正确,因为它们产生A*x-lambda*B*x=0,而LAPACK的值则不正确。

我不知道你为什么认为LAPACK给出了错误的答案,他们对我来说似乎很好。使用你引用的四位数小数,我得到残差(r=A*x-lambda*B*x),这样

norm(r1)=1.5921e-04、norm(r2)=6.0842e-05。

由于范数(A)=1.2994和范数(B)=7.9874,这些残差看起来非常令人满意。

DSPGVX产生的特征向量被归一化,使得

范数(x'*B*x)=1。

看起来DSGPVX正在求解A*lambda=B*x*lambda;Matlab使用"eig"为您的问题提供DSGPVX解决方案,尽管Matlab的文档是正确的。我猜想这是DSGPVX文档中的一个错误。

>> a=[0.24 0.39 0.42 -0.16;0.39 -0.11 0.79 0.63;0.42 0.79 -0.25 0.48;-0.16 0.63 0.48 -0.03];
>> b=[4.16 -3.12 0.56 -0.1;-3.12 5.03 -0.83 1.09;0.56 -0.83 0.76 0.34;-0.1 1.09 0.34 1.18];
>> [v,d]=eig(a,b)
v =
   -0.0690    0.3080   -0.4469   -0.5528
   -0.5740    0.5329   -0.0371   -0.6766
   -1.5428   -0.3496    0.0505   -0.9276
    1.4004   -0.6211    0.4743    0.2510

d =
   -2.2254         0         0         0
         0   -0.4548         0         0
         0         0    0.1001         0
         0         0         0    1.1270
>> norm(a*v-b*v*d)
ans =
   1.5001e-15

看起来Lapack的结果实际上对应于代码和Mathematica生成的最后两个特征值,尽管低阶比特的结果截然不同。相应的矢量非常接近,只是缩放不同而已。

很明显,如果你的/Mematica的值检查出来了,而Lapack的值没有检查出来,你应该相信那个能给出正确答案的人。调查一下你的问题是什么,以及Lapack的算法使它提供了非常不精确的答案,这可能是有价值的。