1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2009 Jitse Niesen <jitse (a] maths.leeds.ac.uk> 5 // Copyright (C) 2012 Chen-Pang He <jdh8 (a] ms63.hinet.net> 6 // 7 // This Source Code Form is subject to the terms of the Mozilla 8 // Public License v. 2.0. If a copy of the MPL was not distributed 9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10 11 #ifndef EIGEN_MATRIX_FUNCTIONS 12 #define EIGEN_MATRIX_FUNCTIONS 13 14 #include <cfloat> 15 #include <list> 16 #include <functional> 17 #include <iterator> 18 19 #include <Eigen/Core> 20 #include <Eigen/LU> 21 #include <Eigen/Eigenvalues> 22 23 /** 24 * \defgroup MatrixFunctions_Module Matrix functions module 25 * \brief This module aims to provide various methods for the computation of 26 * matrix functions. 27 * 28 * To use this module, add 29 * \code 30 * #include <unsupported/Eigen/MatrixFunctions> 31 * \endcode 32 * at the start of your source file. 33 * 34 * This module defines the following MatrixBase methods. 35 * - \ref matrixbase_cos "MatrixBase::cos()", for computing the matrix cosine 36 * - \ref matrixbase_cosh "MatrixBase::cosh()", for computing the matrix hyperbolic cosine 37 * - \ref matrixbase_exp "MatrixBase::exp()", for computing the matrix exponential 38 * - \ref matrixbase_log "MatrixBase::log()", for computing the matrix logarithm 39 * - \ref matrixbase_pow "MatrixBase::pow()", for computing the matrix power 40 * - \ref matrixbase_matrixfunction "MatrixBase::matrixFunction()", for computing general matrix functions 41 * - \ref matrixbase_sin "MatrixBase::sin()", for computing the matrix sine 42 * - \ref matrixbase_sinh "MatrixBase::sinh()", for computing the matrix hyperbolic sine 43 * - \ref matrixbase_sqrt "MatrixBase::sqrt()", for computing the matrix square root 44 * 45 * These methods are the main entry points to this module. 46 * 47 * %Matrix functions are defined as follows. Suppose that \f$ f \f$ 48 * is an entire function (that is, a function on the complex plane 49 * that is everywhere complex differentiable). Then its Taylor 50 * series 51 * \f[ f(0) + f'(0) x + \frac{f''(0)}{2} x^2 + \frac{f'''(0)}{3!} x^3 + \cdots \f] 52 * converges to \f$ f(x) \f$. In this case, we can define the matrix 53 * function by the same series: 54 * \f[ f(M) = f(0) + f'(0) M + \frac{f''(0)}{2} M^2 + \frac{f'''(0)}{3!} M^3 + \cdots \f] 55 * 56 */ 57 58 #include "src/MatrixFunctions/MatrixExponential.h" 59 #include "src/MatrixFunctions/MatrixFunction.h" 60 #include "src/MatrixFunctions/MatrixSquareRoot.h" 61 #include "src/MatrixFunctions/MatrixLogarithm.h" 62 #include "src/MatrixFunctions/MatrixPower.h" 63 64 65 /** 66 \page matrixbaseextra_page 67 \ingroup MatrixFunctions_Module 68 69 \section matrixbaseextra MatrixBase methods defined in the MatrixFunctions module 70 71 The remainder of the page documents the following MatrixBase methods 72 which are defined in the MatrixFunctions module. 73 74 75 76 \subsection matrixbase_cos MatrixBase::cos() 77 78 Compute the matrix cosine. 79 80 \code 81 const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const 82 \endcode 83 84 \param[in] M a square matrix. 85 \returns expression representing \f$ \cos(M) \f$. 86 87 This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::cos(). 88 89 \sa \ref matrixbase_sin "sin()" for an example. 90 91 92 93 \subsection matrixbase_cosh MatrixBase::cosh() 94 95 Compute the matrix hyberbolic cosine. 96 97 \code 98 const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const 99 \endcode 100 101 \param[in] M a square matrix. 102 \returns expression representing \f$ \cosh(M) \f$ 103 104 This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::cosh(). 105 106 \sa \ref matrixbase_sinh "sinh()" for an example. 107 108 109 110 \subsection matrixbase_exp MatrixBase::exp() 111 112 Compute the matrix exponential. 113 114 \code 115 const MatrixExponentialReturnValue<Derived> MatrixBase<Derived>::exp() const 116 \endcode 117 118 \param[in] M matrix whose exponential is to be computed. 119 \returns expression representing the matrix exponential of \p M. 120 121 The matrix exponential of \f$ M \f$ is defined by 122 \f[ \exp(M) = \sum_{k=0}^\infty \frac{M^k}{k!}. \f] 123 The matrix exponential can be used to solve linear ordinary 124 differential equations: the solution of \f$ y' = My \f$ with the 125 initial condition \f$ y(0) = y_0 \f$ is given by 126 \f$ y(t) = \exp(M) y_0 \f$. 127 128 The cost of the computation is approximately \f$ 20 n^3 \f$ for 129 matrices of size \f$ n \f$. The number 20 depends weakly on the 130 norm of the matrix. 131 132 The matrix exponential is computed using the scaling-and-squaring 133 method combined with Padé approximation. The matrix is first 134 rescaled, then the exponential of the reduced matrix is computed 135 approximant, and then the rescaling is undone by repeated 136 squaring. The degree of the Padé approximant is chosen such 137 that the approximation error is less than the round-off 138 error. However, errors may accumulate during the squaring phase. 139 140 Details of the algorithm can be found in: Nicholas J. Higham, "The 141 scaling and squaring method for the matrix exponential revisited," 142 <em>SIAM J. %Matrix Anal. Applic.</em>, <b>26</b>:1179–1193, 143 2005. 144 145 Example: The following program checks that 146 \f[ \exp \left[ \begin{array}{ccc} 147 0 & \frac14\pi & 0 \\ 148 -\frac14\pi & 0 & 0 \\ 149 0 & 0 & 0 150 \end{array} \right] = \left[ \begin{array}{ccc} 151 \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\ 152 \frac12\sqrt2 & \frac12\sqrt2 & 0 \\ 153 0 & 0 & 1 154 \end{array} \right]. \f] 155 This corresponds to a rotation of \f$ \frac14\pi \f$ radians around 156 the z-axis. 157 158 \include MatrixExponential.cpp 159 Output: \verbinclude MatrixExponential.out 160 161 \note \p M has to be a matrix of \c float, \c double, \c long double 162 \c complex<float>, \c complex<double>, or \c complex<long double> . 163 164 165 \subsection matrixbase_log MatrixBase::log() 166 167 Compute the matrix logarithm. 168 169 \code 170 const MatrixLogarithmReturnValue<Derived> MatrixBase<Derived>::log() const 171 \endcode 172 173 \param[in] M invertible matrix whose logarithm is to be computed. 174 \returns expression representing the matrix logarithm root of \p M. 175 176 The matrix logarithm of \f$ M \f$ is a matrix \f$ X \f$ such that 177 \f$ \exp(X) = M \f$ where exp denotes the matrix exponential. As for 178 the scalar logarithm, the equation \f$ \exp(X) = M \f$ may have 179 multiple solutions; this function returns a matrix whose eigenvalues 180 have imaginary part in the interval \f$ (-\pi,\pi] \f$. 181 182 In the real case, the matrix \f$ M \f$ should be invertible and 183 it should have no eigenvalues which are real and negative (pairs of 184 complex conjugate eigenvalues are allowed). In the complex case, it 185 only needs to be invertible. 186 187 This function computes the matrix logarithm using the Schur-Parlett 188 algorithm as implemented by MatrixBase::matrixFunction(). The 189 logarithm of an atomic block is computed by MatrixLogarithmAtomic, 190 which uses direct computation for 1-by-1 and 2-by-2 blocks and an 191 inverse scaling-and-squaring algorithm for bigger blocks, with the 192 square roots computed by MatrixBase::sqrt(). 193 194 Details of the algorithm can be found in Section 11.6.2 of: 195 Nicholas J. Higham, 196 <em>Functions of Matrices: Theory and Computation</em>, 197 SIAM 2008. ISBN 978-0-898716-46-7. 198 199 Example: The following program checks that 200 \f[ \log \left[ \begin{array}{ccc} 201 \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\ 202 \frac12\sqrt2 & \frac12\sqrt2 & 0 \\ 203 0 & 0 & 1 204 \end{array} \right] = \left[ \begin{array}{ccc} 205 0 & \frac14\pi & 0 \\ 206 -\frac14\pi & 0 & 0 \\ 207 0 & 0 & 0 208 \end{array} \right]. \f] 209 This corresponds to a rotation of \f$ \frac14\pi \f$ radians around 210 the z-axis. This is the inverse of the example used in the 211 documentation of \ref matrixbase_exp "exp()". 212 213 \include MatrixLogarithm.cpp 214 Output: \verbinclude MatrixLogarithm.out 215 216 \note \p M has to be a matrix of \c float, \c double, <tt>long 217 double</tt>, \c complex<float>, \c complex<double>, or \c complex<long 218 double> . 219 220 \sa MatrixBase::exp(), MatrixBase::matrixFunction(), 221 class MatrixLogarithmAtomic, MatrixBase::sqrt(). 222 223 224 \subsection matrixbase_pow MatrixBase::pow() 225 226 Compute the matrix raised to arbitrary real power. 227 228 \code 229 const MatrixPowerReturnValue<Derived> MatrixBase<Derived>::pow(RealScalar p) const 230 \endcode 231 232 \param[in] M base of the matrix power, should be a square matrix. 233 \param[in] p exponent of the matrix power, should be real. 234 235 The matrix power \f$ M^p \f$ is defined as \f$ \exp(p \log(M)) \f$, 236 where exp denotes the matrix exponential, and log denotes the matrix 237 logarithm. 238 239 The matrix \f$ M \f$ should meet the conditions to be an argument of 240 matrix logarithm. If \p p is not of the real scalar type of \p M, it 241 is casted into the real scalar type of \p M. 242 243 This function computes the matrix power using the Schur-Padé 244 algorithm as implemented by class MatrixPower. The exponent is split 245 into integral part and fractional part, where the fractional part is 246 in the interval \f$ (-1, 1) \f$. The main diagonal and the first 247 super-diagonal is directly computed. 248 249 Details of the algorithm can be found in: Nicholas J. Higham and 250 Lijing Lin, "A Schur-Padé algorithm for fractional powers of a 251 matrix," <em>SIAM J. %Matrix Anal. Applic.</em>, 252 <b>32(3)</b>:1056–1078, 2011. 253 254 Example: The following program checks that 255 \f[ \left[ \begin{array}{ccc} 256 \cos1 & -\sin1 & 0 \\ 257 \sin1 & \cos1 & 0 \\ 258 0 & 0 & 1 259 \end{array} \right]^{\frac14\pi} = \left[ \begin{array}{ccc} 260 \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\ 261 \frac12\sqrt2 & \frac12\sqrt2 & 0 \\ 262 0 & 0 & 1 263 \end{array} \right]. \f] 264 This corresponds to \f$ \frac14\pi \f$ rotations of 1 radian around 265 the z-axis. 266 267 \include MatrixPower.cpp 268 Output: \verbinclude MatrixPower.out 269 270 MatrixBase::pow() is user-friendly. However, there are some 271 circumstances under which you should use class MatrixPower directly. 272 MatrixPower can save the result of Schur decomposition, so it's 273 better for computing various powers for the same matrix. 274 275 Example: 276 \include MatrixPower_optimal.cpp 277 Output: \verbinclude MatrixPower_optimal.out 278 279 \note \p M has to be a matrix of \c float, \c double, <tt>long 280 double</tt>, \c complex<float>, \c complex<double>, or \c complex<long 281 double> . 282 283 \sa MatrixBase::exp(), MatrixBase::log(), class MatrixPower. 284 285 286 \subsection matrixbase_matrixfunction MatrixBase::matrixFunction() 287 288 Compute a matrix function. 289 290 \code 291 const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename internal::stem_function<typename internal::traits<Derived>::Scalar>::type f) const 292 \endcode 293 294 \param[in] M argument of matrix function, should be a square matrix. 295 \param[in] f an entire function; \c f(x,n) should compute the n-th 296 derivative of f at x. 297 \returns expression representing \p f applied to \p M. 298 299 Suppose that \p M is a matrix whose entries have type \c Scalar. 300 Then, the second argument, \p f, should be a function with prototype 301 \code 302 ComplexScalar f(ComplexScalar, int) 303 \endcode 304 where \c ComplexScalar = \c std::complex<Scalar> if \c Scalar is 305 real (e.g., \c float or \c double) and \c ComplexScalar = 306 \c Scalar if \c Scalar is complex. The return value of \c f(x,n) 307 should be \f$ f^{(n)}(x) \f$, the n-th derivative of f at x. 308 309 This routine uses the algorithm described in: 310 Philip Davies and Nicholas J. Higham, 311 "A Schur-Parlett algorithm for computing matrix functions", 312 <em>SIAM J. %Matrix Anal. Applic.</em>, <b>25</b>:464–485, 2003. 313 314 The actual work is done by the MatrixFunction class. 315 316 Example: The following program checks that 317 \f[ \exp \left[ \begin{array}{ccc} 318 0 & \frac14\pi & 0 \\ 319 -\frac14\pi & 0 & 0 \\ 320 0 & 0 & 0 321 \end{array} \right] = \left[ \begin{array}{ccc} 322 \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\ 323 \frac12\sqrt2 & \frac12\sqrt2 & 0 \\ 324 0 & 0 & 1 325 \end{array} \right]. \f] 326 This corresponds to a rotation of \f$ \frac14\pi \f$ radians around 327 the z-axis. This is the same example as used in the documentation 328 of \ref matrixbase_exp "exp()". 329 330 \include MatrixFunction.cpp 331 Output: \verbinclude MatrixFunction.out 332 333 Note that the function \c expfn is defined for complex numbers 334 \c x, even though the matrix \c A is over the reals. Instead of 335 \c expfn, we could also have used StdStemFunctions::exp: 336 \code 337 A.matrixFunction(StdStemFunctions<std::complex<double> >::exp, &B); 338 \endcode 339 340 341 342 \subsection matrixbase_sin MatrixBase::sin() 343 344 Compute the matrix sine. 345 346 \code 347 const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sin() const 348 \endcode 349 350 \param[in] M a square matrix. 351 \returns expression representing \f$ \sin(M) \f$. 352 353 This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::sin(). 354 355 Example: \include MatrixSine.cpp 356 Output: \verbinclude MatrixSine.out 357 358 359 360 \subsection matrixbase_sinh MatrixBase::sinh() 361 362 Compute the matrix hyperbolic sine. 363 364 \code 365 MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const 366 \endcode 367 368 \param[in] M a square matrix. 369 \returns expression representing \f$ \sinh(M) \f$ 370 371 This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdStemFunctions::sinh(). 372 373 Example: \include MatrixSinh.cpp 374 Output: \verbinclude MatrixSinh.out 375 376 377 \subsection matrixbase_sqrt MatrixBase::sqrt() 378 379 Compute the matrix square root. 380 381 \code 382 const MatrixSquareRootReturnValue<Derived> MatrixBase<Derived>::sqrt() const 383 \endcode 384 385 \param[in] M invertible matrix whose square root is to be computed. 386 \returns expression representing the matrix square root of \p M. 387 388 The matrix square root of \f$ M \f$ is the matrix \f$ M^{1/2} \f$ 389 whose square is the original matrix; so if \f$ S = M^{1/2} \f$ then 390 \f$ S^2 = M \f$. 391 392 In the <b>real case</b>, the matrix \f$ M \f$ should be invertible and 393 it should have no eigenvalues which are real and negative (pairs of 394 complex conjugate eigenvalues are allowed). In that case, the matrix 395 has a square root which is also real, and this is the square root 396 computed by this function. 397 398 The matrix square root is computed by first reducing the matrix to 399 quasi-triangular form with the real Schur decomposition. The square 400 root of the quasi-triangular matrix can then be computed directly. The 401 cost is approximately \f$ 25 n^3 \f$ real flops for the real Schur 402 decomposition and \f$ 3\frac13 n^3 \f$ real flops for the remainder 403 (though the computation time in practice is likely more than this 404 indicates). 405 406 Details of the algorithm can be found in: Nicholas J. Highan, 407 "Computing real square roots of a real matrix", <em>Linear Algebra 408 Appl.</em>, 88/89:405–430, 1987. 409 410 If the matrix is <b>positive-definite symmetric</b>, then the square 411 root is also positive-definite symmetric. In this case, it is best to 412 use SelfAdjointEigenSolver::operatorSqrt() to compute it. 413 414 In the <b>complex case</b>, the matrix \f$ M \f$ should be invertible; 415 this is a restriction of the algorithm. The square root computed by 416 this algorithm is the one whose eigenvalues have an argument in the 417 interval \f$ (-\frac12\pi, \frac12\pi] \f$. This is the usual branch 418 cut. 419 420 The computation is the same as in the real case, except that the 421 complex Schur decomposition is used to reduce the matrix to a 422 triangular matrix. The theoretical cost is the same. Details are in: 423 Åke Björck and Sven Hammarling, "A Schur method for the 424 square root of a matrix", <em>Linear Algebra Appl.</em>, 425 52/53:127–140, 1983. 426 427 Example: The following program checks that the square root of 428 \f[ \left[ \begin{array}{cc} 429 \cos(\frac13\pi) & -\sin(\frac13\pi) \\ 430 \sin(\frac13\pi) & \cos(\frac13\pi) 431 \end{array} \right], \f] 432 corresponding to a rotation over 60 degrees, is a rotation over 30 degrees: 433 \f[ \left[ \begin{array}{cc} 434 \cos(\frac16\pi) & -\sin(\frac16\pi) \\ 435 \sin(\frac16\pi) & \cos(\frac16\pi) 436 \end{array} \right]. \f] 437 438 \include MatrixSquareRoot.cpp 439 Output: \verbinclude MatrixSquareRoot.out 440 441 \sa class RealSchur, class ComplexSchur, class MatrixSquareRoot, 442 SelfAdjointEigenSolver::operatorSqrt(). 443 444 */ 445 446 #endif // EIGEN_MATRIX_FUNCTIONS 447 448