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.
| Sistema | Flujo | Evento / modo |
|---|---|---|
| Tanque con bomba | Nivel con entrada neta | Bomba arranca sobre el umbral |
| Inventario | Stock que baja con ventas | Pedido al tocar el mínimo |
| Termostato | Temperatura que deriva | Calefactor on/off por banda |
| Semáforo | Cola que crece y se vacía | Luz que conmuta por temporizador |
03 · Diseño
Cómo armar un híbrido
- 1Describí el flujo por modo.
¿Cómo evoluciona el nivel con la bomba apagada y con ella encendida?
- 2Definí las guardas.
Condiciones de cruce:
nivel > umbral,stock < mínimo. - 3Guardá el modo en el estado.
Encendida o apagada es memoria: sin ella no se puede continuar.
- 4Revisá 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á
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?
Flujo con interruptor
12 pasos · salida 2 + 3 con bomba
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
- Con umbral 6 y entrada 3, ¿la bomba queda siempre encendida? ¿Sigue siendo híbrido?
- Subí el extra a 6. ¿Bajan los pasos con bomba o suben los arranques?
- ¿Dónde pondrías histéresis y por qué?
Ver respuestas sugeridas
- Queda casi siempre encendida (el nivel rara vez baja de 6); el modelo degenera en continuo: el evento deja de conmutar.
- Bajan los pasos con bomba pero pueden subir los arranques: cada encendido rinde más y el relé puede repiquetear.
- 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:
ifde guarda dentro del bucle de flujo.
En el próximo tema miraremos dentro del modelo: caja blanca, gris y negra.