天天看點

Python模拟彈道軌迹

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

最近美國把薩德系統部署到南韓,一時心血來潮就用python模拟最簡單的彈道軌迹。希望能幫助各位初學者學習python數學模組化和matplotlib動态可視化模拟。

發表一下政治觀點:看了戰争之王的朋友可以了解,和平是軍火商的噩夢。為了賺取高額軍火利潤,美國軍火商要不停制造全球仇恨和緊張。美國在亞太不停挑撥離間各個中,日,韓,北韓,菲律賓,制造仇恨和沖突。這是為了能借機賣更多軍火給這些國家。

暴力是人的本能之一。

洛克希德馬丁公司是美國知名軍火商,利潤每年上百億。薩德系統就是洛克希德馬丁的産品。奧巴馬和特朗普收了軍火商的政治賄金,美國總統隻不過是軍火商的頭号代理商和宣傳工具。

是以不要期待民主自由的美國總統給世界帶來和平,很多時候,為了賺錢,美國政客和軍火商要不停制造全球沖突和仇恨。

Python模拟彈道軌迹

洛克希德馬丁

數學模組化要用導數知識:

感謝英國大神牛頓和德國大神萊布尼茨的導數求最值方法,當飛彈的瞬時速度為0時,飛彈高度達到最高值(峰值),看不懂的可以去補補微積分知識,高中課本就能看懂。

Python模拟彈道軌迹
Python模拟彈道軌迹

Python導入math子產品,表示飛行時間t_flight:

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

Python模拟彈道軌迹

這是代碼運作的界面

Python模拟彈道軌迹

運作後可以觀察彈道資料,設定不同發射速度和角度可以得到不同結果。

Python模拟彈道軌迹

生成的動态圖:

生成動态圖需要導入matplotlib子產品。

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

animation.FuncAnimation函數用于生成動态圖檔。fig是生成的圖表對象,generate函數生成資料後傳遞給update函數更新,這樣資料不斷更新,圖形也不停變化。

interval表示時間間隔,設定的值越小,運動速度越快。

Python模拟彈道軌迹
Python模拟彈道軌迹
Python模拟彈道軌迹

代碼運作平台:

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 = 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函數    

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 = 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()

Python模拟彈道軌迹
# -*- 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()