一种简单的有预测导弹拦截
- 导弹将瞄准目标的正前方
- 视频展示如下
1 dt=001
2
-
导弹实现的功能
- 导弹瞄准目标的正前方
- 导弹距离目标较远时,加速度较小
- 导弹聚集目标较近时,加速度较大,以达到命中而不至于近身擦过的问题
- 因此导弹会花很长的时间在初段追踪上,在末端的用时很短
导弹预测代码
#导弹自动追踪算法
#简单到超级的预测
import numpy as np
import matplotlib.pyplot as plt
import random
from matplotlib.animation import ArtistAnimation
class target():
def __init__(self,loca=np.array([800.,1000.]),verb=np.array([25.,35.]),acce=np.array([5.,-10.]),dn=-1):
self.loca = loca
self.verb = verb
self.acce = acce
self.dn = dn
def aim(self):
self.verb += np.array([0,0.])
self.acce += np.array([0,0.])
def run(self):
self.verb += dt * self.acce
self.loca += dt * self.verb + 0.5 * self.acce * dt**2
class missile():
global Target
global dt
def __init__(self,loca=np.array([0.,0.]),verb=np.array([0.,0.]),acce=np.array([0.,0.]),dn=-1):
self.loca = loca
self.verb = verb
self.acce = acce
self.dn = dn
def aim(self,Target):
acce_max = 4
minlim = 30
maxlim = 2000
for tar in Target:
if tar.dn == missile1.dn:
ABS = sum((self.loca-tar.loca)**2) ** 0.5
if ABS <= 1500:
acce_max *= 4
if ABS <= 1000:
acce_max *= 6.5
if ABS <= 500:
acce_max *= 8
if ABS <= 200:
acce_max *= 10
cosa,sina = (tar.loca-self.loca)/ABS
self.acce = np.array([cosa,sina])*acce_max
if sum((tar.loca - self.loca)**2) <= minlim**2:
print("strike!")
Target.remove(tar)
break
if sum((tar.loca - self.loca)**2) >= maxlim**2:
print("miss!")
break
break
def run(self):
self.verb += dt * self.acce
self.loca += dt * self.verb + 0.5 * self.acce * dt**2
def draw():
global Target
global Missile
global time
global Tx
global Ty
global Mx
global My
for i in Target:
Tx.append(i.loca[0])
Ty.append(i.loca[1])
for i in Missile:
Mx.append(i.loca[0])
My.append(i.loca[1])
plt.xlim(0,4000)
plt.ylim(0,2000)
plt.plot(Tx,Ty,linewidth=3,c="red",label="target")
plt.plot(Mx,My,linewidth=3,c="green",label="missile")
plt.legend()
plt.title(str(round(time,2)))
plt.pause(0.5)
plt.cla()
if __name__ == "__main__":
Tx = []
Ty = []
Mx = []
My = []
dt = 0.05
time = 0
target1 = target()
Target = [target1]
missile1 = missile()
Missile = [missile1]
while Target:
for i in Target:
i.aim()
i.run()
for i in Missile:
i.aim(Target)
i.run()
draw()
time += dt
- 这样的预测呢,不可能让人满意,只是记录一下我开始学着做导弹轨迹预测的问题
- 真实的情景中呢,至少还有三四个点没有考虑到
- 敌方目标的运动轨迹在大方向上是可以预测的
- 导弹打击目标
- 飞机飞行方向
- 敌方目标的运动准确轨迹也是可以预测的
- 弹道导弹在仅凭重力的运动情况下,是可以大致解算出导弹的轨迹
- 导弹击中目标并不是像我们的程序一样,导弹与目标在一定的距离内就算命中
- 这可能是日本人的防空白磷弹
- 现实中的导弹要考虑 命中部位,攻击角度等很多因素
- 敌方的目标也会机动
- 我方导弹的侦测能力是有限的
- 敌方目标的运动轨迹在大方向上是可以预测的
- 未来加油!
- 在读文献!
- 国庆间图一乐!