File indexing completed on 2025-01-31 09:21:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #ifndef ODESolver_h
0032 #define ODESolver_h 1
0033
0034 #include <vector>
0035 #include <map>
0036 #include <functional>
0037
0038
0039
0040
0041 using myODEs = std::vector<double>(*)(double ,std::vector<double>) ;
0042 std::vector<double> operator*(const std::vector<double> v, double alfa);
0043 std::vector<double> operator+(const std::vector<double> v, double alfa);
0044 std::vector<double> operator+(const std::vector<double> v1, const std::vector<double> v2);
0045
0046
0047
0048 class ODESolver
0049 {
0050 public:
0051 ODESolver();
0052 ~ODESolver() = default;
0053 void Embedded_RungeKutta_Fehlberg(
0054 std::function<std::vector<double>(double,std::vector<double>)>, std::vector<double> &y,
0055 double start,double end,double stepsize=-1, double epsilon = 1e-3,
0056 std::vector<double> *time_observer=nullptr,std::vector<std::vector<double>> *state_observer=nullptr);
0057 void SetNstepsForObserver(unsigned int ndt) {fNstepsForObserver = ndt;}
0058 void RungeKutta4(
0059 std::function<std::vector<double>(double,std::vector<double>)>, std::vector<double> &y,
0060 double start,double end,double stepsize=-1,
0061 std::vector<double> *time_observer=nullptr,std::vector<std::vector<double>> *state_observer=nullptr);
0062 private:
0063 double RungeKutta_Fehlberg(std::function<std::vector<double>(double,std::vector<double>)>,
0064 std::vector<double> &y,double t, double stepsize=-1);
0065 void absValuesVector(std::vector<double> &vIn);
0066 unsigned int fNstepsForObserver{1};
0067 };
0068
0069
0070
0071 inline void ODESolver::absValuesVector(std::vector<double> &vIn)
0072 {
0073 for (double &val : vIn) {
0074 if (val < 0) val *= -1.;
0075 }
0076 }
0077
0078
0079
0080 #endif