nmpc_cgmres
OdeSolver.h
Go to the documentation of this file.
1 /* Author: Masaki Murooka */
2 
3 #pragma once
4 
5 #include <functional>
6 #include <iostream>
7 
8 #include <Eigen/Core>
9 #include <Eigen/Dense>
10 
11 namespace nmpc_cgmres
12 {
14 class OdeSolver
15 {
16 public:
17  using StateEquation = std::function<void(double,
18  const Eigen::Ref<const Eigen::VectorXd> &,
19  const Eigen::Ref<const Eigen::VectorXd> &,
20  Eigen::Ref<Eigen::VectorXd>)>;
21 
22 public:
23  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
24 
25  virtual void solve(const StateEquation & state_eq,
26  double t,
27  const Eigen::Ref<const Eigen::VectorXd> & x,
28  const Eigen::Ref<const Eigen::VectorXd> & u,
29  double dt,
30  Eigen::Ref<Eigen::VectorXd> ret) = 0;
31 };
32 
34 class EulerOdeSolver : public OdeSolver
35 {
36 public:
37  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
38 
39  virtual void solve(const StateEquation & state_eq,
40  double t,
41  const Eigen::Ref<const Eigen::VectorXd> & x,
42  const Eigen::Ref<const Eigen::VectorXd> & u,
43  double dt,
44  Eigen::Ref<Eigen::VectorXd> ret) override
45  {
46  Eigen::VectorXd dotx(x.size());
47  state_eq(t, x, u, dotx);
48  ret = x + dt * dotx;
49  }
50 };
51 
54 {
55 public:
56  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
57 
58  virtual void solve(const StateEquation & state_eq,
59  double t,
60  const Eigen::Ref<const Eigen::VectorXd> & x,
61  const Eigen::Ref<const Eigen::VectorXd> & u,
62  double dt,
63  Eigen::Ref<Eigen::VectorXd> ret) override
64  {
65  double dt_half = dt / 2;
66  Eigen::VectorXd k1(x.size()), k2(x.size()), k3(x.size()), k4(x.size());
67  state_eq(t, x, u, k1);
68  state_eq(t + dt_half, x + dt_half * k1, u, k2);
69  state_eq(t + dt_half, x + dt_half * k2, u, k3);
70  state_eq(t + dt, x + dt * k3, u, k4);
71  ret = x + (dt / 6) * (k1 + 2 * k2 + 2 * k3 + k4);
72  }
73 };
74 } // namespace nmpc_cgmres
nmpc_cgmres
Definition: CgmresProblem.h:11
nmpc_cgmres::EulerOdeSolver::solve
virtual EIGEN_MAKE_ALIGNED_OPERATOR_NEW void solve(const StateEquation &state_eq, double t, const Eigen::Ref< const Eigen::VectorXd > &x, const Eigen::Ref< const Eigen::VectorXd > &u, double dt, Eigen::Ref< Eigen::VectorXd > ret) override
Definition: OdeSolver.h:39
nmpc_cgmres::RungeKuttaOdeSolver::solve
virtual EIGEN_MAKE_ALIGNED_OPERATOR_NEW void solve(const StateEquation &state_eq, double t, const Eigen::Ref< const Eigen::VectorXd > &x, const Eigen::Ref< const Eigen::VectorXd > &u, double dt, Eigen::Ref< Eigen::VectorXd > ret) override
Definition: OdeSolver.h:58
nmpc_cgmres::RungeKuttaOdeSolver
Class to solve Ordinaly Diferential Equation by Runge-Kutta method.
Definition: OdeSolver.h:53
nmpc_cgmres::OdeSolver::solve
virtual EIGEN_MAKE_ALIGNED_OPERATOR_NEW void solve(const StateEquation &state_eq, double t, const Eigen::Ref< const Eigen::VectorXd > &x, const Eigen::Ref< const Eigen::VectorXd > &u, double dt, Eigen::Ref< Eigen::VectorXd > ret)=0
nmpc_cgmres::EulerOdeSolver
Class to solve Ordinaly Diferential Equation by Euler method.
Definition: OdeSolver.h:34
nmpc_cgmres::OdeSolver::StateEquation
std::function< void(double, const Eigen::Ref< const Eigen::VectorXd > &, const Eigen::Ref< const Eigen::VectorXd > &, Eigen::Ref< Eigen::VectorXd >)> StateEquation
Definition: OdeSolver.h:20
nmpc_cgmres::OdeSolver
Virtual class to solve Ordinaly Diferential Equation.
Definition: OdeSolver.h:14