[关闭]
@c-xy 2016-10-23T16:25:04.000000Z 字数 2028 阅读 446

第六次作业


摘要

本文讨论了考虑空气阻力以及空气阻力随海拔变化的情况下(恒温模型),进行定点射击的参数设置。一门加农炮发射时的全部参数只有初始速度(包括速度的方向,对于二维情况就是速度的横纵坐标),而目标可以用海拔跟距离两个值表示。本文解决了以下问题:只要给定目标位置,即可给出全部能击中目标的速度的组合(用一条二维曲线表示出)。

代码

  1. def accelerate(x,y,vx,vy):
  2. v=sqrt(vx*vx+vy*vy)
  3. ansax=-0.00004*v*vx
  4. ansay=-g-0.00004*v*vy
  5. return (ansax,ansay)
  6. import pylab
  7. from math import sqrt
  8. from math import cos
  9. from math import sin
  10. from math import pi
  11. from math import atan
  12. g=9.8
  13. class Euler2Dsimulation:
  14. def __init__(self,speed,theta,aimx,aimy,acc=accelerate,timestep=0.001):
  15. self._timestep=timestep
  16. self._x=[0]
  17. self._y=[0]
  18. self._vx=[speed*cos(theta)]
  19. self._vy=[speed*sin(theta)]
  20. self._aimx=aimx
  21. self._aimy=aimy
  22. self._accelerate=acc
  23. def calculate(self):#速度过小返回false
  24. while True:
  25. self._x.append(self._x[-1]+self._vx[-1]*self._timestep)
  26. self._y.append(self._y[-1]+self._vy[-1]*self._timestep)
  27. (ax,ay)=self._accelerate(self._x[-1],self._y[-1],self._vx[-1],self._vy[-1])
  28. self._vx.append(self._vx[-1]+self._timestep*ax)
  29. self._vy.append(self._vy[-1]+self._timestep*ay)
  30. if self._x[-1]>=self._aimx:
  31. return self._y[-1]-self._aimy
  32. if self._vy[-1]<=0 and self._y[-1]<=self._aimy:
  33. return -1000
  34. def plot(self):
  35. pylab.plot(self._x, self._y)
  36. pylab.xlabel('x ($m$)')
  37. pylab.ylabel('y ($m$)')
  38. def dichotomy(para1,para2,func,eps=1):
  39. temp=(para1+para2)/2
  40. ft=func(temp)
  41. while abs(ft)>eps:
  42. f1=func(para1)
  43. f2=func(para2)
  44. if f1*ft>0 :
  45. para1=temp
  46. else:
  47. para2=temp
  48. temp=(para1+para2)/2
  49. ft=func(temp)
  50. return temp
  51. max_speed=5000
  52. target=(15000,2000)
  53. min_theta=atan(target[1]/target[0])
  54. ltheta=[]
  55. lspeed=[]
  56. theta=min_theta
  57. while theta<pi/2:
  58. theta+=0.01
  59. if Euler2Dsimulation(max_speed,theta,target[0],target[1]).calculate()<0 :
  60. continue
  61. ltheta.append(theta)
  62. def func(para):
  63. return Euler2Dsimulation(para,theta,target[0],target[1]).calculate()
  64. lspeed.append(dichotomy(10,max_speed,func))
  65. lx=[]
  66. ly=[]
  67. for i in range(len(ltheta)):
  68. lx.append(lspeed[i]*cos(ltheta[i]))
  69. ly.append(lspeed[i]*sin(ltheta[i]))
  70. pylab.plot(lx,ly)
  71. pylab.show()

结果展示

在这里,我们假定目标的坐标为(15000,2000),然后给出了所有可能打到这个位置的初始发射速度。图像曲线上的每一个点都代表了一种发射速度,从而可以轻易看出我们想要的信息,比如最小发射速度等。
(这里不得不吐槽python的运行速度,我跑了三十分钟都没出结果。真!的!慢!所以不得已我将精度调的非常低,让运行时间可以接受)
速度曲线
(这幅图上点的横纵坐标代表发射速度的横纵分量,按这些速度发射即可射中目标。理应是光滑曲线,但限于精度只取了几个离散点)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注