#ifndef __STRATEGY_H
#define __STRATEGY_H

using namespace std;

template <class Function, class V1, class V2>
V2 nextByRK4(Function f, V1 x, V2 y, V1 h){
  V2 k1 = f(x, y) * h;
  V2 k2 = f(x + h/2, y + k1/2) * h;
  V2 k3 = f(x + h/2, y + k2/2) * h;
  V2 k4 = f(x + h, y + k3) * h;
  return y + (k1 + k2*2 + k3*2 + k4)/6;
}

template <class Function, class V1, class V2>
V2 nextByRK2(Function f, V1 x, V2 y, V1 h){
  V2 k1 = f(x, y) * h;
  V2 k2 = f(x + h, y + k1) * h;
  return y + (k1 + k2)/2;
}

template <class Function, class V1, class V2>
V2 nextByEuler(Function f, V1 x, V2 y, V1 h){
  return y + f(x, y) * h;
}

#endif /* __STRATEGY_H */
