我有一个简单的 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中做什么才能获得像第二个结果一样的特征值?
结果示例:
谢谢。
请您参考如下方法:
特征值至少作为数学构造是完全明确定义且明确的(除了它们的顺序)。如果特征值偏离,则意味着其中一个结果是错误的,或者矩阵的条件太差,以至于特征值求解器并不总是给出正确(精确)的结果。
就您而言,您一定误读了某些内容:
>> 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
谜团解开了。


