summaryrefslogtreecommitdiff
path: root/gsl-1.9/doc/eigen.texi
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/doc/eigen.texi')
-rw-r--r--gsl-1.9/doc/eigen.texi462
1 files changed, 462 insertions, 0 deletions
diff --git a/gsl-1.9/doc/eigen.texi b/gsl-1.9/doc/eigen.texi
new file mode 100644
index 0000000..e2c291a
--- /dev/null
+++ b/gsl-1.9/doc/eigen.texi
@@ -0,0 +1,462 @@
+@cindex eigenvalues and eigenvectors
+This chapter describes functions for computing eigenvalues and
+eigenvectors of matrices. There are routines for real symmetric,
+real nonsymmetric, and complex hermitian matrices. Eigenvalues can
+be computed with or without eigenvectors. The hermitian matrix algorithms
+used are symmetric bidiagonalization followed by QR reduction. The
+nonsymmetric algorithm is the Francis QR double-shift.
+
+@cindex LAPACK, recommended for linear algebra
+These routines are intended for ``small'' systems where simple algorithms are
+acceptable. Anyone interested in finding eigenvalues and eigenvectors of
+large matrices will want to use the sophisticated routines found in
+@sc{lapack}. The Fortran version of @sc{lapack} is recommended as the
+standard package for large-scale linear algebra.
+
+The functions described in this chapter are declared in the header file
+@file{gsl_eigen.h}.
+
+@menu
+* Real Symmetric Matrices::
+* Complex Hermitian Matrices::
+* Real Nonsymmetric Matrices::
+* Sorting Eigenvalues and Eigenvectors::
+* Eigenvalue and Eigenvector Examples::
+* Eigenvalue and Eigenvector References::
+@end menu
+
+@node Real Symmetric Matrices
+@section Real Symmetric Matrices
+@cindex symmetric matrix, real, eigensystem
+@cindex real symmetric matrix, eigensystem
+
+@deftypefun {gsl_eigen_symm_workspace *} gsl_eigen_symm_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues of
+@var{n}-by-@var{n} real symmetric matrices. The size of the workspace
+is @math{O(2n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_symm_free (gsl_eigen_symm_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_symm (gsl_matrix * @var{A}, gsl_vector * @var{eval}, gsl_eigen_symm_workspace * @var{w})
+This function computes the eigenvalues of the real symmetric matrix
+@var{A}. Additional workspace of the appropriate size must be provided
+in @var{w}. The diagonal and lower triangular part of @var{A} are
+destroyed during the computation, but the strict upper triangular part
+is not referenced. The eigenvalues are stored in the vector @var{eval}
+and are unordered.
+@end deftypefun
+
+@deftypefun {gsl_eigen_symmv_workspace *} gsl_eigen_symmv_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues and
+eigenvectors of @var{n}-by-@var{n} real symmetric matrices. The size of
+the workspace is @math{O(4n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_symmv_free (gsl_eigen_symmv_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_symmv (gsl_matrix * @var{A}, gsl_vector * @var{eval}, gsl_matrix * @var{evec}, gsl_eigen_symmv_workspace * @var{w})
+This function computes the eigenvalues and eigenvectors of the real
+symmetric matrix @var{A}. Additional workspace of the appropriate size
+must be provided in @var{w}. The diagonal and lower triangular part of
+@var{A} are destroyed during the computation, but the strict upper
+triangular part is not referenced. The eigenvalues are stored in the
+vector @var{eval} and are unordered. The corresponding eigenvectors are
+stored in the columns of the matrix @var{evec}. For example, the
+eigenvector in the first column corresponds to the first eigenvalue.
+The eigenvectors are guaranteed to be mutually orthogonal and normalised
+to unit magnitude.
+@end deftypefun
+
+@node Complex Hermitian Matrices
+@section Complex Hermitian Matrices
+
+@cindex hermitian matrix, complex, eigensystem
+@cindex complex hermitian matrix, eigensystem
+
+@deftypefun {gsl_eigen_herm_workspace *} gsl_eigen_herm_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues of
+@var{n}-by-@var{n} complex hermitian matrices. The size of the workspace
+is @math{O(3n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_herm_free (gsl_eigen_herm_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_herm (gsl_matrix_complex * @var{A}, gsl_vector * @var{eval}, gsl_eigen_herm_workspace * @var{w})
+This function computes the eigenvalues of the complex hermitian matrix
+@var{A}. Additional workspace of the appropriate size must be provided
+in @var{w}. The diagonal and lower triangular part of @var{A} are
+destroyed during the computation, but the strict upper triangular part
+is not referenced. The imaginary parts of the diagonal are assumed to be
+zero and are not referenced. The eigenvalues are stored in the vector
+@var{eval} and are unordered.
+@end deftypefun
+
+@deftypefun {gsl_eigen_hermv_workspace *} gsl_eigen_hermv_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues and
+eigenvectors of @var{n}-by-@var{n} complex hermitian matrices. The size of
+the workspace is @math{O(5n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_hermv_free (gsl_eigen_hermv_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_hermv (gsl_matrix_complex * @var{A}, gsl_vector * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_hermv_workspace * @var{w})
+This function computes the eigenvalues and eigenvectors of the complex
+hermitian matrix @var{A}. Additional workspace of the appropriate size
+must be provided in @var{w}. The diagonal and lower triangular part of
+@var{A} are destroyed during the computation, but the strict upper
+triangular part is not referenced. The imaginary parts of the diagonal
+are assumed to be zero and are not referenced. The eigenvalues are
+stored in the vector @var{eval} and are unordered. The corresponding
+complex eigenvectors are stored in the columns of the matrix @var{evec}.
+For example, the eigenvector in the first column corresponds to the
+first eigenvalue. The eigenvectors are guaranteed to be mutually
+orthogonal and normalised to unit magnitude.
+@end deftypefun
+
+@node Real Nonsymmetric Matrices
+@section Real Nonsymmetric Matrices
+@cindex nonsymmetric matrix, real, eigensystem
+@cindex real nonsymmetric matrix, eigensystem
+
+The solution of the real nonsymmetric eigensystem problem for a
+matrix @math{A} involves computing the Schur decomposition
+@tex
+\beforedisplay
+$$
+A = Z T Z^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = Z T Z^T
+@end example
+
+@end ifinfo
+where @math{Z} is an orthogonal matrix of Schur vectors and @math{T},
+the Schur form, is quasi upper triangular with diagonal
+@math{1}-by-@math{1} blocks which are real eigenvalues of @math{A}, and
+diagonal @math{2}-by-@math{2} blocks whose eigenvalues are complex
+conjugate eigenvalues of @math{A}. The algorithm used is the double
+shift Francis method.
+
+@deftypefun {gsl_eigen_nonsymm_workspace *} gsl_eigen_nonsymm_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues of
+@var{n}-by-@var{n} real nonsymmetric matrices. The size of the workspace
+is @math{O(2n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_nonsymm_free (gsl_eigen_nonsymm_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_nonsymm_params (const int @var{compute_t}, const int @var{balance}, gsl_eigen_nonsymm_workspace * @var{w})
+This function sets some parameters which determine how the eigenvalue
+problem is solved in subsequent calls to @code{gsl_eigen_nonsymm}.
+
+If @var{compute_t} is set to 1, the full Schur form @math{T} will be
+computed by @code{gsl_eigen_nonsymm}. If it is set to 0,
+@math{T} will not be computed (this is the default setting). Computing
+the full Schur form @math{T} requires approximately 1.5-2 times the
+number of flops.
+
+If @var{balance} is set to 1, a balancing transformation is applied
+to the matrix prior to computing eigenvalues. This transformation is
+designed to make the rows and columns of the matrix have comparable
+norms, and can result in more accurate eigenvalues for matrices
+whose entries vary widely in magnitude. See @ref{Balancing} for more
+information. Note that the balancing transformation does not preserve
+the orthogonality of the Schur vectors, so if you wish to compute the
+Schur vectors with @code{gsl_eigen_nonsymm_Z} you will obtain the Schur
+vectors of the balanced matrix instead of the original matrix. The
+relationship will be
+@tex
+\beforedisplay
+$$
+T = Q^t D^{-1} A D Q
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+T = Q^t D^(-1) A D Q
+@end example
+
+@end ifinfo
+@noindent
+where @var{Q} is the matrix of Schur vectors for the balanced matrix, and
+@var{D} is the balancing transformation. Then @code{gsl_eigen_nonsymm_Z}
+will compute a matrix @var{Z} which satisfies
+@tex
+\beforedisplay
+$$
+T = Z^{-1} A Z
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+T = Z^(-1) A Z
+@end example
+
+@end ifinfo
+@noindent
+with @math{Z = D Q}. Note that @var{Z} will not be orthogonal. For
+this reason, balancing is not performed by default.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymm (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_eigen_nonsymm_workspace * @var{w})
+This function computes the eigenvalues of the real nonsymmetric matrix
+@var{A} and stores them in the vector @var{eval}. If @math{T} is
+desired, it is stored in the upper portion of @var{A} on output.
+Otherwise, on output, the diagonal of @var{A} will contain the
+@math{1}-by-@math{1} real eigenvalues and @math{2}-by-@math{2}
+complex conjugate eigenvalue systems, and the rest of @var{A} is
+destroyed. In rare cases, this function will fail to find all
+eigenvalues. If this happens, an error code is returned
+and the number of converged eigenvalues is stored in @code{w->n_evals}.
+The converged eigenvalues are stored in the beginning of @var{eval}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymm_Z (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_matrix * @var{Z}, gsl_eigen_nonsymm_workspace * @var{w})
+This function is identical to @code{gsl_eigen_nonsymm} except it also
+computes the Schur vectors and stores them into @var{Z}.
+@end deftypefun
+
+@deftypefun {gsl_eigen_nonsymmv_workspace *} gsl_eigen_nonsymmv_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues and
+eigenvectors of @var{n}-by-@var{n} real nonsymmetric matrices. The
+size of the workspace is @math{O(5n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_nonsymmv_free (gsl_eigen_nonsymmv_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymmv (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_nonsymmv_workspace * @var{w})
+This function computes eigenvalues and right eigenvectors of the
+@var{n}-by-@var{n} real nonsymmetric matrix @var{A}. It first calls
+@code{gsl_eigen_nonsymm} to compute the eigenvalues, Schur form @math{T}, and
+Schur vectors. Then it finds eigenvectors of @math{T} and backtransforms
+them using the Schur vectors. The Schur vectors are destroyed in the
+process, but can be saved by using @code{gsl_eigen_nonsymmv_Z}. The
+computed eigenvectors are normalized to have Euclidean norm 1. On
+output, the upper portion of @var{A} contains the Schur form
+@math{T}. If @code{gsl_eigen_nonsymm} fails, no eigenvectors are
+computed, and an error code is returned.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymmv_Z (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_matrix * @var{Z}, gsl_eigen_nonsymmv_workspace * @var{w})
+This function is identical to @code{gsl_eigen_nonsymmv} except it also saves
+the Schur vectors into @var{Z}.
+@end deftypefun
+
+@node Sorting Eigenvalues and Eigenvectors
+@section Sorting Eigenvalues and Eigenvectors
+@cindex sorting eigenvalues and eigenvectors
+
+@deftypefun int gsl_eigen_symmv_sort (gsl_vector * @var{eval}, gsl_matrix * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+This function simultaneously sorts the eigenvalues stored in the vector
+@var{eval} and the corresponding real eigenvectors stored in the columns
+of the matrix @var{evec} into ascending or descending order according to
+the value of the parameter @var{sort_type},
+
+@table @code
+@item GSL_EIGEN_SORT_VAL_ASC
+ascending order in numerical value
+@item GSL_EIGEN_SORT_VAL_DESC
+descending order in numerical value
+@item GSL_EIGEN_SORT_ABS_ASC
+ascending order in magnitude
+@item GSL_EIGEN_SORT_ABS_DESC
+descending order in magnitude
+@end table
+
+@end deftypefun
+
+@deftypefun int gsl_eigen_hermv_sort (gsl_vector * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+This function simultaneously sorts the eigenvalues stored in the vector
+@var{eval} and the corresponding complex eigenvectors stored in the
+columns of the matrix @var{evec} into ascending or descending order
+according to the value of the parameter @var{sort_type} as shown above.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymmv_sort (gsl_vector_complex * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+This function simultaneously sorts the eigenvalues stored in the vector
+@var{eval} and the corresponding complex eigenvectors stored in the
+columns of the matrix @var{evec} into ascending or descending order
+according to the value of the parameter @var{sort_type} as shown above.
+Only GSL_EIGEN_SORT_ABS_ASC and GSL_EIGEN_SORT_ABS_DESC are supported
+due to the eigenvalues being complex.
+@end deftypefun
+
+
+@comment @deftypefun int gsl_eigen_jacobi (gsl_matrix * @var{matrix}, gsl_vector * @var{eval}, gsl_matrix * @var{evec}, unsigned int @var{max_rot}, unsigned int * @var{nrot})
+@comment This function finds the eigenvectors and eigenvalues of a real symmetric
+@comment matrix by Jacobi iteration. The data in the input matrix is destroyed.
+@comment @end deftypefun
+
+@comment @deftypefun int gsl_la_invert_jacobi (const gsl_matrix * @var{matrix}, gsl_matrix * @var{ainv}, unsigned int @var{max_rot})
+@comment Invert a matrix by Jacobi iteration.
+@comment @end deftypefun
+
+@comment @deftypefun int gsl_eigen_sort (gsl_vector * @var{eval}, gsl_matrix * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+@comment This functions sorts the eigensystem results based on eigenvalues.
+@comment Sorts in order of increasing value or increasing
+@comment absolute value, depending on the value of
+@comment @var{sort_type}, which can be @code{GSL_EIGEN_SORT_VALUE}
+@comment or @code{GSL_EIGEN_SORT_ABSVALUE}.
+@comment @end deftypefun
+
+@node Eigenvalue and Eigenvector Examples
+@section Examples
+
+The following program computes the eigenvalues and eigenvectors of the 4-th order Hilbert matrix, @math{H(i,j) = 1/(i + j + 1)}.
+
+@example
+@verbatiminclude examples/eigen.c
+@end example
+
+@noindent
+Here is the beginning of the output from the program,
+
+@example
+$ ./a.out
+eigenvalue = 9.67023e-05
+eigenvector =
+-0.0291933
+0.328712
+-0.791411
+0.514553
+...
+@end example
+
+@noindent
+This can be compared with the corresponding output from @sc{gnu octave},
+
+@example
+octave> [v,d] = eig(hilb(4));
+octave> diag(d)
+ans =
+
+ 9.6702e-05
+ 6.7383e-03
+ 1.6914e-01
+ 1.5002e+00
+
+octave> v
+v =
+
+ 0.029193 0.179186 -0.582076 0.792608
+ -0.328712 -0.741918 0.370502 0.451923
+ 0.791411 0.100228 0.509579 0.322416
+ -0.514553 0.638283 0.514048 0.252161
+@end example
+
+@noindent
+Note that the eigenvectors can differ by a change of sign, since the
+sign of an eigenvector is arbitrary.
+
+The following program illustrates the use of the nonsymmetric
+eigensolver, by computing the eigenvalues and eigenvectors of
+the Vandermonde matrix @math{V(x;i,j) = x_i^{n - j}} with
+@math{x = (-1,-2,3,4)}.
+
+@example
+@verbatiminclude examples/eigen_nonsymm.c
+@end example
+
+@noindent
+Here is the beginning of the output from the program,
+
+@example
+$ ./a.out
+eigenvalue = -6.41391 + 0i
+eigenvector =
+-0.0998822 + 0i
+-0.111251 + 0i
+0.292501 + 0i
+0.944505 + 0i
+eigenvalue = 5.54555 + 3.08545i
+eigenvector =
+-0.043487 + -0.0076308i
+0.0642377 + -0.142127i
+-0.515253 + 0.0405118i
+-0.840592 + -0.00148565i
+...
+@end example
+
+@noindent
+This can be compared with the corresponding output from @sc{gnu octave},
+
+@example
+octave> [v,d] = eig(vander([-1 -2 3 4]));
+octave> diag(d)
+ans =
+
+ -6.4139 + 0.0000i
+ 5.5456 + 3.0854i
+ 5.5456 - 3.0854i
+ 2.3228 + 0.0000i
+
+octave> v
+v =
+
+ Columns 1 through 3:
+
+ -0.09988 + 0.00000i -0.04350 - 0.00755i -0.04350 + 0.00755i
+ -0.11125 + 0.00000i 0.06399 - 0.14224i 0.06399 + 0.14224i
+ 0.29250 + 0.00000i -0.51518 + 0.04142i -0.51518 - 0.04142i
+ 0.94451 + 0.00000i -0.84059 + 0.00000i -0.84059 - 0.00000i
+
+ Column 4:
+
+ -0.14493 + 0.00000i
+ 0.35660 + 0.00000i
+ 0.91937 + 0.00000i
+ 0.08118 + 0.00000i
+
+@end example
+Note that the eigenvectors corresponding to the eigenvalue
+@math{5.54555 + 3.08545i} are slightly different. This is because
+they differ by the multiplicative constant
+@math{0.9999984 + 0.0017674i} which has magnitude 1.
+
+@node Eigenvalue and Eigenvector References
+@section References and Further Reading
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+@itemize @asis
+@item
+G. H. Golub, C. F. Van Loan, @cite{Matrix Computations} (3rd Ed, 1996),
+Johns Hopkins University Press, ISBN 0-8018-5414-8.
+@end itemize
+
+@noindent
+The @sc{lapack} library is described in,
+
+@itemize @asis
+@item
+@cite{LAPACK Users' Guide} (Third Edition, 1999), Published by SIAM,
+ISBN 0-89871-447-8.
+
+@uref{http://www.netlib.org/lapack}
+@end itemize
+
+@noindent
+The @sc{lapack} source code can be found at the website above along with
+an online copy of the users guide.