{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": "# UD02 · Notebook 2 — Control difuso con scikit-fuzzy\n\n**Requisitos**\n\nNecesitas el **contenedor de prácticas de IA** de la UD00 funcionando, o un entorno Python\n3.12+ con `numpy` y `scikit-fuzzy`:\n\n```bash\ndocker compose up -d # si usas el contenedor del curso\npip install scikit-fuzzy==0.5.0\n```\n\n**Objetivo**: construir un sistema de control difuso tipo Mamdani que decida la **velocidad de un\nventilador** según la temperatura y la humedad de una sala, recorriendo las tres fases de un\nsistema de razonamiento impreciso — fuzzificación, evaluación de reglas y desfuzzificación (RA2-d).\n\nEs una **entrega evaluable**: se corrige con la rúbrica de su tarea en Aules." }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fase 1 — Importa las librerías y define los universos" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%pip install scikit-fuzzy\n", "\n", "import numpy as np\n", "import skfuzzy as fuzz\n", "from skfuzzy import control as ctrl\n", "\n", "# TU CÓDIGO: define los tres Antecedent/Consequent (temperatura 0-40, humedad 0-100, velocidad 0-100)\n", "temperatura = ...\n", "humedad = ...\n", "velocidad = ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fase 2 — Funciones de pertenencia (términos lingüísticos)\n", "\n", "**¿Por qué trapezoidal en los extremos?**\n", "\n", "Las funciones de los extremos suelen ser trapezoidales para que «fresca» o «caliente»\n", "mantengan pertenencia plena hasta el límite del universo, y triangulares en el centro." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# TU CÓDIGO: funciones de pertenencia de las tres variables\n", "..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fase 3 — Reglas IF-THEN" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# TU CÓDIGO\n", "r1 = ...\n", "r2 = ...\n", "r3 = ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fase 4 — Sistema y simulación" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# TU CÓDIGO\n", "sistema = ...\n", "sim = ...\n", "print(...)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fase 5 — Visualiza las funciones de pertenencia\n", "\n", "Deja en el notebook la gráfica y explica qué ocurre en cada simulación." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# TU CÓDIGO\n", "velocidad.view()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fase 6 — Experimento (respuesta razonada)\n", "\n", "Prueba estas combinaciones y anota el resultado en una tabla:\n", "\n", "| Temperatura | Humedad | Velocidad (%) | ¿Coherente? |\n", "|---|---|---|---|\n", "| 10 | 30 | | |\n", "| 25 | 50 | | |\n", "| 38 | 90 | | |\n", "| 18 | 80 | | |" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# TU CÓDIGO: calcula la velocidad para las 4 combinaciones de la tabla anterior\n", "..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**✏️ Respuesta**: copia la tabla de la Fase 6 aquí ya completada, y comenta si algún resultado te sorprende y por qué.\n", "\n", "*(escribe aquí)*" ] }, { "cell_type": "markdown", "metadata": {}, "source": "\n## Entrega\n\nSube a la tarea **N02 · Control difuso con scikit-fuzzy** de Aules un único fichero **`.zip`** con:\n\n- el notebook `.ipynb` ejecutado, con el controlador funcionando y las figuras de las funciones de pertenencia.\n\nAntes de comprimirlo, ejecuta el notebook entero, de arriba abajo y sin errores.\n\nAules **solo acepta un `.zip`** en esta tarea: no subas los ficheros sueltos, comprímelos juntos. El plazo acaba a las **23:59** del día que marca la tarea; después la tarea se cierra y ya no admite entregas.\n\n\n**Qué tiene que verse en el notebook**\n\n| Fase | Evidencia mínima |\n|---|---|\n| 1-2 | Las dos variables de entrada y la de salida, con sus funciones de pertenencia |\n| 3 | Las tres reglas IF-THEN |\n| 4 | Las dos simulaciones (20 ºC/50 % y 33 ºC/85 %) con su velocidad resultante |\n| 5 | La captura de `velocidad.view()` |\n| 6 | La tabla de experimentos completa, con la columna «¿Coherente?» justificada |\n\n**Soluciones**\n\nLas soluciones no se publican: se corrigen y comentan en clase." } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.12" } }, "nbformat": 4, "nbformat_minor": 5 }