Eigensystem Error on Machine Precision Matrices

• To: mathgroup at smc.vnet.net
• Subject: [mg22850] Eigensystem Error on Machine Precision Matrices
• From: "David Park" <djmp at earthlink.net>
• Date: Sat, 1 Apr 2000 02:51:10 -0500 (EST)
• Sender: owner-wri-mathgroup at wolfram.com

```Dear MathGroup,

I believe that the Eigensystem command in Version 4 gives errors about 10%
of the time when used on machine precision orthogonal matrices. It does not
give errors when extended precision is used for the matrices, or if the
calculation is enclosed in SetPrecision, or if the matrix has exact values.
These last methods, however, take 10 to 20 times as long. The machine
precision results have complex eigenvectors that differ from the proper
results (by more that just a complex factor) and they do not satisfy the
eigenvalue equation.

In the following I give one particular test case which gives an incorrect
answer, and statements to evaluate various cases. I also give the code to
generate and test  random orthogonal matrices. To keep the posting short, I
do not show the results.

Matrix which gives an error:

omat = {{2/Sqrt[13], 0, 3/Sqrt[13]}, {3/Sqrt[182],
Sqrt[13/14], -Sqrt[2/91]},
{-(3/Sqrt[14]), 1/Sqrt[14], Sqrt[2/7]}};

The exact solution and test:

{evalse, evectse} = Eigensystem[omat] // N // Chop;
Chop[omat.Transpose[evectse]] ==
Chop[Transpose[evectse].DiagonalMatrix[evalse]]

Display of eigenvalues and eigenvectors:

{MatrixForm[Transpose[{evalse}]], MatrixForm[evectse]}

Display of the two sides of the eigenvalue equation:

{omat.Transpose[evectse] // Chop // MatrixForm,
Transpose[evectse].DiagonalMatrix[evalse] // Chop // MatrixForm}

Evaluation with a machine precision matrix (gives incorrect answer):

{evals, evects} = Eigensystem[N[omat]] // Chop;
Chop[omat.Transpose[evects]] ==
Chop[Transpose[evects].DiagonalMatrix[evals]]

Evaluation with extended precision (gives correct answer):

{evalse, evectse} = Eigensystem[N[omat, 20]];
Chop[omat.Transpose[evectse]] ==
Chop[Transpose[evectse].DiagonalMatrix[evalse]]

Evaluation within SetPrecision (gives correct answer):

{evalse, evectse} = SetPrecision[Eigensystem[omat], 5];
Chop[omat.Transpose[evectse]] ==
Chop[Transpose[evectse].DiagonalMatrix[evalse]]

This is code to generate exact random orthogonal matrices and then test
them:

Needs["LinearAlgebra`Orthogonalization`"]
randomortho::usage =
"randomortho[1] with generate a random orientation-preserving orthogonal
\
matrix. randomortho[-1] will generate a random orientation-reversing \
orthogonal matrix.";
randomortho[orientation_?(MatchQ[#, -1 | 1] &)] :=
Module[{v0, mat},
gen := (v0 = {Random[Integer, {-10, 10}], Random[Integer, {-10, 10}],
Random[Integer, {-10, 10}]};
mat = GramSchmidt[{v0, {0, 1, 0}, {0, 0, 1}}]);
gen; While[Det[mat] == 0, gen];
If[Det[mat] == orientation, mat, Reverse[mat]]
]

omat = randomortho[1];
{evals, evects} = Eigensystem[N[omat]] // Chop;
Chop[omat.Transpose[evects]] ==
Chop[Transpose[evects].DiagonalMatrix[evals]]

I would appreciate if some of the greater mathematicians in the group could
confirm if this is indeed a bug, or else inform me if there is something
about orthogonal matrices and eigensystems that I don't understand.

David Park