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); }