28 #include <eigen3/Eigen/Core> 31 using namespace Eigen;
35 DynamicalSystem::DynamicalSystem(
int order,
double tau, Eigen::VectorXd initial_state, Eigen::VectorXd attractor_state, std::string name)
40 dim_(initial_state.size()*order),
42 dim_orig_(initial_state.size()),
43 tau_(tau),initial_state_(initial_state),attractor_state_(attractor_state),
44 name_(name),integration_method_(RUNGE_KUTTA)
46 assert(order==1 || order==2);
47 assert(initial_state.size()==attractor_state.size());
62 assert(x.size()==
dim());
63 assert(xd.size()==
dim());
69 x.segment(0,initial_state_.size()) = initial_state_;
75 void DynamicalSystem::integrateStep(
double dt,
const Eigen::Ref<const Eigen::VectorXd> x, Eigen::Ref<Eigen::VectorXd> x_updated, Eigen::Ref<Eigen::VectorXd> xd_updated)
const 79 assert(x.size()==
dim());
80 if (integration_method_ == RUNGE_KUTTA)
81 integrateStepRungeKutta(dt, x, x_updated, xd_updated);
83 integrateStepEuler(dt, x, x_updated, xd_updated);
87 void DynamicalSystem::integrateStepEuler(
double dt,
const Ref<const VectorXd> x, Ref<VectorXd> x_updated, Ref<VectorXd> xd_updated)
const 91 x_updated = x + dt*xd_updated;
94 void DynamicalSystem::integrateStepRungeKutta(
double dt,
const Ref<const VectorXd> x, Ref<VectorXd> x_updated, Ref<VectorXd> xd_updated)
const 100 VectorXd k1(l), k2(l), k3(l), k4(l);
102 VectorXd input_k2 = x + dt*0.5*k1;
104 VectorXd input_k3 = x + dt*0.5*k2;
106 VectorXd input_k4 = x + dt*k3;
109 x_updated = x + dt*(k1 + 2.0*(k2+k3) + k4)/6.0;
DynamicalSystem class header file.
virtual void integrateStep(double dt, const Eigen::Ref< const Eigen::VectorXd > x, Eigen::Ref< Eigen::VectorXd > x_updated, Eigen::Ref< Eigen::VectorXd > xd_updated) const
Integrate the system one time step.
virtual void set_initial_state(const Eigen::VectorXd &initial_state)
Mutator function for the initial state of the dynamical system.
int dim(void) const
Get the dimensionality of the dynamical system, i.e.
virtual void differentialEquation(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > xd) const =0
The differential equation which defines the system.
virtual ~DynamicalSystem(void)
Destructor.
virtual void integrateStart(Eigen::Ref< Eigen::VectorXd > x, Eigen::Ref< Eigen::VectorXd > xd) const
Start integrating the system.