public override ODEState Solve(IODEEquation eq, ODEState initialState, double time, double timeStep) { ODEState deriv = eq.GetDerivative(time, initialState); // Compute new state using Euler's method // Yn+1 = Yn + deltaT * dYn/dt return(initialState.AddScaled(deriv, timeStep)); }
public override ODEState Solve(IODEEquation eq, ODEState initialState, double time, double timeStep) { ODEState k1 = eq.GetDerivative(time, initialState); ODEState k2 = eq.GetDerivative(time + timeStep / 2, initialState.AddScaled(k1, timeStep / 2)); ODEState k3 = eq.GetDerivative(time + timeStep / 2, initialState.AddScaled(k2, timeStep / 2)); ODEState k4 = eq.GetDerivative(time + timeStep, initialState.AddScaled(k3, timeStep)); ODEState sum = k1.AddScaled(k2, 2).AddScaled(k3, 2).AddScaled(k4, 1); return(initialState.AddScaled(sum, timeStep / 6)); }
/// <summary> /// This method solves the ODE from the initial time to the final time /// by dividing this interval into timesteps and calling the other /// solve method for each time step. /// </summary> /// <param name="eq"> The ODE to solve </param> /// <param name="initialState"> Initial state of the ODE </param> /// <param name="initialTime"> Time at which to start </param> /// <param name="finalTime"> Time at which to stop </param> /// <param name="timeStep"> Hint of the time step to use </param> /// <returns> The state of the ODE at finalTime </returns> public virtual ODEState Solve(IODEEquation eq, ODEState initialState, double initialTime, double finalTime, double timeStep) { double t; ODEState y = initialState; for (t = initialTime; t < finalTime; t += timeStep) { y = Solve(eq, y, t, timeStep); } if (t < finalTime) { y = Solve(eq, y, t, finalTime - t); } return(y); }
public abstract ODEState Solve(IODEEquation eq, ODEState initialState, double time, double timeStep);