Lodestar
An integrated real-time control package in C++
OrdinaryDifferentialEquation.hpp
1 //
2 // Created by Hamza El-Kebir on 5/8/21.
3 //
4 
5 #ifndef LODESTAR_ORDINARYDIFFERENTIALEQUATION_HPP
6 #define LODESTAR_ORDINARYDIFFERENTIALEQUATION_HPP
7 
8 #ifdef LS_USE_GINAC
9 
10 #include <Eigen/Dense>
11 #include "ginac/ginac.h"
12 
13 #include "Lodestar/systems/StateSpace.hpp"
14 
15 #include <string>
16 #include <deque>
17 
18 namespace ls {
19  namespace symbolic {
21  public:
23  functions_(GiNaC::lst{GiNaC::ex(0)}),
24  states_(GiNaC::lst{GiNaC::symbol("x")}),
25  inputs_(GiNaC::lst{GiNaC::symbol("u")}),
26  time_(GiNaC::symbol("t"))
27  {
28  makeSymbolMap();
29  }
30 
31  OrdinaryDifferentialEquation(const GiNaC::lst &functions,
32  const GiNaC::lst &states,
33  const GiNaC::lst &inputs) :
34  functions_(functions),
35  states_(states),
36  inputs_(inputs),
37  time_(GiNaC::symbol("t"))
38  {
39  makeSymbolMap();
40  }
41 
42  OrdinaryDifferentialEquation(const GiNaC::lst &functions,
43  const GiNaC::lst &states,
44  const GiNaC::lst &inputs,
45  const GiNaC::symbol &time) :
46  functions_(functions),
47  states_(states),
48  inputs_(inputs),
49  time_(time)
50  {
51  makeSymbolMap();
52  }
53 
54  GiNaC::exmap generateExpressionMap() const;
55 
56  GiNaC::exmap generateExpressionMap(
57  const std::vector<GiNaC::relational> &relationals) const;
58 
59  GiNaC::exmap
60  generateExpressionMap(const std::vector<double> &states,
61  const std::vector<double> &inputs) const;
62 
63  GiNaC::exmap generateExpressionMap(double t,
64  const std::vector<double> &states,
65  const std::vector<double> &inputs) const;
66 
67  GiNaC::symbol getSymbol(const std::string &symbolName) const;
68 
69  GiNaC::symbol getStateSymbol(unsigned int i) const;
70 
71  GiNaC::symbol getInputSymbol(unsigned int i) const;
72 
73  GiNaC::symbol getTimeSymbol() const;
74 
75  const GiNaC::lst &getFunctions() const;
76 
77  void setFunctions(const GiNaC::lst &functions);
78 
79  const GiNaC::lst &getStates() const;
80 
81  void setStates(const GiNaC::lst &states);
82 
83  const GiNaC::lst &getInputs() const;
84 
85  void setInputs(const GiNaC::lst &inputs);
86 
87  Eigen::MatrixXd evalf(const GiNaC::exmap &m) const;
88 
89  Eigen::MatrixXd evalf(const std::vector<double> &states,
90  const std::vector<double> &inputs) const;
91 
92  Eigen::MatrixXd
93  evalf(double t, const std::vector<double> &states,
94  const std::vector<double> &inputs) const;
95 
96  GiNaC::matrix generateJacobian(const GiNaC::lst &variables) const;
97 
98  GiNaC::matrix generateJacobianStates() const;
99 
100  std::string generateJacobianStatesCppFunc(const std::string &functionName, const bool dynamicType = false) const;
101 
102  std::string generateJacobianStatesArrayInputCppFunc(const std::string &functionName, const bool dynamicType = false) const;
103 
104  GiNaC::matrix generateJacobianInputs() const;
105 
106  std::string generateJacobianInputsCppFunc(const std::string &functionName, const bool dynamicType = false) const;
107 
108  std::string generateJacobianInputsArrayInputCppFunc(const std::string &functionName, const bool dynamicType = false) const;
109 
110  Eigen::MatrixXd generateJacobianMatrix(const GiNaC::lst &variables,
111  const GiNaC::exmap &exmap) const;
112 
113  Eigen::MatrixXd
114  generateJacobianMatrix(const GiNaC::matrix &jacobian,
115  const GiNaC::exmap &exmap) const;
116 
117  Eigen::MatrixXd
118  generateJacobianMatrixStates(const GiNaC::exmap &exmap) const;
119 
120  Eigen::MatrixXd
121  generateJacobianMatrixInputs(const GiNaC::exmap &exmap) const;
122 
123  std::string generateMatrixCppFunc(const GiNaC::matrix &ginacMatrix, const std::string &functionName, const bool dynamicType = false) const;
124 
125  std::string generateMatrixArrayInputCppFunc(const GiNaC::matrix &ginacMatrix, const std::string &functionName, const bool dynamicType = false) const;
126 
127  systems::StateSpace<> linearize(const GiNaC::exmap &exmap) const;
128 
129  systems::StateSpace<> linearize(const std::vector<double> &states,
130  const std::vector<double> &inputs) const;
131 
132  systems::StateSpace<> linearize(double t,
133  const std::vector<double> &states,
134  const std::vector<double> &inputs) const;
135 
136  systems::StateSpace<> linearize(const GiNaC::matrix &jacobianStates,
137  const GiNaC::matrix &jacobianInputs,
138  const GiNaC::exmap &exmap) const;
139 
140  systems::StateSpace<> linearize(const GiNaC::matrix &jacobianStates,
141  const GiNaC::matrix &jacobianInputs,
142  const std::vector<double> &states,
143  const std::vector<double> &inputs) const;
144 
145  systems::StateSpace<> linearize(const GiNaC::matrix &jacobianStates,
146  const GiNaC::matrix &jacobianInputs,
147  double t,
148  const std::vector<double> &states,
149  const std::vector<double> &inputs) const;
150 
151  static Eigen::MatrixXd matrixToMatrixXd(const GiNaC::matrix &mat);
152 
153  static Eigen::MatrixXd matrixToMatrixXd(const GiNaC::ex &ex);
154 
155  protected:
156  GiNaC::lst functions_;
157  GiNaC::symbol time_;
158  GiNaC::lst states_;
159  GiNaC::lst inputs_;
160 
161  std::map<std::string, GiNaC::symbol> symbolMap_;
162 
163  void makeSymbolMap();
164 
165  static void replaceString(std::string &str, const std::string &source, const std::string &dest);
166  static void replaceStringAll(std::string &str, const std::string &source, const std::string &dest);
167  static std::string stripWhiteSpace(std::string &str);
168  };
169  }
170 }
171 
172 #endif
173 
174 #endif //LODESTAR_ORDINARYDIFFERENTIALEQUATION_HPP
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::systems::StateSpace
Definition: StateSpace.hpp:15
ls::symbolic::OrdinaryDifferentialEquation
Definition: OrdinaryDifferentialEquation.hpp:20