#!/usr/bin/python
# -*- coding: utf8 -*-
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from math import *
code_website = 'http://commons.wikimedia.org/wiki/User:Geek3/mplwp'
try:
import mplwp
except ImportError, er:
print 'ImportError:', er
print 'You need to download mplwp.py from', code_website
exit(1)
name = 'mplwp_ballistic_trajectories_badminton.svg'
fig = mplwp.fig_standard(mpl)
xlim = 0,12*515/355.; fig.gca().set_xlim(xlim)
ylim = 0,12; fig.gca().set_ylim(ylim)
from scipy.integrate import odeint
from scipy.optimize import brentq
def ballistic(g, k, xy0, v0, alpha0, tt):
# use a four-dimensional vector function vec = [x, y, vx, vy]
def dif(vec, t):
v = sqrt(vec[2]**2 + vec[3]**2)
return [vec[2], vec[3], -k*v*vec[2], -g -k*v*vec[3]]
# solve the differential equation numerically
vec = odeint(dif, [xy0[0], xy0[1], v0*cos(alpha0), v0*sin(alpha0)], tt)
return vec[:,0], vec[:,1] # return x(tt) and y(tt)
g = 9.81
k = 0.2
v0 = 65.0
for alpha0 in np.radians(np.array([20, 30, 40, 50, 60])):
t1= brentq(lambda t: ballistic(g,k,[0,2.5],v0,alpha0,[0,t])[1][1],0.1,4)
t = np.linspace(0, t1, 5001)
x, y = ballistic(g, k, [0, 2.5], v0, alpha0, t)
while len(y) > 1 and y[-2] <= 0.0: x = x[:-1]; y = y[:-1]
plt.plot(x, y,
label=ur'$\alpha_0=\,{:g}$°'.format(degrees(alpha0)))
for a in np.linspace(radians(19), radians(21), 20):
t1 = brentq(lambda t: ballistic(g,k,[0,2.5],v0,a,[0,t])[1][1],0.1,5)
x, y = ballistic(g, k, [0, 2.5], v0, a, [0, t1])
print degrees(a), x[1]
plt.xlabel('x [m]'); fig.gca().xaxis.set_label_coords(1.03, -0.02)
plt.ylabel('h [m]'); fig.gca().yaxis.labelpad = -1
mpl.rc('legend', borderaxespad=0.5)
plt.legend(loc='upper right').get_frame().set_alpha(0.9)
plt.savefig(name)
mplwp.postprocess(name)