专栏首页顶级程序员用Python模拟弹道轨迹

用Python模拟弹道轨迹

转自:中国统计网(小编微信:itongjilove) ‍作者:Toby:python数据科学爱好者。国内最大药品数据中心任职,二十多个数据库负责人。

最近美国把萨德系统部署到韩国,一时心血来潮就用python模拟最简单的弹道轨迹。希望能帮助各位初学者学习python数学建模和matplotlib动态可视化模拟。

发表一下政治观点:看了战争之王的朋友可以理解,和平是军火商的噩梦。为了赚取高额军火利润,美国军火商要不停制造全球仇恨和紧张。美国在亚太不停挑拨离间各个中,日,韩,朝鲜,菲律宾,制造仇恨和冲突。这是为了能借机卖更多军火给这些国家。

暴力是人的本能之一。

洛克希德马丁公司是美国知名军火商,利润每年上百亿。萨德系统就是洛克希德马丁的产品。奥巴马和特朗普收了军火商的政治贿金,美国总统只不过是军火商的头号代理商和宣传工具。

所以不要期待民主自由的美国总统给世界带来和平,很多时候,为了赚钱,美国政客和军火商要不停制造全球冲突和仇恨。

(洛克希德马丁)

切入正题,谈谈科学。。。。。。。

数学建模要用导数知识:

感谢英国大神牛顿和德国大神莱布尼茨的导数求最值方法,当导弹的瞬时速度为0时,导弹高度达到最高值(峰值),看不懂的可以去补补微积分知识,高中课本就能看懂。

Python导入math模块,表示飞行时间t_flight:

t_flight =2*u*math.sin(theta_radians)/g

这是代码运行的界面

运行后可以观察弹道数据,设置不同发射速度和角度可以得到不同结果。

生成的动态图:

生成动态图需要导入matplotlib模块。

说明此语句意思animation.FuncAnimation(fig, update,generate,interval=5)

animation.FuncAnimation函数用于生成动态图片。fig是生成的图表对象,generate函数生成数据后传递给update函数更新,这样数据不断更新,图形也不停变化。

interval表示时间间隔,设置的值越小,运动速度越快。

代码运行平台:

Canopy python 2.7,Windows32位系统

代码汇总

源代码添加详细注解,方便各位朋友阅读理解

#-*- coding: utf-8 -*-

'''

Animatethe trajectory of an object in projectile motion

'''

#seaborn增强背景效果

importseaborn

frommatplotlib import pyplot as plt

frommatplotlib import animation

frommatplotlib.font_manager import FontProperties

importmath

g= 9.8

fig= plt.figure()

ax=fig.add_subplot(111)

ax.set_aspect('equal')

#中文字体路径 设置

font=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=14)

#获取一个列表,有205个间隔数据,每个数据间隔0.005

defget_intervals(u, theta):

intervals = []

start = 0

interval = 0.005

while start < t_flight:

intervals.append(start)

start = start + interval

return intervals

#更新时间间隔参数,从而不断改变圆的圆心坐标位置,让其移动

defupdate(t):

x = u*math.cos(theta_radians)*t

y = u*math.sin(theta_radians)*t - 0.5*g*t*t

circle.center = x, y

return circle,

#产生时间间隔参数,(从0,0.005,0.01一直到1.02 )依次传递给updata函数

defgenerate():

for t in intervals:

yield t

defPrint():

print u"初始速度(米/秒):",u

print u"发射角度(度)",theta

print u"飞行总时间(秒)",t_flight

print u"飞行距离(米)",xmax

#初始参数,u为初始速度,theta为发射角度

u= 30

theta=60

#返回一个角度的弧度值

theta_radians= math.radians(theta)

'''

Out[65]:0.5235987755982988

'''

#导弹飞行总时间,运用导数知识可以求得公式

t_flight= 2*u*math.sin(theta_radians)/g

intervals= get_intervals(u, theta_radians)

'''

[0,

0.005,

0.01,

0.015,

0.02,

0.025,

0.10500000000000002,

0.11000000000000003,

0.11500000000000003,

.......

0.9900000000000008,

0.9950000000000008,

1.0000000000000007,

1.0050000000000006,

1.0100000000000005,

1.0150000000000003,

1.0200000000000002]

len(intervals)

Out[67]:205

'''

xmin= 0

#x横轴最大距离

xmax= u*math.cos(theta_radians)*intervals[-1]

ymin= 0

t_max= u*math.sin(theta_radians)/g

#y横轴最大距离

#ymax= u*math.sin(theta)*t_max - 0.5*g*t_max**2

ymax=xmax

#设置坐标轴的x,y取值范围

ax= plt.axes(xlim=(xmin, xmax), ylim=(ymin, ymax))

#创建一个圆,圆点在(0,0),半径为0.2

circle= plt.Circle((xmin, ymin), 2)

ax.add_patch(circle)

#动画函数,让炮弹不断变化,generate产生数据传递给update更新

anim= animation.FuncAnimation(fig, update,generate,interval=5)

plt.title(u'导弹发射轨迹',fontproperties=font)

plt.xlabel(u'水平距离(米)',fontproperties=font)

plt.ylabel(u'导弹运行高度(米)',fontproperties=font)

plt.show()

#输出详细参数信息

Print()

End.

—————END—————

看完本文有意思?请分享给更多人

小伙伴们,你怎么看!

本文分享自微信公众号 - 顶级程序员(TopCoding),作者:Toby

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 马化腾成全球华人首富——2018胡润全球富豪榜出炉

    源 \ 21世纪经济报道 导读:昨天(2月28日),胡润研究院发布《2018胡润全球富豪榜》,世界首富和中国首富均易主! 其中,亚马逊创始人杰夫·贝佐斯以775...

    顶级程序员
  • 记一次惊心的网站TCP队列问题排查经历

    此时问题已经影响到整个网站的正常业务,我的那个心惊的呀,最主要报警系统没有任何报警,服务运行一切正常,瞬时背上的汗已经出来了。但还是要静心,来仔细寻找蛛丝马迹,...

    顶级程序员
  • 还有哪些类似0.99999…=1有趣的事实?

    来自:几用来包的回答 - 知乎 链接:https://www.zhihu.com/question/37118994/answer/70677255(点击尾部...

    顶级程序员
  • 手机备忘录误删了怎么恢复?简单一键恢复

      手机备忘录误删了怎么恢复?对于一些刚接触苹果手机的用户来讲,操作手机并不是那么方便,所以就会有一些误操作导致手机中的数据被删除,当我们手机中的备忘录删除了很...

    科技第六人
  • 手机备忘录删除了怎么恢复?你值得拥有的方法

      手机备忘录删除了怎么恢复?苹果手机上的备忘录删除了怎么恢复?很多小伙伴最近都遇到过这样的问题,记录在手机里面的备忘录突然不见了,又感觉是被自己删除了,可是就...

    科技第六人
  • 数据可视化-Matplotlib生成堆栈图

    今天我们将学习如何在Matplotlib中创建堆栈图。有时这些被称为区域图表。这些与饼图类似,但它们不是在一个瞬间显示比例,而是随着时间的推移显示“整体的部分”...

    亚乐记
  • 自动化测试解决了什么问题

    为了解自动化测试的当前和未来状态,我们采访了14位非常熟悉自动化测试的IT专业人员。我们问他们:“通过自动化测试解决了哪些现实问题?”

    FunTester
  • 反反爬虫系列(二)

    我之前的一篇文章大概讲到过如何批量撸这个网站的数据,先吐槽下南京车300,目前我所在的公司的母公司。进入估价页面,显示浏览器指纹验证,再是拖滑块,然后文字点击。...

    小歪
  • 女皇武则天:我不愿被 extends

    利用继承,我们可以基于已存在的类构造一个新类。继承的好处在于,子类可以复用父类的非 private 的方法和非 private 成员变量。

    沉默王二
  • LeetCode-6 Z字形变换

    今天我们学习第6题Z字形变换,这是一个字符串的中等题,像这样字符串的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我们看...

    用户3470542

扫码关注云+社区

领取腾讯云代金券