public static Derivative evaluate(State initial, Vector3 acceleration, float dt, Derivative d)
 {
     State state;
     state.position = initial.position + d.dx * dt;
     state.velocity = initial.velocity + d.dv * dt;
     Derivative output;
     output.dx = state.velocity;
     output.dv = acceleration;
     return output;
 }
        public static State Integrate(State oldState, Vector3 accel, float timeDT)
        {
            Derivative orig;

            orig.dx = Vector3.Zero;
            orig.dv = Vector3.Zero;
            Derivative a = evaluate(oldState, accel, 0, orig);
            Derivative b = evaluate(oldState, accel, timeDT * 0.5f, a);
            Derivative c = evaluate(oldState, accel, timeDT * 0.5f, b);
            Derivative d = evaluate(oldState, accel, timeDT, c);

            Vector3 dxdt = 1.0f / 6.0f * (a.dx + 2.0f * (b.dx + c.dx) + d.dx);
            Vector3 dvdt = 1.0f / 6.0f * (a.dv + 2.0f * (b.dv + c.dv) + d.dv);

            State newState;

            newState.position = oldState.position + dxdt * timeDT;
            newState.velocity = oldState.velocity + dvdt * timeDT;
            return(newState);
        }
        public static Derivative evaluate(State initial, Vector3 acceleration, float dt, Derivative d)
        {
            State state;

            state.position = initial.position + d.dx * dt;
            state.velocity = initial.velocity + d.dv * dt;
            Derivative output;

            output.dx = state.velocity;
            output.dv = acceleration;
            return(output);
        }