Advertisement

Python模拟弹道轨迹

阅读量:

http://www.itongji.cn/cms/article/articledetails?articleid=5029

最近美国将萨德防御系统部署至韩国,在一时兴起的情况下就利用python语言模拟了弹道轨迹的最基本情况。这项行动旨在帮助那些刚开始学习python编程语言的人掌握数学建模技巧以及matplotlib库的动态可视化功能。

阐述了自己的政治立场:通过观看《战争之王》之类的作品可以体会其中的道理。和平对军火商人而言犹如 nightmare——一种难以逃脱的命运困境。以获取巨额军事利润为目的,在美国内部及周边地区持续煽动分裂与敌意的行为主要涉及日本、韩国、朝鲜、菲律宾等国家。其目的是通过利用这些矛盾来增加更多的军事销售。

暴力是人的本能之一。

作为美国知名的军事工业巨头,洛卡特公司年均营业收入达数十亿美元。其推出的萨德系统项目正是这一军事工业巨头的核心产物。两人通过接受军方拨款间接获得了政治偏见与影响力。这种角色与其说是公众人物与其说是军方利益的代言人与信息传播者

所以不要预想民权民自由原则下的美国总统能为世界带来和平。很多时候,在利益驱动下,美国政客与军火商不断煽动全球冲突与仇恨。

blob.png

洛克希德马丁

数学建模要用导数知识:

感谢英国数学家牛顿和德国数学家莱布尼茨所创立的导数极值求解方法。当导弹的速度降为零的瞬间,其高度达到了峰值。对于不懂这一概念的读者,请注意复习微积分知识;高中数学教材都能轻松理解其中的道理。

blob.png
blob.png

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

t_flight = 2umath.sin(theta_radians)/g

blob.png

这是代码运行的界面

blob.png

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

blob.png

生成的动态图:

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

详细阐述该函数的作用是通过FuncAnimation模块生成并集成了绘图与动态更新的动画效果的图形对象。其中 fig 用于指定绘图对象 update 用于指定动态更新的函数 generate 用于指定数据生成器 interval=5 设置为每隔5ms更新一次

动画库animation.FuncAnimation用于创建动态图像。fig是一个生成图表的对象,在generate函数生成数据后会将这些数据传递给update函数以实现图形更新的过程变化。

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

blob.png
blob.png
blob.png

代码运行平台:

Canopy python 2.7,Windows32位系统

代码汇总

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

-- coding: utf-8 --

'''

Animate the trajectory of an object in projectile motion

'''

#seaborn增强背景效果

import seaborn

from matplotlib import pyplot as plt

from matplotlib import animation

from matplotlib.font_manager import FontProperties

import math

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

def get_intervals(u, theta):

intervals = []

start = 0

interval = 0.005

while start < t_flight:

intervals.append(start)

start = start + interval

return intervals

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

def update(t):

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

y = umath.sin(theta_radians)t - 0.5gt*t

circle.center = x, y

return circle,

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

def generate():

for t in intervals:

yield t

def Print():

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 = 2umath.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 = umath.sin(theta)t_max - 0.5gt_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()

复制代码
 # -*- coding: utf-8 -*-

    
 """
    
 Created on Wed Dec 14 09:59:34 2016
    
 #轰炸萨德
    
 @author: Administrator
    
 """
    
 from mpl_toolkits.basemap import Basemap
    
 import matplotlib.pyplot as plt
    
 import numpy as np
    
 from matplotlib.font_manager import FontProperties
    
 font=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=20)
    
 # 创建一个fig对象,自定义fig的size
    
 fig = plt.figure(figsize=(60,60))
    
 # 划分fig并且选择一个子图给ax变量
    
 ax = fig.add_subplot(1,1,1)
    
 #width=2000,height=2000
    
 m = Basemap(projection='mill', llcrnrlat=30, urcrnrlat=50, llcrnrlon=90, urcrnrlon=150)
    
 m.drawcoastlines()
    
 m.drawcountries(linewidth=2)
    
 #m.drawrivers()
    
 # bjlat, bjlon are lat/lon of Bei jing北京的经纬度
    
 bjlat = 40; bjlon = 116
    
 #tokyolat,tokyolon 表示萨德部署地的经纬度
    
 THAADlat,THAADlon=36.119485,128.3445734
    
 # draw parallels
    
 m.drawparallels(np.arange(10,90,20),labels=[1,1,0,1])
    
 # draw meridians
    
 m.drawmeridians(np.arange(-180,180,30),labels=[1,1,0,1])
    
 #m.drawmapboundary(fill_color='aqua')
    
 # fill continents, set lake color same as ocean color.
    
 #m.fillcontinents(color='coral',lake_color='aqua')
    
 def Draw_position(lon,lat,city,mark,markersize=100):
    
     xpt,ypt=m(lon,lat)
    
     #convert back to lat/lon
    
     lonpt,latpt=m(xpt,ypt,inverse=True)
    
     m.plot(xpt,ypt,mark,markersize) #plot a blue dot there
    
     plt.text(xpt+100000,ypt+100000,city)
    
 #绘制萨德坐标
    
 Draw_position(128.3445734,36.119485,"THAAD",'c*',100)
    
 #绘制北京坐标
    
 Draw_position(116,40,"Beijign",'g^',100)
    
 #链接北京和萨德的路线
    
 m.drawgreatcircle(bjlon,bjlat,THAADlon,THAADlat,linewidth=2,color='b')
    
 m.etopo()
    
 #添加图例,文字说明
    
 plt.legend(loc=4)
    
 plt.title("轰炸萨德,制作人Toby!",fontproperties=font)
    
 plt.show()

全部评论 (0)

还没有任何评论哟~