在此次数学建模问题中,我们需要分析潜艇在三维空间中的定位误差,并计算深弹命中的概率。我们将通过详细的模型构建过程以及代码实现,来进行这一分析。
1. 模型建立
1.1 坐标系定义
首先,假设潜艇的中心位置位于坐标系的原点 O(0,0,0)O(0, 0, 0)O(0,0,0)。在水平方向上,潜艇的定位误差(X和Y方向)服从正态分布,其标准差为水平定位误差。此外,潜艇在深度方向的定位误差(Z方向)服从截尾的正态分布。我们还设定了一些基本的参数来描述潜艇的几何尺寸和误差范围。
import numpy as np
from scipy.stats import norm
# 参数设定
sub_len = 100 # 潜艇长度 (m)
sub_width = 20 # 潜艇宽度 (m)
sub_height = 25 # 潜艇高度 (m)
sub_depth = 150 # 潜艇中心深度 (m)
sigma_xy = 120 # 水平方向的定位误差 (m)
sigma_z = 40 # 深度方向的定位误差 (m)
min_depth = 120 # 潜艇的最小深度 (m)
expl_radius = 20 # 炸弹的杀伤半径 (m)
trigger_depth = sub_depth + sub_height # 触发引信的引爆深度
1.2 引爆条件
在这个模型中,我们假设深弹有两种引爆机制:
- 触发引信引爆:当深弹落在潜艇的水平平面范围内,且引爆深度低于潜艇上表面时,触发引信会引爆深弹。
- 定深引信引爆:如果深弹的引爆深度高于潜艇上表面,但潜艇仍在深弹的杀伤范围内,定深引信会引爆深弹。
2. 投弹命中概率的表达
2.1 水平方向的命中概率
潜艇在水平方向上的命中概率由潜艇的长度、宽度以及水平方向的定位误差决定。我们使用正态分布的累积分布函数来计算水平方向的命中概率。以下是计算水平命中概率的函数:
# 水平方向的命中概率函数
def horiz_hit_prob(length, width, sigma_xy):
# X方向上的命中概率,计算潜艇在长度方向被命中的概率
x_prob = norm.cdf(length / 2 / sigma_xy) - norm.cdf(-length / 2 / sigma_xy)
# Y方向上的命中概率,计算潜艇在宽度方向被命中的概率
y_prob = norm.cdf(width / 2 / sigma_xy) - norm.cdf(-width / 2 / sigma_xy)
# 水平方向总的命中概率 = X命中概率 * Y命中概率
return x_prob * y_prob
在这个函数中,我们通过分别计算X和Y方向的命中概率,最终得到水平命中概率。
2.2 垂直方向的命中概率
垂直方向的命中概率与潜艇的深度误差以及定深引信的杀伤半径相关。触发引信和定深引信的命中概率分别表示为:
- 触发引信的引爆概率:即深弹引爆深度低于潜艇上表面的概率。
- 定深引信的引爆概率:即深弹的引爆深度高于潜艇上表面但仍在潜艇杀伤半径内的概率。
以下是计算垂直命中概率的函数:
# 垂直方向的命中概率函数
def vert_hit_prob(h0, sigma_z, min_depth, height, radius):
# 计算触发引信引爆的概率,也就是深度小于潜艇上表面的情况
trigger_prob = norm.cdf(h0 + height, loc=h0, scale=sigma_z) - norm.cdf(min_depth, loc=h0, scale=sigma_z)
# 计算定深引信引爆的概率,潜艇在深弹的杀伤半径范围内时会被引爆
depth_prob = norm.cdf(h0 + height + radius, loc=h0, scale=sigma_z) - norm.cdf(h0 + height, loc=h0, scale=sigma_z)
# 单边截尾的归一化处理
norm_factor = 1 - norm.cdf(min_depth, loc=h0, scale=sigma_z)
# 返回总的垂直命中概率 = 触发引信概率 + 定深引信概率
return (trigger_prob + depth_prob) / norm_factor
这个函数首先计算触发引信的概率,再计算定深引信的概率,最后进行归一化处理。
2.3 总命中概率
总命中概率为水平方向和垂直方向命中概率的乘积。对应的计算函数如下:
# 计算总的命中概率
def total_hit_prob():
# 计算水平方向的命中概率
p_horiz = horiz_hit_prob(sub_len, sub_width, sigma_xy)
# 计算垂直方向的命中概率
p_vert = vert_hit_prob(sub_depth, sigma_z, min_depth, sub_height, expl_radius)
# 返回总命中概率 = 水平概率 * 垂直概率
return p_horiz * p_vert
3. 计算并输出结果
最后,我们调用 total_hit_prob
函数来计算总的命中概率,并输出结果:
# 运行计算并输出结果
hit_prob = total_hit_prob()
print(f"最大命中概率: {hit_prob:.4f}")
代码后续更新:
https://note.youdao.com/s/YVjtHq80