Documentos de Académico
Documentos de Profesional
Documentos de Cultura
(https://elrobotista.com/)
PROGRAMACIÓN
(HTTPS://ELROBOTISTA.COM/CATEGORY/PROGRAMACION/)
Si recuerdan sus clases de cálculo, seguramente recordaran que la integral es el “área bajo la
curva” y la derivada: “la recta tangente a la curva” que los profesores repiten hasta casi hacernos
vomitar. Pero, ¿cuál es el significado en la realidad, o la aplicación práctica de una integral o una
derivada? En este caso, les presento una: resolver ecuaciones diferenciales de forma numérica.
Esto no es importante solo por el hecho de que sea tedioso o aburrido resolver ecuaciones
diferenciales de forma analítica y a mano como en sus exámenes de cálculo. Verán, la mayoría de
las ecuaciones diferenciales que representan fenómenos físicos son demasiado complejas para
resolver de forma analítica, y en muchos otros casos las soluciones ni siquiera existen. Entonces,
podemos recurrir a las computadoras para resolver las ecuaciones diferenciales y poder estudiar la
respuesta de los modelos bajo diferentes condiciones.
Podrían pensar que, si de por si ya es complicado resolver una integral o derivada en lápiz y papel,
ha de ser aún más difícil resolverlas con una computadora. Están equivocados. Déjenme aburrirlos
con un poco de teoría. Será breve. Lo prometo.
https://elrobotista.com/simulaciones-numericas/ 1/9
4/4/2019 Python: Simulación de un motor de corriente directa
∫ ∑ f(k)Δx
b b
f (x)dx ≈ (https://elrobotista.com/)
a k= a
ILnaicsio
um(hatttposr:i/
a/ceolrnovbeortgisetaa.claom
in/ culoagn(dhottlpism
te) gral B ://Δ ro→
elx boti0s,tap.c
eorome/sbtolongo/)nos interesa mucho ahorita:
Nosotros (https://elrobotis ta.com/ab out/)
nos interesa la sumatoria. Entonces, vemo s que podemos aproximar una integral con una
sumatoria, siempre y cuando Δ sea lo suficientemente pequeño.De manera similar, podemos
aproximar la derivada
Δf(x) d f (x )
≈ ,
Δx dx
si Δx es suficientemente pequeño. Entonces todo esto comienza a tomar sentido. Las integrales se
vuelven sumas, mientras que las derivadas se vuelven restas. !Esto sí es sencillo! Veamos cómo
podemos usar estas aproximaciones para simular el motor de la entrada anterior:
Ω(s) K
= ,
Vin (s) τs + 1
dω
τ + ω = Kvin ,
dt
Δω
τ + ω ≈ Kvin .
Δt
https://elrobotista.com/simulaciones-numericas/ 2/9
4/4/2019 Python: Simulación de un motor de corriente directa
ωk– ωk−1 1
≈ (Kvin – ωk−1 ),
Δt τ
Esta es la ventaja de resolver una ecuación diferencial en una computadora: las integrales se
transforman en sumas y las derivadas en restas. Una ecuación diferencial se vuelve una ecuación
de diferencias.
De nada nos sirve la ecuación si no podemos estudiar la respuesta. Podemos resolverla paso a paso
y obtener la evolución del sistema; sin embargo, estarán de acuerdo que esto sería tedioso y
aburrido. Por otro lado, las computadoras son perfectas para esto. Existen diversas herramientas
de simulación y lenguajes de programación tanto libres como propietarios para simular sistemas.
En esta ocasión usaremos Python por la sintaxis tan limpia que caracteriza a este lenguaje y
además, es un lenguaje de programación de código abierto.
https://elrobotista.com/simulaciones-numericas/ 3/9
4/4/2019 Python: Simulación de un motor de corriente directa
1 # IMPORTAR modulo PARA GRAFICAR.
2 import MATPLOTLIB.pyplot AS plt
3 K = 145.47 # GANANCIA de DC del motor.
4 TAU = 0.087 # CONSTANTE de tiempo,
5 ti = 0. # Tiempo INICIAL. (https://elrobotista.com/)
6 tf = 2. # Tiempo FINAL.
7 dt = 0.01 # Tiempo de muestreo.
8 t = ti # Tiempo ACTUAL de SIMULACION.
In9icioV(ihnttp
= s2
:/4/e#lroVb E .cdo
oTtiAsJta
OL emE/N)TRADAB.log (https://elrobotista.com/blog/)
10 w = 0. # VELOCIDAD INICIAL del motor.
N1o1soWtro=s [(h
wt]tp#s:/
V/
eecltroorbodteistsao.c
lo mi/
uc aebso.ut/)
on
12 T = [t] # Vector de tiempo.
13 ts = 1e-2 # Tiempo de muestreo.
14
15 # INTEGRAR LA ECUACION de DIFERENCIAS
16 # por el tiempo ESPECIFICADO.
17 while t < tf:
18
19 # ESTA es LA ECUACION de DIFERENCIAS.
20 w = (dt / TAU) * (K * Vin - w) + w
21
22 t += ts # Siguiente MUESTRA de tiempo.
23 # AGREGAR AL vector de soluciones PARA GRAFICAR
24 # LA VELOCIDAD CONTRA el tiempo.
25 W.APPEND(w / 1000.)
26 T.APPEND(t)
27
28 # GRAFICAR LA VELOCIDAD CONTRA el tiempo.
29 plt.plot(T, W)
30
31 # ADORNAR LA GRAFICA.
32 plt.title('RESPUESTA del motor')
33 plt.XLABEL('Tiempo (s)')
34 plt.YLABEL('VELOCIDAD (RPM x 1000)')
35 plt.show()
https://elrobotista.com/simulaciones-numericas/ 4/9
4/4/2019 Python: Simulación de un motor de corriente directa
(https://elrobotista.com/)
(https://elrobotista.com/simulaciones-numericas/motor_response1_1024/)
Simular sistemas dinámicos utilizando métodos numéricos permite evaluar el desempeño del
sistema a variación de parámetros: sea del sistema mismo, condiciones de operación, diferentes
paradigmas de control, etc. Por ejemplo, supongamos que queremos estudiar el impacto de la
variación de los parámetros τ, K. Si tienen conocimiento en teoría de ecuaciones diferenciales, les
será obvio el impacto que tienen estos parámetros en la respuesta del motor. Pero tengamos en
cuenta que estamos hablando de un sistema lineal de primer orden; no es tan sencillo deducirlo
para modelos de sistemas dinámicos más complejos.
Supongamos que el modelo es más complejo y queremos estudiar el impacto de estos parámetros
usando Python. ¿Cómo sería?
https://elrobotista.com/simulaciones-numericas/ 5/9
4/4/2019 Python: Simulación de un motor de corriente directa
1 import MATPLOTLIB.pyplot AS plt
2
3 # Vectores de VARIACION de PARAMETROS
4 _K = [145.47 * (i / 2.) for i in RANGE(2, 7)]
5 _TAU = [0.087 * (i / 2.) for i in RANGE(2, 7)] (https://elrobotista.com/)
6
7 ti = 0. # Tiempo INICIAL.
8 tf = 1.5 # Tiempo FINAL.
In9iciot(sht=tp0s.:/0/2el#
robTioetimspta
o .cdoemm/u)estreBol.og (https://elrobotista.com/blog/)
10
N1o1sottro=s t(h
itt#psT:/ i/
eemlpro
obAoCtTisUtAaL.co
dem/ aMbUoLuAtC/I)ON.
SI
12 Vin = 24 # VOLTAJE de ENTRADA.
13 x = 0. # VELOCIDAD INICIAL del motor.
14
15 _X = [[x] for _ in _K] # Vector de soluciones
16 _T = [[t] for _ in _K] # Vector de tiempo
17 # LEYENDAS
18 leg = []
19
20 for K, TAU, X, T in zip(_K, _TAU, _X, _T):
21 x, t = X[0], T[0]
22 # ASIGNAR LEYENDA PARA distinguir GRAFICO.
23 leg.APPEND('K={0}, TAU={1}'.FORMAT(K, TAU))
24 while t < tf:
25 dx = (K * Vin - x) / TAU
26 x += dx * ts
27 t += ts # Siguiente MUESTRA de tiempo.
28 X.APPEND(x / 1000)
29 T.APPEND(t)
30 plt.plot(T, X, linewidth = 2.)
31 plt.title('IMPACTO de LA VARIACION de PARAMETROS del Motor')
32 plt.XLABEL('Tiempo (s)')
33 plt.YLABEL('VELOCIDAD (RPM x 1000)')
34 plt.xlim([ti, tf])
35 plt.grid()
36 plt.legend(leg, loc='best')
37 plt.show()
https://elrobotista.com/simulaciones-numericas/ 6/9
4/4/2019 Python: Simulación de un motor de corriente directa
(https://elrobotista.com/simulaciones-numericas/var_motor_response_1024/)
Figura 2.- Respuesta del motor con diferentes parámetros a un escalón de voltaje.
(https://elrobotista.com/)
Entonces, podemos concluir que fácilmente podemos desarrollar simulaciones para estudiar la
respuesta de sistemas dinámicos bajo condiciones de operación que nos interesen.
Integrador ODE-1
Podemos establecer un algoritmo un poco más sencillo de recordar que nos permitirá desarrollar
las simulaciones aún con más facilidad: el método de integración “ODE-1” o método de Euler. Va
algo así: redefinamos, por sencillez, la notación de la derivada en el tiempo de una señal arbitraría
y:
dy
≡ y.
dt
yk − yk−1
≈ y,
Δt
yk ≈ yΔt + yk−1 .
Si se dieron cuenta, este algoritmo nos sirve para resolver derivadas de primer orden. En futuras
entradas veremos como podemos generalizar el método para resolver un sistema dinámico de
dimensión n > 1. Esto nos permitirá estudiar sistemas más complejos, como por ejemplo un
“Quadcopter”.
https://elrobotista.com/simulaciones-numericas/ 7/9
4/4/2019 Python: Simulación de un motor de corriente directa
Acertijo: ¿Si, además de estudiar la velocidad del motor, también necesitamos estudiar la posición
del motor. Qué necesitamos añadir a la simulación para que también calcule la posición del motor
y no sólo la velocidad? Y la situación inversa también es válida: ¿Si neces(ihtattms:s//oeblrtoebnoetrislata.com/)
po
aceleración del motor a partir de la velocidad, ¿cómo sería el algoritmo en Python?
Compartir:
(https://elrobotista.com/simulaciones-numericas/?share=facebook&nb=1)
(https://elrobotista.com/simulaciones-numericas/?share=twitter&nb=1)
(https://api.whatsapp.com/send?
text=Simulaci%C3%B3n%20de%20Sistemas%20Din%C3%A1micos%20https%3A%2F%2Felrobotista.com%2Fsimulaciones-
numericas%2F)
(https://elrobotista.com/simulaciones-numericas/?share=linkedin&nb=1)
(https://elrobotista.com/simulaciones-numericas/?share=reddit&nb=1)
(https://elrobotista.com/simulaciones-numericas/?share=google-plus-1&nb=1)
PYTHON (HTTPS://ELROBOTISTA.COM/TAG/PYTHON/)
SIMULACION (HTTPS://ELROBOTISTA.COM/TAG/SIMULACION/)
https://elrobotista.com/simulaciones-numericas/ 8/9
4/4/2019 Python: Simulación de un motor de corriente directa
https://elrobotista.com/simulaciones-numericas/ 9/9