private RungeKuttaParametros GetRungeKuttaParameters(TipoVehiculo tipoVehiculo)
        {
            var parametrosRungeKutta = new RungeKuttaParametros
            {
                h = 0.05F
            };

            switch (tipoVehiculo)
            {
            case TipoVehiculo.Motocicleta:
                parametrosRungeKutta.CapacidadTanque = Parameters.TanqueMotocicleta;
                break;

            case TipoVehiculo.Automovil:
                parametrosRungeKutta.CapacidadTanque = Parameters.TanqueAutomovil;
                break;

            case TipoVehiculo.Camioneta:
                parametrosRungeKutta.CapacidadTanque = Parameters.TanqueCamioneta;
                break;

            default:
                break;
            }

            return(parametrosRungeKutta);
        }
        public RungeKuttaResultado RungeKutta(RungeKuttaParametros parameters)
        {
            if (_rungeKuttaPreviousValues.ContainsKey(parameters.CapacidadTanque))
            {
                return(new RungeKuttaResultado
                {
                    Value = _rungeKuttaPreviousValues[parameters.CapacidadTanque],
                    Vectors = _rungeKuttaPreviousVectors[parameters.CapacidadTanque]
                });
            }

            var result = new RungeKuttaResultado();

            var vectorAnterior = new MetodosNumericos.RungeKuttaVector
            {
                Paso = 0,
                t    = -parameters.h,
                Ci1  = 0
            };

            do
            {
                var vectorActual = new MetodosNumericos.RungeKuttaVector
                {
                    Paso = vectorAnterior.Paso + 1,
                    t    = vectorAnterior.t + parameters.h,
                    Ci   = vectorAnterior.Ci1
                };

                vectorActual.K0  = 30 * vectorActual.Ci + 10;
                vectorActual.K1  = 30 * (vectorActual.Ci + (vectorActual.K0 / 2) * parameters.h) + 10;
                vectorActual.K2  = 30 * (vectorActual.Ci + (vectorActual.K1 / 2) * parameters.h) + 10;
                vectorActual.K3  = 30 * (vectorActual.Ci + vectorActual.K2 * parameters.h) + 10;
                vectorActual.Ci1 = vectorActual.Ci + (parameters.h / 6) * (vectorActual.K0 + 2 * vectorActual.K1 + 2 * vectorActual.K2 + vectorActual.K3);

                result.Vectors.Add(vectorActual);
                vectorAnterior = vectorActual;
            } while (vectorAnterior.Ci1 <= parameters.CapacidadTanque);

            // Regla de 3
            // si h = 1 equivale a 10 minutos, entonces value = (10 * h) / 1
            result.Value = 10 * vectorAnterior.t / 1;

            _rungeKuttaPreviousValues.Add(parameters.CapacidadTanque, result.Value);
            _rungeKuttaPreviousVectors.Add(parameters.CapacidadTanque, result.Vectors);

            return(result);
        }