{ "cells": [ { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: control in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (0.8.1)\n", "Requirement already satisfied: numpy in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from control) (1.16.1)\n", "Requirement already satisfied: scipy in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from control) (1.2.0)\n", "Requirement already satisfied: matplotlib in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from control) (3.0.2)\n", "Requirement already satisfied: cycler>=0.10 in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from matplotlib->control) (0.10.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from matplotlib->control) (1.0.1)\n", "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from matplotlib->control) (2.3.1)\n", "Requirement already satisfied: python-dateutil>=2.1 in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from matplotlib->control) (2.7.5)\n", "Requirement already satisfied: six in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from cycler>=0.10->matplotlib->control) (1.12.0)\n", "Requirement already satisfied: setuptools in c:\\users\\dcasta25\\appdata\\local\\programs\\python\\python37\\lib\\site-packages (from kiwisolver>=1.0.1->matplotlib->control) (40.6.2)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING: You are using pip version 19.1.1, however version 19.2.1 is available.\n", "You should consider upgrading via the 'python -m pip install --upgrade pip' command.\n" ] } ], "source": [ "!pip install control \n", "from IPython.core.interactiveshell import InteractiveShell\n", "InteractiveShell.ast_node_interactivity = \"all\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Modelizado\n", "\n", "Modelizar un sistema es generar una representación matemática de este, entendiendolo como una relación entre una serie de entradas y una serie de salidas.\n", "\n", "Para modelizar un sistema vamos a utilizar diferentes formas entre ellas estan:\n", "\n", "- Ecuación diferencial.\n", "- Diagrama de bloques.\n", "- Función de transferencia. \n", "\n", "De estas una de la formas más utiles en control es la función de transferencia. Para encontrar esta podemos hacerlo de manera teórica utilizando la transformada de Laplace o Podemos hacerlo de una manera más interactiva partiendo de la _ecuación diferencial_ en donde despejaremos la derivada más grande de cada ecuación y luego construimos un diagrama de bloques. \n", "\n", "Una vez tenemos el diagrama de bloque tomamos los bloques que tiene integrales y los pasamos al dominio de Laplace\n", "\n", "$$\\int dt \\to \\frac{1}{s}$$\n", "\n", "## Sistema masa resorte amortiguador\n", "\n", "Para comenzar utilicemos un modelo de masa-resorte (masa $m$ y resorte $k$) con una fuerza external de entrada $F$. El modelo de este sistema se puede encontrar utilizando el principio fundemental de la dinámica que dicta que la sumatoria de fuerza es igual a la masa por la aceleración.\n", "\n", "$$F-k\\, x=m\\, a$$\n", "\n", "Recordemos que la aceleración $a$ es la segunda derivada de la posición $x$, de ahí.\n", "\n", "$$F-k\\, x=m\\, \\frac{d^2x}{dt^2}$$\n", "\n", "Una vez tenemos el modelo del sistema como una función de transferencia, podemos escribir el modelo como un diagrama de bloques. Para lograrlo, debemos despejar la derivada más grande. \n", "\n", "$$\\frac{d^2x}{dt^2} = \\frac{1}{m} (F-k\\, x)$$\n", "\n", "Esta equación puede ser descrita por un diagrama de bloques. \n", "\n", "$$F \\to + \\to \\boxed{\\frac{1}{m}}\\to\\boxed{\\frac{1}{s}}\\to\\boxed{\\frac{1}{s}}\\to x$$\n", "\n", "La posición realimenta al nodo de suma a traves de $k$\n", "\n", "$$x \\to \\boxed{k} \\to - $$\n", "\n", "### Función de transferencia\n", "\n", "La función de transferencia puede ser encontrada utilizando el paquete de control de **Python**." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "from control import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Primero definimos los bloques del sistema" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "invM = tf(1,4)\n", "integral = tf(1,[1,0])\n", "spring = tf(5,1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Con estos bloques podemos reconstruir el diagrama de bloques y construir la función de transferencia entre la salida y la entrada.\n", "\n", "Empecemos construyendo la función de transferencia del primer lazo, esto se puede hacer por dos metodos:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "G = invM * integral * integral\n", "G2 = series(invM, integral, integral)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Que producen el mismo resultado" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", " 1\n", "-----\n", "4 s^2" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "\n", " 1\n", "-----\n", "4 s^2" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G\n", "G2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora podemos incluir el lazo cerrado en el sistema. " ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "XF = feedback(G,spring)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", " 1\n", "---------\n", "4 s^2 + 5" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "XF" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ejercicios\n", "\n", "Encontrar la función de transferencia de :\n", "\n", "- Un sistema masa-resorte-amortiguador\n", "- Un sistema de tanque con caudal de entrada (como entrada), caudal de salida con caida atmosferica, y la altura $h$ como salida." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 4 }