5 #ifndef LODESTAR_ORDINARYDIFFERENTIALEQUATION_HPP
6 #define LODESTAR_ORDINARYDIFFERENTIALEQUATION_HPP
10 #include <Eigen/Dense>
11 #include "ginac/ginac.h"
13 #include "Lodestar/systems/StateSpace.hpp"
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"))
32 const GiNaC::lst &states,
33 const GiNaC::lst &inputs) :
34 functions_(functions),
37 time_(GiNaC::symbol(
"t"))
43 const GiNaC::lst &states,
44 const GiNaC::lst &inputs,
45 const GiNaC::symbol &time) :
46 functions_(functions),
54 GiNaC::exmap generateExpressionMap()
const;
56 GiNaC::exmap generateExpressionMap(
57 const std::vector<GiNaC::relational> &relationals)
const;
60 generateExpressionMap(
const std::vector<double> &states,
61 const std::vector<double> &inputs)
const;
63 GiNaC::exmap generateExpressionMap(
double t,
64 const std::vector<double> &states,
65 const std::vector<double> &inputs)
const;
67 GiNaC::symbol getSymbol(
const std::string &symbolName)
const;
69 GiNaC::symbol getStateSymbol(
unsigned int i)
const;
71 GiNaC::symbol getInputSymbol(
unsigned int i)
const;
73 GiNaC::symbol getTimeSymbol()
const;
75 const GiNaC::lst &getFunctions()
const;
77 void setFunctions(
const GiNaC::lst &functions);
79 const GiNaC::lst &getStates()
const;
81 void setStates(
const GiNaC::lst &states);
83 const GiNaC::lst &getInputs()
const;
85 void setInputs(
const GiNaC::lst &inputs);
87 Eigen::MatrixXd evalf(
const GiNaC::exmap &m)
const;
89 Eigen::MatrixXd evalf(
const std::vector<double> &states,
90 const std::vector<double> &inputs)
const;
93 evalf(
double t,
const std::vector<double> &states,
94 const std::vector<double> &inputs)
const;
96 GiNaC::matrix generateJacobian(
const GiNaC::lst &variables)
const;
98 GiNaC::matrix generateJacobianStates()
const;
100 std::string generateJacobianStatesCppFunc(
const std::string &functionName,
const bool dynamicType =
false)
const;
102 std::string generateJacobianStatesArrayInputCppFunc(
const std::string &functionName,
const bool dynamicType =
false)
const;
104 GiNaC::matrix generateJacobianInputs()
const;
106 std::string generateJacobianInputsCppFunc(
const std::string &functionName,
const bool dynamicType =
false)
const;
108 std::string generateJacobianInputsArrayInputCppFunc(
const std::string &functionName,
const bool dynamicType =
false)
const;
110 Eigen::MatrixXd generateJacobianMatrix(
const GiNaC::lst &variables,
111 const GiNaC::exmap &exmap)
const;
114 generateJacobianMatrix(
const GiNaC::matrix &jacobian,
115 const GiNaC::exmap &exmap)
const;
118 generateJacobianMatrixStates(
const GiNaC::exmap &exmap)
const;
121 generateJacobianMatrixInputs(
const GiNaC::exmap &exmap)
const;
123 std::string generateMatrixCppFunc(
const GiNaC::matrix &ginacMatrix,
const std::string &functionName,
const bool dynamicType =
false)
const;
125 std::string generateMatrixArrayInputCppFunc(
const GiNaC::matrix &ginacMatrix,
const std::string &functionName,
const bool dynamicType =
false)
const;
130 const std::vector<double> &inputs)
const;
133 const std::vector<double> &states,
134 const std::vector<double> &inputs)
const;
137 const GiNaC::matrix &jacobianInputs,
138 const GiNaC::exmap &exmap)
const;
141 const GiNaC::matrix &jacobianInputs,
142 const std::vector<double> &states,
143 const std::vector<double> &inputs)
const;
146 const GiNaC::matrix &jacobianInputs,
148 const std::vector<double> &states,
149 const std::vector<double> &inputs)
const;
151 static Eigen::MatrixXd matrixToMatrixXd(
const GiNaC::matrix &mat);
153 static Eigen::MatrixXd matrixToMatrixXd(
const GiNaC::ex &ex);
156 GiNaC::lst functions_;
161 std::map<std::string, GiNaC::symbol> symbolMap_;
163 void makeSymbolMap();
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);
174 #endif //LODESTAR_ORDINARYDIFFERENTIALEQUATION_HPP