甲舰位于坐标(0, 0)处,向位于x轴上的点A(x0, 0)处的乙舰发射导弹,导弹始终对准乙舰,如果乙舰以最大的速度v0(v0是常数)沿平行于y轴的直线行驶,导弹的速度为αv0。根据已给数据可知:α=7.834872,xo=12.99078.
如果导弹沿运行轨迹到坐标为x1=0.5x0=6.49539时,乙舰才发现甲舰追踪自己,此时乙舰加速,以速度为2v0前进,导弹速度不变,假定v0=1, 问导弹是否能击中乙舰?如能击中,导弹将在何时何地击中乙舰?
代码如下,望采纳
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
# 常数值定义
x0 = 12.99078
v0 = 1
a = 7.834872
alpha = a * v0
# 定义微分方程组
def missile(y, t, x0, alpha):
"""
导弹模型微分方程组
:param y: 状态向量
:param t: 时间参数(未用到)
:param x0: 乙舰距离原点的水平距离
:param alpha: 导弹速度与乙舰速度的比
"""
x, y, vx, vy = y
# 计算导弹速度大小和方向
v = np.sqrt(vx**2 + vy**2)
theta = np.arctan2(vy, vx)
# 计算乙舰的坐标
xt = x + x0
yt = 0
# 计算两点之间的方向角和距离
beta = np.arctan2(yt - y, xt - x)
d = np.sqrt((xt - x)**2 + (yt - y)**2)
# 计算受力(保证导弹对准乙舰)
F = alpha * v * np.sin(beta - theta)
# 计算导弹的加速度
ax = F * np.cos(theta)
ay = F * np.sin(theta)
# 返回状态向量的一阶导数
return [vx, vy, ax, ay]
# 运行ODE求解器求解微分方程
# 初始状态:x=0, y=0, vx=v0*alpha, vy=0
y0 = [0, 0, v0 * alpha, 0]
t = np.linspace(0, 10, 10000)
sol = odeint(missile, y0, t, args=(x0, alpha))
# 将坐标系平移,元素1加上x0
xt = sol[:, 0] + x0
yt = sol[:, 1]
# 绘制导弹轨迹
plt.plot(xt, yt)
plt.xlabel('水平距离')
plt.ylabel('高度')
plt.title('导弹追踪问题')
# 查找乙舰发现时刻索引
index = np.where(xt >= 6.49539)[0][0]
# 添加乙舰加速后的模拟
v0_2 = 2 * v0 # 加速后的速度
sol2 = odeint(missile, sol[index], t[index:], args=(x0, alpha))
xt2 = sol2[:, 0] + x0
yt2 = sol2[:, 1]
# 绘制乙舰加速后的轨迹
plt.plot(xt2, yt2)
# 查找导弹击中的时刻和坐标
index2 = np.where(yt2 <= 0.001)[0][0]
xt_hit = xt2[index2]
yt_hit = yt2[index2]
# 绘制击中乙舰的位置
plt.plot(xt_hit, yt_hit, 'ro')
plt.text(xt_hit, yt_hit, '击中', ha='center', va='bottom')
plt.show()
# 输出结果
print('导弹是否能够击中乙舰:', yt_hit <= 0)
print('导弹击中乙舰的时间:', t[index+index2])
print('导弹击中乙舰的位置: ({0}, {1})'.format(xt_hit, yt_hit))