| // This file is part of Eigen, a lightweight C++ template library |
| // for linear algebra. |
| // |
| // Copyright (C) 2009 Jitse Niesen <jitse@maths.leeds.ac.uk> |
| // |
| // Eigen is free software; you can redistribute it and/or |
| // modify it under the terms of the GNU Lesser General Public |
| // License as published by the Free Software Foundation; either |
| // version 3 of the License, or (at your option) any later version. |
| // |
| // Alternatively, you can redistribute it and/or |
| // modify it under the terms of the GNU General Public License as |
| // published by the Free Software Foundation; either version 2 of |
| // the License, or (at your option) any later version. |
| // |
| // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY |
| // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the |
| // GNU General Public License for more details. |
| // |
| // You should have received a copy of the GNU Lesser General Public |
| // License and a copy of the GNU General Public License along with |
| // Eigen. If not, see <http://www.gnu.org/licenses/>. |
| |
| #ifndef EIGEN_MATRIX_FUNCTIONS |
| #define EIGEN_MATRIX_FUNCTIONS |
| |
| #include <list> |
| #include <functional> |
| #include <iterator> |
| |
| #include <Eigen/Core> |
| #include <Eigen/LU> |
| #include <Eigen/Eigenvalues> |
| |
| namespace Eigen { |
| |
| /** \ingroup Unsupported_modules |
| * \defgroup MatrixFunctions_Module Matrix functions module |
| * \brief This module aims to provide various methods for the computation of |
| * matrix functions. |
| * |
| * To use this module, add |
| * \code |
| * #include <unsupported/Eigen/MatrixFunctions> |
| * \endcode |
| * at the start of your source file. |
| * |
| * This module defines the following MatrixBase methods. |
| * - \ref matrixbase_cos "MatrixBase::cos()", for computing the matrix cosine |
| * - \ref matrixbase_cosh "MatrixBase::cosh()", for computing the matrix hyperbolic cosine |
| * - \ref matrixbase_exp "MatrixBase::exp()", for computing the matrix exponential |
| * - \ref matrixbase_matrixfunction "MatrixBase::matrixFunction()", for computing general matrix functions |
| * - \ref matrixbase_sin "MatrixBase::sin()", for computing the matrix sine |
| * - \ref matrixbase_sinh "MatrixBase::sinh()", for computing the matrix hyperbolic sine |
| * |
| * These methods are the main entry points to this module. |
| * |
| * %Matrix functions are defined as follows. Suppose that \f$ f \f$ |
| * is an entire function (that is, a function on the complex plane |
| * that is everywhere complex differentiable). Then its Taylor |
| * series |
| * \f[ f(0) + f'(0) x + \frac{f''(0)}{2} x^2 + \frac{f'''(0)}{3!} x^3 + \cdots \f] |
| * converges to \f$ f(x) \f$. In this case, we can define the matrix |
| * function by the same series: |
| * \f[ f(M) = f(0) + f'(0) M + \frac{f''(0)}{2} M^2 + \frac{f'''(0)}{3!} M^3 + \cdots \f] |
| * |
| */ |
| |
| #include "src/MatrixFunctions/MatrixExponential.h" |
| #include "src/MatrixFunctions/MatrixFunction.h" |
| |
| |
| |
| /** |
| \page matrixbaseextra MatrixBase methods defined in the MatrixFunctions module |
| \ingroup MatrixFunctions_Module |
| |
| The remainder of the page documents the following MatrixBase methods |
| which are defined in the MatrixFunctions module. |
| |
| |
| |
| \section matrixbase_cos MatrixBase::cos() |
| |
| Compute the matrix cosine. |
| |
| \code |
| const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const |
| \endcode |
| |
| \param[in] M a square matrix. |
| \returns expression representing \f$ \cos(M) \f$. |
| |
| This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::cos(). |
| |
| \sa \ref matrixbase_sin "sin()" for an example. |
| |
| |
| |
| \section matrixbase_cosh MatrixBase::cosh() |
| |
| Compute the matrix hyberbolic cosine. |
| |
| \code |
| const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const |
| \endcode |
| |
| \param[in] M a square matrix. |
| \returns expression representing \f$ \cosh(M) \f$ |
| |
| This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::cosh(). |
| |
| \sa \ref matrixbase_sinh "sinh()" for an example. |
| |
| |
| |
| \section matrixbase_exp MatrixBase::exp() |
| |
| Compute the matrix exponential. |
| |
| \code |
| const MatrixExponentialReturnValue<Derived> MatrixBase<Derived>::exp() const |
| \endcode |
| |
| \param[in] M matrix whose exponential is to be computed. |
| \returns expression representing the matrix exponential of \p M. |
| |
| The matrix exponential of \f$ M \f$ is defined by |
| \f[ \exp(M) = \sum_{k=0}^\infty \frac{M^k}{k!}. \f] |
| The matrix exponential can be used to solve linear ordinary |
| differential equations: the solution of \f$ y' = My \f$ with the |
| initial condition \f$ y(0) = y_0 \f$ is given by |
| \f$ y(t) = \exp(M) y_0 \f$. |
| |
| The cost of the computation is approximately \f$ 20 n^3 \f$ for |
| matrices of size \f$ n \f$. The number 20 depends weakly on the |
| norm of the matrix. |
| |
| The matrix exponential is computed using the scaling-and-squaring |
| method combined with Padé approximation. The matrix is first |
| rescaled, then the exponential of the reduced matrix is computed |
| approximant, and then the rescaling is undone by repeated |
| squaring. The degree of the Padé approximant is chosen such |
| that the approximation error is less than the round-off |
| error. However, errors may accumulate during the squaring phase. |
| |
| Details of the algorithm can be found in: Nicholas J. Higham, "The |
| scaling and squaring method for the matrix exponential revisited," |
| <em>SIAM J. %Matrix Anal. Applic.</em>, <b>26</b>:1179–1193, |
| 2005. |
| |
| Example: The following program checks that |
| \f[ \exp \left[ \begin{array}{ccc} |
| 0 & \frac14\pi & 0 \\ |
| -\frac14\pi & 0 & 0 \\ |
| 0 & 0 & 0 |
| \end{array} \right] = \left[ \begin{array}{ccc} |
| \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\ |
| \frac12\sqrt2 & \frac12\sqrt2 & 0 \\ |
| 0 & 0 & 1 |
| \end{array} \right]. \f] |
| This corresponds to a rotation of \f$ \frac14\pi \f$ radians around |
| the z-axis. |
| |
| \include MatrixExponential.cpp |
| Output: \verbinclude MatrixExponential.out |
| |
| \note \p M has to be a matrix of \c float, \c double, |
| \c complex<float> or \c complex<double> . |
| |
| |
| |
| \section matrixbase_matrixfunction MatrixBase::matrixFunction() |
| |
| Compute a matrix function. |
| |
| \code |
| const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename ei_stem_function<typename ei_traits<Derived>::Scalar>::type f) const |
| \endcode |
| |
| \param[in] M argument of matrix function, should be a square matrix. |
| \param[in] f an entire function; \c f(x,n) should compute the n-th |
| derivative of f at x. |
| \returns expression representing \p f applied to \p M. |
| |
| Suppose that \p M is a matrix whose entries have type \c Scalar. |
| Then, the second argument, \p f, should be a function with prototype |
| \code |
| ComplexScalar f(ComplexScalar, int) |
| \endcode |
| where \c ComplexScalar = \c std::complex<Scalar> if \c Scalar is |
| real (e.g., \c float or \c double) and \c ComplexScalar = |
| \c Scalar if \c Scalar is complex. The return value of \c f(x,n) |
| should be \f$ f^{(n)}(x) \f$, the n-th derivative of f at x. |
| |
| This routine uses the algorithm described in: |
| Philip Davies and Nicholas J. Higham, |
| "A Schur-Parlett algorithm for computing matrix functions", |
| <em>SIAM J. %Matrix Anal. Applic.</em>, <b>25</b>:464–485, 2003. |
| |
| The actual work is done by the MatrixFunction class. |
| |
| Example: The following program checks that |
| \f[ \exp \left[ \begin{array}{ccc} |
| 0 & \frac14\pi & 0 \\ |
| -\frac14\pi & 0 & 0 \\ |
| 0 & 0 & 0 |
| \end{array} \right] = \left[ \begin{array}{ccc} |
| \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\ |
| \frac12\sqrt2 & \frac12\sqrt2 & 0 \\ |
| 0 & 0 & 1 |
| \end{array} \right]. \f] |
| This corresponds to a rotation of \f$ \frac14\pi \f$ radians around |
| the z-axis. This is the same example as used in the documentation |
| of \ref matrixbase_exp "exp()". |
| |
| \include MatrixFunction.cpp |
| Output: \verbinclude MatrixFunction.out |
| |
| Note that the function \c expfn is defined for complex numbers |
| \c x, even though the matrix \c A is over the reals. Instead of |
| \c expfn, we could also have used StdStemFunctions::exp: |
| \code |
| A.matrixFunction(StdStemFunctions<std::complex<double> >::exp, &B); |
| \endcode |
| |
| |
| |
| \section matrixbase_sin MatrixBase::sin() |
| |
| Compute the matrix sine. |
| |
| \code |
| const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sin() const |
| \endcode |
| |
| \param[in] M a square matrix. |
| \returns expression representing \f$ \sin(M) \f$. |
| |
| This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::sin(). |
| |
| Example: \include MatrixSine.cpp |
| Output: \verbinclude MatrixSine.out |
| |
| |
| |
| \section matrixbase_sinh const MatrixBase::sinh() |
| |
| Compute the matrix hyperbolic sine. |
| |
| \code |
| MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const |
| \endcode |
| |
| \param[in] M a square matrix. |
| \returns expression representing \f$ \sinh(M) \f$ |
| |
| This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::sinh(). |
| |
| Example: \include MatrixSinh.cpp |
| Output: \verbinclude MatrixSinh.out |
| |
| */ |
| |
| } |
| |
| #endif // EIGEN_MATRIX_FUNCTIONS |
| |