[关闭]
@flyboy1995 2016-10-17T14:32:13.000000Z 字数 1366 阅读 32

第五次作业


作业2.6


摘要

本次作业要求使用欧拉法研究炮弹的运动轨迹(忽略空气阻力)。


背景

题目原文:
2.6:Use the Euler method to calculate cannon shell trajectories ignoring both air drag and effect of air density (actually,ignoring the former automatically rules out the latter).Compare your results with those in Figure 2.4,and with the exact solution.


正文

忽略空气阻力时,炮弹的运动方程由牛顿第二定律可得:


可以将方程组化为一阶微分方程:

用欧拉法可以得到:




即为炮弹的运动轨迹。

代码如下:

  1. import pylab
  2. from math import cos
  3. from math import sin
  4. from math import pi
  5. class Euler2Dsimulation:
  6. def __init__(self,speed,theta,timestep=0.001):
  7. self._timestep=timestep
  8. self._x=[0]
  9. self._y=[0]
  10. self._vx=[speed*cos(theta)]
  11. self._vy=[speed*sin(theta)]
  12. self.g=9.8
  13. self.calculate()
  14. self.plot()
  15. def _accelerate(self,x,y,vx,vy):
  16. ansax=0
  17. ansay=-self.g
  18. return (ansax,ansay)
  19. def calculate(self):
  20. while self._y[-1]>=0:
  21. self._x.append(self._x[-1]+self._vx[-1]*self._timestep)
  22. self._y.append(self._y[-1]+self._vy[-1]*self._timestep)
  23. (ax,ay)=self._accelerate(self._x[-1],self._y[-1],self._vx[-1],self._vy[-1])
  24. self._vx.append(self._vx[-1]+self._timestep*ax)
  25. self._vy.append(self._vy[-1]+self._timestep*ay)
  26. def plot(self):
  27. pylab.plot(self._x, self._y)
  28. pylab.xlabel('x ($m$)')
  29. pylab.ylabel('y ($m$)')
  30. Euler2Dsimulation(700,pi/4)
  31. Euler2Dsimulation(700,pi/6)
  32. Euler2Dsimulation(700,pi/3)
  33. pylab.show()

结论

此处输入图片的描述


致谢

感谢曹昕宇同学跟我讲解。

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