Eigenvalue/vector functions
STACK has a contributed library for eigenvector/value functions. To use this library you must load it into the question variables.
- To use the latest code from github:
stack_include_contrib("eigenlib.mac");
- Loading this library automatically declares
stack_linear_algebra_declare(true);
to provide context. See the documentation on the core linear algebra for more information.
This page contains reference documentation on functions in this library.
Predicates for eigenvector-eigenvalue problems
eigenlib.mac
provides two functions for checking whether a given vector or scalar is an eigenvector or eigenvalue respectively.
eigenvectorp(v,M)
tests whether the vectorv
is an eigenvector of the matrixM
. The zero vector is not considered an eigenvector.v
can be a matrix, list or ntuple.eigenvectorp(v,M,L)
will run the above function, but specifically checks thatv
is an eigenvector that corresponds to the eigenvalueL
.eigenvaluep(L,M)
tests whetherL
is an eigenvalue ofM
.eigenvaluep(L,M,v)
will run the above function, but specifically checks thatL
is the eigenvalue corresponding the eigenvectorv
.v
can be a matrix, list or ntuple.
There are some more helpful functions in the contributed vector spaces library such as unit_vecp
, lin_indp
and subspace_equivp
to test whether a given vector is a unit vector, whether a given collection of vectors are linearly independent, and whether two given sets of vectors span the same subspace. These may be helpful when examining eigenspaces or orthogonal decomposition (among other topics).
Extracting eigenvectors and eigenvalues
Maxima provides the functions eigenvectors
and eigenvalues
to extract the eigenvectors and eigenvalues of a square matrix.
eigenvalues(M)
will return a list of two elements. The first element is a list containing all of the eigenvalues ofM
. The second element is a list of the algebraic multiplicities of these eigenvalues (in order).- For example,
eigenvalues(matrix([3,1,0],[0,5,0],[0,0,5]))
will return[[3,5],[1,2]]
because the eigenvalue has an algebraic multiplicity of and the eigenvalue has an algebraic multiplicity of . eigenvectors(M)
will also return a list of two elements. The first element is exactly the output ofeigenvalues(M)
. The second element is a list, where each element is a list containing the linearly independent eigenvectors corresponding to the eigenvalues fromeigenvalues(M)
. The eigenvectors are given as lists, not matrices.- For example,
eigenvalues(matrix([3,1,0],[0,5,0],[0,0,5]))
will return[[[3,5],[1,2]],[[[1,0,0]],[[1,2,0],[0,0,1]]]]
. The first sublist is the same as above. The second is a list with two entries; the former is[[1,0,0]]
indicating that the eigenvalue has exactly one eigenvector,[1,0,0]
; the latter is[[1,2,0],[0,0,1]]
indicating that the eigenvalue has two linearly independent eigenvectors,[1,2,0]
and[0,0,1]
.
These are useful for getting all relevant eigenvalue or eigenvector information, but they are a bit cumbersome to use if you only need a small piece of that information. eigenlib.mac
provides some extra functions to help with this.
get_eigenvalue(v,M)
will return the corresponding eigenvalue of eigenvectorv
for matrixM
. Ifv
is not an eigenvector ofM
, this function returnsfalse
.get_eigenvector(L,M)
will return a basis for the eigenspace ofM
corresponding to eigenvalueL
. It will always return a list of linearly independent column vectors unlessL
is not an eigenvalue ofM
, in which case it will return the empty list[]
.get_eigenvector(L,M,true)
indicates that the basis should be orthonormalised. This is likely to produce some ugly vectors if used on a random matrix and you are not using floats.alg_mult(M,L)
gives the algebraic multiplicity of eigenvalueL
for matrixM
. IfL
is not an eigenvalue ofM
, returns 0.geo_mult(M,L)
gives the geometric multiplicity of eigenvalueL
for matrixM
. IfL
is not an eigenvalue ofM
, returns 0.
Diagonalisation
The contributed matrixfactorizations.mac
file contains functions for diagonalising matrices or computing Jordan normal forms. Check the documentation for more details.
Miscellaneous useful functions
The contributed function Rayleigh(M,v)
computes the Rayleigh quotient of a matrix M
and v
: . This is an eigenvalue estimate for approximate eigenvector v
and is sometimes used in power method calculations .
Some suggestions for writing eigenvector-eigenvalue questions
These functions provide teachers with the ability to work with eigenvectors and eigenvalues of arbitrary matrices, but this is perhaps not best practice when expecting students to work by hand. STACK also provides a library of matrix randomisation functions that can help to generate sensible problems. In particular, teachers may find rand_diag
and rand_integer_invertible
useful to generate and such that has reasonably well-controlled eigenvectors and eigenvalues. rand_diagonalizable
and rand_defective
may also be good options. As usual, check your deployed variants carefully!
If you like to keep numbers simple to work with, consider using the STACK function scale_nicely
to remove fractions or common factors from eigenvector elements.