【问题标题】:LAPACK fails calculating eigenvectorsLAPACK 无法计算特征向量
【发布时间】:2012-03-13 18:25:09
【问题描述】:

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

所以我得到了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 的值则没有。

【问题讨论】:

    标签: c++ lapack eigenvector


    【解决方案1】:

    我不知道您为什么认为 LAPACK 给出的答案不正确,我觉得它们很好。使用您引用的四位小数,我得到残差 (r = A*x - lambda*B*x),这样

    范数(r1) = 1.5921e-04,范数(r2) = 6.0842e-05。

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

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

    标准(x'*B*x) = 1.

    【讨论】:

    • 我的结果中有 1e-15 之类的残基。如果他们的标准化,他们应该注意到它。
    • 感谢您的回答。我主要关心的是;既然我的解决方案给出了一个小的残留物,为什么你的没有,因为这是网站上报道的,否则我认为我可以把它们中的任何一个都当作好,你同意吗?
    【解决方案2】:

    看起来 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
    

    【讨论】:

      【解决方案3】:

      看起来 Lapack 的结果确实与您的代码和 Mathematica 生成的最后两个特征值相对应,尽管低阶位的结果完全不同。对应的向量非常接近,只是缩放不同。

      显然,如果您/Mathematica 的价值观得到检验,而 Lapack 的价值观却没有,那么您应该相信能得出正确答案的那个。调查您的问题是什么以及 Lapack 的算法使其提供非常不精确的答案可能很有价值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多