using System; using System.Collections.Generic; using System.Text; using RungeKutta.Integrators; namespace RungeKutta.SimStep { class MidpointMethod : SimStepper { public State Integrate(State oldState, float timeStep, ODEs.ODE ode) { State k1 = new State(), k2 = new State(), k3 = new State(); k1 = oldState; k1.acceleration = ode.EvaluateForceAtState(k1); k2.position = EulerStep.Integrate(oldState.position, timeStep / 2.0f, k1.velocity); k2.velocity = EulerStep.Integrate(oldState.velocity, timeStep / 2.0f, k1.acceleration); k2.acceleration = ode.EvaluateForceAtState(k2); k3.position = EulerStep.Integrate(oldState.position, timeStep, k2.velocity); k3.velocity = EulerStep.Integrate(oldState.velocity, timeStep, k2.acceleration); k3.acceleration = k2.acceleration; return k3; } public override string ToString() { return "Midpoint Method"; } public int ForceEvaluations { get { return 2; } } } }