Bug introduced after 5.0, in or before 8.0 and persisting through 13.3.
I notice in the following example that wrong smallest 2 eigenvalues are resulted if calculating from a sparse matrix. But it gives correct result if we
- calculate the smallest 3,4,... eigenvalues from the sparse matrix
- calculate any smallest eigenvalues from the corresponding normal matrix
I found many cases with this behavior. Why and any remedy?
In the code below, the 104×104 matrix in the minimal example I found is imported from Pastebin because it exceeds the length limit of a post.
Import["https://pastebin.com/raw/PpDfY3EQ", "Package"];
mysparsemat = mymat;
mymat = Normal[mysparsemat];
m = 2;
Reverse@First[Eigensystem[mymat, -m]]
Reverse@First[Eigensystem[mysparsemat, -m]]
m = 4;
Reverse@First[Eigensystem[mymat, -m]]
Reverse@First[Eigensystem[mysparsemat, -m]]
The result of the above code is
{-0.712477 + 1.02863*10^-16 I, 0.712477 + 1.46577*10^-16 I}
{0.712477 - 1.44294*10^-11 I, 0.712656 - 2.12258*10^-11 I}
{-0.712477 + 1.02863*10^-16 I, 0.712477 + 1.46577*10^-16 I,
-0.712656 - 1.05578*10^-16 I, 0.712656 + 6.49144*10^-16 I}
{-0.712477 - 5.10777*10^-10 I, 0.712477 - 5.44863*10^-12 I,
0.712656 + 3.10198*10^-11 I, -0.712656 + 3.64677*10^-10 I}
So the resultant wrong 2nd smallest eigenvalue is actually the correct 3rd or 4th smallest eigenvalue. (The eigenvalues should be real and doubly degenerate in absolute value as expected from the original problem's nature).
Update
As you might have noticed in the comments below, a first guess accusing the Arnoldi algorithm is irrelevant. (And Matlab gives the correct result.)
A bug report has been filed for this in the Wolfram community.
Eigenvalues[sm, -2, Method -> {"Arnoldi", "Criteria" -> "Magnitude", "StartingVector" -> SparseArray[1 -> 1, 104]}]
andEigenvalues[sm, -2, Method -> {"Arnoldi", "Criteria" -> "Magnitude", "StartingVector" -> SparseArray[52 -> 1, 104]}]
. $\endgroup$eigs()
on your matrix. At the very least, it's a way to be sure that it's the algorithm itself that is going flat, and not Mathematica's specific implementation (even tho both are using ARPACK under the hood). $\endgroup$eigs()
is perfectly capable of returning the two smallest eigenvalues (in magnitude). I don't know what's up with Mathematica now. $\endgroup$