@Guoguo0605
2016-04-07T17:24:12.000000Z
字数 3217
阅读 1326
code trajectory_of_cannon_shell
# -*- coding: utf-8 -*-from pylab import *from math import *g = 9.8b2m = 4e-5class flight_state:def __init__(self, _x = 0, _y = 0, _vx = 0, _vy = 0, _t = 0):self.x = _xself.y = _yself.vx = _vxself.vy = _vyself.t = _tclass cannon:def __init__(self, _fs = flight_state(0, 0, 0, 0, 0), _dt = 0.1):self.cannon_flight_state = []self.cannon_flight_state.append(_fs)self.dt = _dtdef next_state(self, current_state):global gnext_x = current_state.x + current_state.vx * self.dtnext_vx = current_state.vxnext_y = current_state.y + current_state.vy * self.dtnext_vy = current_state.vy - g * self.dt#print next_x, next_yreturn flight_state(next_x, next_y, next_vx, next_vy, current_state.t + self.dt)def shoot(self):while not(self.cannon_flight_state[-1].y < 0):self.cannon_flight_state.append(self.next_state(self.cannon_flight_state[-1]))r = - self.cannon_flight_state[-2].y / self.cannon_flight_state[-1].yself.cannon_flight_state[-1].x = (self.cannon_flight_state[-2].x + r * self.cannon_flight_state[-1].x) / (r + 1)self.cannon_flight_state[-1].y = 0def show_trajectory(self, labe, n):x = []y = []for fs in self.cannon_flight_state:x.append(fs.x)y.append(fs.y)if n == 1:subplot(121)plot(x,y, label = labe)xlabel(r'$x(m)$', fontsize=16)ylabel(r'$y(m)$', fontsize=16)text(45367, 15000, 'No Drag', fontsize=16)title('Trajectory of cannon shell')ax = gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.xaxis.set_ticks_position('bottom')ax.yaxis.set_ticks_position('left')ax.set_xlim(0, 60000)ax.set_ylim(0, 18000)elif n == 2:subplot(122)plot(x,y, label = labe)xlabel(r'$x(m)$', fontsize=16)text(35367, 15000, 'With Air Drag', fontsize=16)title('Trajectory of cannon shell')ax = gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.xaxis.set_ticks_position('bottom')ax.yaxis.set_ticks_position('left')ax.set_xlim(0, 60000)ax.set_ylim(0, 18000)#show()class drag_cannon(cannon):def next_state(self, current_state):global g, b2mv = sqrt(current_state.vx * current_state.vx + current_state.vy * current_state.vy)next_x = current_state.x + current_state.vx * self.dtnext_vx = current_state.vx - b2m * v * current_state.vx * self.dtnext_y = current_state.y + current_state.vy * self.dtnext_vy = current_state.vy - g * self.dt - b2m * v * current_state.vy * self.dt#print next_x, next_yreturn flight_state(next_x, next_y, next_vx, next_vy, current_state.t + self.dt)class adiabatic_drag_cannon(cannon):def next_state(self, current_state):global g, b2mfactor = (1 - 6.5e-3 * current_state.y / 288.15) ** 2.5v = sqrt(current_state.vx * current_state.vx + current_state.vy * current_state.vy)next_x = current_state.x + current_state.vx * self.dtnext_vx = current_state.vx - factor * b2m * v * current_state.vx * self.dtnext_y = current_state.y + current_state.vy * self.dtnext_vy = current_state.vy - g * self.dt - factor * b2m * v * current_state.vy * self.dt#print next_x, next_yreturn flight_state(next_x, next_y, next_vx, next_vy, current_state.t + self.dt)speed = 700theta = range(30,56,5)v_x = [speed * cos(i * pi / 180) for i in theta]v_y = [speed * sin(i * pi / 180) for i in theta]def nodrag():a = []b = []for i in range(len(theta)):a.append(cannon(flight_state(0, 0, v_x[i], v_y[i], 0), _dt = 0.1))labe = str(theta[i]) + r'$^{\circ}$'a[i].shoot()a[i].show_trajectory(labe,1)legend(loc='upper left', frameon=False)b.append(drag_cannon(flight_state(0, 0, v_x[i], v_y[i], 0), _dt = 0.1))b[i].shoot()b[i].show_trajectory(labe,2)legend(loc='upper left', frameon=False)nodrag()show()