TMB Documentation  v1.9.11
matexp.hpp
Go to the documentation of this file.
1 // Copyright (C) 2013-2015 Kasper Kristensen
2 // License: GPL-2
3 
9 namespace tmbutils {
10 
12 template <class scalartype, int dim>
13 struct matexp{
14  typedef Matrix<scalartype,dim,dim> matrix;
15  typedef Matrix<std::complex<scalartype> ,dim,dim> cmatrix;
16  typedef Matrix<std::complex<scalartype> ,dim,1> cvector;
17  cmatrix V;
18  cmatrix iV;
19  cvector lambda;
20  EigenSolver< matrix > eigensolver;
21  matexp(){};
22  matexp(matrix A_){
23  eigensolver.compute(A_);
24  V=eigensolver.eigenvectors();
25  lambda=eigensolver.eigenvalues();
26  iV=V.inverse();
27  }
28  matrix operator()(scalartype t){
29  cmatrix tmp;
30  tmp.setZero();
31  matrix ans;
32  for(int i=0;i<dim;i++)tmp(i,i)=exp(lambda(i)*t);
33  //tmp=V*tmp*iV;
34  tmp=tmp.operator*(iV);
35  tmp=V.operator*(tmp);
36 
37  for(int i=0;i<dim;i++)
38  for(int j=0;j<dim;j++)
39  ans(i,j)=std::real(tmp(i,j));
40  return ans;
41  }
42 };
43 
45 template <class scalartype>
46 struct matexp<scalartype,2>{
47  typedef std::complex<scalartype> complex;
48  typedef Matrix<scalartype,2,2> matrix;
49  typedef Matrix<complex ,2,2> cmatrix;
50  typedef Matrix<complex ,2,1> cvector;
51  cmatrix V;
52  cmatrix iV;
53  cvector lambda;
54  matexp(){};
55  matexp(matrix A_){
56  complex T=scalartype(0.5)*A_.trace(); /* half trace */
57  complex D=A_.determinant();
58  lambda << T+sqrt(T*T-D) , T-sqrt(T*T-D);
59  scalartype a=A_(0,0);
60  scalartype b=A_(0,1);
61  V << b, b, lambda(0)-a, lambda(1)-a;
62  iV=V.inverse();
63  }
64  matrix operator()(scalartype t){
65  int dim=2;
66  cmatrix tmp;
67  tmp.setZero();
68  matrix ans;
69  for(int i=0;i<dim;i++)tmp(i,i)=exp(lambda(i)*t);
70  //tmp=V*tmp*iV;
71  tmp=tmp.operator*(iV);
72  tmp=V.operator*(tmp);
73 
74  for(int i=0;i<dim;i++)
75  for(int j=0;j<dim;j++)
76  ans(i,j)=std::real(tmp(i,j));
77  //ans(i,j)=(tmp(i,j));
78  return ans;
79  }
80 };
81 
82 }
Matrix exponential: matrix of arbitrary dimension.
Definition: matexp.hpp:13
Utility functions for TMB (automatically included)
Definition: concat.hpp:5
License: GPL v2