Stan Math Library  2.15.0
reverse mode automatic differentiation
matrix_exp_2x2.hpp
Go to the documentation of this file.
1 #ifndef STAN_MATH_PRIM_MAT_FUN_MATRIX_EXP_2X2_HPP
2 #define STAN_MATH_PRIM_MAT_FUN_MATRIX_EXP_2X2_HPP
3 
6 
7 namespace stan {
8  namespace math {
9 
19  template <typename T>
20  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
22  const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& A) {
23  T a = A(0, 0), b = A(0, 1), c = A(1, 0), d = A(1, 1), delta;
24  delta = sqrt(square(a - d) + 4 * b * c);
25 
26  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> B(2, 2);
27  T half_delta = 0.5 * delta;
28  T cosh_half_delta = cosh(half_delta);
29  T sinh_half_delta = sinh(half_delta);
30  T exp_half_a_plus_d = exp(0.5 * (a + d));
31  T Two_exp_sinh = 2 * exp_half_a_plus_d * sinh_half_delta;
32  T delta_cosh = delta * cosh_half_delta;
33  T ad_sinh_half_delta = (a - d) * sinh_half_delta;
34 
35  B(0, 0) = exp_half_a_plus_d * (delta_cosh + ad_sinh_half_delta);
36  B(0, 1) = b * Two_exp_sinh;
37  B(1, 0) = c * Two_exp_sinh;
38  B(1, 1) = exp_half_a_plus_d * (delta_cosh - ad_sinh_half_delta);
39 
40  return B / delta;
41  }
42  }
43 }
44 #endif
fvar< T > sqrt(const fvar< T > &x)
Definition: sqrt.hpp:14
fvar< T > cosh(const fvar< T > &x)
Definition: cosh.hpp:13
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > matrix_exp_2x2(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &A)
Return the matrix exponential of a 2x2 matrix.
fvar< T > square(const fvar< T > &x)
Definition: square.hpp:14
fvar< T > exp(const fvar< T > &x)
Definition: exp.hpp:10
fvar< T > sinh(const fvar< T > &x)
Definition: sinh.hpp:12

     [ Stan Home Page ] © 2011–2016, Stan Development Team.