- 作者没实现的
- 作者没能做出一个视频,都是以照片形式保存的
- 我们考虑的导弹完全没有智能,只知道开最大马力向前冲
- 我们的导弹没有预测功能
- 我们的飞机不会调整加速度
- 作者实现的
- 导弹和目标 受气动阻力f=-kv 重力 G=-mg
- 导弹只能在一定范围内追踪目标
- 导弹每隔0.3秒搜索一次目标,并确定追踪目标
- 导弹加速需要燃料,导弹的燃料有上限
- 作者相信的
- 一定可以很快完善这些问题
- 有预测拦截正在学正在学
- 好习惯,讲问题先上效果图
- 提示,你要先在同一文件夹下新建一个 0 文件夹
- 好习惯,讲问题先上源码
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import random
from matplotlib.animation import ArtistAnimation
import matplotlib
import xlsxwriter as xls
import xlrd as xl
matplotlib.rcParams["font.sans-serif"] = ["SimHei"]
matplotlib.rcParams["axes.unicode_minus"] = False
frames = []
Missile = [0 for i in range(3)]
Target = [0 for i in range(3)]
dt = 0.1
time = 0
#阻力 f = -kv
#重力 f = g
class missile():
global Target
global Missile
global get
def __init__(self,location,verb,acce,dn=-1,road=0,oil=2000,acce_max=40):
self.location = location
self.verb = verb
self.acce = acce
self.dn = dn
self.road = road
self.oil = oil
self.acce_max = acce_max
def find_target(self,Target):
scale = 100000
acce_max = self.acce_max
x = self.location[0]
y = self.location[1]
z = self.location[2]
L = [x,y,z]
if self.dn == -1:
flag = 0
for i in Target:
if (i.dn == -1)&(sum([(L[i]-self.location[i])**2 for i in range(len(L))])<scale**2):
self.dn = get
i.dn = get
flag = 1
target_dis = [-self.location[0] + i.location[0],
-self.location[1] + i.location[1],
-self.location[2] + i.location[2]]
k = sum([i**2 for i in target_dis])**0.5
target_dis = [j/k for j in target_dis]
self.acce = np.array([acce_max*i for i in target_dis])
self.acce -= np.array([0,0,9.8])
self.acce -= 0.02 * self.verb
break
if not flag:
i = random.choice(Target)
self.dn = i.dn
target_dis = [-self.location[0] + i.location[0],
-self.location[1] + i.location[1],
-self.location[2] + i.location[2]]
k = sum([i**2 for i in target_dis])**0.5
target_dis = [j/k for j in target_dis]
self.acce = np.array([acce_max*i for i in target_dis])
self.acce -= np.array([0,0,9.8])
self.acce -= 0.02 * self.verb
else:
for i in Target:
if i.dn == self.dn:
target_dis = [-self.location[0] + i.location[0],
-self.location[1] + i.location[1],
-self.location[2] + i.location[2]]
k = sum([i**2 for i in target_dis])**0.5
target_dis = [j/k for j in target_dis]
self.acce = np.array([acce_max*i for i in target_dis])
self.acce -= np.array([0,0,9.8])
self.acce -= 0.02 * self.verb
break
def self_check(self,Target):
flag = 0
for i in Target:
if i.dn == self.dn:
flag = 1
break
if not flag:
self.dn = -1
def fire(self,Target):
least_dis = 50
i = -2
for j in Target:
if j.dn == self.dn:
i = Target.index(j)
break
x = Target[i].location[0]
y = Target[i].location[1]
z = Target[i].location[2]
if (x-self.location[0])**2+\
(y-self.location[1])**2+\
(z-self.location[2])**2 <= least_dis**2:
Target.pop(i)
print("strike!")
Missile.remove(self)
def run(self):
global dt
self.location += (self.verb * dt + 0.5 * self.acce * dt**2.0)
self.verb = self.verb + dt * self.acce
def count(self):
oil_consumption = 0.1
self.oil -= oil_consumption * sum([i**2 for i in self.acce])**0.5
if self.oil <= 0:
self.acce_max = 0
print("No fuel")
class target():
def __init__(self,location,verb,acce,dn=-1):
self.location = location
self.verb = verb
self.acce = acce
self.dn = dn
def run(self):
global dt
self.location += (self.verb * dt + 0.5 * self.acce * dt**2.0)
self.verb = self.verb + dt * self.acce
self.acce -= np.array([0,0,9.8])
self.acce -= 0.02 * self.verb
def draw():
global Target
global Missile
global time
fig = plt.figure()
ax = fig.add_subplot(1,1,1,projection="3d")
Tx = [i.location[0] for i in Target]
Ty = [i.location[1] for i in Target]
Tz = [i.location[2] for i in Target]
Mx = [i.location[0] for i in Missile]
My = [i.location[1] for i in Missile]
Mz = [i.location[2] for i in Missile]
plt.title(str(time)+" "+str([round(i,2) for i in Mx]))
plt.xlabel(str([round(i,2) for i in Tx]))
ax.scatter(Tx,Ty,Tz,s=5,c="r",label="Target")
ax.scatter(Mx,My,Mz,s=5,c="b",label="Missile")
plt.pause(1)
plt.savefig("0//"+str(time)+".jpg")
plt.close()
if __name__ == "__main__":
missile1 = missile(np.array([0.,0.,0.]),np.array([0.,0.,0.]),np.array([0.,0.,0.]))
missile2 = missile(np.array([0.,0.,0.]),np.array([0.,0.,0.]),np.array([0.,0.,0.]))
missile3 = missile(np.array([0.,0.,0.]),np.array([0.,0.,0.]),np.array([0.,0.,0.]))
missile4 = missile(np.array([0.,0.,0.]),np.array([0.,0.,0.]),np.array([0.,0.,0.]))
missile5 = missile(np.array([0.,0.,0.]),np.array([0.,0.,0.]),np.array([0.,0.,0.]))
missile6 = missile(np.array([0.,0.,0.]),np.array([0.,0.,0.]),np.array([0.,0.,0.]))
Missile = [missile1,missile2,missile3,missile4,missile5,missile6]
#Missile = [missile1,missile2,missile3]
target1 = target(np.array([500.,100.,200.]),np.array([30.,-1.,1.]),np.array([10.,5.,3.]))
target2 = target(np.array([200.,100.,100.]),np.array([20.,-2.,-1.]),np.array([7.,10.,1.]))
target3 = target(np.array([100.,500.,200.]),np.array([10.,-3.,0.]),np.array([2.,2.,12.]))
Target = [target1,target2,target3]
time1 = 0
get = 0
while Target and (time < 200):
for m in Missile:
get += 1
if not (time1%3):
m.self_check(Target)
m.find_target(Target)
m.count()
m.run()
m.fire(Target)
for t in Target:
t.run()
draw()
time += dt
time1 += 1
- 主要用到的编码思想也就是一个面向对象的编程
- 主要用的库是 Numpy
- 为什么用Numpy呢?
- 操作很简单,相同位置的可以直接相加
- 对于大量数据算得更快
- 为什么用Numpy呢?
- 警告
- 你应该调整飞机或者导弹的飞行参数来使得更快得拦截
- 参数解释
self.location = location
self.verb = verb
self.acce = acce
- location是一个一维三项的array数组,数组的类型应该被设定为float
- verb acce 同上
- scale 导弹扫描范围
scale = 100000
- oil 和 acce_max 油量和导弹最大加速度
- oil_consumption 油耗 油耗量/加速度