@Xc-liu
2016-04-06T09:55:31.000000Z
字数 3092
阅读 851
本文主要分析抛体在空气阻力作用下的运动情况 ,以炮弹为实际情景来讨论不同情况下炮弹的射程。本文主要分析的影响因素:
1.空气阻力
2.高度对空气阻力的影响
3.炮弹的出射角度
本文的局限性在于没有考虑运动过程中科里奥利里力的影响,近似认为炮弹在一个平面内运动。(考虑科里奥利力的情形将在下一篇给出)
在不考虑空气阻力的情况下抛体的运动很容易给出解析解。为了验证数值计算的精度,可以将数值解与解析解做比较。抛体的运动参数取取值如下:
30度 | 45度 | 60度 |
---|---|---|
43387.1m | 49838.7m | 43387.1m |
以45度为例解析解的射程为50000m, 此时相对误差为0.32%.
而且数值解至少有两个特征符合物理事实:
1.角度为45度时射程最远。
2.角度和为90度的两种炮弹射程相同。
考虑空气阻力的影响但是忽略空气阻力随高度的变化。抛体的动力学方程为
图中抛体运动的参数取值:
\ | 30 度 | 45度 | 60 度 |
---|---|---|---|
射程 | 21229.8m | 21774.2m | 17903.2m |
在考虑空气阻力随炮弹高度变化的情况下炮弹的射程分析:
为了简化认为气体密度服从波耳兹曼分布
相较前一种情况则需要将
角度/度 | 射程/米 |
---|---|
30 | 23656.1203 |
40 | 26180.4552 |
43 | 26512.8946 |
45 | 26611.8632 |
46.5 | 26618.7672 |
47 | 26607.9512 |
50 | 26400.5592 |
60 | 23820.2634 |
由以上的表格并且结合物理分析,射程最大的角度出现在45度和47度之间为了提高精度继续细分:
角度/度 | 射程/米 |
---|---|
45.5 | 26619.5690 |
46 | 26621.8973 |
46.5 | 26618.7672 |
45.75 | 26621.4104 |
46.25 | 26621.0196 |
46.75 | 26612.9744 |
45.8 | 26622.0541 |
45.9 | 26623.1768 |
综上所述:
最大射程的抛射角度45.90度,精确到小数点后一位。
import math
#initial value
t=[]
dt=0.01
M=1.0 #B_2/m=4*10-5 realy count
g=9.8
end_time=100
y_h=0.0001
B_2=4*10**(-5)
a=45.8/180.0*math.pi
b=45.9/180.0*math.pi
c=46.75/180.0*math.pi
theta=[a,b,c] #inital angle 30 45 60
t.append(0)
#print a,b,c
x_1=[]
v_x_1=[]
y_1=[]
v_y_1=[]
x_1.append(0)
y_1.append(0)
v_x_1.append(700*math.cos(theta[0])) #initial speed equal 700m/s
v_y_1.append(700*math.sin(theta[0]))
for i in range(int(end_time/dt)):
m=x_1[i]+v_x_1[i]*dt
x_1.append(m)
n=v_x_1[i]-(B_2*math.e**(-y_1[i]*y_h))*((v_x_1[i]**2+v_y_1[i]**2)**0.5)*v_x_1[i]*M*dt
v_x_1.append(n)
o=y_1[i]+v_y_1[i]*dt
y_1.append(o)
p=v_y_1[i]-g*dt-(B_2*math.e**(-y_1[i]*y_h))*((v_x_1[i]**2+v_y_1[i]**2)**0.5)*v_y_1[i]*M*dt
v_y_1.append(p)
# print x_1[-1],y_1[-1]
if o<=0:
if o>=-3:
print m,1
x_2=[]
v_x_2=[]
y_2=[]
v_y_2=[]
x_2.append(0)
y_2.append(0)
v_x_2.append(700.0*math.cos(theta[1])) #initial speed equal 700m/s
v_y_2.append(700.0*math.sin(theta[1]))
for i in range(int(end_time/dt)):
m=x_2[i]+v_x_2[i]*dt
x_2.append(m)
n=v_x_2[i]-(B_2*math.e**(-y_2[i]*y_h))*((v_x_2[i]**2+v_y_2[i]**2)**0.5)*v_x_2[i]*M*dt
v_x_2.append(n)
o=y_2[i]+v_y_2[i]*dt
y_2.append(o)
p=v_y_2[i]-g*dt-(B_2*math.e**(-y_2[i]*y_h))*((v_x_2[i]**2+v_y_2[i]**2)**0.5)*v_y_2[i]*M*dt
v_y_2.append(p)
# print x_2[-1],y_2[-1],
if o<=0:
if o>=-3:
print m,2
x_3=[]
v_x_3=[]
y_3=[]
v_y_3=[]
x_3.append(0)
y_3.append(0)
v_x_3.append(700.0*math.cos(theta[2])) #initial speed equal 700m/s
v_y_3.append(700.0*math.sin(theta[2]))
for i in range(int(end_time/dt)):
m=x_3[i]+v_x_3[i]*dt
x_3.append(m)
n=v_x_3[i]-(B_2*math.e**(-y_3[i]*y_h))*((v_x_3[i]**2+v_y_3[i]**2)**0.5)*v_x_3[i]*M*dt
v_x_3.append(n)
o=y_3[i]+v_y_3[i]*dt
y_3.append(o)
p=v_y_3[i]-g*dt-(B_2*math.e**(-y_3[i]*y_h))*((v_x_3[i]**2+v_y_3[i]**2)**0.5)*v_y_3[i]*M*dt
v_y_3.append(p)
# print x_3[-1],y_3[-1],
# if y_3<=0:
# print(x_3)
if o<=0:
if o>=-3:
print m,3
#draw the picture
import numpy as np
import matplotlib.pyplot as plt
plt.plot(x_1,y_1)
plt.plot(x_2,y_2)
plt.plot(x_3,y_3)
plt.ylabel(u'height/m')
plt.xlabel(u'distance/m the blue line is 43 degree the green line is 45 degree the red line is 47 degree')
plt.title(u"the trial of the cannon")
plt.show()
计算物理教材