Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions include/EulerSolver.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once

#include "ISolver.hpp"

class EulerSolver : public ISolver
{
public:
void Step(
IRocket& rocket,
State& state,
double dt) const override;
};
2 changes: 2 additions & 0 deletions include/IRocket.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#pragma once

#include <Eigen/Dense>
#include "State.hpp"

class IRocket {
Expand Down
12 changes: 9 additions & 3 deletions include/ISolver.hpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
#pragma once

#include "IRocket.hpp"
#include "State.hpp"

class ISolver {
class ISolver
{
public:
virtual ~ISolver() = default;

virtual State Step(IRocket& rocket, const State& current, double dt) = 0;
};
virtual void Step(
IRocket& rocket,
State& state,
double dt) const = 0;
};

12 changes: 12 additions & 0 deletions include/RK4Solver.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once

#include "ISolver.hpp"

class RK4Solver : public ISolver
{
public:
void Step(
IRocket& rocket,
State& state,
double dt) const override;
};
14 changes: 14 additions & 0 deletions src/solvers/EulerSolver.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include "EulerSolver.hpp"

void EulerSolver::Step(
IRocket& rocket,
State& state,
double dt) const
{
Eigen::VectorXd dx = rocket.GetDerivatives(state);

State derivative(state.size());
derivative.data = dx;

state = state + derivative * dt;
}
31 changes: 31 additions & 0 deletions src/solvers/RK4Solver.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include "RK4Solver.hpp"

void RK4Solver::Step(
IRocket& rocket,
State& state,
double dt) const
{
const State x = state;

// k1
State k1(x.size());
k1.data = rocket.GetDerivatives(x);

// k2
State x2 = x + k1 * (dt * 0.5);
State k2(x.size());
k2.data = rocket.GetDerivatives(x2);

// k3
State x3 = x + k2 * (dt * 0.5);
State k3(x.size());
k3.data = rocket.GetDerivatives(x3);

// k4
State x4 = x + k3 * dt;
State k4(x.size());
k4.data = rocket.GetDerivatives(x4);

// Final RK4 update
state = x + (k1 + k2 * 2.0 + k3 * 2.0 + k4) * (dt / 6.0);
}