多波束测深合理探测方案的设计及效果分析
摘要
多波束测深系统比单波束测深系统测量范围大、精度高,适合大面积海底地形的勘探。在实际探测中,海底地形起伏大,不能简单地根据海区平均水深设计测线间隔。本文基于对覆盖宽度、重叠率等的分析,建立了适当的数学模型,设计了合理的探测方案,对提高探测效率和准确性有一定作用。
对于问题一,本文建立了二维平面上计算多波束测深的覆盖宽度及条带重叠率的数学模型。根据问题的变化,我们首先给出了坡面情况下重叠率的计算方法。利用三角形中存在的几何关系推导出了海水深度、覆盖宽度、重叠率的计算公式,并计算相关数值将其填入表1,发现最浅两条测线出现了漏测现象。
对于问题二,本文在第一问的基础上,在不同测线方向的情况下以深度与坡度角度完善了在三维情况下多波束测深覆盖宽度的数学模型。我们首先提取出了三个主要参数:当前坡度γ、当前深度xρ、当前开角θ,并分析了它们之间存在的关系。推导出了各参数在三维情况下的求解公式,以此公式计算出了题中所列位置多波束测深的覆宽,并将它们填入表2。
对于问题三,本文制定了基于贪心思想的测线设计方案。我们首先分析出需要使得w₂在各点最宽以得到最短路径和最佳航向,以重叠率为控制条件进行迭代计算。经过优化后,我们得到了平行的测线方向,共34条。同时对不同重叠率下的路线数量和平行方向上的航线密度做了横向分析。
对于问题四,本文首先采用微分思想,利用插值拟合和随机森林模型对数据进行预处理以及数据特点分析,深入探讨了不同曲面以及开角情况下的测量状态,基于第三问的研究改进了飞蛾火焰算法,并给出具体的路径搜索流程,在对区域进行分块之后,以重叠率为10%,在空间内迭代搜索了各区域最佳路径,给出各个分区的数据,经过整合之后,得到了最优化的路线且覆盖率达99.96%, 测线总长度为434662m。
综上所述,本文基于微分思想和贪心思想建立层层递进的计算与智能搜索模型。我们首先建立二维平面上的多波束测深的覆盖宽度及条带重叠率的数学模型,然后扩展至三维空间中,从简单地形测线的设计推进到复杂真实海底测量策略的优化,解决了多波束测深系统最优路线方案的设计问题,并且给出具体的图像和精确数据。对使用多波束测深系统进行实际海底地形测绘有一定参考价值。
关键词:空间几何 贪心思想 微分 随机森林 飞蛾火焰算法 多波束测深
一、问题重述
1.1 问题背景
一份详细的海底地形图可以保障水下船体航行,同时在预测海洋灾害、探测海底资源等方面具有重要作用。测绘海底地形图有多种方法,其中多波束测深系统是一种用于测量海底地形的、承载多传感器的系统。它比单波束测深系统测量范围大、速度快、精度高,特别适合大面积海底地形的勘探。
进行探测时,测线产生的相邻条带需要有10%~20%的重叠率。重叠率过高会导致数据冗余、处理测量结果过程繁琐; 重叠率过低会导致漏测。由于在实际探测中,海底地形较为复杂,不能简单地根据海区平均水深设计测线间隔。为了避免重叠率过高或过低的情况、提高探测效率和准确性,需要建立适当的数学模型,来设计合理的测线间隔。
1.2需要解决的问题
1. 当测线方向垂直的平面与海底坡面的交线面面角为α时;
(1) 建立计算多波束测深的覆盖宽度及相邻条带之间重叠率的数学模型。
(2) 依据该模型计算表1中的各指标值。
2. 当待测海域为矩形、测线方向与海底坡面的法向在水平面上投影的夹角为β时:
(1) 建立矩形待测海域的计算多波束测深覆盖宽度的模型。
(2) 依据该计算模型探究表2中所列位置多波束测深的覆盖宽度。
3. 当矩形海域南北长2海里,东西宽4海里,深度为110m,海底西深东浅时:
(1) 依据1、2中的数据模型,综合考虑探测效率和准确性,设计一组测线,使得测量长度最短、η∈[10%,20%],且要求测线完全覆盖待测的矩形海域。
4. 现有南北长5海里、东西宽4海里的某海域单波束测量的测深数据:
(1) 设计多波束测量船的测量布线方案,使得测线形成的条带尽可能覆盖待测海域:η尽可能不超过20%:测线的总长度最短。
(2) 计算设计出的测线的总长度、漏测海区占总待测海域面积的百分比,以及η>20%部分的总长度。
二、问题分析
2.1问题一的分析
题目中给出的重叠率的定义是基于水平状态下的,当海底并不平坦时,坡度会给重叠率的计算带来一定的问题。我们需要将重叠率的计算做出适应非水平海底的修正,以适应海底的复杂地形情况。本题要求我们在海底平面坡度为α时分析,
2
我们可以根据修正后的定义画出该情景下的几何关系简图。利用这些几何关系,在二维平面上给出给定测线距中心点处的距离时,可以做出海水深度、覆盖宽度、与前一条测线重复率的计算。
2.2问题二的分析
由第一问所建立的模型可知,当前深度由距初始航线的距离来决定。那么对于问题二的解决,我们需要沿用第一问的模型并对此做出相应扩展。参考问题一的模型,可以得到参数间存在的关系。由于当海底平面为均一平面,测量船的航向确定时,坡度也确定为一定值,因此我们需要从深度与坡度着手来解决关于该矩形待测海域的相关计算,完善问题一中的多波束测深覆盖宽度的数学模型。
2.3问题三的分析
本题要求在南北长2海里、东西宽4海里的矩形海域内求解一组长度最短,且覆盖全海域的测线方案。这里可以提取出两个信息:测线方案的设计中覆盖面积为全海域、且长度最短是必然要求。基于贪心算法的思想,为使测线的长度最短,需要使得在各处尽可能宽,由此可得到最短测线距离。在取得最优的覆宽以及测线长度的条件下,以重叠率为优化与控制结果的关键指标进行迭代计算。
2.4问题四的分析
由于单波束测深方法是一种单点连续的测量方法,它沿航迹测得的数据密集,却在测线间没有数据。为了解决测得的数据是离散的问题,需要采用学习模型进行拟合,将离散转为连续,从而做到对任意一点坡面高度、梯度、深度的拟合。为了确定出测量方案,需要从航向的确定和重叠率来考虑,以局部最优解组成总体的最优解。得出测量路径后,还需要统计与计算该方案的测线总长、漏测海域占比与重叠超过20%路线总长。
三、模型假设
1. 多波束测深系统进行海底探测得到的数据真实有效。
2. 不考虑船体颠簸,只考虑航行路线的规划。
3. 海平面水平,不考虑潮汐、洋流、风向对此造成的影响。
4. 海底无鱼群或其他物体的遮挡。
3
四、符号说明
符号 | 说明 |
L重 | 相邻条带重叠部分的长度 |
XDi | 当前深度, i为标号 |
d' | 投影后的条带间距 |
γ | 当前坡度 |
Δx | 测量船距海域中心点处的距离 (行进距离) |
r₂ | 测线路径, i为标号 |
w; | 某点的覆盖宽度 |
S Vg(x₁,y₁) | 船体行进后完成的总覆盖面积 点(x₁,y₁)处的梯度向量 |
五、模型的建立与求解
5.1问题一模型的建立与求解
5.1.1 相关概念的说明
当处于测线相互平行且海底地形平坦的水平状态下,由题目所给的情景可知,相邻条带之间的重叠率η被定义为:
η=1-dW (1)
d为测线间距,W为测线的覆盖宽度,D为深度,LA为相邻条带重叠部分的长度。各字母量的几何含义如下图所示:
当海底地形并非平坦时,在后续问题中可能会出现的更为复杂的情景,例如有复杂坡度(问题二、三) 或海底存在略微弧度(第四问) 的情况:
4
在这里,我们假设d与L ,都为定值,此时若再沿用 1-dw的定义,则图2中①的重叠率与②的重叠率相比,显然有:
ηω<η② (2)
而(2)中的结果是反直觉的,显然可以观察出①中的重叠比例是大的,在这样的情况下,计算出的重叠率将失去意义。这种η公式的失效可能会在后续规划中造成错误。为了适应不同的情景,我们将η的定义做出扩展性的解读,并参考相关文献[1]与题目中的场景,给出对重叠率改进后的定义:即重叠率是重叠部分长度与总覆盖长度的比值。
η=1-w-LmW (3)
对于改进后的合理性也可以从这个角度来解释:我们作一条与海底斜坡平行的 l₂,将测线间距d以最右侧两测线为平行线投影到l₂上,并平移至l₁上。由于此时 d'=W-L,,
因此与水平状态下计算重叠率的(1)式相比,修正重叠率计算公式做出的改动只是将d替换为d'。而由于 与l₂平行,这一步修正可以消除坡度对重叠率 l₁
计算的影响。
利用式(3)所示的重叠率计算方法可以有效避免在不同场景下造成的η失效,在后续计算中我们以该定义为准。
5
5.1.2 模型构建
依据题意,此时需要我们构建当与测线方向垂直的平面和海底坡面的交线构成一条与水平面夹角为α 的斜线时的计算模型,并依据该模型,在二维平面上给出给定测线距中心点处的距离时,海水深度、覆盖宽度、与前一条测线重复率的计算。
如图,以左侧部分为更深区域,我们给出相关位置简图:
利用图3中的几何关系,我们可以写出表格中相关参数的计算方式。其中AB 记为 (Ni2)全BC记为 (wi2)合.
海水深度:若xDj已知,参考三角相关的公式,有
xDj=xDi+Δd⋅tanα (4)
覆盖宽度:将三角形分割成左右并运用正弦定理,有
sinπ-θ2-αxDj=sinθ2W12差 (5)
sinπ-θ2+αxDi=sinθ2Wi2浓 (6)
Wi2差+Wi2合=Wi (7)
解出 |
Wi=xDi,sinθ21sinπ-θ2+α+1sinπ-θ2-α |
同时,易得覆盖宽度在海平面的投影长度为1 Wᵢ⋅cosα.
对于此处重叠率η的计算,我们采取前文中在斜面以及复杂情况下修正后的定义,即将d以两条最右侧波束作为一组平行线投影到海底斜面上,那么有
η=1-d'W (9)
dν=d⋅sinπ2-θ2sinπ2-α+θ2 (10)
5.1.3 模型求解
依据前文中所述的计算方法,此时我们可以得到计算所需的相关参数信息,并以此建立二维平面模型,模型计算结果如下表所示:
表1 问题一的计算结果
测线距中心点 处的距离/m | -800 | -600 | -400 | -200 | 0 | 200 | 400 | 600 | 800 |
海水深度/m | 90.949 | 85.712 | 80.474 | 75.237 | 70 | 64.763 | 59.526 | 54.288 | 49.051 |
覆盖宽度/m | 315.813 | 297.628 | 279.442 | 261.256 | 243.070 | 224.884 | 206.699 | 188.513 | 170.327 |
与前一条测线 的重叠率/% | — | 0.357 | 0.315 | 0.267 | 0.213 | 0.149 | 0.074 | -0.015 | -0.124 |
可以发现最后两条测线出现了漏测,更详细的数值计算结果将在表格文件result1. xlsx 中展示。
5.2问题二模型的建立与求解
5.2.1 模型的准备
从第一问的求解中,我们可以提取出各种可以获取信息的参数。在对于后续问题的求解过程中,有3个重要参数:当前坡度γ,当前深度xρ,与当前多波束换能器的开角θ。由第一问所建立的模型可知,当前深度x₀由距初始航线的距离来决
7
定,所以对于问题二的解决,我们需要沿用第一问的模型并对此做出相应扩展。参考问题一的模型,可以得到参数间存在以下关系:
在解决该问题情境下的矩形待测海域之前,我们首先需要证明1点:若海底平面为一均一平面,当测量船的航向确定(测线方向)时,其坡度也确定,且坡度为定值。这一点结论的证明过程如下:
假设航向法向为 n$全=abc, 则其代表了一个以 n₈
为法向的平面。 由于海平面水平,不难证明该平面与海平面垂直。若海底平面法向为 n汤=abc',
则坡线为两平面交线,且由克莱默法则可以计算出坡线方向为 (bc¹-b¹c,ca'-
ac,ab'-ba').
所以当测量船的航向确定(测线方向)时,坡度是唯一确定的,且为定值。
基于此,我们决定从深度与坡度着手来解决关于该矩形待测海域的相关计算,并完善多波束测深覆盖宽度的数学模型。考虑下图的情况(这里我们以 β=135°为例):
在图7中,我们需要得知当前坡度y的值。设某一高度为h,那么有
tanγ=hhtanα2+ktanβtanα2=tanα⋅|sinβ| (11)
对于深度的计算,可以得到
|
将变化后的参数引入第一问,可以求得覆盖宽度W展的数值
WN=xD⋅sinθ21sinπ-θ2-γ+1sinπ-g2+γ (13)
至此,我们已经实现了将第一问的模型升维到第二问的工作。在改变Δx与β的情况下,可以实现对特定参数的数值计算。
5.2.2 模型的求解
上文中,我们建立了在不同Δx与β的数值下,计算多波束测深的覆盖宽度的数学模型,求解的结果以保留小数点后三位的形式放在如下表格中,由于篇幅问题,更详细的数值将在表格文件 result2. xlsx中呈现。
表2 问题二的计算结果
覆盖宽度/m | 测量船距海域中心点处的距离/海里 | ||||||||
0 | 0.3 | 0.6 | 0.9 | 1.2 | 1.5 | 1.8 | 2.1 | ||
测线 方向 夹角 P | 0 | 415.692 | 466.091 | 516.490 | 566.889 | 617.288 | 667.687 | 718.085 | 768.484 |
45 | 416.192 | 451.872 | 487.552 | 523.232 | 558.912 | 594.592 | 630.273 | 665.953 | |
90 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | |
135 | 416.192 | 380.511 | 344.831 | 309.151 | 273.471 | 237.791 | 202.110 | 116.430 | |
180 | 415.692 | 365.293 | 314.895 | 264.496 | 214.097 | 163.698 | 113.299 | 62.900 | |
225 | 416.192 | 380.511 | 344.831 | 309.151 | 273.471 | 237.791 | 202.110 | 116.430 | |
270 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | 416.692 | |
315 | 416.192 | 451.872 | 487.552 | 523.232 | 558.912 | 594.592 | 630.273 | 665.953 |
通过观察求解结果,可以发现以下规律:(1)在同一点不同航向会使覆盖宽度产生较大变化。(2)在不同深浅的水域中覆盖宽度变化较大,直线行驶时产生的轨迹为类三角(锥) 形,并不均匀。(3)经过检验,在参数一致的情况下该模型与第一问建立的模型得出了相同的结果,验证了模型的正确性。
9
5.3问题三模型的建立与求解:
5.3.1 问题分析
这个问题中,需要我们在南北长2海里、东西宽4海里的矩形海域内求解一组长度最短,且覆盖全海域的测线方案。这里可以提取出两个重要信息:对于测线方案的设计来说,覆盖整个海域面积和长度最短是必然要求。假设在每处其行进微小的距离为Δx,在该处的覆盖宽度为wᵢ,那么有( wi=fγxDi,则船体行进完成后总的覆盖面积S为
S=∫wᵢΔx (14)
为了满足题干要求,该面积要覆盖整个海域面积。
在第二问的最后一部分结果分析中,我们提到了在不同深度、不同角度下,覆盖宽度w₁也不同。基于贪心算法的思想,为使测线的长度Δx最短,需要使得( wᵢ在各处尽可能宽。由此可得到最短测线距离。
下面我们对不同深度下不同角度的w₂均做出计算,并且可视化出了较深处与较浅处的结果用作说明:
由图可看出,不同坡度下,无论大小,总是在方向为 π2+nπ的地方取得最高值,此时是与其等高线共线的情况。如果单独抽取出该结构,将不同的方向模拟为一个圆锥,而坡面模拟为一个斜切的面,此时由几何知识可知,该切面为椭圆。而当W的长度为其长轴时为最大,这也就是之前航向与等高线平行的原因。
由图同时可以观察到,无论是左图中的较浅情况还是右图中所示的较深情况,均于测线方向在90°与270°时取得最优的覆盖宽度。而这个方向恰巧是与各点梯度向量垂直的方向。也就是当沿图10所示方向的情况下,各处可以取得最优的覆宽以及测线长度:
10
在确定了每条航线的方向后,该问题就演变成在图11所示平面中合理安排测线方案的问题。
5.3.2 模型建立
为了保证数据的准确性和处理的简单性,重叠率的范围有一定要求。在题目重叠率 η∈[10的要求下,我们给出以下计算步骤。其中“重复”的步骤指的是以η为优化与控制结果的关键指标进行迭代计算。
在已知边界深度的计算下,第一条测线的计算方法如下:
由XD初、α得
xD,j-Δr⋅tanα⋅sinθ2⋅cosα=x⋅sinπ-θ2-α (15)
|
|
xD1=xDy-Δr⋅tanα (17)
其中Δr为第一条测线距边界得距离,xρ为其测线深度。同时,在相邻测线之间还具有以下关系:
|
L汤wi=η (19参考一、二问中建立的计算宽度的模型,并结合上几式易得
xDi-1⋅sinϑ2A+xDi⋅sinθ2B-xpi-1-xDitanα=η⋅xDi⋅sinθ21A+1B (20)
将式(20)化简,那么有
|
|
式(21)即为以前一条测线深度推出后一条测线深度的递推公式。其中xD₂为待计算深度,xDi-₁为前一已知深度。其中, A=sinπ-y2+α,B=sinπ-θ2-α.
由于在前文的流程中未确定从较浅处开始迭代还是较深处开始迭代,因此本组对两种情况都做出了计算。我们发现当选择从较深处开始迭代时,最后多测的面积(即超出待测海域的面积) 要小于从最浅处开始迭代多测的面积。推测产生此现象的原因,可能是浅处测线覆盖宽度较小、密度较大,所以并不会重复测得很多面积。
在以不同重叠率为横坐标、测线数量为纵坐标的图13 (左) 中,我们不难看出测线数量呈阶梯状比例,最小为34个,最多为38个。这样的结果符合重叠越少,测线越少的直观感受。
同时,我们对当测线数量最少的情况下, η∈[10测线的具体位置进行了可视化处理,在图13(右) 中,横坐标为距初始点距离,纵坐标为测线的垂直深度。可以观察到在垂直深度较深处分布稀疏,而在较浅处分布较为密集。
12
我们以 MaxWᵢ,Minnumberrᵢ为优化目标,找出了理想的测线数量。在这里给出了平行的测线方位与位置(见附件)。我们还需要将这些平行测线以“以”字形方式连接起来,连接后便得到了一条完整路径,见图。
5.4问题四的求解
5.4.1数据初步处理及可视化
在文件附件. xlsx中展示了某海域单波束测量的测深深度数据,该海域范围较大,且数据单位不统一,因此坐标点显得较为稀疏。为了更直观地呈现附件中的数据,并对问题做出初步的分析,我们首先采用分段三次埃尔米特插值对数据进行差值扩充与可视化:
在图15中可以观察到,海域大概是从(0,0)点向周围下降,根据图15(右)所示的等深线地形图来看,在右下角的位置达到最深,在右上角线条稀疏,形成了一个较为平缓的鞍部。
由于给出的数据是有一定间隔的离散点。在路径优化的时候无法得到任一坐标的相关数据,要克服这一问题的一种方法是插入足够多的数值,用离散的点代替平滑图像。但这种方法在后续计算中有一定缺点:(1)精度较低。(2)由于某些点的缺失导致计算失效。(3)误差累积,致使结果误差很大。(4)数据量过于庞大,使
13
用复杂,计算困难,耗时较长。
针对上述问题,经过思考,我们决定采用大型学习模型进行拟合。也就是将已有点的数据作为训练集,建立一个用于辅助计算的机器学习模型,这样,我们给定坐标后,便可以给出精确的数据。使用这种方法将离散转为连续,能够大大提高计算的精确度和便利性。
为此,我们尝试了线性回归、支持向量机、随机森林等多种模型,并以拟合接近度R²进行评估,最终发现随机森林模型与原数据拟合度可以达到99.999%,几乎能完全拟合原数据。因此,我们选择训练该模型并作为后续数据的支撑。拟合效果如下:
基于该模型,同样可以做到对任意一点深度,梯度的拟合,进而计算出每个点的坡度,因此我们对前面部分的某些概念做出优化:
设有一点(x₁,y₂), 则该点
梯度单位向量(最大坡度向量): gxᵢyᵢ
在该梯度上的坡度: α(x₁y₂)
在该点深度: xD(x₂,y₂)
在该点探测区域宽度: w(x₁,y₂)
至此,我们完成了相关数据的准备工作。
5.4.2 问题分析
基于前面几个问题的研究,我们可以明确以下信息:
目的优化 maxLyminS-S (22)
则有
|
最佳航线方向 (23) |
到每一处的最大覆盖宽度是解决问题的关键,这同样也关系到确定航向的问题。为了贴合题目中的要求,需要分别从航向的确定和重叠率来考虑。
关于航向的确定,在第三问结尾的相关探索部分已经有所说明:沿等高方向
14
行驶会获得最大覆宽w。曲面情况下也需要考虑,因此我们做出了下图中的模拟:
在上图中,我们用圆锥模拟不同方向,用两类斜面去截圆锥,从其在水平面的投影来寻找最优的wᵢ,可以看出它们的投影为类椭圆,总体仍然以长轴(即沿梯度为开角方向)取最大,但在极端情况下,可能会出现右侧中长轴变短的情况,不过该地形在本题地图中并未出现,且也可近似认为其类长轴为最宽处。
关于重叠率,本题并未给出前几问中那样精确的范围,只需要不超过20%,参考题干中的“为保证测量的便利性和数据的完整性,相邻条带之间应有10%~20% 的重叠率”,我们以此作为标准。
对于开角的确定,题目中并未给出数值上的参考。我们对开角θ在±30°内进行了覆宽变化的探究。在深度为70的情况下,做出如下三维图。
可以看出,在开角变大,坡度变大的情况下,测宽显著变大,在地形较倾斜范围海域造成误差,因此开角的选择应根据地形进行合理的制定。开角变小会让测量宽度变小而使航线变密集,航线的分布也会产生微小变化。在本题仍以θ=120°为标准。
5.4.3 模型建立
本题实际上是一个特殊的优化问题,其总体的最优解总是由局部最优解组成。
15
基于前文航向对w大小的探究,其航向需要与其梯度方向垂直(或与等高线相切).针对这个过程,本文查阅到一个很符合该题的群体智能算法“飞蛾火焰算法”[2][4],同时基于贪心思想和微分思想,并结合第三问,修改了该算法的螺旋函数与适应函数的确定方式,形成自适应的“飞蛾火焰”算法。
假设有如图所示的航线,并有正在探索的航线l₂,本组做出以下调整:
(1) 自适应火源调整方案
该火源存在的本意是为了让搜索粒子与火源位置保持一定角度,但本题地形复杂,因此采用随机森林预测出的梯度 ∇gxᵢyᵢ和一个与 ∇gxᵢyᵢ
正交的单位向量来作为测线方向的自调整的角度。
(2) 地图微分化:
由于地图范围非常大,而探索船每次探测的部分占比很小,因此我们采用微分思想,将每一点( x₁yᵢ处的区域认为是与题三中平坦的情形,并采用 x₁y₁
处的w、a、g作为整个小区域的数据, 对于相邻区域内的另一点(xⱼ,yⱼ)满足:
αxᵢyᵢ=αxⱼyᵢ (24-1)
∇gxiyi=∇gxjyj (24-2)
xDx1yi=xDxiyj (24-3)
1. 处理过的部分数据
2. 代码部分
第二问. py
第三问(1). py
第三问(2). py
第三问(3). py
第三问(4). py
第三问(5)张角与坡度. py
第四问(1)拟合函数. py
第四问(2)梯度. py
第四问(3)插值. py
第四问(4). py
第四问(5). py
第四问(6). py
第四问(7). py
第四问(8). py
第四问(9). py
第一问(1). py
代码部分:
第一问:
1. import pandas as pd
2. import numpy as np
3. # 初始化参数
4. D 0 = 70
5. the ta = 120
6. alpha = 1.5
7. d = 200
8. d = d* np. sin( np. radians(90- theta/2))/ np. sin( np. radians(90- alpha+ theta/2))
9. distances = np. array([-800, -600, -400, -200, 0, 200, 400, 600, 800])
10. D= D 0 - distances * np. tan( np. radians( alpha))
11.
12. print(D)
13.
14. W=D* np. sin( np. radians( theta/2))*( 1/ np. sin( np. radians((180- theta)/2+ alpha)) +1/ np. sin( np. radians((180- theta)/2- alpha)))
15. print(W)
16. n=1-d/W
17. print(n)
18. # 创建 DataFrame 用于保存结果
19. df = pd. DataFrame({'测线距中心点处的距离/m': distances})
21
20. df['海水深度/m'] = D
21. df['覆盖宽度/m'] = W
22. df["与前一条测线的重叠率/%"] = n
23. # # 将 DataFrame 保存为 Excel 文件
24. # path=r"C:\ Users\PC\ Desktop\res1. xlsx'
25. # df. to excel( path, index= False)
第二问:
1. import pandas as pd
2. import numpy as np
3. def get width(B):
4. # 初始化参数
5. D 0 = 120 # 海底深度 (单位: m)
6. alpha = 1.5 # 坡度 (单位: 度)
7. D = D 0 - distances * np. tan( np. radians( alpha)) * np. cos( np. radians(180 - B))
8. the ta = 120 # 换能器的开角 (单位: 度)
9. alpha= np. arctan( abs( np. sin( np. radians(8)))* np. tan( np. radians( alpha)))*180/ np. pi
10. print(D)
11. W = D * np. sin( np. radians( theta / 2)) * (
12. 1 / np. sin( np. radians((180 - theta) / 2 + alpha)) + 1 / n p. sin( np. radians((180 - theta) / 2 - alpha)))
13. print(W)
14. return W
15. distances = np. array([0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1])
16. distances = distances * 1852
17. print( distances)
18.
19. angle=[0,45,90,135,180,225,270,315]
20. W=[]
21. for i in angle:
22. W. append( get width(i))
23.
24. # 将 DataFrame 保存为 Excel 文件
25. path=r*C:\ Users\PC\ Desktop\res2. xlsx'
26. pd. DataFrame(W). to excel( path, index= False)
第三问:
(1).
1. import pandas as pd
2. import numpy as np
3. import matplotlib. pyplot as plt
4. plt. rcParams[" font. sans- serif"]=['SimHei'] #显示中文
5. def get width(B,D 0):
6. # 初始化参数
7. alpha = 1.5 # 坡度 (单位: 度)
8.
9. D = D 0
10. the ta = 120 # 换能器的开角 (单位: 度)
11. alpha= np. arctan( abs( np. sin( np. radians(8)))* np. tan( np. radians( alpha)))
*180/ np. pi
22
12.
13. print(D)
14.
15. w = D * np. sin( np. radians( the ta / 2)) * (
16. 1 / np. sin( np. radians((180 - theta) / 2 + alpha)) + 1 / n
p. sin( np. radians((180 - theta) / 2 - alpha)))
17.
18. print(W)
19. return W
20.
21. angle= np. linspace(0,360,360)
22. W=[]
23. for i in angle:
24. W. append( get width(i,150))
25.
26. print(W)
27. plt. plot( angle,W)
28.
29. plt. scatter(90,W[89], color=*r")
30. plt. scatter(270,W[269], color="r')
31. plt. text(90,W[89], '({}, {})". format(90,W[89]))
32. plt. text(270,W[269], '({}, {})'. format(270,W[269]))
33.
34. angle= np. linspace(0,360,360)
35. W=[]
36. for i in angle:
37. W. append( get width(i,149.5))
38.
39. print(W)
40. plt. plot( angle,W)
41.
42. plt. scatter(90,W[89], color="r")
43. plt. scatter(270,W[269], color="r')
44. plt. text(90,W[89], '({}, {})'. format(90,W[89]))
45. plt. text(270,W[269], '({}, {})". format(270,W[269]))
46.
47. plt. xlabel(*不同角度*)
48. plt. ylabel("覆盖宽度")
49. plt. show()
(2):
1. import pandas as pd
2. import numpy as np
3. import matplotlib. pyplot as plt
4. plt. rcParams[" font. sans- serif"]=['SimHei'] #显示中文
5.
6. def sin(a):
7. return np. sin( np. radians(a))
8. def cos(a):
9. return np. cos( np. radians(a))
10. def tan(a):
11. return np. tan( np. radians(a))
23
12.
13. angle= np. linspace(0,360,360)
14. low=110-2*1852* np. tan( np. radians(1.5))
15. high=110+2*1852* np. tan( np. radians(1.5))
16.
17. alpha = 1.5 # 坡度 (单位: 度)
18. theta = 120 # 换能器的开角 (单位: 度)
19.
20. n= np. linspace(0.1,0.2,100)
21. cnt=[]
22. for i in n:
23. x = sin( theta / 2) * cos( alpha) * high / ( sin(90 - theta / 2 - alpha)+ sin( alpha) * sin( the ta / 2))
24. x = high - x * tan( alpha)
25. print(x)
26. ans = []
27. ans. append(x)
28. A = sin(90 - theta / 2 + alpha)
29. B = sin(90 - theta / 2 - alpha)
30. C = sin( theta / 2) / A - 1 / tan( alpha)
31. D = i * sin( the ta / 2) * (1 / A +1 / B) - sin( the ta / 2) / B - 1 / t an( alpha)
32.
33. while True:
34. x = x * C / D
35. if x < low:
36. break
37. ans. append(x)
38.
39. # print( len( ans))
40. cnt. append( len( ans))
41. # print( ans[-1])
42.
43. n= np. array(n)
44. print(n)
45. print( cnt)
46. plt. plot(n, cnt, color='r')
47. plt. xlabel("不同重复率")
48. plt. ylabel("测线总数")
49.
50. plt. show()
(3):
1. import pandas as pd
2. import numpy as np
3. import matplotlib. pyplot as plt
4. plt. rcParams[" font. sans- serif"]=['SimHei'] #显示中文
5.
6. def sin(a):
7. return np. sin( np. radians(a))
8. def cos(a):
9. return np. cos( np. radians(a))
24
10. def tan(a):
11. return np. tan( np. radians(a))
12. def get Wleft(D):
13. return D* sin( theta/2)/ sin(90- theta/2- alpha)
14.
15.
16. angle= np. linspace(0,360,360)
17. low=110-2*1852* np. tan( np. radians(1.5))
18. high=110+2*1852* np. tan( np. radians(1.5))
19.
20. alpha= 1.5 # 坡度 (单位: 度)
21. theta = 120 # 换能器的开角 (单位: 度)
22.
23. n=0.1
24. cnt=[]
25. x = sin( theta / 2)* cos( alpha) * high / ( sin(90 - theta / 2 - alpha) + s in( alpha) * sin( theta / 2))
26. x = high - x * tan( alpha)
27. print(x)
28. ans = []
29. ans. append(x)
30. A = sin(90 - the ta / 2 + alpha)
31. B = sin(90 - the ta / 2 - alpha)
32. C = sin( theta / 2) / A - 1 / tan( alpha)
33. D = n * sin( the ta / 2) * (1 / A+1 / B) - sin( theta / 2) / B - 1 / tan(a lpha)
34.
35. while True:
36. x = x ﹡ C / D
37. if x < low:
38. break
39. ans. append(x)
40.
41. # print( len( ans))
42. # print( ans[-1])
43. index= np. arange( len( ans))
44. ans= np. array( ans)
45. dis=[]
46. for i in range( len( ans)-1):
47. dis. append(( ans[i]- ans[i+1])/ tan( alpha))
48. for i in range( len( dis)-1):
49. dis[i+1]+= dis[i]
50.
51.
52. # plt. scatter( index, ans, color="g')
53. # plt. xlabel("测线编号")
54. # plt. ylabel("水深")
55. # plt. show()
56. print( dis)
57. dis. insert(0,0)
58. dis= np. array( dis)/1852
25
59. y= np. zeros( len( dis))
60. # plt. scatter( dis,y, marker="x",s=10)
61. plt. xlabel(*各测线的水平位置“)
62. plt. ylim(-1.2,1.2)
63. plt. yticks( alpha=0)
64. plt. tick params( axis='y', width=0)
65. y= np. linspace(-1,1,10000)
66. for i in range( len( dis)-1):
67. x= np. full((1,10000), dis[i])
68. plt. scatter(x,y,s=0.0001, color=*c')
69. tx= np. linspace( dis[i], dis[i+1],1000)
70. if i %2==0:
71. ty = 1
72. else:
73. ty=-1
74. ty = np. full((1, 1000), ty)
75. plt. scatter( tx, ty, s=0.0001, color='c')
76. x= np. full((1,10000), dis[-1])
77. plt. scatter(x,y,s=0.0001, color="c")
78. plt. show()
79. path=r'C:\ Users\PC\ Desktop\距离. xlsx'
80.
81.
82. # pd. DataFrame( dis). to excel( path)
83. # # path=r"C:\ Users\PC\ Desktop\水深. xlsx'
84. # # pd. DataFrame( ans). to excel( path)
(4).
1. import pandas as pd
2. import numpy as np
3. import matplotlib. pyplot as plt
4. plt. rcParams[" font. sans- serif"]=['SimHei'] #显示中文
5.
6. def sin(a):
7. return np. sin( np. radians(a))
8. def cos(a):
9. return np. cos( np. radians(a))
10. def tan(a):
11. return np. tan( np. radians(a))
12. def get Wleft(D):
13. return D* sin( theta/2)/ sin(90- theta/2- alpha)
14. def get WRight(D):
15. return D* sin( theta/2)/ sin(90- theta/2+ alpha)
16.
17. angle= np. linspace(0,360,360)
18. low=110-2*1852* np. tan( np. radians(1.5))
19. high=110+2*1852* np. tan( np. radians(1.5))
20.
21. alpha = 1.5 # 坡度(单位: 度)
22. theta = 120 # 换能器的开角 (单位: 度)
23.
24. n=0.1