使用eig的特征值

时间:2018-10-13 09:48:15

标签: matlab eigenvalue

我有一个简单的2x2矩阵:

A = [-2.0883*10^7 , 1.3975*10^7 ; 1.3975*10^7 , -9.3514*10^6]

通过使用eig(A),我得到了以下特征值:

(-3.0235*10^7, -9.3132*10^-10)

但是,通过使用网络上的其他一些计算器,我得到了以下答案:

(-3.0235*10^7 , 507.32)

我应该在Matlab中做什么来获得第二个结果中的特征值?

结果示例:

enter image description here

谢谢。

1 个答案:

答案 0 :(得分:2)

至少作为数学构造的特征值是完全定义明确的(不含顺序)。如果特征值不正确,则意味着结果之一是错误的,或者矩阵条件不佳,特征值求解器并不总是给出正确的(准确的)结果。

在您的情况下,您可能误读了一些内容:

>> A = [-2.0883*10^7 , 1.3975*10^7 ; 1.3975*10^7 , -9.3514*10^6];
>> eigvals = eig(A);
>> eigvals(1)

ans =

  -3.0235e+07

>> eigvals(2)

ans =

  507.3209

也就是说,第二组特征值是正确的。


关于您的更新:

对于2x2矩阵,可以轻松地在纸上计算特征值。这两个特征值恰好是

e1 = trace(A)/2 + sqrt(trace(A)^2/4 - det(A))
e2 = trace(A)/2 - sqrt(trace(A)^2/4 - det(A))

如果求解二阶特征多项式。为您的确切数字:

>> tr = A(1,1) + A(2,2); % computed by hand to avoid magic
>> d = A(1,1)*A(2,2) - A(1,2)*A(2,1); % same
>> tr/2 + sqrt(tr^2/4 - d)

ans =

  507.3209

>> tr/2 - sqrt(tr^2/4 - d)

ans =

  -3.0235e+07

但是,更新后的代码表明您输入的内容与示例不完全相同;您的真实输入来自较早的计算,并且上面的A只是矩阵中浮点数的截断形式。现在,看看特征值中出现的两个术语:

>> format long
>> tr/2            

ans =

   -15117200

>> sqrt(tr^2/4 - d)

ans =

     1.511770732088699e+07

如您所见,一个术语是-15117200(精确),另一个是15117707.32088699(近似;来自平方根)。现在,这些数字的数量巨大,并且几乎相同(符号除外)。这意味着它们的总和将被抵消,并且这种抵消对变量的特定值非常敏感。

换句话说,由于某些基本的对称性,特定的G2{1}包含这样的值,使得上述两个术语几乎完全抵消了 。相信MATLAB在告诉您什么,您的特征值就可以了。但是,当您将矩阵的截断版本复制到单独的特征值计算中时(就像我在上面所做的那样),由于抵消只是部分的,您会得到错误的结果。


您在注释中给出了矩阵的更具体值:

>> B = [-2.088317534729117e+07, 1.397451196178947e+07 ; 1.397451196178947e+07 , -9.351402807405353e+06];
>> tr = trace(B);         
>> d = det(B);
>> tr/2

ans =

    -1.511728907734826e+07

>> sqrt(tr^2/4 - d)

ans =

     1.511728907734826e+07

神秘感解决了。