【2024数模国赛赛题思路公开】国赛D题思路丨附可运行代码丨无偿自提
2024年国赛D题解题思路
问题一
【题目】
投射一枚深弹,潜艇中心位置的深度定位没有误差,两个水平坐标定位均服从正态分布。分析投弹最大命中概率与投弹落点平面坐标及定深引信引爆深度之间的关系,并给出使得投弹命中概率最大的投弹方案,及相应的最大命中概率表达式。
针对以下参数值给出最大命中概率:潜艇长 100 m,宽20 m,高 25 m,潜艇航向方位角为 90∘,深弹杀伤半径为20 m,潜艇中心位置的水平定位标准差 𝜎 = 120 m,潜艇中心位置的深度定位值为 150 m.
【题目分析】
模型构建:
- 潜艇的水平位置误差均服从正态分布 N(0,σ2),无深度误差。
- 需分析深弹的投射落点坐标和定深引信引爆深度对命中概率的影响。
- 潜艇的几何尺寸和航向角已知(潜艇长100 m,宽20 m,高25 m,航向方位角为90°)。
- 利用深弹杀伤半径(20 m)以及潜艇的形状和尺寸,通过积分计算投弹落点坐标的概率密度函数并结合杀伤判定条件(落在潜艇的不同位置及引爆深度)。
· 思路:
- 计算不同投弹落点下的命中概率。
- 最大化命中概率的投弹方案,可以通过优化投弹坐标(平面上的期望值)和引爆深度来实现。
· 计算:
- 根据给定的潜艇尺寸、航向、和误差分布,设定目标平面及其误差范围,计算积分得到命中概率的表达式。
- 使用优化方法(如拉格朗日乘数法或数值优化算法)来求解最大命中概率和最优投弹方案。
【解题思路】
1. 问题描述和建模目标
分析单枚深弹在潜艇中心深度定位没有误差的情况下,投弹的最大命中概率与投弹落点平面坐标及定深引信引爆深度之间的关系,并找出使得投弹命中概率最大的投弹方案和相应的最大命中概率表达式。
2. 坐标系和变量定义
潜艇中心在海平面上的投影为原点O
X轴正向为正东方向,Y轴正向为正南方向,Z轴正向为垂直向下。
潜艇的水平位置误差:,无深度误差。
潜艇的尺寸为100*20*25m³,航向角为90°(正东方向),杀伤半径为20m,水平定位标准差为σ=120m,深度定位值为150m。
3. 命中判定条件
深弹满足以下任意一个条件即为命中潜艇:
- 深弹落点在潜艇平面范围内,且引爆深度位于潜艇上表面的下方,由触发引信引爆。
- 深弹落点在潜艇平面范围内,且引爆深度位于潜艇上表面的上方,同时潜艇在深弹的杀伤范围内,由定深引信引爆。
- 弹落点在潜艇平面范围外,但到达引爆深度时,由定深引信引爆,且此时潜艇在深弹的杀伤范围内。
4. 命中概率模型
潜艇的水平位置X和Y坐标均服从正态分布,概率密度函数为:
为了计算命中概率,需要对投弹落点的概率进行积分。
- 命中条件 1 和 2(深弹落点在潜艇平面范围内):
潜艇在水平面上的范围为:
命中概率为:
化简为:
引爆深度Zd与潜艇上表面z=137.5m的关系:
若zd<137.5m,由触发引信引爆。
若zd>137.5m且zd-137.5m≤20m,由定深引信引爆。
结合条件:
2. 命中条件 3(深弹落点在潜艇平面范围外):
如果落点在平面范围外,则计算深弹在杀伤范围内命中的概率:
其中,潜艇中心与落点的距离,且需满足d≤20。
概率表达为
总命中概率为:
5. 智能优化算法的引入
可以使用智能优化算法(如遗传算法、粒子群优化或梯度下降)来最大化Ptotal。设定目标函数为:
- 遗传算法:将投弹坐标(x,y) 和引爆深度Zd 编码为个体,通过选择、交叉和变异操作迭代优化。
- 粒子群优化:粒子的位置表示投弹坐标和引爆深度,利用速度和位置的更新规则进行优化。
- 梯度下降:在命中概率表达式足够光滑时,通过计算梯度优化(x,y,Zd) 以最大化命中概率。
【Python参考代码】
import numpy as np
from scipy.optimize import minimize
from scipy.stats import norm
# 定义潜艇和深弹的参数
submarine_length = 100 # 潜艇长度 (m)
submarine_width = 20 # 潜艇宽度 (m)
submarine_height = 25 # 潜艇高度 (m)
submarine_depth = 150 # 潜艇中心位置的深度 (m)
sigma = 120 # 水平定位标准差 (m)
kill_radius = 20 # 深弹杀伤半径 (m)
# 潜艇上表面深度
z_top = submarine_depth - submarine_height / 2
# 水平位置概率密度函数
def horizontal_pdf(x, y, sigma):
return (1 / (2 * np.pi * sigma ** 2)) * np.exp(- (x ** 2 + y ** 2) / (2 * sigma ** 2))
# 计算命中概率
def hit_probability(throw_point, detonation_depth):
x, y = throw_point
# 计算水平命中概率
def p_in():
return (norm.cdf(submarine_length / 2, loc=x, scale=sigma) - norm.cdf(-submarine_length / 2, loc=x,
scale=sigma)) * \
(norm.cdf(submarine_width / 2, loc=y, scale=sigma) - norm.cdf(-submarine_width / 2, loc=y, scale=sigma))
# 垂直命中概率
p_z1 = norm.cdf(z_top, loc=detonation_depth, scale=0) if detonation_depth < z_top else 0
p_z2 = norm.cdf(z_top + kill_radius, loc=detonation_depth, scale=0) - norm.cdf(z_top, loc=detonation_depth,
scale=0) if z_top < detonation_depth <= z_top + kill_radius else 0
p_hit1 = p_in() * (p_z1 + p_z2)
# 外部命中概率(落点在潜艇平面范围外)
p_out = 1 - p_in()
distance = np.sqrt(x ** 2 + y ** 2 + (detonation_depth -
submarine_depth) ** 2)
p_hit2 = p_out * (1 if distance <= kill_radius else 0)
# 总命中概率
p_total = p_hit1 + p_hit2
return p_total
# 优化目标函数
def objective(params):
throw_point = params[:2]
detonation_depth = params[2]
# 我们的目标是最大化命中概率,因此这里取负值进行最小化
return -hit_probability(throw_point, detonation_depth)
# 初始猜测的投弹点 (x, y) 和引爆深度
initial_guess = [0, 0, submarine_depth]
# 进行优化,约束引爆深度为正数
result = minimize(objective, initial_guess,
bounds=[(-submarine_length, submarine_length), (-submarine_width, submarine_width), (0, None)])
# 输出结果
optimal_throw_point = result.x[:2]
optimal_detonation_depth = result.x[2]
max_hit_probability = -result.fun
print(f"Optimal Throw Point (x, y): {optimal_throw_point}")
print(f"Optimal Detonation Depth: {optimal_detonation_depth}")
print(f"Maximum Hit Probability: {max_hit_probability}")