Skip to main content
 首页 » 编程设计

matlab中使用 eig 求特征值

2025年12月25日169lexus

我有一个简单的 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

谢谢。

请您参考如下方法:

特征值至少作为数学构造是完全明确定义且明确的(除了它们的顺序)。如果特征值偏离,则意味着其中一个结果是错误的,或者矩阵的条件太差,以至于特征值求解器并不总是给出正确(精确)的结果。

就您而言,您一定误读了某些内容:

>> 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 只是矩阵中 float 的截断版本。现在,看看特征值中出现的两项:

>> 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 

谜团解开了。