#!/opt/local/bin/python #Andrew Samuels #baseball.py from scipy import * from pdb import * #create arrays dt = 1e-4 nMAX = int(1/dt) x = zeros(nMAX) y = zeros(nMAX) z = zeros(nMAX) vx = zeros(nMAX) vy = zeros(nMAX) vz = zeros(nMAX) v = zeros(nMAX) #constants B = 4.1e-4 #magnus force (dimensionless) w = 1800/60.0 * 2*pi #rotaton rate of baseball, 1800 rpm to rad/s g = 9.81 #acceleration of gravity (m/s^2) v0_fb = 42.4688 #initial speed of pitch, fastball (m/s) v0_op = 38.0 #initial speed of pitch, other pitches (m/s) l = 18.44 #distance from pitcher (m) T_fb = l/v0_fb #step-length, estimated flight time, fastball T_op = l/v0_op #step-length, estimated flight time, other pitches nT_fb = int(T_fb/dt) #number of iterations for fastball nT_op = int(T_op/dt) #number of iterations for other pitches d2r = pi/180 # convert degrees to radians theta = 1 * d2r # elevation angle of pitch, degrees phi1 = 225 * d2r #direction of w, relative to z, fastball phi2 = 45 * d2r #direction of w, relative to z, curveball phi3 = 0 * d2r #direction of w, relative to z, slider phi4 = 135 * d2r #direction of w, relative to z, screwball #drag force constants c1 = 0.0039 c2 = 0.0058 vd = 35.0 #(m/s) delta = 5.0 # (m/s) #initial conditions x[0] = 0.0 y[0] = 0.0 z[0] = 0.0 vx[0] = v0_fb * cos(theta) vy[0] = 0.0 vz[0] = v0_fb * sin(theta) #pass dx/dt=vx through runkut4 def rk4dx(vx,dt): def dxdt(vx): dxdt = vx return dxdt K0 = dt * dxdt(vx) K1 = dt * dxdt(vx + K0/2.0) K2 = dt * dxdt(vx + K1/2.0) K3 = dt * dxdt(vx + K2) vxnew = (K0 + 2.0*K1 + 2.0*K2 + K3)/6.0 return vxnew #pass dy/dt=vy through runkut4 def rk4dy(vy,dt): def dydt(vy): dydt = vy return dydt K0 = dt * dydt(vy) K1 = dt * dydt(vy + K0/2.0) K2 = dt * dydt(vy + K1/2.0) K3 = dt * dydt(vy + K2) vynew = (K0 + 2.0*K1 + 2.0*K2 + K3)/6.0 return vynew #pass dz/dt=vz through runkut4 def rk4dz(vz,dt): def dzdt(vz): dzdt = vz return dzdt K0 = dt * dzdt(vz) K1 = dt * dzdt(vz + K0/2.0) K2 = dt * dzdt(vz + K1/2.0) K3 = dt * dzdt(vz + K2) vznew = (K0 + 2.0*K1 + 2.0*K2 + K3)/6.0 return vznew #solve accelerations with runge kutta 4 def rk4(v,vx,vy,vz,dt,phi): def ax(v,vx,vy,vz,phi): #drag force function, Fd(v) def Fd(v): return c1 + (c2/(1.0 + exp((v-vd)/delta))) return -Fd(v)*v*vx + B*w*(vz*sin(phi)-vy*cos(phi)) def ay(v,vx,vy,phi): #drag force function, Fd(v) def Fd(v): return c1 + (c2/(1.0 + exp((v-vd)/delta))) return -Fd(v)*v*vy + B*w*vx*cos(phi1) def az(v,vx,vz,phi): #drag force function, Fd(v) def Fd(v): return c1 + (c2/(1.0 + exp((v-vd)/delta))) return -g*-Fd(v)*v*vz - B*w*vx*sin(phi) K0 = dt * ax(v,vx,vy,vz,phi) L0 = dt * ay(v,vx,vy,phi) M0 = dt * az(v,vx,vz,phi) K1 = dt * ax(v + dt/2.0,vx + K0/2.0,vy + L0/2.0,vz + M0/2.0,phi) L1 = dt * ay(v + dt/2.0,vx + K0/2.0,vy + L0/2.0,phi) M1 = dt * az(v + dt/2.0,vx + K0/2.0,vz + M0/2.0,phi) K2 = dt * ax(v + dt/2.0,vx + K1/2.0,vy + L1/2.0,vz + M1/2.0,phi) L2 = dt * ay(v + dt/2.0,vx + K1/2.0,vy + L1/2.0,phi) M2 = dt * az(v + dt/2.0,vx + K1/2.0,vz + M1/2.0,phi) K3 = dt * ax(v + dt,vx + K2,vy + L2,vz + M0,phi) L3 = dt * ay(v + dt,vx + K1,vy + L2,phi) M3 = dt * az(v + dt,vx + K1,vz + M2,phi) axnew = (K0 + 2.0*K1 + 2.0*K2 + K3)/6.0 aynew = (L0 + 2.0*L1 + 2.0*L2 + L3)/6.0 aznew = (M0 + 2.0*M1 + 2.0*M2 + M3)/6.0 return axnew,aynew,aznew f=open('fastball.dat','w') #first time step is n + 1 #start loop for i in range(0,nT_fb): v = (vx[i] * vx[i] + vy[i] * vy[i] + vz[i] * vz[i]) v = (v)**0.5 print "X: " + str(x[i]) + " , Y: " + str(y[i]) + " , Z: " + str(z[i]) + " ,T: " + str(x[i]/v) +" , V: "+ str(v) + "\n" f.write(str(x[i])+'\t'+str(y[i])+'\t'+ str(z[i])+'\t'+str(x[i]/v) + '\t' + str(v) +'\n') x[i+1] = x[i] + rk4dx(vx[i],dt) y[i+1] = y[i] + rk4dy(vy[i],dt) z[i+1] = z[i] + rk4dz(vz[i],dt) vx[i+1] = vx[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi1)[0] vy[i+1] = vy[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi1)[1] vz[i+1] = vz[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi1)[2] f.close() print "Created fastball.dat" #change initial conditions for the other pitches vx[0] = v0_op * cos(theta) vz[0] = v0_op * sin(theta) #curveball h=open('curveball.dat','w') for i in range(0,nT_op): v = (vx[i] * vx[i] + vy[i] * vy[i] + vz[i] * vz[i]) v = (v)**0.5 print "X: " + str(x[i]) + " , Y: " + str(y[i]) + " , Z: " + str(z[i]) + " ,T: " + str(x[i]/v) +" , V: "+ str(v) + "\n" h.write(str(x[i])+'\t'+str(y[i])+'\t'+ str(z[i])+'\t'+str(x[i]/v) + '\t' + str(v) +'\n') x[i+1] = x[i] + rk4dx(vx[i],dt) y[i+1] = y[i] + rk4dy(vy[i],dt) z[i+1] = z[i] + rk4dz(vz[i],dt) vx[i+1] = vx[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi2)[0] vy[i+1] = vy[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi2)[1] vz[i+1] = vz[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi2)[2] h.close() print "Created curveball.dat" #slider j=open('slider.dat','w') for i in range(0,nT_op): v = (vx[i] * vx[i] + vy[i] * vy[i] + vz[i] * vz[i]) v = (v)**0.5 print "X: " + str(x[i]) + " , Y: " + str(y[i]) + " , Z: " + str(z[i]) + " ,T: " + str(x[i]/v) +" , V: "+ str(v) + "\n" j.write(str(x[i])+'\t'+str(y[i])+'\t'+ str(z[i])+'\t'+str(x[i]/v) + '\t' + str(v) +'\n') x[i+1] = x[i] + rk4dx(vx[i],dt) y[i+1] = y[i] + rk4dy(vy[i],dt) z[i+1] = z[i] + rk4dz(vz[i],dt) vx[i+1] = vx[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi3)[0] vy[i+1] = vy[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi3)[1] vz[i+1] = vz[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi3)[2] j.close() print "Created slider.dat" #screwball o=open('screwball.dat','w') for i in range(0,nT_op): v = (vx[i] * vx[i] + vy[i] * vy[i] + vz[i] * vz[i]) v = (v)**0.5 print "X: " + str(x[i]) + " , Y: " + str(y[i]) + " , Z: " + str(z[i]) + " ,T: " + str(x[i]/v) +" , V: "+ str(v) + "\n" o.write(str(x[i])+'\t'+str(y[i])+'\t'+ str(z[i])+'\t'+str(x[i]/v) + '\t' + str(v) +'\n') x[i+1] = x[i] + rk4dx(vx[i],dt) y[i+1] = y[i] + rk4dy(vy[i],dt) z[i+1] = z[i] + rk4dz(vz[i],dt) vx[i+1] = vx[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi4)[0] vy[i+1] = vy[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi4)[1] vz[i+1] = vz[i] + rk4(v,vx[i],vy[i],vz[i],dt,phi4)[2] o.close() print "Created screwball.dat"
I am a software engineer with a computational physics focus. The purpose of this blog is to showcase my ideas and works. I can create value and reduce costs for your company.
20111228
Fun with Python: Simulating Baseball Pitches using 4th Order Runge-Kutta Method
Here is a description of the problem in PDF format. Basically this code simulates four different baseball pitches (slider, curve, fastball, screwball) by solving differential equations using the 4th order Runge-Kutta method.
Fun with Python: Electric Field Using Trapezoid Method
Suppose a line of charge is given that lies on the y-axis from y=-10 cm to y=+10 cm. At any point, the electric field can be calculated by the following function:
E_x=(sigma/(4*pi*epsilon_0))*intregral_-10_10(x/((x^2+y^2)^(3/2)))dy
where sigma is the linear charge density.
This python program solves this equation using the trapezoid method for numerical integration and outputs the data into a .dat file.
E_x=(sigma/(4*pi*epsilon_0))*intregral_-10_10(x/((x^2+y^2)^(3/2)))dy
where sigma is the linear charge density.
This python program solves this equation using the trapezoid method for numerical integration and outputs the data into a .dat file.
#Andrew Samuels #efield.py #find the electric field for a given function #Uses the trapezoid method #import modules from math import * #open a data file dfile = open('efdata.dat','w') #make some functions def efunc(x,y): return x/(x**2.+y**2.)**(3/2.) def efTrap(f,a,b,step=1): A = -(f(x,a) + f(x,b)) S = float(b - a) for n in range(step+1): y = a + n*S/step A += 2*f(x,y) return A*float(b-a)/(2*step) #constant k = 10.5/1.113e-4 #10.5microC/4*pi*e_0*1e6 #integrate from x=1 to 100 in steps of 5 x=1 while x <= 100 : ef = k * efTrap(efunc,-10,10,10000) print "x = " + str(x) + " , eField = " + str(ef) dfile.write(str(x) + '\t' + str(ef) + '\n') x += 5 #close data file dfile.close() print "Done! Created efdata.dat"
Fun with Python: Linear Algebra Solver
This program is similar to my Gaussian Elimination script only this time the matrix is solved using Back Substitution, then checked for accuracy using the Sci-Py module.
#Andrew Samuels #linear equation solver. Does Gauss-Jordon elimination, then back substituion. from scipy import * from scipy import linalg from pdb import * #function to compute dot product def dot(a, b): return reduce(lambda sum, p: sum + p[0]*p[1], zip(a,b), 0) matrix = zeros((3,4)) #aug = zeros((3,1)) matrix[0,0] = 1 matrix[0,1] = 1 matrix[0,2] = 1 matrix[0,3] = 0 matrix[1,0] = 1 matrix[1,1] = -2 matrix[1,2] = 2 matrix[1,3] = 4 matrix[2,0] = 1 matrix[2,1] = 2 matrix[2,2] = -1 matrix[2,3] = -1 pivot = 0 ncols = 4 nrows = 3 #for all pivots for col in range(ncols-1): #divide pivot by itself to make it 1 matrix[pivot,:] = matrix[pivot,:]/matrix[pivot,pivot] #for all pivots that haven't been done yet for row in range(pivot+1,nrows): matrix[row,:] = matrix[row,:] - matrix[pivot,:] pivot = pivot + 1 print " " print "Row Echelon Form: " print matrix print "\n" #solve the matrix and print solution for pivot in range(nrows-1,-1,-1): matrix[pivot] = (matrix[pivot] - dot(matrix[pivot,pivot+1:nrows],matrix[pivot+1:nrows]))/matrix[pivot,pivot] print "Solved by Back Subst.: " print matrix print "\n" #check with scipy a = array([[1,1,1],[1,-2,2],[1,2,-1]]) b = array([[0],[4],[-1]]) sol = linalg.solve(a,b) print "Solved by Scipy (check): " print sol print "\n"
Fun with Python: Gaussian Elimination
Here is my python program that does Gaussian Elimination on a 3 x 4 matrix. Of course, there are existing modules with functions that could do this automatically, but this was a good learning exercise doing it the hard way.
#Andrew Samuels #Gaussian Elimination #performs gaussian elimination on a 3 by 4 matrix #import scipy module from scipy import * from pdb import * #construct the matrix matrix = zeros((3,4)) matrix[0,0] = 1 matrix[0,1] = 1 matrix[0,2] = 1 matrix[0,3] = 0 matrix[1,0] = 1 matrix[1,1] = -2 matrix[1,2] = 2 matrix[1,3] = 4 matrix[2,0] = 1 matrix[2,1] = 2 matrix[2,2] = -1 matrix[2,3] = -1 pivot = 0 ncols = 4 nrows = 3 #for all pivots for col in range(ncols-1): #divide pivot by itself to make it 1 matrix[pivot,:] = matrix[pivot,:]/matrix[pivot,pivot] #for all pivots that haven't been done yet for row in range(pivot+1,nrows): matrix[row,:] = matrix[row,:] - matrix[pivot,:] pivot = pivot + 1 print matrix
Fun with Python: Factorial Calculator
This program written in python calculates a factorial when given an integer. The program will complain if you don't give it a valid integer, such as a letter or dollar sign.
#Andrew Samuels #factorial calculator #Fall 2011 #calculates a factorial from integer input from user n = raw_input('Enter an integer: ') try: n=int(n) except: print 'Enter a valid integer, dummy!' exit(1) f=1 while n > 1 : f = f * n n = n - 1 print f
Subscribe to:
Posts (Atom)