4.1 Movimiento circular – Una partícula, animación con matplotlib-Python

Simular el movimiento circular de una partícula en el plano x,y considerando la variable tiempo consiste en definir las ecuaciones a usar para cada eje.

movimiento circular 01 GIFanimado

x(t) = \cos \Big( \frac{2 \pi}{T}t \Big) y(t) = \sin \Big( \frac{2 \pi}{T}t \Big)

donde T es el periodo de la función.

Para la gráfica se crean todas las muestras de los puntos en los tiempos ti que al graficarse mostraría un punto en cada posición ti. La animación consiste en usar el concepto de fotograma, una «foto» por unidad de tiempo como en el cine, es decir solo dibujar un punto a la vez, por cada foto ‘i’.

Los fotogramas dentro de un periodo se definen como fotos=20, y el retardo dt en milisegundos dentro del periodo es t/fotos*1000.

La animación requiere usar los procedimientos redibuja(i) y borrapizarra() para cada fotograma ‘i’. Los procedimientos usados o coordinados con la instrucción animation.FuncAnimation()

En caso de requerir un archivo gif animado se proporciona un nombre de archivo. Para crear el archivo se requiere de un complemento ‘imagemagick‘ a ser instalado.

# FCNM-ESPOL-2015. Fisica con Python
# Una particula en recorrido circular
# propuesta: edelros@espol.edu.ec

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# INGRESO
T = 4 # periodo en segundos
x_t = lambda t: np.cos(2*np.pi*t/T)
y_t = lambda t: np.sin(2*np.pi*t/T)

# intervalos ejes x,y 
x_a = -1.2 ; x_b =-x_a  # simétricos a 0
y_a = -1.2 ; y_b =-y_a

fotos  = 20   # muestras en un periodo
retardo = int(T/fotos*1000)  # milisegundos entre fotogramas

narchivo = 'movimientocircular01' # archivo.gif

# PROCEDIMIENTO
# Inicializa valores de muestras
i  = np.arange(0, fotos) # cuenta tramas
ti = np.linspace(0,T,fotos+1)
xi = x_t(ti)
yi = y_t(ti)

# SALIDA - Gráfica animada
figura, graf_xy = plt.subplots()
graf_xy.axis([x_a, x_b, y_a, y_b])
graf_xy.set_aspect('equal')
graf_xy.grid()
graf_xy.set_xlabel('x(t)')
graf_xy.set_ylabel('y(t)')
graf_xy.set_title('movimiento circular')
punto, = graf_xy.plot(xi[0], yi[0],'ro')

# cuadros de texto en gráfico
txt_x = (x_b+x_a)/2
txt_y = y_b*(1-0.09)
txt_ti = graf_xy.text(txt_x,txt_y,'t='+str(ti[0]),
                      horizontalalignment='center')

# Animación Nueva graf_xy (n frame)
def redibuja(i):
    # actualiza el punto
    punto.set_xdata(xi[i]) 
    punto.set_ydata(yi[i])
    # actualiza texto
    t_trama = np.around(ti[i],2)
    txt_ti.set_text('t= '+str(t_trama))
    return (punto,txt_ti)

def borrapizarra(): # limpiar gráfica
    punto.set_ydata(np.ma.array(xi, mask=True))
    txt_ti.set_text('')
    return (punto,txt_ti)

# Animación coordina
ani = animation.FuncAnimation(figura, redibuja, i ,
                              init_func=borrapizarra,
                              interval = retardo, blit=True)
# Graba Archivo GIFAnimado y video, requiere 'imagemagick'
#ani.save(narchivo+'_GIFanimado.gif',writer='imagemagick')

plt.show()

Otros ejercicios donde las animaciones son un complemento para mostrar resultados en otros cursos:

Método de la Bisección – Concepto – Métodos Numéricos

Ecuaciones Diferenciales Parciales Parabólicas – Métodos Numéricos

Gráfica animada para interpretar el Integral de convolución – Señales y Sistemas