UD05 · EX4 — Simulador de quemador de gas¶
En la siguiente práctica, simularemos el comportamiento de un quemador de gas. El quemador tiene un sensor de temperatura y un actuador que regula la cantidad de gas quemada. El objetivo es mantener la temperatura en 100 grados Celsius. El quemador tiene un comportamiento no lineal, por lo que es difícil de controlar.
Al principio, el quemador está apagado y la temperatura es de 20 grados centígrados. El quemador se enciende y la temperatura aumenta. Cuando la temperatura alcanza los 100 grados Celsius, si apagamos el quemador, la temperatura disminuye. Si encendemos el quemador, la temperatura aumenta y sobrepasamos los 100 grados Celsius. Necesitamos modificar la cantidad de gas que quemamos para mantener la temperatura en 100 grados Celsius de manera constante.
Pasos previos¶
Necesitamos instalar la libreria scikit-fuzzy. Usamos la 0.5.0 con un pequeno parche: la 0.4.2 que se usaba antes ya no funciona en Python 3.12 o posterior.
%pip install scikit-fuzzy networkx
# scikit-fuzzy 0.4.2 ya no arranca en Python 3.12+ (importa `imp` y `distutils`, que
# se eliminaron del lenguaje), asi que instalamos la 0.5.0. En esa version todo
# funciona menos `ControlSystem.view()`: en su visualizador, la linea que guarda el
# sistema quedo dentro de un `if` y nunca se ejecuta. Se arregla en tres lineas:
from skfuzzy.control.visualization import ControlSystemVisualizer
_init_original = ControlSystemVisualizer.__init__
def _init_parcheado(self, control_system):
_init_original(self, control_system)
self.ctrl = control_system
ControlSystemVisualizer.__init__ = _init_parcheado
Implementación simple¶
Primero, implementaremos un controlador simple que intente mantener la temperatura en 100 grados Celsius. El controlador será una función en la que pasamos la temperatura actual y nos devuelve la cantidad de gas que debemos quemar (entre 0 y 100).
def controlador_simple(temperatura):
# Escribe aquí el código para el controlador simple
Efecto sobre la temperatura¶
Dependiendo de la cantidad de gas quemado, la temperatura aumenta o disminuye. Asumiremos que la temperatura aumenta 1 grado Celsius por segundo si quemamos 1 unidad de gas y disminuye 0.5 grados Celsius por segundo si no quemamos nada. Los valores intermedios son proporcionales.
La función será la siguiente:
def temperatura(t_actual, gas):
gas = gas / 100
return t_actual + gas - 0.5 * (1 - gas)
Simulamos el quemador.¶
Ahora simulemos el quemador. El quemador tiene un sensor de temperatura y un actuador regula la cantidad de gas quemado. El quemador tiene un comportamiento no lineal, por lo que es difícil de controlar. El controlador debe poder mantener la temperatura en 100 grados centígrados.
Visualizamos la temperatura y la cantidad de gas que quemamos durante 100 segundos.
import matplotlib.pyplot as plt
import numpy as np
def simulador(controlador, t_inicial=20, pasos=300):
temps = np.zeros(pasos)
gasos = np.zeros(pasos)
for p in range(pasos):
gas = controlador(t_inicial)
t_inicial = temperatura(t_inicial, gas)
print(gas, t_inicial)
temps[p] = t_inicial
gasos[p] = gas
plt.plot(temps)
plt.plot(gasos)
plt.legend(['Temperatura', 'Gas'])
plt.show()
simulador(controlador_simple)
100 21.0 100 22.0 100 23.0 100 24.0 100 25.0 100 26.0 100 27.0 100 28.0 100 29.0 100 30.0 100 31.0 100 32.0 100 33.0 100 34.0 100 35.0 100 36.0 100 37.0 100 38.0 100 39.0 100 40.0 100 41.0 100 42.0 100 43.0 100 44.0 100 45.0 100 46.0 100 47.0 100 48.0 100 49.0 100 50.0 100 51.0 100 52.0 100 53.0 100 54.0 100 55.0 100 56.0 100 57.0 100 58.0 100 59.0 100 60.0 100 61.0 100 62.0 100 63.0 100 64.0 100 65.0 100 66.0 100 67.0 100 68.0 100 69.0 100 70.0 50 70.25 50 70.5 50 70.75 50 71.0 50 71.25 50 71.5 50 71.75 50 72.0 50 72.25 50 72.5 50 72.75 50 73.0 50 73.25 50 73.5 50 73.75 50 74.0 50 74.25 50 74.5 50 74.75 50 75.0 50 75.25 50 75.5 50 75.75 50 76.0 50 76.25 50 76.5 50 76.75 50 77.0 50 77.25 50 77.5 50 77.75 50 78.0 50 78.25 50 78.5 50 78.75 50 79.0 50 79.25 50 79.5 50 79.75 50 80.0 50 80.25 50 80.5 50 80.75 50 81.0 50 81.25 50 81.5 50 81.75 50 82.0 50 82.25 50 82.5 50 82.75 50 83.0 50 83.25 50 83.5 50 83.75 50 84.0 50 84.25 50 84.5 50 84.75 50 85.0 50 85.25 50 85.5 50 85.75 50 86.0 50 86.25 50 86.5 50 86.75 50 87.0 50 87.25 50 87.5 50 87.75 50 88.0 50 88.25 50 88.5 50 88.75 50 89.0 50 89.25 50 89.5 50 89.75 50 90.0 50 90.25 50 90.5 50 90.75 50 91.0 50 91.25 50 91.5 50 91.75 50 92.0 50 92.25 50 92.5 50 92.75 50 93.0 50 93.25 50 93.5 50 93.75 50 94.0 50 94.25 50 94.5 50 94.75 50 95.0 50 95.25 50 95.5 50 95.75 50 96.0 50 96.25 50 96.5 50 96.75 50 97.0 50 97.25 50 97.5 50 97.75 50 98.0 50 98.25 50 98.5 50 98.75 50 99.0 50 99.25 50 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5 50 99.75 50 100.0 0 99.5
Podemos ver cómo funciona el sistema pero no es estable. Una vez que la temperatura alcanza los 100 grados, el sistema no puede mantener la temperatura en 100 grados de manera efectiva.
Veamos una forma más efectiva de controlar el sistema.
Implementación en lógica difusa¶
La lógica difusa es la herramienta perfecta para este tipo de problema. Nos permite modelar el comportamiento del sistema de manera intuitiva y fácil; devueltos valores continuos en lugar de valores discretos.
Utilizaremos la librería Scikit-Fuzzy para implementar el controlador difuso. Esta librería nos permite definir conjuntos difusos, reglas difusas e inferencia fácilmente.
Primero, definimos los conjuntos difusos que usaremos para modelar el sistema. En este caso, usaremos cuatro conjuntos difusos para modelar la temperatura: muy frio, frío, apropiado y muy caliente. Y cinco conjuntos difusos para modelar la cantidad de gas que quemamos: muy poco, poco, mediano, mucho y total.
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import numpy as np
# La temperatura objetivo estará en el centro del conjunto apropiado
temperatura_obj = 100
# Definimos el universo del discurso
rango_temperatura = np.arange(0, 150, 1)
rango_gas = np.arange(0, 100, 0.1)
# Definimos los antecedentes y el consecuente
temp = ctrl.Antecedent(rango_temperatura, 'temp')
gas = ctrl.Consequent(rango_gas, 'gas')
# Definimos conjuntos difusos
# Visualizamos conjuntos difusos
temp.view()
gas.view()
Reglas difusas¶
Ahora definimos las reglas difusas que modelan el comportamiento del sistema. En este caso, definiremos cinco reglas difusas:
- Si la temperatura es muy fría, quemaremos todo el gas.
- Si la temperatura es fría, quemaremos mucho gas.
- Si la temperatura es apropiada, quemaremos una cantidad adecuada de gas.
- Si la temperatura está caliente, quemaremos poco gas.
# Escribe aquí las 4 reglas difusas
Inferencia difusa¶
Ahora definimos el controlador difuso. El controlador difuso es un sistema difuso que utiliza las reglas difusas para inferir el valor de la salida. En este caso, el controlador difuso utiliza las reglas difusas para inferir la cantidad de gas que tenemos que quemar para mantener la temperatura en 100 grados Celsius.
# Añadelas al Sistema de Control y visualizalas
controlador_simulador = ctrl.ControlSystemSimulation(controlador)
# Simulamos controlador difuso
def controlador_difuso(temperatura):
controlador_simulador.input['temp'] = temperatura
controlador_simulador.compute()
return controlador_simulador.output['gas']
simulador(controlador_difuso, 20, 250)
79.99970336860154 20.699995550529025 79.99969928892038 21.39999103986283 79.99969494912807 22.09998646409975 79.99969033145005 22.7999818190715 79.99968541621061 23.49997710031466 79.99968018158575 24.199972303038447 79.9996746033146 24.899967422088164 79.99966865436352 25.599962451903618 79.99966230453057 26.299957386471576 79.99965551998328 26.999952219271325 79.9996482627039 27.699946943211884 79.99964048984266 28.399941550559525 79.9996321529308 29.099936032853485 79.99962319694698 29.79993038080769 79.99961355918278 30.499924584195433 79.9996031678661 31.199918631713423 79.99959194047636 31.89991251082057 79.99957978166823 32.599906207545594 79.99956658069618 33.299899706256035 79.99955220818705 33.99989298937884 79.99953651206982 34.69988603705989 79.99951931238525 35.39987882674567 79.99950039460315 36.09987133266472 79.99947950091745 36.79986352517848 79.99945631877927 37.49985536996017 79.99943046556619 38.19984682694366 79.9994014678057 38.89983784896075 79.99936873252648 39.59982837994865 79.99933150704983 40.29981835255439 79.37233641244323 40.99040339874104 77.91037764949358 41.65905906348344 76.46566020993541 42.30604396663247 75.03512078079572 42.93157077834441 73.61588083869704 43.53580899092486 72.2055840056819 44.118892751010094 70.80241692080827 44.68092900482222 69.42025479320314 45.222232826720266 68.17074840812708 45.744794052842174 67.05193997139237 46.25057315241306 66.03968085127298 46.741168365182155 65.1156260119896 47.217902755362 64.26556267008554 47.681886195413284 63.478265673180424 48.134060180510986 62.74473762598529 48.57523124490076 62.05766630352328 49.00609623945361 61.41103669269075 49.427261789843975 60.80017056924446 49.83926434838264 60.22076811838166 50.24257587015836 59.99999999999992 50.64257587015836 60.000000000000085 51.04257587015836 60.00000000000026 51.442575870158365 59.999999999999815 51.84257587015836 60.00000000000029 52.24257587015837 60.000000000000036 52.64257587015837 59.99999999999992 53.042575870158366 59.99999999999996 53.442575870158365 60.00000000000019 53.84257587015837 60.00000000000023 54.242575870158376 59.99999999999987 54.642575870158375 60.00000000000005 55.04257587015837 60.000000000000064 55.44257587015837 59.99999999999986 55.84257587015837 59.99999999999993 56.24257587015837 60.000000000000085 56.64257587015837 60.00000000000017 57.04257587015837 59.999999999999886 57.44257587015837 60.00000000000024 57.84257587015838 60.00000000000012 58.242575870158376 59.99999999999987 58.642575870158375 59.99999999999991 59.04257587015837 60.00000000000009 59.44257587015837 60.000000000000156 59.84257587015838 59.999999999999886 60.242575870158376 60.000000000000014 60.642575870158375 60.00000000000014 61.04257587015837 59.99999999999981 61.44257587015837 59.9999999999999 61.84257587015837 60.00000000000007 62.24257587015837 60.00000000000001 62.64257587015837 59.9999999999999 63.042575870158366 60.000000000000064 63.442575870158365 59.99999999999996 63.842575870158356 60.000000000000036 64.24257587015835 59.99999999999998 64.64257587015834 60.00000000000012 65.04257587015833 59.99999999999993 65.44257587015832 59.99999999999993 65.84257587015831 60.000000000000036 66.2425758701583 60.000000000000014 66.6425758701583 60.00000000000005 67.04257587015829 59.99999999999997 67.44257587015828 59.99999999999995 67.84257587015827 60.000000000000014 68.24257587015826 60.000000000000185 68.64257587015827 59.9999999999999 69.04257587015826 59.99999999999994 69.44257587015825 60.00000000000017 69.84257587015826 60.00000000000014 70.24257587015826 59.99999999999994 70.64257587015825 60.00000000000007 71.04257587015825 60.00000000000015 71.44257587015825 59.99999999999996 71.84257587015824 60.000000000000064 72.24257587015823 60.00000000000016 72.64257587015824 60.00000000000006 73.04257587015823 60.00000000000003 73.44257587015822 60.00000000000013 73.84257587015821 59.99999999999998 74.2425758701582 60.00000000000002 74.6425758701582 60.000000000000085 75.04257587015819 59.999999999999964 75.44257587015818 60.00000000000005 75.84257587015817 60.00000000000005 76.24257587015816 60.00000000000013 76.64257587015815 60.00000000000002 77.04257587015815 60.00000000000007 77.44257587015814 60.00000000000009 77.84257587015813 60.000000000000036 78.24257587015812 60.000000000000064 78.64257587015811 60.00000000000007 79.0425758701581 60.00000000000006 79.4425758701581 60.000000000000036 79.84257587015809 60.00000000000005 80.24257587015808 60.00000000000007 80.64257587015807 60.000000000000064 81.04257587015806 60.000000000000014 81.44257587015805 60.00000000000008 81.84257587015804 60.0000000000001 82.24257587015803 60.00000000000003 82.64257587015803 60.00000000000008 83.04257587015802 59.99999999999997 83.44257587015801 60.00000000000001 83.842575870158 60.00000000000015 84.242575870158 59.999999999999936 84.642575870158 60.00000000000004 85.04257587015799 60.0000000000002 85.442575870158 59.99999999999991 85.84257587015799 60.00000000000014 86.24257587015798 59.99999999999989 86.64257587015797 59.99999999999998 87.04257587015796 60.0 87.44257587015795 60.00000000000006 87.84257587015794 59.99999999999993 88.24257587015794 60.00000000000013 88.64257587015793 59.999999999999865 89.04257587015792 60.000000000000206 89.44257587015792 60.00000000000005 89.84257587015792 59.99999999999998 90.2425758701579 60.00000000000019 90.64257587015791 59.999999999999886 91.0425758701579 60.00000000000013 91.4425758701579 59.99999999999995 91.84257587015789 60.00000000000015 92.24257587015789 59.999999999999886 92.64257587015788 60.000000000000185 93.04257587015789 59.99999999999986 93.44257587015788 59.99999999999983 93.84257587015787 60.00000000000017 94.24257587015788 60.0000000000001 94.64257587015787 59.999999999999915 95.04257587015786 59.99999999999965 95.44257587015785 59.99999999999991 95.84257587015784 60.000000000000306 96.24257587015785 60.00000000000022 96.64257587015786 60.0000000000001 97.04257587015785 60.000000000000114 97.44257587015784 60.00000000000016 97.84257587015784 60.00000000000005 98.24257587015784 59.99999999999996 98.64257587015783 60.000000000000114 99.04257587015782 50.743136569880875 99.30372291870603 41.87687404809725 99.43187602942749 41.19631079310489 99.54982069132406 40.81754340947513 99.66208384246619 40.55840368575737 99.77045989775254 40.357788462265766 99.87582672468653 40.1876478083579 99.9786414418119 40.032048666605796 100.079122171811 39.88115848569449 100.17733954909642 39.72860531199326 100.27326862877631 39.56540077783061 100.36674964044377 39.38131398486351 100.45746935021673 39.162938542034134 100.54491342834724 38.89088465419111 100.62827669816011 38.53523142420439 100.70630516952318 38.0482761701839 100.77702931207594 37.35567143213645 100.83736438355798 36.3645374440932 100.88283244521938 35.07159013289863 100.90890629721285 33.87821414991903 100.91707950946164 33.38628523322542 100.91787378796003 33.334504449750845 100.9178913547063 33.33335061005277 100.9178916138571 33.33333358539102 100.91789161763796 33.33333333700988 100.9178916176931 33.333333333387614 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393 33.33333333333298 100.91789161769393
Enfoque alternativo¶
Un enfoque similar pero con un resultado diferente sería el siguiente: como entrada, recibiremos el error de temperatura (la diferencia entre la temperatura actual y la temperatura objetivo). Como salida, devolveremos la cantidad de gas que debemos quemar.
La diferencia entre este enfoque y el enfoque anterior es que en este caso, el controlador difuso no tiene que saber cuál es la temperatura actual. Solo tiene que saber cuál es la diferencia entre la temperatura actual y la temperatura objetivo. También lo hará más flexible y fácil de reutilizar.
# Definimos el universo del discurso
teperatura_objetivo = 100
rango_error = np.arange(-teperatura_objetivo, teperatura_objetivo, 1)
rango_gas = np.arange(0, 100, 0.1)
# Definimos los antecedentes y el consecuente
error = ctrl.Antecedent(rango_error, 'error')
gas = ctrl.Consequent(rango_gas, 'gas')
# Definimos conjuntos difusos
## Aquí debes añadir los conjuntos difusos (puedes ayudarte de la imagen inferior)
# Visualizamos conjuntos difusos
error.view()
gas.view()
Nuevas reglas difusas¶
Ahora definimos las reglas difusas que modelan el comportamiento del sistema. En este caso, definiremos solo tres reglas difusas:
- Si la diferencia con la temperatura es frio, quemaremos todo el gas.
- Si la diferencia con la temperatura es cero, quemaremos una cantidad adecuada.
- Si la diferencia con la temperatura es caliente, quemaremos muy poco gas.
# Definimos las reglas difusas
# Definimos el controlador difuso
#Y lo visualizamos
# Simulamos controlador difuso
controlador_simulador = ctrl.ControlSystemSimulation(controlador)
def controlador_difus(temperatura):
controlador_simulador.input['error'] = temperatura - teperatura_objetivo
controlador_simulador.compute()
return controlador_simulador.output['gas']
simulador(controlador_difus, 20, 150)
87.69895397489567 20.815484309623436 87.79757445999121 21.632447926523305 87.8950225753918 22.450873265154183 87.99124587594876 23.270741953293413 88.08618961861264 24.0920347975726 88.17979664008173 24.91473174717383 88.27200722671579 25.738811855574564 88.36275897614222 26.564253240216697 88.45198664995868 27.39103303996608 88.53962201685002 28.21912737021883 88.62559368542885 29.04851127550026 88.70982692599995 29.87915867939026 88.79224348042524 30.71104233159664 88.87276135916547 31.544133751984123 88.95129462451067 32.378403171351785 89.02775315892173 33.213819468735615 89.1020424173163 34.05035010499536 89.17406316201283 34.88796105242555 89.24371117896345 35.72661672011 89.31087697375241 36.56627987471629 89.37544544572305 37.406911556402136 89.43729553843777 38.248470989478704 89.49629986451761 39.090915487446466 89.55232430272575 39.93420035198735 89.60522756496898 40.778278765461884 89.65486073067143 41.62310167642195 89.70106674574 42.46861767760805 89.74367988309054 43.31477287585441 89.78252516140029 44.161510753275415 89.81741771846724 45.00877201905242 89.84816213519146 45.856494451080295 89.87455170582973 46.70461272666774 89.89636764976802 47.55305824141426 89.91337825959374 48.40175891530817 89.92533797976992 49.25063898500472 89.93198640966968 50.099618781149765 89.93333333333335 50.94861878114976 89.93091726828926 51.7975825401741 89.92299650095964 52.64642748768849 89.90982406159603 53.49507484861243 89.89165561281533 54.34344968280467 89.86873241208733 55.191480668985974 89.84128226349523 56.0390999029384 89.80952039891694 56.88624270892216 89.77365029426018 57.732847463336064 89.73386442591993 58.57885542972486 89.69034497220845 59.42421060430799 89.64326446410905 60.26885957126962 89.59278638935005 61.11275136710987 89.53906575346724 61.95583735341188 89.48224960120858 62.798071097430004 89.42247750137248 63.63940825995059 89.35988199789726 64.47980648991904 89.29458902980802 65.31922532536616 89.22671832239061 66.15762610020202 89.15638375178386 66.99497185647878 89.08369368499736 67.83122726175375 89.00875129719336 68.66635853121166 88.9316548679293 69.50033335423059 88.852498057919 70.33312082509937 88.7713701677394 71.16469137761547 88.68835637980399 71.99501672331253 88.60353798481351 72.82406979308473 88.51699259380153 73.65182468199176 88.42879433680126 74.47825659704377 88.3390140490838 75.30334180778001 88.24771944584064 76.12705759946762 88.1549752861226 76.94938222875946 88.06084352676818 77.77029488166097 87.96538346702565 78.58977563366635 87.86865188448975 79.4078054119337 87.77070316295423 80.224365959378 87.67158941271073 81.03943980056866 87.57136058381332 81.85301020932586 87.47006457275944 82.66506117791725 87.3677473230349 83.47557738776277 87.26445291990693 84.28454418156137 87.16022367985647 85.09194753675922 87.0551002349786 85.8977740402839 86.94912161267813 86.70201086447408 86.84232531096104 87.50464574413849 86.73474736959356 88.30566695468238 86.62642243739157 89.10506329124325 86.51738383587119 89.90282404878133 86.40766361949676 90.69893900307378 86.29729263272253 91.49339839256461 86.18630056402868 92.28619290102505 86.0747159971299 93.077313640982 85.96256645952327 93.86675213787484 85.84987846854008 94.65450031490293 85.73667757503482 95.44055047852845 85.62298840487055 96.2248953046015 85.50883469830244 97.00752782507604 85.39423934740113 97.78844141528705 85.2792244316202 98.56762978176135 43.601932273903955 98.72165876586992 42.70706134856122 98.86226468609834 42.137101194420005 98.99432120401464 41.727945813931946 99.12024039122362 41.41175257255791 99.24141667981198 41.15442803169611 99.35873310028742 40.93659377706313 99.47278200694338 40.74622713622597 99.58397541398676 40.57534485884082 99.69260558686938 40.41833664731898 99.79888063657916 40.271055185860305 99.90294646436706 40.13028470326319 100.00490073491602 39.99852986676127 100.10487868291744 39.96849378603238 100.20440608970793 39.938200653176956 100.30347909950558 39.9071928105095 100.40208699166323 39.874984516840044 100.50021175941582 39.841036638505166 100.5978273089934 39.80472623929942 100.69489820258289 39.765307459493854 100.7913778144753 39.72185849135257 100.8872056918456 39.6732066963698 100.98230379229113 39.61781911568387 101.0765710790264 39.55363716575195 101.16987563651267 39.47781897845747 101.26204292118953 39.386324144436955 101.35283778335608 39.27321997393638 101.44193608296513 39.12947660452247 101.52887823203297 38.94078676706847 101.61299003353899 38.683461237162575 101.69324195209643 38.31649227833346 101.76798933627143 37.76660782410271 101.83448845363296 36.90702496241036 101.88809382806912 35.58480447396702 101.92186589517863 34.01054524089152 101.93202407379201 33.300508121531756 101.93153169561498 33.33868690322053 101.9316119991633 33.33248925110402 101.93159933792985 33.333467165591614 101.93160134541372 33.33331213244901 101.93160102740046 33.33333669231684 101.93160107778522 33.33333280116148 101.93160106980264 33.33333341764667 101.93160107106735 33.33333331997434 101.93160107086696 33.33333333545032 101.93160107089872 33.33333333299742 101.93160107089368 33.33333333338705 101.93160107089449 33.33333333332418 101.93160107089435 33.33333333333516 101.93160107089437 33.33333333333348 101.93160107089437 33.33333333333348 101.93160107089437 33.33333333333348 101.93160107089437 33.33333333333348 101.93160107089437 33.33333333333348 101.93160107089437 33.33333333333348 101.93160107089437
Entrega¶
Una vez completado el Notebook y ejecutado completamente (comprueba que funcionan todas las celdas). Envialo a la tarea correspondiente de AULES.