Modelos y Simulación · Tema 15

Modelos híbridos

Cuando lo discreto y lo continuo se combinan: flujos que corren y eventos que conmutan.

01 · Punto de partida

La realidad no elige bando

El tanque se llena sin pausa, pero la bomba arranca de golpe al superar el umbral. El stock baja de a unidades y el pedido llega de golpe al tocar el mínimo. Casi todo sistema real mezcla flujos continuos con eventos discretos: eso modela un híbrido.

  • ¿Qué parte fluye y qué parte salta?
  • ¿Qué evento cambia el régimen y con qué condición?
  • ¿El modo actual es parte del estado?
  • ¿El evento se detecta a tiempo con el paso elegido?

02 · Definiciones

Flujos, modos y conmutaciones

∽

Flujo

La dinámica continua entre eventos: el nivel sube con la entrada neta.

◐

Modo

El régimen discreto vigente: bomba apagada o encendida, abierto o cerrado.

⚡

Conmutación

El evento que cambia el modo al cruzar una guarda: el umbral alcanzado.

Híbridos de todos los días.
SistemaFlujoEvento / modo
Tanque con bombaNivel con entrada netaBomba arranca sobre el umbral
InventarioStock que baja con ventasPedido al tocar el mínimo
TermostatoTemperatura que derivaCalefactor on/off por banda
SemáforoCola que crece y se vacíaLuz que conmuta por temporizador

03 · Diseño

Cómo armar un híbrido

  1. 1
    Describí el flujo por modo.

    ¿Cómo evoluciona el nivel con la bomba apagada y con ella encendida?

  2. 2
    Definí las guardas.

    Condiciones de cruce: nivel > umbral, stock < mínimo.

  3. 3
    Guardá el modo en el estado.

    Encendida o apagada es memoria: sin ella no se puede continuar.

  4. 4
    Revisá el paso.

    El dt debe detectar el cruce a tiempo: pasos largos se saltean eventos.

Solo continuo

Suaviza el salto

Trata el arranque como tasa media: barato, pero esconde picos y decisiones.

Híbrido

Respeta el salto

El evento ocurre en su instante: ve arranques, conteos y desgaste real.

Modo
Régimen discreto vigente del sistema.
Guarda
Condición que dispara la conmutación.
Histéresis
Banda entre arrancar y parar que evita el repiqueteo del relé.
Repiqueteo
Conmutaciones rapidísimas por umbral único con ruido.

04 · Puentes

De los Temas 13 y 14 hasta acá

Flujo (T14)+Evento (T14)+Modo en el estado (T8)=Híbrido

El híbrido usa todo lo visto: estado con modo, transiciones con guardas y reloj por pasos que no se saltea cruces.

05 · En Python

Bomba que arranca por umbral

Python en tu navegador. El if del umbral es el evento; el resto, flujo.

def hibrido(n0, entrada, salida_base, extra, umbral, pasos):
    # Flujo continuo + evento discreto (bomba por umbral).
    n = n0
    historia, arranques, encendida = [], 0, False
    for t in range(pasos):
        bomba = n > umbral
        if bomba and not encendida:
            arranques = arranques + 1
        encendida = bomba
        n = max(n + entrada - (salida_base + (extra if bomba else 0)), 0)
        historia.append(n)
    return historia, arranques


print(hibrido(10, 3, 2, 3, 14, 8))

Contar también es modelar

def hibrido_conteo(n0, entrada, salida_base, extra, umbral, pasos):
    n = n0
    pasos_bomba = 0
    for t in range(pasos):
        bomba = n > umbral
        pasos_bomba = pasos_bomba + (1 if bomba else 0)
        n = max(n + entrada - (salida_base + (extra if bomba else 0)), 0)
    return n, pasos_bomba


print(hibrido_conteo(10, 3, 2, 3, 14, 8))

06 · Exploración

Laboratorio: umbral que prende y apaga

La bomba suma salida extra cuando el nivel supera el umbral (banda sombreada = bomba encendida). Movete el umbral: ¿cuántos arranques lográs?

EXPERIMENTO 15

Flujo con interruptor

12 pasos · salida 2 + 3 con bomba

Los resultados numéricos aparecen debajo.
Nivel final13,00
Arranques3
Pasos con bomba3
LecturaRegula

La bomba arranca 3 veces y el nivel termina en 13.

La línea lima es el nivel; la banda marca los pasos con bomba encendida. Cada encendido es un evento discreto.

Preguntas para explorar

  1. Con umbral 6 y entrada 3, ¿la bomba queda siempre encendida? ¿Sigue siendo híbrido?
  2. Subí el extra a 6. ¿Bajan los pasos con bomba o suben los arranques?
  3. ¿Dónde pondrías histéresis y por qué?
Ver respuestas sugeridas
  1. Queda casi siempre encendida (el nivel rara vez baja de 6); el modelo degenera en continuo: el evento deja de conmutar.
  2. Bajan los pasos con bomba pero pueden subir los arranques: cada encendido rinde más y el relé puede repiquetear.
  3. Entre arranque y parada (banda 12–15): arrancar arriba y parar abajo evita el repiqueteo con ruido.

07 · Comprensión

Confusiones frecuentes

«El modo no es estado»

Sí lo es: sin saber si la bomba está encendida no se puede continuar. Todo modo va al estado.

«El umbral se detecta solo»

Solo si el paso lo permite: con dt largos el nivel salta el umbral sin disparar el evento. Paso corto o detección de cruce.

«Híbrido es solo mezclar código»

Es mezclar semánticas: flujos con tasas y eventos con guardas, cada uno con su reloj y su lectura.

«Más modos es más realismo»

Cada modo multiplica transiciones por probar. Los modos se ganan con evidencia, como todo detalle.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: seguir la conmutación

Ejecutá y marcá en qué paso arranca la bomba por primera vez.

def hibrido(n0, entrada, salida_base, extra, umbral, pasos):
    n = n0
    historia, arranques, encendida = [], 0, False
    for t in range(pasos):
        bomba = n > umbral
        if bomba and not encendida:
            arranques = arranques + 1
        encendida = bomba
        n = max(n + entrada - (salida_base + (extra if bomba else 0)), 0)
        historia.append(n)
    return historia, arranques


print(hibrido(10, 3, 2, 3, 14, 8))
Ver solución razonada

Da ([11, 12, 13, 14, 15, 13, 14, 15], 1): el nivel supera 14 en t = 4 (vale 15) y la bomba arranca en t = 5, bajando a 13. Un solo arranque.

Ejercicio 2: contar el trabajo de la bomba

¿Nivel final y pasos con bomba en ese mismo escenario?

def hibrido_conteo(n0, entrada, salida_base, extra, umbral, pasos):
    n = n0
    pasos_bomba = 0
    for t in range(pasos):
        bomba = n > umbral
        pasos_bomba = pasos_bomba + (1 if bomba else 0)
        n = max(n + entrada - (salida_base + (extra if bomba else 0)), 0)
    return n, pasos_bomba


print(hibrido_conteo(10, 3, 2, 3, 14, 8))
Ver solución

Da (15, 1): final 15 con 1 paso de bomba. El conteo mide el desgaste que el flujo solo no ve.

Ejercicio 3: diseñar la guarda

Agregá histéresis: arrancar sobre 15 y parar bajo 12. ¿Cuántos arranques ahora?

Ver una posible respuesta
def histeresis(n0, entrada, salida_base, extra, pasos):
    n, encendida, arranques = n0, False, 0
    for t in range(pasos):
        if not encendida and n > 15:
            encendida, arranques = True, arranques + 1
        elif encendida and n < 12:
            encendida = False
        n = max(n + entrada - (salida_base + (extra if encendida else 0)), 0)
    return n, arranques


print(histeresis(10, 3, 2, 3, 8))

Da (12, 1): la banda 12–15 evita el repiqueteo y mantiene un solo arranque en este escenario.

09 · Síntesis

Ideas para recordar

  • Híbrido = flujo continuo + eventos discretos con modos y guardas.
  • El modo es estado: se guarda, se informa y se continúa desde él.
  • El paso debe detectar los cruces a tiempo.
  • La histéresis evita el repiqueteo en umbrales con ruido.
  • En Python: if de guarda dentro del bucle de flujo.

En el próximo tema miraremos dentro del modelo: caja blanca, gris y negra.