How can I get symbolic orthonormal eigenvectors for 3 by 3 hermitian matrix?

Using the following syntax, I can obtain the symbolic eigenvalues and eigenvectors of the following Hermitian matrix (a,b,c,d are all real parameters):

M3:={{a,b,0},{b,c,b},{0,b,d}}
Eigenvalues[M3,Cubics->True]
Eigenvectors[M3,Cubics->True]


I have computed the dot product of each of the eigenvectors with each other eigenvector to ensure that they are indeed orthogonal.

However, Mathematica does not normalize them, and when I use Orthogonalize, I get no result (I allowed it to run for five days before I killed the job).

Normalizing is not hard, at least in principle, but the algebra involved will be extensive. Even if I do the normalization by hand, I'd like to be able to check it against something. Is it possible to get a set of normalized symbolic eigenvectors?

So you get your eigenvalues and eigenvectors easily enough,

M3 := {{a, b, 0}, {b, c, b}, {0, b, d}}
{vals, vecs} = Eigensystem[M3, Cubics -> True];


the results are long (but don't have any Root objects), and are pasted here. As you noticed, the results are orthogonal but not normalized. I like to check this by substituting random numbers for the variables and taking all the inner products,

Dot @@@
Tuples[vecs /. Thread[{a, b, c, d} -> RandomReal[10, 4]], 2] // Chop
(* {20.3231, 0, 0, 0, 2.37878, 0, 0, 0, 1.88533} *)


See the informative discussion here for why this is desired behavior. But this is a 3x3 matrix, so it is definitely within reason to normalize these symbolic vectors. You can use the Normalize function, but you get the same result if you just do it explicitly,

nvecs = #/Sqrt[#.#] & /@ vecs;


The resulting vectors are pasted here. You can test the orthonormality of the resulting vectors as well,

Dot @@@
Tuples[nvecs /. Thread[{a, b, c, d} -> RandomReal[10, 4]], 2] // Chop
(* {1., 0, 0, 0, 1., 0, 0, 0, 1.} *)

• A better orthonormality check would be to use FullSimplify[ConjugateTranspose[nvecs].nvecs == IdentityMatrix[Length[nvecs]]]. #/Sqrt[#.#] & can indeed be used for symmetric matrices, but for Hermitian matrices, Normalize[] would be more appropriate. – J. M. will be back soon Feb 25 '16 at 10:20