Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.68 KB | None | 0 0
  1. from numpy import pi, sin, cos, sqrt, array, arange, linspace
  2. from pylab import plot, show, legend, xlabel, ylabel
  3.  
  4. m = 1.0
  5. g = 1.0
  6. l = 1.0
  7.  
  8.  
  9.  
  10. # solve df/dt = f(r, t)
  11. def f(r, t):
  12.     theta = r[0]
  13.     omega = r[1] # angular velocity
  14.     ftheta = omega # dtheta/dt = ftheta
  15.     fomega = -g / l * sin(theta) # domega/dt = fomega
  16.    
  17.     return array([ftheta, fomega], float)
  18.  
  19. def findPeriod(theta0):
  20.    
  21.     omega0 = 0
  22.     r = array([theta0, omega0], float)
  23.     t0 = 0
  24.     tf = 50.0
  25.     N = 1000
  26.     h = (tf - t0) / N # timestep
  27.     tpoints = arange(t0, tf, h) # array of time values
  28.     thetapoints = []
  29.     omegapoints = []
  30.  
  31.     isFirstCrossRecorded = False
  32.     isSecondCrossRecorded = False
  33.     firstCross = 0 # in time steps
  34.     secondCross = 0
  35.    
  36.     for t in tpoints:
  37.         thetapoints.append(r[0])
  38.         omegapoints.append(r[1])
  39.  
  40.         thetaold = thetapoints[len(thetapoints) - 2]
  41.         if not isFirstCrossRecorded and (r[0] < 0 and thetaold > 0):
  42.             isFirstCrossRecorded = True
  43.             firstCross = t
  44.  
  45.         if not isSecondCrossRecorded and isFirstCrossRecorded and (r[0] > 0 and thetaold < 0):
  46.             isSecondCrossRecorded = True
  47.             secondCross = t
  48.  
  49.         # second order RK method
  50.     #    rmid = r + h * f(r, t)
  51.     #    r += h * f(rmid, t)
  52.  
  53.         # fourth order RK method
  54.         k1 = h * f(r, t)
  55.         k2 = h * f(r + 0.5 * k1, t + 0.5 * h)
  56.         k3 = h * f(r + 0.5 * k2, t + 0.5 * h)
  57.         k4 = h * f(r + k3, t + h)
  58.         r += 1/6 * (k1 + 2 * k2 + 2 * k3 + k4)
  59.        
  60.     return secondCross - firstCross
  61.    
  62. theta0 = 0.1 * pi
  63. print("Period is ", findPeriod(theta0), "for a theta0 of", theta0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement