diff --git a/include/EulerSolver.hpp b/include/EulerSolver.hpp new file mode 100644 index 0000000..6e2db9d --- /dev/null +++ b/include/EulerSolver.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "ISolver.hpp" + +class EulerSolver : public ISolver +{ +public: + void Step( + IRocket& rocket, + State& state, + double dt) const override; +}; \ No newline at end of file diff --git a/include/IRocket.hpp b/include/IRocket.hpp index 8a2fd11..145211d 100644 --- a/include/IRocket.hpp +++ b/include/IRocket.hpp @@ -1,4 +1,6 @@ #pragma once + +#include #include "State.hpp" class IRocket { diff --git a/include/ISolver.hpp b/include/ISolver.hpp index 7c877e8..75ac98b 100644 --- a/include/ISolver.hpp +++ b/include/ISolver.hpp @@ -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; -}; \ No newline at end of file + virtual void Step( + IRocket& rocket, + State& state, + double dt) const = 0; +}; + diff --git a/include/RK4Solver.hpp b/include/RK4Solver.hpp new file mode 100644 index 0000000..5695104 --- /dev/null +++ b/include/RK4Solver.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "ISolver.hpp" + +class RK4Solver : public ISolver +{ +public: + void Step( + IRocket& rocket, + State& state, + double dt) const override; +}; \ No newline at end of file diff --git a/src/solvers/EulerSolver.cpp b/src/solvers/EulerSolver.cpp new file mode 100644 index 0000000..d4ddfd3 --- /dev/null +++ b/src/solvers/EulerSolver.cpp @@ -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; +} \ No newline at end of file diff --git a/src/solvers/RK4Solver.cpp b/src/solvers/RK4Solver.cpp new file mode 100644 index 0000000..e96a71d --- /dev/null +++ b/src/solvers/RK4Solver.cpp @@ -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); +}