Eig3x3.Eigenvectors — the Eberly eigenvector assembly #
Given the eigenvalues from Habera-Zilian's method (see Eig3x3.Eigenvalues,
[HZ25]), this module performs Eberly's non-iterative method
[Ebe14] to compute the eigenvectors.
Algorithm #
For an eigenvalue λ that is well-separated from its neighbors, the matrix A − λI
has rank 2: its three rows lie in a plane, and the eigenvector is the one
direction perpendicular to that plane computed directly as a cross product
of two rows (eigvecIsolated). Cross products lose accuracy as eigenvalues
cluster, so we first compare the gaps λ₂ − λ₁ and λ₃ − λ₂ and apply that
construction only at the isolated end of the spectrum.
Symmetry then does the rest. Eigenvectors of distinct eigenvalues of a symmetric
matrix are orthogonal, so the second eigenvector lies in the plane perpendicular
to the first, and the problem reduces to solving a 2×2 system (eigvecInPlane).
Only one perpendicular direction remains, so it is automatically an eigenvector, unit-length, and right-handed. The third eigenvector is then just the cross product of the other two. When eigenvalues repeat, any perpendicular direction is valid, and the code falls back to the unit vector of the eigenbasis.
Provenance #
D. Eberly, "A Robust Eigensolver for 3×3 Symmetric Matrices", Geometric Tools, (2014). [Ebe14] (CC BY 4.0).
Specifically, the non-iterative algorithm (§5):
- isolated-eigenvector from cross products (§5, Listing 4),
- robust orthogonal complement (§5, Listing 5),
- 2×2 reduction in the complement (§5, Listing 6),
- right-handed completion.
The gap comparison method replaces Eberly's sign method, which is equivalent in exact arithmetic but more direct.
Visibility #
This is an internal, package-private module and not intended to be used directly.