void TEpidemModel::RungeKutta(const TFltV& y, const TFltV& dydx, double x, double h, TFltV& SirOutV) { const int n = y.Len(); IAssert(y.Len() == n && dydx.Len() == n); TFltV dym(n), dyt(n), yt(n); int i; double hh=h*0.5; double h6=h/6.0; double xh=x+hh; for (i=0; i < n; i++) { yt[i]=y[i]+hh*dydx[i]; } GetDerivs(xh, yt, dyt); for (i=0; i<n; i++) { yt[i]=y[i]+hh*dyt[i]; } GetDerivs(xh,yt,dym); for (i=0; i<n; i++) { yt[i]=y[i]+h*dym[i]; dym[i] += dyt[i]; } GetDerivs(x+h,yt,dyt); SirOutV.Clr(false); for (i=0; i<n; i++) { SirOutV.Add(y[i]+h6 * (dydx[i]+dyt[i]+2.0*dym[i])); } }
OpenANN::Environment::State DoublePoleBalancing::rk4(const State& s, double force, const State& der) { const double TIME_DELTA = 0.01; State result(6); double hh = TIME_DELTA * 0.5, h6 = TIME_DELTA / 6.0; State dym(6); State dyt(6); State yt(6); yt = s + hh * der; dyt = derivative(yt, force); dyt(0) = yt(1); dyt(2) = yt(3); dyt(4) = yt(5); yt = s + hh * dyt; dym = derivative(yt, force); dym(0) = yt(1); dym(2) = yt(3); dym(4) = yt(5); yt = s + TIME_DELTA * dym; dym += dyt; dyt = derivative(yt, force); dyt(0) = yt(1); dyt(2) = yt(3); dyt(4) = yt(5); result = s + h6 * (der + dyt + 2.0 * dym); return result; }