@842001323
2016-10-24T08:38:11.000000Z
字数 3182
阅读 391
摘要:炮弹与炮弹不在同一海拔,海拔变化自然对轨迹有影响。同时探究目标海拔改变时怎样能用最小速度打到目标,最后尝试精确击打,并计算相应误差。
炮弹在空中飞行受到重力与空气阻力、风阻的影响
部分代码
import math
import pylab as pl
class cannon_shell1:
def __init__(self, time_step=0.01 ,angle=1, initial_v=700, T0=273, b=0.0065, Bm=0.00004,g=9.8,c=2.5,v_wind=25):
self.y = [1000]
self.x = [0]
self.t = [0]
self.ang = angle
self.v = [initial_v]
self.vx =[initial_v*math.cos(self.ang)]
self.vy =[initial_v*math.sin(self.ang)]
self.b = b
self.Bm = Bm
self.T0 = T0
self.dt = time_step
self.g=g
self.c=c
self.v_wind=v_wind
def run1(self):
_time=0
while (self.y[-1]>0):
self.vx.append(self.vx[-1]-self.Bm*self.dt*math.sqrt((self.vx[-1]-self.v_wind)*(self.vx[-1]-self.v_wind)+self.vy[-1]*self.vy[-1])*(self.vx[-1]-self.v_wind)*(1-self.b*self.y[-1]/self.T0)**self.c)
self.vy.append(self.vy[-1]-self.g*self.dt-self.Bm*self.dt*math.sqrt((self.vx[-1]-self.v_wind)*(self.vx[-1]-self.v_wind)+self.vy[-1]*self.vy[-1])*self.vy[-1]*(1-self.b*self.y[-1]/self.T0)**self.c)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.v.append(math.sqrt(self.vx[-1]*self.vx[-1]+self.vy[-1]*self.vy[-1]))
self.t.append(_time)
_time+=self.dt
绘图时选择了多个发射角度:0.5、0,6、0.7、0.8、0.9、1、1.1、1.2、1.3、1.4、1.5、。图中做了两条水平黑线,代表不同的海拔高度。
部分代码
class cannon_shell1:
def __init__(self, time_step=0.01 ,angle=0, initial_v=700, T0=273, b=0.0065, Bm=0.00004,c=2.5,v_wind=25):
self.y = [0]
self.x = [0]
self.t = [0]
self.ang = angle
self.v = [initial_v]
self.vx =[initial_v*math.cos(self.ang)]
self.vy =[initial_v*math.sin(self.ang)]
self.b = b
self.Bm = Bm
self.T0 = T0
self.v_wind = v_wind
self.dt = time_step
self.g = g
self.c=c
def run1(self):
_time=0
while (self.y[-1]<1000):
initial_v=700
self.ang=self.ang+0.01
self.y = [0]
self.x = [0]
self.t = [0]
self.v = [initial_v]
self.vx =[initial_v*math.sin(self.ang)]
self.vy =[initial_v*math.sin(self.ang)]
while (self.x[-1]<15000):
self.vx.append(self.vx[-1]-self.Bm*self.dt*math.sqrt((self.vx[-1]-self.v_wind)*(self.vx[-1]-self.v_wind)+self.vy[-1]*self.vy[-1])*(self.vx[-1]-self.v_wind)*(1-self.b*self.y[-1]/self.T0)**self.c)
self.vy.append(self.vy[-1]-self.g*self.dt-self.Bm*self.dt*math.sqrt((self.vx[-1]-self.v_wind)*(self.vx[-1]-self.v_wind)+self.vy[-1]*self.vy[-1])*self.vy[-1]*(1-self.b*self.y[-1]/self.T0)**self.c)
self.y.append(self.y[-1]+self.vy[-1]*self.dt)
self.x.append(self.x[-1]+self.vx[-1]*self.dt)
self.v.append(math.sqrt(self.vx[-1]*self.vx[-1]+self.vy[-1]*self.vy[-1]))
self.t.append(_time)
_time+=self.dt
运行时出现如下错误
因为不知具体错误是哪所以只做到了这一步。
每一个初始速度对应一个打击范围,当目标位置处于打击范围向外的边界上,能达到该目标的最小初始速度即为与边界范围相应的初始速度。