{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "1a8b3769", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "
\n", " " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def hide_code_in_slideshow(): \n", " from IPython import display\n", " import binascii\n", " import os\n", " uid = binascii.hexlify(os.urandom(8)).decode() \n", " html = \"\"\"\n", " \"\"\" % (uid, uid)\n", " display.display_html(html, raw=True)\n", "\n", "hide_code_in_slideshow() " ] }, { "cell_type": "code", "execution_count": 2, "id": "7743e289", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "#!pip install scikit-fuzzy\n", "\n", "%matplotlib inline\n", "\n", "import numpy as np\n", "import skfuzzy as fuzz\n", "from skfuzzy import control as ctrl" ] }, { "cell_type": "markdown", "id": "00acac82", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Control Difuso\n", "\n", "Es un sistema de control que esta basado en la lógica difusa. \n", "\n", "\n", "\n", "[Lofti A. Zadeh](https://es.wikipedia.org/wiki/Lotfi_A._Zadeh) desarrollo la lógica difusa. " ] }, { "cell_type": "markdown", "id": "b0236a5d", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# ¿Qué tan mojada esta la ropa?\n", "\n", "## Lógica Booleana\n", "\n", "- Mojada (_Verdadero_)\n", "- Seca (_Falso_)\n", "\n", "## Lógica Difusa\n", "\n", "- Parcialmente Mojada (0.7)\n", "- Parcialmente Seca (0.3)" ] }, { "cell_type": "markdown", "id": "7437f798", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Beneficios del control difuso\n", "\n", "- No requiere conocer el modelo dinámico del sistema a controlar. Por tanto,\n", " - No requiere identificar el sistema\n", " - No necesita aproximar el modelo\n", " - No necesita linealizarlo. \n", "- **Pero,**\n", " - No se conoce bien el sistema" ] }, { "cell_type": "code", "execution_count": 3, "id": "4d41226b", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "# https://www.irjet.net/archives/V2/i8/IRJET-V2I8104.pdf\n", "# https://www.upt.ro/img/files/alegeri_2020/csud/5_Cinci_lucrari_stiintifice_in_extenso_2020-2024.pdf" ] }, { "cell_type": "markdown", "id": "5848d0e9", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Aplicaciones del control difuso " ] }, { "cell_type": "markdown", "id": "a227ba30", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Estructura de un controlador difuso\n", "\n", "![](control-loop.png)\n", "\n", "Tomada de [_A survey on industrial applications of fuzzy control_](https://doi.org/10.1016/j.compind.2010.10.001)" ] }, { "cell_type": "markdown", "id": "207c3854", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Etapas dentro de un controlador difuso\n", "\n", "- Valores de Entrada (_crisp inputs_)\n", "- **Módulo de Fusificación**\n", "- Entradas difusas\n", "- **Módulo de Inferencia**\n", "- Conclusiones difusas\n", "- **Módulo de Defusificación**\n", "- Valores de Salida (_crisp outputs_)" ] }, { "cell_type": "markdown", "id": "503a4528", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Variables lingüísticas / Funciones de membresia\n", "\n" ] }, { "cell_type": "markdown", "id": "1c31b49c", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Reglas de Control \n", "\n", "Dado un sistema con dos entradas $X$ y $Y$ y una salida $Z$, podemos definir las reglas de control en el modulo de inferencia así:\n", "\n", "- Si $X$ es $A_1$ y $Y$ es $B_1$, entonces $Z$ es $C_1$\n", "- Si $X$ es $A_2$ y $Y$ es $B_2$, entonces $Z$ es $C_2$\n", "- Si $X$ es $A_3$ y $Y$ es $B_3$, entonces $Z$ es $C_3$" ] }, { "cell_type": "markdown", "id": "d355cc78", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Modulo de Defusificación\n", "\n", "Para la defusificación se pueden usar diferentes métodos:\n", "\n", "- Centroide: considera a la función como una función de distribución de masa y busca su centroide. \n", "- Bisectriz: divide el area bajo la función en dos regiones iguales.\n", "- Máximo central (MOM _mean of maximum_): toma el promedio de los máximos.\n", "- Máximo más grande (LOM _largest of maximum_): toma el máximo más grande. \n", "- Máximo más pequeño (SOM _smallest of maximum_): toma el máximo más pequeño.\n", "\n", "[![](defusificacion.png)](https://www.slideserve.com/erv/hedge)" ] }, { "cell_type": "markdown", "id": "63e6f395", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Modulo de inferencia \n", "\n", "Existen diferentes métodos de inferencia, entre ellos: \n", "\n", "- Mamdani " ] }, { "cell_type": "markdown", "id": "211cb146", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "[![](mamdani.jpg)](http://www.dma.fi.upm.es/recursos/aplicaciones/logica_borrosa/web/fuzzy_inferencia/mamdanir_en.htm)" ] }, { "cell_type": "markdown", "id": "f419182e", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Ejemplo : Impresora\n", "\n", "Realicemos el control de posición de la impresora via el voltaje del motor con un controlador difuso.\n", "\n", "![](printer.png)\n", "\n", "- Variable de entrada : Error de posición\n", "- Variable de salida : Voltaje del motor" ] }, { "cell_type": "markdown", "id": "a3a17df5", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Sistema de control\n", "\n", "![](control-loop.png)" ] }, { "cell_type": "markdown", "id": "208b3f91", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Reglas de control\n", "\n", "- Si el error es NG, entonces el voltaje es NG (negativo grande)\n", "- Si el error es NP, entonces el voltaje es NP (negativo pequeño)\n", "- Si el error es C, entonces el voltaje es C (cero)\n", "- Si el error es PP, entonces el voltaje es PP (positivo pequeño)\n", "- Si el error es PG, entonces el voltaje es PG (positivo grande)\n" ] }, { "cell_type": "markdown", "id": "244a1016", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# En MATLAB \n", "\n", "Usaremos la aplicación _fuzzy logic designer_, debemos tener instalado el _Fuzzy Logic Toolbox_\n", "\n", "![](fuzzy-logic-toolbox.png)" ] }, { "cell_type": "markdown", "id": "9c30a1fb", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Fuzzy logic designer\n", "\n", "Esta es la ventana inicial, donde definiremos la variable de entrada como el error y la variable de salida como el voltaje. \n", "\n", "![](fuzzy-logic-designer.png)" ] }, { "cell_type": "markdown", "id": "11d57d70", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Funciones de membresia\n", "\n", "Cambiar los valores de error en posición\n", "\n", "- ENG = (Range -20, 20, Type: Trapmf, Params: -20 -20 -10 – 5)\n", "- ENP = (Range -20, 20, Type: Trimf, Params: -10 -5 -0 )\n", "- EC = (Range -20, 20, Type: Trimf, Params: -5 -0 5 )\n", "- EPP = (Range -20, 20, Type: Trimf, Params: 0 5 10 )\n", "- EPG = (Range -20, 20, Type: Trápmf, Params: 5 10 20 20 )\n" ] }, { "cell_type": "markdown", "id": "9d81d2bd", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Funciones de membresia\n", "\n", "Cambiar los valores de voltaje\n", "\n", "- VNG = (Range -12, 12, Type: Trapmf, Params: -12 -12 -6 – 3)\n", "- VNP = (Range -12, 12, Type: Trimf, Params: -6 -3 -0 )\n", "- VC = (Range -12, 12, Type: Trimf, Params: -3 -0 3 )\n", "- VPP = (Range -12, 12, Type: Trimf, Params: 0 3 6 )\n", "- VPG = (Range -12, 12, Type: Trapmf, Params: 3 6 12 12 )\n" ] }, { "cell_type": "markdown", "id": "385f9bde", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Añadir reglas de control \n", "\n", "- Vamos a edit y buscamos el término _Rules_.\n", "- Emparejamos las entradas y salidas correspondientes con el bóton \"Add rule\"\n", "- Cuando hayamos terminado cerramos la ventana.\n", "- Seleccionamos el metodo de fusificación. \n", "- Exportamos las reglas. " ] }, { "cell_type": "markdown", "id": "016b7c46", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Visualización de las reglas\n", "\n", "![](fuzzy-logic-designer-rules.png)" ] }, { "cell_type": "markdown", "id": "19fedf9d", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Visualización de la superficie de control\n", "\n", "![](fuzzy-logic-designer-surface.png)" ] }, { "cell_type": "markdown", "id": "234deb4c", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Archivos para Matlab\n", "\n", "- [Controlador difuso](impresora.fis)\n", "- [Simulink](impresora.slx)" ] }, { "cell_type": "markdown", "id": "a23371b7", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Aunque la lógica difusa se había estado estudiando desde aproximadamente\n", "Los años 1920,Lofti Zadeh fue quien oficialmente introdujo el tema en 1965.\n", "El observó que los computadores no les iba bien manejando datos subjetivos\n", "Tales que si podían ser manejados por humanos." ] }, { "cell_type": "markdown", "id": "cecdc571", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Lógica difusa\n", "\n", "¿Que tan mojada esta la ropa? \n", "\n", "- Lógica clásica: Verdadero (mojado), Falso (seco)\n", "\n", "$$M \\in \\{0,1\\}$$\n", "\n", "- Lógica difusa: Parcialmente verdarero, parcialmente falso.\n", "\n", " $$M \\in [0,1]$$\n", " \n", " Muy seca, poco seca, poco mojada, muy mojada" ] }, { "cell_type": "markdown", "id": "691d7e41", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Ejemplo calor\n", "\n", "**¿Está el té caliente?**\n", "\n", "- En sistemas booleanos, tenemos valores absolutos:\n", "\n", "$$\\array{\\text{Si}&\\text{No}}$$\n", "\n", "- En sistemas difusos, tenemos valores que son parcialmente verdaderos y parcialmente falsos\n", "\n", "$$\\array{\\text{Muy Caliente}&\\text{Caliente}&\\text{Frío}&\\text{Muy Frío}}$$" ] }, { "cell_type": "markdown", "id": "8de86823", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Ventajas del control difuso\n", "\n", "No requiere conocer el modelo dinámico del sistema a controlar. Por tanto,\n", "- El control difuso no requiere identificar el sistema\n", "- Ni necesita aproximar el modelo\n", "- Ni necesita linealizarlo\n", "Facilita el diseño del controlador\n", "\n", "Pero necesita conocer las reglas lingüísticas de control de un experto. Cuando no se conoce el modelo se usa:\n", "- Control PID (una entrada y una salida)\n", "- Control Difuso (múltiples entradas y salidas)\n" ] }, { "cell_type": "markdown", "id": "708ab9da", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Función de membresia\n", "\n", "La función de membresia fue introducida por Lofti A. Zaden en 1965 en el artículo _\"fuzzy sets\"_. Las funciones de membresia caracterizan la caracteristica difusa. \n", "\n", "A cada valor difuso se le asigna un valor numérico entre 0 y 1." ] }, { "cell_type": "markdown", "id": "192806b9", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Conjuntos\n", "\n", "En conjuntos clásicos los elementos pueden ser o no-ser parte de un conjunto. \n", "\n", "Sea $A$ un conjunto, y $\\chi$ la función de membresia a dicho conjunto:\n", "\n", "$$\\chi_A(x) = \\left\\{\\array{0&x\\in A\\\\1&x\\notin A}\\right\\}$$\n", "\n", "Para un ejemplo de alturas $A= \\{165,166,167,\\ldots\\}$\n", "\n", "## Cardinalidad\n", "\n", "La cardinalidad de un conjunto $S$ es denotado por $|S|$, y es el numero de elementos del conjunto. Este número también se conoce como el número cardinal. " ] }, { "cell_type": "markdown", "id": "3def755c", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Conjunto difuso\n", "\n", "Los conjuntos difusos pueden ser considerados una extensión de los conjuntos clásicos. \n", "\n", "**En lógica difusa un elemento puede ser parcialmente miembro de un conjunto.**\n", "\n", "La función de membresia para un conjunto difuso se representa por $\\mu_A(x)$" ] }, { "cell_type": "markdown", "id": "0c546eba", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Operaciones de conjuntos clásicos \n", "\n", "$$A=\\{1,2,3,4,5\\} \\quad B=\\{4,5,6,7,8\\}$$\n", "\n", "\n", "- Union $A \\cup B = \\{x | x \\in A \\;\\text{o}\\; x \\in B \\}$\n", "\n", "$$A\\cup B = \\{1,2,3,4,5,6,7,8\\}$$\n", "\n", "- Intersección $A \\cap B = \\{x | x \\in A \\;\\text{y}\\; x \\in B \\}$\n", "\n", "$$A\\cap B = \\{4,5\\}$$\n", "\n", "- Complemento $A'= \\{x|x\\notin A, x\\in X\\}$\n", "\n", "- Diferencia $A|B = \\{x|x\\in A \\;\\text{y}\\; x\\notin B\\}$" ] }, { "cell_type": "markdown", "id": "433b97be", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Operaciones de conjuntos difusos\n", "\n", "- Union (máximo)\n", "\n", "$$\\mu_{\\tilde{A}\\cup\\tilde{B}} = \\mu_{\\tilde{A}}\\cup\\mu_{\\tilde{B}} \\quad y \\in u$$" ] }, { "cell_type": "code", "execution_count": 4, "id": "4b4dc3d3", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 5, "id": "1db35e6a", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import tkinter\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "# matplotlib.use('TkAgg')" ] }, { "cell_type": "code", "execution_count": 6, "id": "4de645be", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Python39\\lib\\site-packages\\skfuzzy\\control\\fuzzyvariable.py:122: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", " fig.show()\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "