Python模拟弹道轨迹
http://www.itongji.cn/cms/article/articledetails?articleid=5029
最近美国将萨德防御系统部署至韩国,在一时兴起的情况下就利用python语言模拟了弹道轨迹的最基本情况。这项行动旨在帮助那些刚开始学习python编程语言的人掌握数学建模技巧以及matplotlib库的动态可视化功能。
阐述了自己的政治立场:通过观看《战争之王》之类的作品可以体会其中的道理。和平对军火商人而言犹如 nightmare——一种难以逃脱的命运困境。以获取巨额军事利润为目的,在美国内部及周边地区持续煽动分裂与敌意的行为主要涉及日本、韩国、朝鲜、菲律宾等国家。其目的是通过利用这些矛盾来增加更多的军事销售。
暴力是人的本能之一。
作为美国知名的军事工业巨头,洛卡特公司年均营业收入达数十亿美元。其推出的萨德系统项目正是这一军事工业巨头的核心产物。两人通过接受军方拨款间接获得了政治偏见与影响力。这种角色与其说是公众人物与其说是军方利益的代言人与信息传播者
所以不要预想民权民自由原则下的美国总统能为世界带来和平。很多时候,在利益驱动下,美国政客与军火商不断煽动全球冲突与仇恨。

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


Python导入math模块,表示飞行时间t_flight:
t_flight = 2umath.sin(theta_radians)/g

这是代码运行的界面

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

生成的动态图:
生成动态图需要导入matplotlib模块。
详细阐述该函数的作用是通过FuncAnimation模块生成并集成了绘图与动态更新的动画效果的图形对象。其中 fig 用于指定绘图对象 update 用于指定动态更新的函数 generate 用于指定数据生成器 interval=5 设置为每隔5ms更新一次
动画库animation.FuncAnimation用于创建动态图像。fig是一个生成图表的对象,在generate函数生成数据后会将这些数据传递给update函数以实现图形更新的过程变化。
interval表示时间间隔,设置的值越小,运动速度越快。



代码运行平台:
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()
