Different precision of eig() in Matlab 7.1 and Matlab 7.9

When I run the eig() command in versions 7.1 and 7.9. I get different values for the Eigenvectors for the same Input Matrix. Even the signs seem to change for some elements. There are some modifications bty mathworks in the eig code but I am not able to find out what.
I need to get the values like in Version 7.1 from 7.9 Version. Can anybody tell how it can be done?
*From 7.1 -------------------------------------
>> B = [ 3 -2 -.9 2*eps; ...
-2 4 1 -eps; ...
-eps/4 eps/2 -1 0; ...
-.5 -.5 .1 1 ];
>> [VB,DB] = eig(B)
VB =
-0.6153 0.4176 0.0000 -0.1496
0.7881 0.3261 0.0000 0.1317
0.0000 0.0000 -0.0000 -0.9576
-0.0189 -0.8481 -1.0000 0.2078
DB =
5.5616 0 0 0
0 1.4384 0 0
0 0 1.0000 0
0 0 0 -1.0000
From 7.9 -------------------------------------
>> B = [ 3 -2 -.9 2*eps
-2 4 1 -eps
-eps/4 eps/2 -1 0
-.5 -.5 .1 1 ];
>> [VB,DB] = eig(B)
VB =
0.6153 -0.4176 -0.0000 -0.1437
-0.7881 -0.3261 -0.0000 0.1264
-0.0000 -0.0000 -0.0000 -0.9196
0.0189 0.8481 1.0000 0.3432
DB =
5.5616 0 0 0
0 1.4384 0 0
0 0 1.0000 0
0 0 0 -1.0000*
[EDITED, JSimon, 17-Oct-2011, 07:15 UTC, code formatted, B looked like a vector]

댓글 수: 1

Jan
Jan 2011년 10월 17일
Please read the "Markup help" link abozut formatting the code. Using linebreaks as separators of rows is prone to errors, therefore I recommend to insert semicolons explicitely. The distribution of white-space characters should not change the results.

댓글을 달려면 로그인하십시오.

답변 (1개)

Jan
Jan 2011년 10월 17일
In the releasenotes you find the documented change of the linear algebra libs:
MATLAB now uses new versions of the Basic Linear Algebra Subroutine (BLAS)
libraries. For Intel processors on Windows and Linux platforms, MATLAB supports
the Math Kernel Library (MKL) version 8.0.1. For AMD processors on Linux
platforms, MATLAB uses the AMD Core Math Library (ACML) version 2.7.
[EDITED, JSimon, 17-Oct-2011 15:27 UTC]
Now I see the problem.
B = [ 3, -2, -0.9, 2*eps; ...
-2, 4, 1, -eps; ...
-eps/4, eps/2, -1, 0; ...
-0.5, -0.5, 0.1 1];
[V, D] = eig(B);
% Matlab 2009a:
B*V - V*D
>> [1.7764e-015 1.1102e-016 -4.9304e-032 3.8858e-016
0 -5.5511e-016 1.2326e-031 -4.4409e-016
1.2326e-032 -1.5407e-032 1.3241e-033 2.2204e-016
0 1.3323e-015 7.7716e-016 0.6031]
^^^^^^
% Matlab 6.5:
B*V - V*D
>> [ -8.8818e-016 1.1102e-016 9.8608e-032 6.3838e-016
8.8818e-016 2.7756e-016 3.4513e-031 -2.2204e-016
4.9304e-032 1.2326e-032 1.1002e-032 2.2204e-016
9.7145e-017 4.4409e-016 0 0.44227]
^^^^^^^
The last element of the residual is in both cases much too large due to rounding errors. The matrix B suffers from the balancing!
[V, D] = eig(B, 'nobalance');
B*V - V*D
% 2009a:
>> [-2.6645e-015 1.1102e-016 -5.5875e-016 -1.6653e-016
4.4409e-015 1.2212e-015 3.3637e-016 -2.498e-016
2.1795e-017 1.8112e-018 6.6297e-018 0
3.3307e-016 -2.2204e-016 2.2204e-016 1.1102e-016]
% Matlab 6.5:
>> [ -2.6645e-015 0 -3.2346e-016 -2.7756e-017
4.4409e-015 1.1102e-015 4.2267e-017 -2.498e-016
2.1795e-017 1.8112e-018 6.6297e-018 0
5.5511e-017 -4.4409e-016 4.4409e-016 8.3267e-017]

댓글 수: 5

Thanks Jan,
Any Idea how I can get the old values through the new version.
I am porting an application from older version to 7.9. The application is working fine but the results are not matching. The results I used to get earlier were correct and verified.
I want the new version to give me the same results.
I remember working with a customer who insisted to have a bug re-implemented, because the old (wrong) results were usful and proven :-).
Of course this is a bit different here...
What is the issue with the new results? If they are wrong, file a bug report. If they are just differnt, lets see how you can use them.
Yes. The new results are way too different than what I had in 7.1 .
Wilson, some of the vectors merely point in the opposite direction (sign change on all elements.) The direction of the vector is not specified in the eig() documentation and should not be relied upon.
Everything else is just small roundoff changes, which one must expect with eig even with the same MATLAB version if one uses a different processor. If you needed something more accurate you would need to switch over to symbolic computation -- the number of "guard digits" needed for "correct" numeric calculation of eigenvalues is pretty much unbounded.
Jan
Jan 2011년 10월 17일
@Andreas: Please send me the address of the customer. I have collection of ready-to-use bugs, my so called "toolbugs". Perhaps he is interested in buying them.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Debugging and Improving Code에 대해 자세히 알아보기

질문:

2011년 10월 17일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by