2024年美国大学生数学建模竞赛(B题)|数学建模完整代码+建模过程全解全析
数字商品 教育 / 知识

2024年美国大学生数学建模竞赛(B题)|数学建模完整代码+建模过程全解全析

CS数模 · 2 · 0

商品介绍
赛中紧张进行ing,我们团队本题也完成了相应的内容!!!
我们cs数模30+团队提供了进阶版!💡 限时特价,明日涨价,机不可失!
全力精细打磨,有需要的同学们可以来下面这个链接看看:
(进阶版!)2024年美赛 (B题)| 多目标规划多算法组合独家做法,多元分析|数学建模完整代码+建模过程全解全析
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
我的解题思路是基于数学建模领域的前沿理论和实践研究,具有极强的创新性和实用性。我深入分析了各种数学建模问题,并总结出了一套行之有效的解决方案,帮助大家在竞赛中脱颖而出,或在实际情景中解决问题。我们的团队既注重理论分析,又重视实际应用。在此次美赛中,我们依据实际问题出发,结合数学建模理论进行分析,并给出可行的解决方案。通过我的解题思路,你可以快速理解各种数学建模问题,并有效地解决它们。
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
让我们来看看美赛的B题!
 
## 问题重述:
 
Maritime Cruises Mini-Submarines (MCMS)是一家位于希腊的公司,他们制造能够携带人类前往海洋最深处的潜水艇。这些潜水艇被移动到目的地并从主机船只中释放,不需要连接线。MCMS现在希望利用他们的潜水艇带领游客探索爱奥尼亚海底的沉船遗迹。然而,在他们能够这样做之前,他们需要赢得监管机构的批准,制定在与主船失去通信以及潜水艇出现机械故障(包括动力丧失)的情况下的安全程序。特别是,他们希望您开发一个模型,以预测潜水艇随时间的位置。与在陆地或海面进行典型的搜救不同,出现故障的潜水艇可能会定位在海底或水下某个中性浮力点。其位置可能会受到洋流、海水密度的差异和/或海底地形的影响。您的任务是:
 
1. 定位 - 开发一个能够预测潜水艇随时间位置的模型。
  - 这些预测存在哪些不确定性?
  - 潜水艇在事故发生前可以定期向主船发送哪些信息来减少这些不确定性?潜水艇需要什么样的设备来实现?
2. 准备 - 您是否建议公司在主船上携带其他搜索设备?您可能会考虑不同类型的设备,但必须考虑到设备的可用性、维护、准备和使用成本。如果需要,搜救船只可能需要携带什么样的额外设备来协助搜救?
3. 搜索 - 开发一个模型,该模型将使用来自您的位置模型的信息,以推荐最初的部署点和搜索模式,以最大程度地减少找到失踪潜水艇所需的时间。确定找到潜水艇的概率作为时间和累积搜索结果的函数。
4. 推演 - 您的模型如何扩展以考虑其他旅游目的地,如加勒比海?您的模型如何改变以考虑在同一大致区域移动的多个潜水艇?
 
请准备一份不超过25页的报告,提供您的计划详细信息。包括一份面向希腊政府的两页备忘录。
 
## 问题一
当建立潜水艇位置的预测模型时,我们需要考虑潜水艇的动力学、外部环境的影响以及通信限制。以下是详细的建模步骤:
 
1. 位置变化的建模:
  - 三维坐标系: 使用三维坐标系来表示潜水艇的位置。设 $x(t)$、$y(t)$、$z(t)$ 为潜水艇在时间 $t$ 的位置。
  - 位置的动力学: 使用微分方程描述潜水艇位置的动力学。这可能涉及速度和加速度,可以使用牛顿的运动方程。
  - 外部环境的影响: 考虑洋流、水密度变化和海底地形等外部因素对潜水艇位置的影响。这些因素可能导致潜水艇的漂移和深度变化。
 
 
  $\frac{dx}{dt} = v_x(t)$
  $\frac{dy}{dt} = v_y(t)$
  $\frac{dz}{dt} = v_z(t)$
 
 
  其中 $v_x(t)$、$v_y(t)$、$v_z(t)$ 分别表示潜水艇在三个方向上的速度。
 
2. 动力学模型:
  - 失去推进力: 考虑潜水艇可能失去推进力的情况。这可能是由于机械故障、燃料耗尽等原因。
  - 旋转: 如果潜水艇可以旋转,考虑旋转对其运动的影响。
 
  $\text{例如: } \frac{dv_x}{dt} = -k \cdot v_x(t)$
 
  其中 $k$ 是与失去推进力相关的参数。
 
3. 不确定性的引入:
  - 随机过程: 引入随机过程来表示外部环境的不确定性。这可以包括洋流的随机性、水密度的不确定性等。
  - 模型参数的不确定性: 考虑动力学模型中的参数不确定性。
 
 
  $\frac{dx}{dt} = f_x(x, y, z, t) + \epsilon_x(t)$
  $\frac{dy}{dt} = f_y(x, y, z, t) + \epsilon_y(t)$
  $\frac{dz}{dt} = f_z(x, y, z, t) + \epsilon_z(t)$
 
 
  其中 $\epsilon_x(t)$、$\epsilon_y(t)$、$\epsilon_z(t)$ 是表示不确定性的随机过程。
 
4. 通信模型:
  - 位置信息发送事件: 建模潜水艇何时能够发送位置信息给主船。这可能涉及到通信设备的限制、潜水深度的限制等。
  - 通信事件函数 $g(t)$: 该函数可能取决于时间、深度、或其他相关因素。
 
  $\text{例如: } g(t) = \begin{cases}
  1 & \text{如果通信事件发生} \\
  0 & \text{否则}
  \end{cases}$
 
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
# 潜水艇位置模型
def submarine_model(x, y, z, t):
   # 位置动力学模型,这里假设简单的线性运动
   dx_dt = 0.1
   dy_dt = 0.2
   dz_dt = -0.05
   
   return dx_dt, dy_dt, dz_dt
 
# 通信事件模型
def communication_event(t):
   # 简化为时间的函数,这里假设每隔一段时间发送一次位置信息
   if t % 10 == 0:
       return 1
   else:
       return 0
 
# 模拟潜水艇运动
def simulate_submarine_motion(total_time):
   time_points = np.arange(0, total_time, 1)
   positions = np.zeros((len(time_points), 3))
 
   for i, t in enumerate(time_points):
       dx_dt, dy_dt, dz_dt = submarine_model(positions[i, 0], positions[i, 1], positions[i, 2], t)
       positions[i + 1, 0] = positions[i, 0] + dx_dt
       positions[i + 1, 1] = positions[i, 1] + dy_dt
       positions[i + 1, 2] = positions[i, 2] + dz_dt
 
       # 模拟通信事件
       if communication_event(t):
           print(f"Time {t}: Sending position - x: {positions[i, 0]}, y: {positions[i, 1]}, z: {positions[i, 2]}")
 
   return time_points, positions
 
# 三维可视化
def plot_submarine_motion(time_points, positions):
   fig = plt.figure()
   ax = fig.add_subplot(111, projection='3d')
   ax.plot3D(positions[:, 0], positions[:, 1], positions[:, 2], label='Submarine Motion', linewidth=2)
   ax.scatter(positions[:, 0], positions[:, 1], positions[:, 2], color='red', marker='o', label='Communication Events')#见完整版
```
 
## 问题二
我们需要进一步考虑一些因素,包括设备的效果、搜索模式、起始点选择以及时间分布等。
 
### 1. 设备选择和性能:
 
设备性能:$P(E_i)$
 
设备成本:$C(E_i)$
 
### 2. 设备部署策略:
 
搜索模式选择:$P(M)$
 
起始点确定:$P(S)$
 
### 3. 搜索设备效果建模:
 
设备检测概率:$P(D|E_i, M)$
 
设备未检测到的概率:$P(\neg D|E_i, M) = 1 - P(D|E_i, M)$
 
### 4. 搜救时间和效果评估:
 
时间建模:$P(T)$
 
搜救成功概率:$P(R|E_i, M, T, S)$
 
$P(R|E_i, M, T, S) = P(D|E_i, M) \cdot P(S) \cdot \left(1 - \prod_{t=1}^{T} P(\neg D|E_i, M, t)\right)$
 
$P(\neg D|E_i, M, t) = \prod_{j=1}^{k} P(\neg D_j|E_i, M, t)$ (多个设备未检测到的联合概率)
 
### 5. 总体评估:
 
总体搜救成功概率:$P(R) = \sum_{i=1}^{n} P(R|E_i, M, T, S) \cdot P(E_i) \cdot P(M)$
 
```python
import random
 
# 设备性能
def device_performance(device):
   # 假设性能是随机的,实际情况需要根据实际数据或模型确定
   return random.uniform(0.5, 1.0)
 
# 设备成本
def device_cost(device):
   # 假设成本是随机的,实际情况需要根据实际数据或模型确定
   return random.uniform(1000, 5000)
 
# 设备选择和性能
devices = ["Sonar", "Camera", "Laser"]
device_probabilities = {device: device_performance(device) for device in devices}
 
# 设备部署策略
search_modes = ["Spiral", "Grid"]
search_mode_probability = {"Spiral": 0.7, "Grid": 0.3}
 
# 起始点选择
start_point_probability = 0.8
 
# 时间建模
def time_model():
   # 假设时间是随机的,实际情况需要根据实际数据或模型确定
   return random.uniform(1, 10)
 
# 设备检测概率建模
def detection_probability(device, search_mode):
   # 这里使用了随机值,实际情况需要根据实际数据或模型确定
   return device_probabilities[device] * random.uniform(0.5, 1.0)
 
# 搜救成功概率建模
def rescue_probability(device, search_mode, time, start_point):
   detection_prob = detection_probability(device, search_mode)
   # 计算多个设备未检测到的联合概率
   undetected_prob = 1.0
   for t in range(1, int(time) + 1):
       undetected_prob *= (1 - detection_probability(device, search_mode))
 
   return detection_prob * start_point_probability * (1 - undetected_prob)#见完整版
```
 
## 问题三
 
### 建模思路整合:
 
在问题三中,我们需要将搜救模型扩展到考虑其他旅游目的地以及多潜水艇在同一区域的协同搜救情况。以下是整合后的建模思路:
 
#### 1. 适应其他旅游目的地:
 
**位置变化模型:**
$P(L_{\text{new}} | L_{\text{old}}, G)$
 
*解释:* 此模型考虑了地理因素 $G$ 对潜水艇位置的影响,使模型具有适应不同旅游目的地的能力。
 
**模型调整和公式变化:**
$P(R | L, E, M, T, S)$
 
*解释:* 原有搜救模型被扩展,引入了位置信息 $L$,考虑到不同目的地可能需要调整设备性能、搜索模式等参数。
 
#### 2. 多潜水艇移动:
 
**位置变化模型(考虑速度和方向):**
$P(L_{\text{new}_i} | L_{\text{old}_i}, V_i, \Theta_i, G)$
 
*解释:* 考虑了速度 $V$、方向 $\Theta$ 和地理因素 $G$ 的情况下,描述了第 $i$ 艘潜水艇位置变化的概率。
 
**通信协同:**
$P(C_{\text{success}_i} | L_i, L_j, P_{\text{comm}})$
 
*解释:* 该公式表示在给定通信设备参数 $P_{\text{comm}}$ 的情况下,第 $i$ 艘潜水艇和其他潜水艇的协同通信成功概率。协同通信对于避免碰撞和提高搜索效率至关重要。
 
#### 3. 总体评估:
 
**多潜水艇协同搜救总体概率:**
$P(\text{总体搜救成功}) = \sum_{i=1}^{n} P(R_i | L_i, E, M, T, S) \cdot P(L_{\text{new}_i} | L_{\text{old}_i}, V_i, \Theta_i, G) \cdot P(C_{\text{success}_i} | L_i, L_j, P_{\text{comm}})$
 
*解释:* 该公式综合考虑了多艘潜水艇的搜救成功概率、位置变化概率和协同通信概率。通过对所有潜水艇的贡献进行求和,得到总体协同搜救成功的概率。
 
这一整体建模思路允许模型适应不同的旅游目的地,并考虑多潜水艇在同一区域的协同搜救情况。
 
```python
import random
 
# 适应其他旅游目的地
def position_change_probability(new_position, old_position, geography_factors):
   # 模拟位置变化概率,实际应用中需要基于实际数据或模型
   return random.uniform(0.1, 0.9)
 
# 搜救模型
def search_and_rescue_probability(location, equipment, search_mode, time, start_point):
   # 模拟搜救成功概率,实际应用中需要基于实际数据或模型
   return random.uniform(0.1, 0.9)
 
# 多潜水艇移动
def position_change_model(new_position, old_position, speed, direction, geography_factors):
   # 模拟位置变化概率,实际应用中需要基于实际数据或模型
   return random.uniform(0.1, 0.9)
 
# 通信协同
def communication_cooperation_probability(location_i, location_j, communication_params):
   # 模拟通信协同成功概率,实际应用中需要基于实际数据或模型
   return random.uniform(0.1, 0.9)
 
# 多潜水艇协同搜救总体概率
def total_rescue_probability(num_submarines, equipment, search_mode, time, start_point, communication_params):
   total_probability = 0
 
   for i in range(num_submarines):
       # 适应其他旅游目的地
       position_change_prob = position_change_probability(new_position, old_position, geography_factors)
 
       # 搜救模型
       search_rescue_prob = search_and_rescue_probability(location, equipment, search_mode, time, start_point)
 
       # 多潜水艇移动
       position_change_prob_multi_sub = position_change_model(new_position, old_position, speed, direction, geography_factors)
 
       # 通信协同
       communication_cooperation_prob = communication_cooperation_probability(location_i, location_j, communication_params)
 
       # 多潜水艇协同搜救总体概率
       total_probability += search_rescue_prob * position_change_prob_multi_sub * communication_cooperation_prob
 
   return total_probability
 
# 示例调用
num_submarines = 3
equipment = "Sonar"
search_mode = "Spiral"
time = 5
start_point = (0, 0)
communication_params = {"range": 100, "frequency": "UHF"}
geography_factors = {"depth": 500, "current_speed": 2}
 
# 填充实际数据或模型参数
new_position = (random.uniform(0, 100), random.uniform(0, 100))
old_position = (random.uniform(0, 100), random.uniform(0, 100))
speed = random.uniform(1, 5)#见完整版
```
 
## 问题四
问题四涉及如何将模型扩展以考虑其他旅游目的地(例如加勒比海),以及多个潜水艇在相同区域的情况。下面是详细的建模思路:
 
### 1. 适应其他旅游目的地:
 
#### 位置变化模型:
$P(L_{\text{new}} | L_{\text{old}}, G)$
 
**解释:** 这个公式表示在考虑地理因素 $G$ 的情况下,潜水艇从旧位置 $L_{\text{old}}$ 移动到新位置 $L_{\text{new}}$ 的概率。考虑到不同的旅游目的地可能有不同的地理特征,例如加勒比海与爱奥尼亚海,模型需要考虑不同的地理因素。
 
#### 模型调整和公式变化:
$P(R | L, E, M, T, S)$
 
**解释:** 这个公式是原有搜救模型的扩展,包括了位置信息 $L$。在不同目的地,地理环境的变化可能会影响设备性能、搜索模式等,因此模型需要相应调整。这可能包括设备对不同海域的适应性、搜索策略的调整等。
 
### 2. 多潜水艇移动:
 
#### 位置变化模型(考虑速度和方向):
$P(L_{\text{new}_i} | L_{\text{old}_i}, V_i, \Theta_i, G)$
 
**解释:** 这个公式表示在考虑速度 $V$、方向 $\Theta$ 和地理因素 $G$ 的情况下,第 $i$ 艘潜水艇从旧位置 $L_{\text{old}_i}$ 移动到新位置 $L_{\text{new}_i}$ 的概率。考虑到多艘潜水艇可能相互影响,速度和方向可能需要根据协同效应进行调整。
 
#### 通信协同:
$P(C_{\text{success}_i} | L_i, L_j, P_{\text{comm}})$
 
**解释:** 这个公式表示在给定通信设备参数 $P_{\text{comm}}$ 的情况下,第 $i$ 艘潜水艇和其他潜水艇的协同通信成功的概率。协同通信对于避免碰撞和提高搜索效率非常重要。
 
### 3. 总体评估:
 
#### 多潜水艇协同搜救总体概率:
$P(\text{总体搜救成功}) = \sum_{i=1}^{n} P(R_i | L_i, E, M, T, S) \cdot P(L_{\text{new}_i} | L_{\text{old}_i}, V_i, \Theta_i, G) \cdot P(C_{\text{success}_i} | L_i, L_j, P_{\text{comm}})$
 
**解释:** 这个公式整合了多艘潜水艇的搜救成功概率、位置变化概率和协同通信概率。通过对所有潜水艇的贡献进行求和,得到总体协同搜救成功的概率。这个概率可以帮助评估多潜水艇协同搜救的效果。
 
### 4. 适应多个潜水艇和多个目的地:
 
#### 位置变化模型(考虑多潜水艇和多个目的地):
$P(L_{\text{new}_i} | L_{\text{old}_i}, V_i, \Theta_i, G_d)$
 
**解释:** 这个公式在原有位置变化模型的基础上,考虑了不同目的地 $d$ 对潜水艇位置变化的影响。可能需要额外的参数来区分不同目的地的地理特征。
 
#### 多潜水艇协同通信:
$P(C_{\text{success}_i} | L_i, L_j, P_{\text{comm}})$
 
**解释:** 在协同通信模型中,可能需要考虑多潜水艇之间的相互作用,以及它们在不同目的地中的通信效果。
 
```python
import random
 
# 适应其他旅游目的地
def position_change_probability(new_position, old_position, geography_factors):
   # 模拟位置变化概率,实际应用中需要基于实际数据或模型
   depth_difference = abs(geography_factors["depth"] - new_position[1]) # 模拟深度差异
   current_speed = geography_factors["current_speed"] # 模拟海流速度
 
   # 模型调整:深度差异和海流速度对位置变化的影响
   probability = 0.7 - 0.005 * depth_difference + 0.01 * current_speed
   return max(0, min(1, probability)) # 保证概率在[0, 1]范围内
 
# 多潜水艇移动
def position_change_model(new_position, old_position, speed, direction, geography_factors):
   # 模拟位置变化概率,实际应用中需要基于实际数据或模型
   depth_difference = abs(geography_factors["depth"] - new_position[1]) # 模拟深度差异
   current_speed = geography_factors["current_speed"] # 模拟海流速度
 
   # 模型调整:深度差异和海流速度对位置变化的影响
   probability = 0.8 - 0.006 * depth_difference + 0.008 * current_speed
   return max(0, min(1, probability)) # 保证概率在[0, 1]范围内
 
# 通信协同
def communication_cooperation_probability(location_i, location_j, communication_params):
   # 模拟通信协同成功概率,实际应用中需要基于实际数据或模型
   distance = ((location_i[0] - location_j[0]) ** 2 + (location_i[1] - location_j[1]) ** 2) ** 0.5
 
   # 模型调整:距离对通信协同的影响
   probability = 0.9 - 0.005 * distance
   return max(0, min(1, probability)) # 保证概率在[0, 1]范围内
 
# 多潜水艇协同搜救总体概率
def total_rescue_probability(num_submarines, equipment, search_mode, time, start_point, communication_params, destination_factors):
   total_probability = 0
 
   for i in range(num_submarines):
       # 适应其他旅游目的地
       position_change_prob = position_change_probability(new_position, old_position, destination_factors)
 
       # 多潜水艇移动
       position_change_prob_multi_sub = position_change_model(new_position, old_position, speed, direction, destination_factors)
 
       # 通信协同
       communication_cooperation_prob = communication_cooperation_probability(location_i, location_j, communication_params)
 
       # 多潜水艇协同搜救总体概率
       total_probability += position_change_prob_multi_sub * communication_cooperation_prob
 
   return total_probability
 
# 示例调用
num_submarines = 3
equipment = "Sonar"
search_mode = "Spiral"
time = 5
start_point = (0, 0)
communication_params = {"range": 100, "frequency": "UHF"}
destination_factors = {"depth": 500, "current_speed": 2}
 
# 填充实际数据或模型参数
new_position = (random.uniform(0, 100), random.uniform(0, 100))
old_position = (random.uniform(0, 100), random.uniform(0, 100))#见完整版
```
**更多内容**具体可以看看我的**下方名片**!里面包含有认证杯一手资料与分析!
另外在赛中,我们也会陪大家一起解析认证杯的一些方向
关注 **CS数模** 团队,数模不迷路~

同店推荐

包含文件 · 6 · 269.9 KB

  • 01_问题二.py 1.8 KB
  • 02_美赛B题思路+代码.pdf 236.7 KB
  • 03_问题三.py 2.7 KB
  • 04_问题四.py 3.3 KB
  • 05_问题一.py 1.9 KB
  • 06_美赛B题思路+代码.docx 23.7 KB
支付金额 ¥14.80