2023年高教杯国赛B题-多波束测深系统的条带覆盖宽度及重叠率分析(个人文章,附代码,仅供参考)

摘要

本研究针对多波束测深技术在复杂海底地形中的应用进行了深入的分析与建模, 通过几何分析、向量分析、动态规划及粒子群优化等多种数学与优化方法,解决了 测线间距、测线方向、测线布局等关键问题。

针对问题一,建立基于几何分析和三角函数的数学模型,用于研究多波束测深 技术在不同测线间距和海底坡度条件下的覆盖宽度和重叠率。通过推导出覆盖宽度 和重叠率的计算公式,并利用Python对这些公式进行数值求解,我们进行了灵敏度 分析,以找出不同测线间距下的最优重叠率。最终,得出了确保测量精度的最优测 线间距配置如表1所示并保存到result1.xlsx文件中。

针对问题二,采用向量分析与几何建模相结合的方法,建立了测线方向与海底 坡面法向夹角对覆盖宽度影响的三维模型。通过构建一个三维坐标系,并结合向量 点积与叉积的计算,推导出了测线方向变化对海水深度和覆盖宽度的具体影响公式。 使用Python编程进行数值模拟,我们系统地分析了不同测线方向对覆盖宽度的影响, 确定了在复杂地形条件下实现最优测量效果的最优测线方向,最终求得不同条件下 的覆盖宽度并保存到result2.xlsx文件中。

针对问题三,构建一个基于动态规划的覆盖效率优化模型。该模型旨在通过最 小化测线总长度来优化测线布局,同时确保海域的全面覆盖和恒定的重叠率。在模 型建立过程中,我们定义了关键变量,如测线位置、覆盖宽度和测线间距,并通过动 态规划算法递推计算出每条测线的最优位置。最后,得到了测线分布最优解,以及 相应的总长度137048m。

针对问题四,结合粒子群优化算法(PSO),设计了一个多波束测量船的测线布 局模型,以优化测线总长度并控制重叠率。在该模型中,我们首先对测量区域的地 形进行建模,并结合已有的单波束测深数据,通过粒子群优化算法不断调整测线位 置和方向,最终得到了最优的测线布局方案。通过对漏测区域比例和重叠率超限部 分长度的计算与分析,模型成功实现了在复杂地形条件下的测线布局优化,不仅有 效减少了测线总长度,还提高了覆盖率和测量精度,将最终结果保存在表3中。

关键词:多波束探测,动态规划,粒子群优化

一、问题背景与重述

问题背景:(这还要我写???)

问题重述:

问题一: 多波束测深技术的测量精度和效率在很大程度上依赖于测线间的覆盖 宽度及重叠率。海底坡度的存在会导致覆盖宽度和重叠率的变化,进而影响测量结 果的完整性和精确性。因此,需建立数学模型,分析不同测线距离和海底坡度条件 下的覆盖宽度和重叠率。

问题二: 测线方向与海底坡面的法向夹角会影响多波束测深系统的覆盖宽度, 不同的测线方向会导致测量效果的差异。因此,有必要建立一个考虑测线方向影响 的数学模型,通过分析测线方向与覆盖宽度之间的关系,计算不同方向下的覆盖效 果。

问题三: 在特定的海域内,设计测线方案时需在满足重叠率要求的前提下,尽 量减少测线总长度。这要求通过优化模型,在确保测量海域全面覆盖的同时,实现 测线长度最短。

问题四: 基于已有的单波束测深数据,设计多波束测量船的测线布局,以满足 覆盖率和重叠率的要求,同时最小化测线总长度,并计算漏测区域的比例和重叠率 超限部分的长度。

问题一的分析

在问题一中,采用了几何分析法和三角函数模型来分析多波束测深技术在不同 测线距离和海底坡度条件下的覆盖宽度和重叠率。具体来说,通过建立基于海底坡 度和测线间距的几何模型,推导出覆盖宽度和重叠率的计算公式。接下来,我们使 用Python对这些公式进行数值求解,从而得到不同条件下的覆盖宽度和重叠率。通 过对比不同测线距离下的重叠率,找出最优的测线间距,以确保测量的完整性和效 率。

问题二的分析

问题二采用了向量分析和几何建模相结合的方法来探讨测线方向与海底坡面法 向之间的夹角对覆盖宽度的影响。我们首先通过建立三维坐标系和向量模型,计算 测线方向与海底坡面之间的夹角,进而推导出覆盖宽度的计算公式。通过Python编 程,我们对不同测线方向下的覆盖宽度进行了数值模拟,并根据结果分析最优的测 线方向,以实现测量效果的最优化。

问题三的分析

问题三的分析中,采用动态规划方法和覆盖效率模型来优化特定海域内的测线 布局。模型首先定义了覆盖效率这一关键指标,计算测线覆盖宽度与测线方向的关 系,并利用动态规划算法最小化测线总长度。在求解过程中,我们使用Python编程, 递推计算每条测线的位置和距离,最终获得在确保覆盖率的前提下,测线总长度最 短的优化方案。

问题四的分析

在问题四中,结合粒子群优化算法(PSO)和现有的单波束测深数据,设计了一 个多波束测量船的测线布局模型。首先对测量区域进行建模,然后通过粒子群优化 算法对测线布局进行优化,目标是最小化测线总长度,控制重叠率,并计算漏测区 域的比例。在模型求解中,使用Python实现算法,最终得到满足要求的最优测线布局方案。

三、模型假设

①假设海底地形可以近似为连续的平面,并且在测线范围内,海底坡度保持不 变。

②假设多波束测深系统的测量精度不受海水的声速变化、船体姿态变化等因素 的影响。

③假设测量船在航行过程中保持匀速,且航线能够严格按照设计的测线方向进 行。

④假设在优化测线布局时,测量区域的边界条件已知,并且测量船能够完全覆 盖整个海域。

⑤假设海底地形的变化仅在测线的垂直方向上显著,横向上的变化可忽略不计, 从而使得垂直方向上的深度变化对模型的影响最为显著。

⑥假设在模型求解过程中,所有的数学计算均为无误差计算,且所有变量为确 定性变量,不考虑随机性因素的干扰。

⑦假设在模型中,海水深度在测线范围内是连续变化的,不存在突变或断层的 情况。

四、符号说明

符号说明

W 测线覆盖宽度

D0 海域中心点处的海水深度

Di 测线处的海水深度

α 海底坡度,即海底坡面与水平面的倾斜角度

θ 多波束换能器的开角 β 测线方向与x轴的夹角

γ 测线平面与海底坡面之间的夹角

η 测线重叠率

xi 第i条测线的位置

d 测线之间的水平距离

v (k) i,d 第k次迭代中粒子i在维度d上的速度

x (k) i,d 第k次迭代中粒子i在维度d上的位置

Ltotal 测线总长

五、模型的建立与求解

问题一模型的建立与求解

模型的建立

在多波束测深系统中,研究测线之间的覆盖宽度和重叠率是确保测量精度和效 率的关键。综合考虑海底坡度、测线方向、海水深度等因素,根据三角函数和正弦定 理来建立相应的几何模型。

覆盖宽度Wi是多波束系统在海底所形成的测量条带的宽度。覆盖宽度可以通过 利用正弦定理计算。将整个覆盖宽度分为左右两个部分,分别计算:

最终的覆盖宽度为左右部分之和:


Step1:初始化参数 设定海底坡度α = 1.5o.、初始海水深度D0 = 70、测线间的水平距离d = 200、多 波束换能器开角θ等。

Step2:计算海水深度与覆盖宽度 根据前述公式计算不同测线处的海水深度Di。使用正弦定理计算每个测线处的 覆盖宽度Wi。 5

Step3:重叠率的计算 对于相邻的测线,计算其重叠率ηi。通过比较重叠率的大小,可以判断是否存在 漏测或者过度重叠的情况。

Step4:数值求解与结果分析 使用Python,对不同测线位置进行数值求解,得到覆盖宽度和重叠率的具体数 值。根据不同深度和测线间距的设置,输出结果表格如下表所示。

Step5:灵敏度分析 改变测量间距x的值,得到海水深度,覆盖宽度以及重叠率与测量间距x的关系 图如下。


结果显示,海水深度,覆盖宽度以及重叠率随着测量间距x的增大而增加,表明 它们与测量间距x之间存在正相关关系。


首先,我们建立一个三维直角坐标系,其中x轴为海底坡面法向在水平面上的投 影方向,z轴为竖直方向,而y轴与x轴和z轴正交。该坐标系有助于分析测线方向β (即测线与x轴的夹角)变化时,海水深度和覆盖宽度的变化情况。 设海底坡面的法向量为n0,其表达式为:

n0 = (cos α, 0,sin α)

其中,α为海底坡度,表示海底坡面相对于水平面的倾斜角度。 当测线方向发生变化时,即测线与x轴的夹角β不为零,测线所在的平面与海底 坡面之间的交线方向将发生变化,从而影响沿测线方向的海水深度。为描述这种变 化,我们定义测线所在平面的法向量n1为:

n1 = (sin β, cos β, 0)

接下来,我们计算法向量n0与n1的叉积,得到交线方向的向量

d: d = n0 × n1 = (− sin α cos β,sin α sin β, cos α)

向量d描述了测线所在平面与海底坡面交线的方向,即深度线的方向。 为进一步分析覆盖宽度的变化,我们需要确定测线平面与海底坡面之间的夹 角γ。通过计算法向量n0和n1的点积,可以得到夹角γ的余弦值:

cos γ = n0 · n1 |n0||n1| = cos α cos β

夹角γ的表达式为:

γ = arccos (cos α cos β)

接下来,我们分析测线方向变化对海水深度的影响。设船体沿测线方向前进,初 始海水深度为D0,则随着船体在测线方向上前进距离l,海水深度D(l)的变化可以表示为:

D(l) = D0 + l · tan γ

其中,l为船体在测线方向上的前进距离,γ为测线平面与海底坡面的夹角。这个方程 描述了海水深度随船体前进的变化,且这种变化直接影响到覆盖宽度的计算。 进一步地,考虑测线与海底坡面之间的几何关系。测线方向与海底坡面的交线 在三维空间中的投影长度为:

Px = A cos β sin α

其中,A为船体与海底坡面的水平距离,β为测线方向角度,α为海底坡度。 为了计算覆盖宽度W,我们需要考虑多波束换能器的开角θ。覆盖宽度W可以分 为两部分,分别位于测线方向的两侧。我们通过正弦定理,分别计算出这两个部分 的长度:


通过这一推导过程,我们清晰地描述了当测线方向发生变化时,覆盖宽度如何 随着海水深度、测线方向角度β、海底坡度α以及换能器开角θ的变化而变化。利用该 公式,我们可以进一步分析覆盖宽度的变化情况,并进行模型的求解。

5.2.2 模型的求解

模型求解过程包括对不同测线方向角度β下的海水深度变化、覆盖宽度的动态计 算。具体步骤如下:

5.3 问题三模型的建立与求解

5.3.1 模型的建立

在问题三中,我们需要在具有一定坡度的矩形海域内进行多波束测深。目标是 在确保完全覆盖海域并且重叠率适当的情况下,设计测线布设方案,使得测线总长 度尽可能短。这一问题涉及到测线间距的优化、重叠率的控制以及测线方向的选择, 最终通过构建数学模型来实现这一优化目标。

5.3.2 覆盖效率求解 为了在问题三中优化测线布设方案,引入了“覆盖效率”这一关键指标。覆盖效 率 ζ 用于衡量单位测线长度内所覆盖的海域面积大小,从而反映测线布设的合理性 与测量效率。具体而言,覆盖效率 ζ 的数学表达式为:

这一结果表明,当测线方向与等深线平行时,覆盖效率最大,测线布设的效果 最好。这为我们在实际测量中优化测线布设提供了理论依据,可以有效减少测线总 长度,提升测量效率。

5.3.3 恒定重叠率的动态规划求解 在确定测线方向与等深线平行时,我们需要进一步优化测线布设方案,以使得 在满足海域全覆盖和保持恒定重叠率的条件下,测线的总长度最短。为此,我们引 入动态规划方法,通过建立合理的数学模型,实现测线布设的最优解。 首先,我们定义模型中的关键变量: 设 xi 表示第 i 条测线在海域中的横向位置,其中 i = 1, 2, . . . , n 为测线的编 号;Wi 表示第 i 条测线的覆盖宽度,覆盖宽度取决于该测线所处位置的海水深度 Di 和波束开口角度 θ。另外,设 di 为第 i 条测线与第 i + 1 条测线之间的距离,即 di = xi+1 − xi。 模型的优化目标是最小化测线总长度。我们设定总长度 Ltotal 为所有测线间距 di 的总和:

5.4 问题四模型的建立与求解

5.4.1 模型的建立

问题四要求在利用已有的单波束测深数据的基础上,设计出多波束测量船的测 线布局,并计算出测线的总长度、漏测海区占总待测海域面积的百分比,以及重叠 率超过 20% 部分的总长度。这一问题的核心是如何在确保测线覆盖率的同时,最小 化测线总长度,并控制测线之间的重叠率和漏测区域。 我们首先对测量区域的地形进行建模。根据题目提供的数据,我们使用PYTHON对 海域的三维地形进行了可视化分析,生成了海底地形图,并确定了测量区域的边界 条件。

该地形图将为测线布局的设计提供基础数据。我们将整个测量区域划分为若干 个子区域,并在每个子区域内近似认为海底地形为平面。根据多波束换能器的开角 θ 13 以及船只在不同深度 D 下的位置,计算出相应的覆盖宽度 W。覆盖宽度 W 的数学 表达式为:

W = 2D · tan ( θ /2) 

在设计测线时,我们需要考虑测线的方向和间距,以保证测量的全面覆盖,并 满足重叠率在 10% 至 20% 之间的要求。为了提高测量的效率,我们选取测线尽量与 海底等深线平行的方式,这样可以最大限度地利用每条测线的覆盖范围,从而减少 测线总长度。 为了实现上述目标,我们使用粒子群优化算法(Particle Swarm Optimization, PSO)进行优化求解。粒子群优化算法是一种基于群体智能的进化算法,具有计算速 度快、收敛性好等优点。具体来说,在该问题中,每个粒子代表一个测线布局方案, 其位置和速度由测线的位置和间距决定。通过不断调整粒子的速度和位置,使得目 标函数逐步优化,最终得到最优的测线布局方案。 目标函数的定义如下:

目标函数 = min (L + λ1 · M + λ2 · T)

其中,L 表示测线的总长度,M 表示漏测区域的面积占比,T 表示重叠率超过 20% 的部分总长度,λ1 和 λ2 是惩罚系数,用于平衡这三部分在目标函数中的权重。 在具体建模过程中,我们还需考虑以下因素:

1. 海底地形的复杂性:由于海底地形可能存在较大起伏,导致不同区域的覆盖宽 度 W 不同。我们对每个子区域单独计算覆盖宽度,并将其应用于粒子群优化算 法中,以确保测线设计能够适应复杂的地形变化。

2. 测线的方向选择:为了提高测线的覆盖效率,我们优先考虑测线与等深线平行 的情况。在海底坡度变化较大的区域,我们可能需要调整测线的方向,以避免 漏测和提高测量精度。

3. 重叠率的控制:在保证测线覆盖率的前提下,

问题一代码
import numpy as np
import matplotlib.pyplot as plt
# Given constants
b = 120 # in degrees
a = 1.5 # in degrees
x values = np.arange(−800, 801, 200) # x from −800 to 800 with 200m interval
# Convert angles to radians for calculation
b rad = np.radians(b)
a rad = np.radians(a)
# Calculate a1 and a2 in radians
a1 rad = np.radians(90 − b/2 + a)
a2 rad = np.radians(90 − b/2 − a)
# Calculate D and W for each x
D values = (np.tan(a rad) ∗ x values) + 70
W values = (D values / np.sin(a2 rad)) ∗ np.sin(b rad / 2) + (D values / np.sin
(a1 rad)) ∗ np.sin(b rad / 2)
# Initialize overlap rate array
overlap rate = np.empty like(D values)
overlap rate[0] = np.nan # First line has no overlap with a previous line
# Calculate overlap rate using the modified formula
for i in range(1, len(x values)):
overlap rate[i] = 1 − 200 / (((D values[i−1] / np.sin(a1 rad)) ∗ np.sin(b rad / 2)
+
(D values[i] / np.sin(a2 rad)) ∗ np.sin(b rad / 2)) ∗ np.cos(a rad))
# Save data to a specified .txt file
output file = ’../calculated data modified.txt’
with open(output file, ’w’) as f:
18
f.write(’x (m)\tD (m)\tW (m)\tOverlap Rate\n’)
for x, D, W, overlap in zip(x values, D values, W values, overlap rate):
f.write(f’{x}\t{D:.4f}\t{W:.4f}\t{overlap:.4f}\n’)
print(f’Data saved to {output file}’)
# Plot D, W and overlap rate
plt.figure(figsize=(12, 10))
# Plot D values
plt.subplot(4, 1, 1)
plt.plot(x values, D values, marker=’o’, color=’b’)
plt.title(’D values across x’)
plt.xlabel(’x (m)’)
plt.ylabel(’D (m)’)
# Plot W values
plt.subplot(4, 1, 2)
plt.plot(x values, W values, marker=’o’, color=’r’)
plt.title(’W values across x’)
plt.xlabel(’x (m)’)
plt.ylabel(’W (m)’)
# Plot overlap rate
plt.subplot(4, 1, 3)
plt.plot(x values, overlap rate, marker=’o’, color=’g’)
plt.title(’Overlap Rate across x’)
plt.xlabel(’x (m)’)
plt.ylabel(’Overlap Rate’)
plt.tight layout()
# Save the plot to a specified path
plot file = ’../overlap rate and w plot.png’
plt.savefig(plot file)
19
print(f’Plot saved to {plot file}’)
plt.show()

问题二代码
import numpy as np
import matplotlib.pyplot as plt
# Given constants
a = np.radians(1.5) # a angle in radians
x values nm = np.array([0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1]) # x in nautical miles
v values deg = np.array([0, 45, 90, 135, 180, 225, 270, 315]) # v angle in degrees
# Conversion from nautical miles to meters
x values m = x values nm ∗ 1852 # 1 nautical mile = 1852 meters
# Convert v angles to radians
v values rad = np.radians(v values deg)
# Calculate tan(r) and D for each x and v
tan r = np.tan(a) ∗ np.cos(v values rad)
D values = 120 − x values m[:, np.newaxis] ∗ tan r
# Calculate W for each x and v
b rad = np.radians(120) # b angle fixed at 120 degrees
q values = np.arctan(np.tan(a) ∗ np.sin(v values rad))
W values = D values / (np.cos(b rad / 2 + q values)) ∗ np.sin(b rad / 2) +
D values / (np.cos(b rad / 2 − q values)) ∗ np.sin(b rad / 2)
# Plotting W vs x for different v angles (2D plot)
plt.figure(figsize=(10, 6))
for i, v in enumerate(v values deg):
plt.plot(x values nm, W values[:, i], marker=’o’, label=f’v = {v°}’)
plt.title(’W vs x for different v angles’)
20
plt.xlabel(’x (Nautical Miles)’)
plt.ylabel(’W (meters)’)
plt.legend()
plt.grid(True)
# Save the 2D plot to a specified path
plot file 2d = ’W vs x plot2.png’
plt.savefig(plot file 2d)
print(f’2D Plot saved to {plot file 2d}’)
plt.show()
# 3D Plotting W vs x and v
X, V = np.meshgrid(x values nm, v values deg)
W = W values.T # Transpose W values to match the meshgrid shape
fig = plt.figure(figsize=(10, 8))
ax = fig.add subplot(111, projection=’3d’)
# Plotting the surface
surf = ax.plot surface(X, V, W, cmap=’viridis’, edgecolor=’k’)
ax.set title(’3D Plot of W as a function of x and v’)
ax.set xlabel(’x (Nautical Miles)’)
ax.set ylabel(’v (Degrees)’)
ax.set zlabel(’W (meters)’)
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5) # Add a color bar for reference
# Save the 3D plot to a specified path
plot file 3d = ’W vs x and v 3D plot.png’
plt.savefig(plot file 3d)
print(f’3D Plot saved to {plot file 3d}’)
plt.show()
# Save calculated W values to a text file
21
output file = ’calculated W values.txt’
with open(output file, ’w’) as f:
f.write(’x (Nautical Miles)\tv (Degrees)\tW (Meters)\n’)
for i, x in enumerate(x values nm):
for j, v in enumerate(v values deg):
f.write(f’{x:.1f}\t{v:.0f}\t{W values[i, j]:.4f}\n’)
print(f’W values saved to {output file}’)
问题三代码
import numpy as np
2.
3. class Particle:
4. def init (self, dim, minx, maxx):
5. self.position = np.random.uniform(low=minx, high=maxx, size=dim)
6. self.velocity = np.random.uniform(low=−0.1, high=0.1, size=dim)
7. self.best position = np.copy(self.position)
8. self.best score = −np.inf
9.
10. class PSO:
11. def init (self, dim, n particles, bounds):
12. self.dim = dim
13. self.n particles = n particles
14. self.bounds = bounds
15. self.particles = [Particle(dim, ∗bounds) for in range(n particles)]
16.
17. def optimize(self, func, n iter):
18. global best score = −np.inf
19. global best position = None
20.
21. for i in range(n iter):
22. for particle in self.particles:
23. score = func(particle.position)
24.
25. if score > particle.best score:
26. particle.best score = score
22
27. particle.best position = particle.position
28.
29. if score > global best score:
30. global best score = score
31. global best position = particle.position
32.
33. for particle in self.particles:
34. particle.velocity += 2 ∗ np.random.rand(self.dim) ∗ (particle.best position −
particle.position) + 2
∗ np.random.rand(self.dim) ∗ (global best position − particle.position)
35. particle.position += particle.velocity
36.
37. for i in range(self.dim):
38. if particle.position[i] < self.bounds[0]:
39. particle.position[i] = self.bounds[0]
40. elif particle.position[i] > self.bounds[1]:
41. particle.position[i] = self.bounds[1]
42.
43. return global best position
44. def fitness(position):
45. total length = np.sum(position)
46. missed area percentage = np.sum(data[position == 0]) / np.sum(data)
47. overlap length = np.sum(position[position > 1] − 1)
48.
49. # 希望最小化这三个指标
50. return −(total length + missed area percentage + overlap length)
51.
52. pso = PSO(dim=20, n particles=30, bounds=(0, 1))
53. best position = pso.optimize(fitness, n iter=1000)

六、模型的评价、改进与推广

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值