UD05 · Taller 3 — Sistema experto como controlador de un proceso¶
Objetivo: implementar un controlador experto que regule la temperatura de una sala, definiendo las especificaciones de respuesta y observando cómo influyen en el comportamiento.
Fase 1 — La planta¶
Escribe el modelo de la sala: dada una temperatura y una potencia, devuelve la temperatura del siguiente instante. Tiene inercia térmica y pierde calor hacia el exterior.
def simular_planta(temp, potencia, dt=1.6, inercia=0.05, exterior=15.0):
"""Modelo simple de una sala con inercia termica."""
# TU CÓDIGO
...
✏️ Respuesta: ¿qué representa cada parámetro? ¿Qué pasaría con inercia = 0?
(escribe aquí)
Fase 2 — El controlador experto¶
Cuatro reglas sobre el error (consigna − temperatura): error grande → máxima potencia, error medio → media, error pequeño → baja, error negativo → apagar.
!!! Dos trampas que te van a costar tiempo 1. Para comparar dentro de un Fact hace falta el constraint de predicado P(...): un lambda a secas no falla, simplemente no dispara la regla. 2. El motor necesita reset() en cada paso, o los DefFacts no se recargan.
%pip install experta
import collections, collections.abc
if not hasattr(collections, 'Mapping'):
collections.Mapping = collections.abc.Mapping
collections.Iterable = collections.abc.Iterable
collections.MutableMapping = collections.abc.MutableMapping
from experta import *
class ControladorClima(KnowledgeEngine):
def __init__(self, setpoint=21.0):
super().__init__()
self.setpoint = setpoint
self.potencia = 0.0
# TU CÓDIGO: DefFacts, la regla que lee el sensor y las cuatro reglas de potencia
...
def paso(self, temp):
self._temp = temp
self.reset()
self.run()
return self.potencia
ctrl = ControladorClima(setpoint=21.0)
temp = 15.0
for i in range(200):
potencia = ctrl.paso(temp)
temp = simular_planta(temp, potencia)
if i % 20 == 0:
print(f"t={i:3d}: temp={temp:.2f} potencia={potencia:.2f}")
Fase 3 — Mide las especificaciones de respuesta¶
Añade el código que mida las tres cosas que definen la calidad de la respuesta.
# TU CÓDIGO: mide error en regimen permanente, tiempo de asentamiento y sobreimpulso
# - error: temperatura final menos setpoint
# - asentamiento: en que paso entra y se queda en la banda 20,5-21,5 C
# - sobreimpulso: si supera 21,5 C en algun momento, y cuanto
...
✏️ Respuesta: rellena la tabla con tus números.
| Especificación | Valor |
|---|---|
| Error en régimen permanente | |
| Tiempo de asentamiento (pasos) | |
| Sobreimpulso máximo |
Fase 4 — Añade una perturbación¶
En el paso 100, baja la temperatura exterior a 5 ºC: alguien ha abierto una ventana.
# TU CÓDIGO: repite la simulacion con la perturbacion en el paso 100
...
✏️ Respuesta: ¿mantiene la temperatura en la banda? ¿Cuánto tarda en recuperarse?
(escribe aquí)
Fase 5 — Analiza la sensibilidad¶
Cambia el umbral de la regla de potencia media (de 3 a 1,5) y repite las medidas de la Fase 3.
# TU CÓDIGO
...
✏️ Respuesta: la misma tabla, antes y después del cambio. ¿Qué le pasa al sobreimpulso? ¿Y al tiempo de asentamiento?
| Especificación | Umbral 3 | Umbral 1,5 |
|---|---|---|
| Error en régimen permanente | ||
| Tiempo de asentamiento | ||
| Sobreimpulso |
Fase 6 — Compara con un PID¶
✏️ Respuesta: describe cómo respondería un PID bien sintonizado frente a este controlador experto, y cuándo usarías cada uno. No hace falta implementarlo.
(escribe aquí)
Cierre¶
✏️ Respuesta: ¿qué relación tiene un sistema experto con los sistemas híbridos reglas/datos y con la lógica difusa? ¿Cuándo usarías cada uno?
(escribe aquí)