2024长三角数学建模A题抢救落水手机
2024长三角数学建模A题完整思路+可执行代码+运行结果可视化图表https://mbd.pub/o/bread/mbd-ZpWcmJ1r这里仅仅展示部分内容,完整版在上方!
第一个问题是针对在西湖游船上掉落到西湖里的华为 Mate 60 Pro 手机,研究该手机可能的掉落范围以及最优搜索策略。
18页文档建模思路
建立坐标系:以游船为原点,建立笛卡尔坐标系,水平方向为x轴,垂直方向为y轴。
确定手机掉落位置:假设手机在掉落时具有初速度,根据抛体运动的规律,手机的掉落位置可以由以下公式计算得出:
x = v₀tcosθ
y = v₀tsinθ - 1/2gt²
其中,v₀为手机的初速度,θ为手机掉落的角度,g为重力加速度,t为手机掉落的时间。
确定手机掉落的时间:根据游船的速度和手机掉落的位置,可以计算出手机掉落的时间。假设游船的速度为v,手机掉落的位置为(x,y),则手机掉落的时间t可以由以下公式计算得出:
t = x/v
确定手机掉落的角度:手机掉落的角度θ可以由以下公式计算得出:
确定掉落范围:根据手机掉落的角度和水深,可以计算出手机掉落的水平距离和垂直距离,从而确定手机掉落的范围。假设水深为h,手机掉落的角度为θ,手机掉落的水平距离为d,垂直距离为h,则手机掉落的范围可以由以下公式计算得出:
最优搜索策略:根据手机掉落的范围,可以确定搜索的范围。最优的搜索策略应该是以游船为中心,向外以手机掉落的最大水平距离和垂直距离为半径画出一个圆,以该圆为搜索范围进行搜索。如果搜索范围内没有找到手机,则可以缩小搜索范围,以此类推,直到找到手机为止。
问题1:华为 Mate 60 Pro 手机可能的掉落范围
假设水中的掉落物品在水平方向上的运动速度为v,重力加速度为g,掉落的初始高度为h,水面高度为0,则手机掉落到水中所需的时间为t,可以用以下公式表示:
在此基础上,可以得出手机在x轴方向上的运动距离为:
根据水平面上的速度等于手机在y轴方向上的初速度,可以得出:
代入上述公式,可以得出手机在x轴方向上的运动距离为:
因此,手机掉落到水中的范围为水平方向上的2h范围内。
最优搜索策略:
根据手机掉落到水中的范围,可以采用以下搜索策略:
首先,从水平方向上的2h范围内开始搜索,即以手机掉落点为中心,以2h为半径的圆内进行搜索。
如果在该范围内未找到手机,则逐步扩大搜索范围,分别增加1h、2h、3h...直至找到手机为止。
在每个搜索范围内,可以采用网格搜索的方法,即将范围分割为若干小网格,逐个网格进行搜索,直至找到手机为止。
如果在某个范围内仍未找到手机,则可以考虑使用水下摄像头等工具进行搜索。
如果在所有范围内仍未找到手机,则可以考虑使用潜水员等专业人士进行搜索。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
# 定义西湖的水域范围为一个正方形,边长为200米
lake_size = 200
# 定义手机的尺寸为15cm*7.5cm,考虑到手机可能会旋转,将其视为一个圆形,半径为7.5cm
phone_radius = 7.5
# 定义搜索步长为1米,即每次移动1米进行搜索
step_size = 1
# 定义搜索的起始点为西湖的中心点
start_point = np.array([lake_size/2, lake_size/2])
# 定义搜索范围为正方形,边长为手机尺寸的两倍
search_range = np.array([phone_radius*2, phone_radius*2])
# 定义搜索的方向,一共有8个方向,每个方向的角度为45度
directions = [np.array([1, 0]), np.array([1, 1]), np.array([0, 1]), np.array([-1, 1]),
np.array([-1, 0]), np.array([-1, -1]), np.array([0, -1]), np.array([1, -1])]
# 定义用于存储搜索结果的列表
search_results = []
# 定义用于计算搜索范围内的点的函数
def get_points_in_range(start_point, search_range, step_size):
points = []
# 计算搜索范围内所有的点
for x in np.arange(start_point[0]-search_range[0]/2, start_point[0]+search_range[0]/2, step_size):
for y in np.arange(start_point[1]-search_range[1]/2, start_point[1]+search_range[1]/2, step_size):
points.append(np.array([x, y]))
return points
# 定义用于判断点是否在圆形范围内的函数
def is_in_circle(point, center, radius):
# 计算点与圆心的距离
distance = np.linalg.norm(point-center)
# 如果距离小于等于半径,则认为点在圆形范围内,返回True,否则返回False
if distance <= radius:
return True
else:
return False
# 对每个搜索方向进行搜索
for direction in directions:
# 获取搜索范围内的所有点
points = get_points_in_range(start_point, search_range, step_size)
# 对每个点进行判断,如果在圆形范围内,则将其添加到搜索结果中
for point in points:
if is_in_circle(point, start_point + direction, phone_radius):
search_results.append(point)
# 将搜索结果绘制在图中
plt.figure(figsize=(8, 8))
# 绘制西湖的范围
plt.plot([0, lake_size, lake_size, 0, 0], [0, 0, lake_size, lake_size, 0])
# 绘制搜索范围的边界
plt.plot([start_point[0]-search_range[0]/2, start_point[0]+search_range[0]/2, start_point[0]+search_range[0]/2, start_point[0]-search_range[0]/2, start_point[0]-search_range[0]/2],