示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
        /// <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);
        }
示例#4
0
 public abstract ODEState Solve(IODEEquation eq, ODEState initialState, double time, double timeStep);