铛铛!小秘籍来咯!
小秘籍希望大家都能轻松建模呀,国赛也会持续给大家放松思路滴~
抓紧小秘籍,我们出发吧~
让我们来看看国赛的B题!
问题1要建立多波束测深的覆盖宽度及相邻条带之间的重叠率的数学模型,下面详细描述具体的建模思路和计算步骤。
首先,我们已经知道多波束测深的覆盖宽度可以表示为:
其中,
- :覆盖宽度,单位为米。
- :海水深度,单位为米。
- :多波束换能器的开角,单位为度。
接下来,我们需要计算相邻条带之间的重叠率,它可以表示为:
其中,
- :重叠率,以百分比表示。
- :相邻两条测线的间距,单位为米。
要计算问题1中表1中所列位置的指标值,我们需要知道海水深度、多波束换能器的开角、以及相邻两条测线的间距。这些参数需要根据问题中给定的条件来确定。
具体计算步骤如下:
1. 根据问题中给定的海水深度(70米)、多波束换能器的开角(120度)和相邻测线的间距(从表1中读取),使用上述公式计算覆盖宽度和相邻条带之间的重叠率。
2. 将计算得到的覆盖宽度和重叠率填入表1中相应的位置。
3. 重复步骤1和步骤2,直到计算完所有表1中列出的位置。
4. 将结果整理成表格格式,将其放在正文中,并保存到result1.xlsx文件中。
import pandas as pd
import math
from openpyxl import Workbook
# 定义计算覆盖宽度的函数
def calculate_coverage_width(D, theta):
return 2 * D * math.tan(math.radians(theta / 2))
# 读取表1中的数据,这里使用一个示例数据,你可以根据实际情况替换成你的数据
data = {
'测线距中心点处的距离/m': [-800, -600, -400, -200, 0, 200, 400, 600, 800],
'海水深度/m': [70, 70, 70, 70, 70, 70, 70, 70, 70]
}
df = pd.DataFrame(data)
# 多波束换能器的开角
theta = 120
# 计算覆盖宽度并添加到DataFrame中#见完整版
问题2要建立多波束测深的覆盖宽度的数学模型,考虑一个矩形待测海域,其中测线方向与海底坡面的法向在水平面上投影的夹角为(单位:度),多波束换能器的开角为(单位:度),坡度为(单位:度),海域中心点处的海水深度为(单位:米),测量船距海域中心点处的距离为(单位:海里)。
覆盖宽度可以表示为:
W=2D⋅tan(2θ)⋅cos(α)⋅sec(β)
其中,
这个公式考虑了多个因素,包括海水深度、多波束换能器的开角、坡度以及测线方向夹角。覆盖宽度W表示了每条测线在海底上所覆盖的宽度。
解题思路:
根据问题描述,首先要确定问题中给定的参数,包括海水深度、多波束换能器的开角、坡度、测线方向夹角以及测量船距离海域中心点的距离。
使用上述给出的公式计算覆盖宽度W。将这个公式应用于问题2中所列的不同位置,计算每个位置的覆盖宽度。
将计算得到的覆盖宽度整理成表格的形式,包括测量船距离海域中心点的距离和测线方向夹角。
将结果保存到Excel文件或其他合适的格式中,以便进一步分析或报告。
这个数学模型考虑了海水深度、多波束换能器的参数以及测线方向夹角,可以用于计算问题2中不同位置的多波束测深的覆盖宽度。
要设计一组测量长度最短、可完全覆盖整个待测海域的测线,且相邻条带之间的重叠率满足10%~20%的要求,可以采用以下步骤:
1. 确定海域的尺寸和参数:
- 海域南北长:2海里
- 海域东西宽:4海里
- 海水深度:110米
- 坡度:1.5°
- 多波束换能器的开角:120°
2. 计算单条测线的覆盖宽度W:
使用之前给出的覆盖宽度公式:
其中,D为海水深度,θ为多波束换能器的开角,α为坡度,β为测线方向夹角。
3. 计算需要的测线数量:
由于海域的东西宽度为4海里,而单条测线的覆盖宽度为W,所以需要的测线数量可表示为:
4. 确定测线间距d:
- 为满足10%~20%的重叠率要求,测线间距d可以计算为:
- 计算出d后,将测线平均分布在海域的东西宽度上,确保完全覆盖整个待测海域。
5. 计算总测线长度L:
总测线长度L等于单条测线的长度乘以测线的数量N。
下面是问题3的具体计算过程:
- 海域南北长:2海里 = 3704米
- 海域东西宽:4海里 = 7408米
- 海水深度:110米
- 坡度:1.5°
- 多波束换能器的开角:120°
计算单条测线的覆盖宽度W:
计算需要的测线数量N:
确定测线间距d,确保10%~20%的重叠率:
计算总测线长度L:
import math
# 定义计算覆盖宽度的函数
def calculate_coverage_width(D, theta, alpha, beta):
return 2 * D * math.tan(math.radians(theta / 2)) * math.cos(math.radians(alpha)) / math.cos(math.radians(beta))
# 海域尺寸和参数
sea_width = 4 * 1852 # 4海里转换成米
sea_length = 2 * 1852 # 2海里转换成米
sea_depth = 110 # 米
slope = 1.5 # 坡度,度
beam_angle = 120 # 多波束换能器开角,度
# 初始化参数
beta = 0 # 测线方向夹角,初始为0度
min_overlap = 10 / 100 # 10%的最小重叠率
max_overlap = 20 / 100 # 20%的最大重叠率
# 初始化结果
best_N = None
best_d = None
best_L = float('inf') # 初始的总测线长度设置为无穷大
# 循环尝试不同的测线数量N和测线间距d的组合#见完整版代码
代码思路:
我们首先导入了必要的数学库(math)。
定义了一个计算覆盖宽度的函数calculate_coverage_width
,该函数接受海水深度(D)、多波束换能器的开角(theta)、坡度(alpha)和测线方向夹角(beta)作为输入,然后使用之前讨论的覆盖宽度公式计算覆盖宽度W。
指定了海域的尺寸和参数,包括海域的宽度、长度、海水深度、坡度和多波束换能器的开角。
初始化了一些参数,包括测线方向夹角beta
、最小重叠率min_overlap
和最大重叠率max_overlap
。
初始化了结果变量,包括最优测线数量best_N
、最优测线间距best_d
以及初始的总测线长度best_L
,将best_L
设置为无穷大,以确保它在后续的比较中能够被替代。
使用一个循环来尝试不同的测线数量N,从1到100。这是一个假设的范围,你可以根据实际情况调整。
在循环中,首先计算单条测线的覆盖宽度W。
然后计算测线间距d,将海域宽度分成N段。
计算总测线长度L,即N乘以测线间距d。
检查是否满足重叠率要求,计算重叠率并检查是否在最小和最大重叠率范围内。
如果满足要求且总测线长度更短,则更新最优结果。
最后,输出最优的测线数量N、最优的测线间距d以及总测线长度L。
完整代码看看小秘籍的回答哦
如何评价2023年数学建模国赛B题? - 知乎