2012-03-12 159 views
3

我写了一些代码来解决一般特征值问题,现在我将我的结果与LAPACK的DSPGVX函数进行比较。我刚刚与example合作。LAPACK无法计算特征向量

所以我得到的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} 
} 

和经销商都与我的代码和Mathematica与结果一致值

{-2.22545, 1.12704, -0.454756, 0.100076} 

但是在上一个链接中,从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 

我该信任谁?

P.S.我还检查了我的auto值/ autovectors是正确的,因为它们产生A * x-lambda * B * x = 0,而来自LAPACK的值没有。

回答

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 
1

看起来Lapack的结果实际上与您的代码和Mathematica生成的最后两个特征值相对应,尽管低位比特出现了很大的差异。相应的向量非常接近,只是缩放比例不同。很明显,如果你的/ Mathematica的值检出并且Lapack不检测,你应该相信那个能产生正确答案的值。调查一下你的问题是什么,以及Lapack的算法可能会提供非常不准确的答案。

2

我不知道你为什么认为LAPACK给出了不正确的答案,它们对我来说似乎很好。使用您引用的四位数字,我得到残差(r = A * x-λ* B * x),使得范数(r1)= 1.5921e-04,范数(r2)= 6.0842e-05的

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

通过DSPGVX产生的本征矢量归一化,使得

范数(X'* B * X)= 1

+0

我得到残像1E-15与我的结果。如果他们是正常化的,他们应该注意到它。 – flow 2012-03-13 10:39:51

+0

感谢您的回答。 我最关心的是;因为我的解决方案给出了一个较小的残留物,为什么你不这样做,因为这是网站上报告的那个 否则我假设我可以把它们当中的任何一个都取好,你同意吗? – flow 2012-03-14 09:23:13

相关问题