diff --git a/BackwardEuler.hpp b/BackwardEuler.hpp new file mode 100644 index 0000000..521ef96 --- /dev/null +++ b/BackwardEuler.hpp @@ -0,0 +1,18 @@ +// +// Created by Pablo on 12/2/18. +// + +#ifndef PROJECT_BACKWARDEULER_HPP +#define PROJECT_BACKWARDEULER_HPP +#include "AbstractOdeSolver.hpp" + +class BackwardEulerSolver : public AbstractOdeSolver { +public: + BackwardEulerSolver(); + virtual ~BackwardEulerSolver(); + + virtual void SolveEquation(std::ostream &stream) override; +}; + + +#endif //PROJECT_BACKWARDEULER_HPP diff --git a/BackwardEulerSolver.cpp b/BackwardEulerSolver.cpp new file mode 100644 index 0000000..0a5b564 --- /dev/null +++ b/BackwardEulerSolver.cpp @@ -0,0 +1,39 @@ +// +// Created by Pablo on 12/2/18. +// + +#include "BackwardEuler.hpp" +#include + +#define THRESH 50 //Max iter for fixed point method + + +BackwardEulerSolver::BackwardEulerSolver() {} + +BackwardEulerSolver::~BackwardEulerSolver() {} + +void BackwardEulerSolver::SolveEquation(std::ostream &stream) { + double y_prev = GetInitialValue(); + double y_next; + + double t_prev = GetInitialTime(); + double t_next; + + double h = GetStepSize(); + int n = static_cast(std::floor((GetFinalTime() - GetInitialTime()) / h)); + + stream << t_prev << " " << y_prev << "\n"; + + for (int i = 1; i <= n; ++i) { + y_next = y_prev; + t_next = t_prev + h; + // Fixed point iteration + for (int j = 1; j <= THRESH; ++j) { + y_next = y_prev + h * RightHandSide(y_next, t_next); + } + + stream << t_next << " " << y_next << "\n"; + y_prev = y_next; + t_prev = t_next; + } +}