fork download
  1. # Importamos librerias necesarias
  2. # SciPy, SciPy,integrate: librerías para solución por Runge-Kutta 4,5 de la ecuación.
  3. # Matplotlib: para graficar función solución (theta(t))
  4. # Numpy: Matemáticas y trabajo matricial.
  5. import scipy, scipy.integrate
  6. import matplotlib as mpl
  7. import matplotlib.pyplot as plt
  8. import numpy as np
  9.  
  10. # Se define ecuación diferencial como sistema de dos
  11. # ecuaciones de primer orden.
  12. def dydt(t,y,L):
  13. theta,thetaPrima = y
  14. thetaPrimaPrima = -(g/L) * scipy.sin(theta)
  15. return [thetaPrima,thetaPrimaPrima]
  16.  
  17. # Definimos unas constantes a manera de ejemplo.
  18. # g: aceleración de la gravedad.
  19. # L: longitud del péndulo
  20. # theta0: ángulo desde el que se suelta el péndulo.
  21. # thetaPrima0: velocidad inicial con la que se suelta.
  22.  
  23. g = 9.8
  24. L = 1.0
  25. theta0 = scipy.pi/2 # Ángulo inicial: 90 grados.
  26. thetaPrima0 = 0.0
  27.  
  28. solucionador = scipy.integrate.ode(dydt)
  29. # 'dopri5' es para indicarle al solucionador que resuelva
  30. # la ecuación por el método de Runge-Kutta 4,5
  31. solucionador.set_integrator('dopri5')
  32. # .set_f_params es la función para pasarle
  33. # los argumentos adicionales a la ecuación diferencial.
  34. # Para nuestro caso, la longitud del péndulo
  35. solucionador.set_f_params(L)
  36. # Le indicamos al solucionador el valor inicial del problema.
  37. # theta0: ángulo desde el que se suelta el péndulo.
  38. # thetaPrima0: velocidad inicial con la que se suelta.
  39. solucionador.set_initial_value([theta0,thetaPrima0] , 0)
  40.  
  41. thetas = [] # Crear vector vacío de ordenadas.
  42. dt = 0.01 # Pequeño intervalo delta de t.
  43. while solucionador.successful() and solucionador.t < 10:
  44. solucionador.integrate(solucionador.t+dt)
  45. thetas.append(solucionador.y[0]*180/scipy.pi) # Llenar el vector de ordenadas con valor de theta
  46.  
  47. # Creamos vector de abscisas de tiempo.
  48. t=[]
  49. for i in range(len(thetas)):
  50. t.append(i*dt)
  51.  
  52. fig = plt.figure() # Creamos una nuevo gráfico con Matplotlib.
  53. plt.plot(t,thetas) # Graficamos el vector de abscisas vs el vector de ordenadas.
  54. plt.xlabel('tiempo (s)') # Título eje x
  55. plt.ylabel('Amplitud theta(t)') # Título eje y
  56. plt.show() # Mostramos el gráfico en pantalla.
Success #stdin #stdout 0.62s 70172KB
stdin
Standard input is empty
stdout
Standard output is empty