基于 摘要 关键字: 1 目录 一、问题重述 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 3 1 . 1 问题背景 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 3 1 . 2 问题提出 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 4 二、问题分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 4 2 . 1 问题一分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 4 2 . 2 问题二分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 5 2 . 3 问题三分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 5 2 . 4 问题四分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 6 三、模型的假设 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 6 四、符号说明 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 7 五、模型的建立与求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 8 5 . 1 真实海底下各指标的明确与修正 · · · · · · · · · · · · · · · · · · · · · · · 8 5 . 1 . 1 覆盖宽度 W 定义的明确 · · · · · · · · · · · · · · · · · · · · · · · · 8 5 . 1 . 2 重叠率公式的修正 · · · · · · · · · · · · · · · · · · · · · · · · · · · 8 5 . 2 问题一模型的建立及求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · 10 5 . 2 . 1 数学模型的建立与求解 · · · · · · · · · · · · · · · · · · · · · · · · · 10 · · · · · · · · · · · · · · · · · · · · · · · 11 5 . 3 问题二模型的建立及求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · 12 5 . 3 . 1 数学模型的建立与求解 · · · · · · · · · · · · · · · · · · · · · · · · · 12 · · · · · · · · · · · · · · · · · · · · · · · 13 5 . 4 问题三模型的建立及求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · 13 5 . 4 . 1 设计一(东西方向)的分析 · · · · · · · · · · · · · · · · · · · · · · 13 5 . 4 . 2 设计二与设计三的分析 · · · · · · · · · · · · · · · · · · · · · · · · · 14 5 . 4 . 3 设计二的求解算法 · · · · · · · · · · · · · · · · · · · · · · · · · · · 14 5 . 4 . 4 问题三的求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 16 5 . 5 问题四模型的建立及求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · 17 5 . 5 . 1 数据预处理与模型近似 · · · · · · · · · · · · · · · · · · · · · · · · · 17 5 . 5 . 2 Topsis 熵权法建立综合评价指标 · · · · · · · · · · · · · · · · · · · · 19 5 . 2 . 2 问题一中待求表格的计算 5 . 3 . 2 问题二中待求表格的计算 2 5 . 5 . 3 问题四模型的建立 · · · · · · · · · · · · · · · · · · · · · · · · · · · 20 5 . 5 . 4 问题四模型的求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · 21 六、模型的检验与分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 23 6 . 1 修正重叠率公式的合理性检验 · · · · · · · · · · · · · · · · · · · · · · · · · 23 6 . 2 灵敏度分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 24 6 . 3 误差分析 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 26 七、模型的评价 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 26 7 . 1 模型的优点 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 26 7 . 2 模型的缺点 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 26 7 . 3 模型的推广 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 26 八、参考文献 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 27 附录 A 支撑材料的文件列表 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 28 附录 B 根据求解结果画航线图 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 28 附录 C 画曲面图 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 30 附录 D 问题一建模求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 32 附录 E 问题二建模求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 32 附录 F 问题三建模求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 33 附录 G 问题四建模求解 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 34 一、 问题重述 1 . 1 问题背景 单波束测深技术基于声波在水中的传播特性进行海洋深度测量,通过声波在海水中 的传播速度和时间来确定水深。尽管该技术能够沿航迹提供密集的数据,但在测量线之 间存在数据空缺。多波束测深是在单波束测深的基础上进化而来,它能在与航迹垂直的 平面上同时发射多个波束,并接收海底反射的声波,实现更广泛的海底覆盖,解决了单 波束测深的局限性。 在地形平坦的海域,多波束测深可以全面测量以测量船为中心的宽度固定的深度 带,但各深度带之间可能存在重叠或漏测。在地形复杂的海域,需要精心设计测量线间 隔,以最大程度减少漏测并降低数据冗余。多波束测线设计涉及确定船只的测线间隔、 航向等因素,旨在实现最短的测量线总长、最佳的海域覆盖等目标,同时确保测量质量 3 和效率。 1 . 2 问题提出 (1) 问题一:在海底坡面是一条与水平面夹角给定的斜线的情况下,建立一个数学 模型来描述多波束测深的覆盖宽度及相邻条带之间的重叠率。并在给出多波束换能器 的开角,坡度,海域中心点处的海水深度等参数的条件下,计算海域中心周围的海水深 度,覆盖宽度以及与前一条测线的重叠率。 (2) 问题二:对于矩形待测海域,当测线方向与海底坡面的法向在水平面上投影有 一定夹角时,建立一个数学模型来描述多波束测深的覆盖宽度。并在给出多波束换能器 的开角,坡度,海域中心点处的海水深度等参数的条件下,计算不同测线方向夹角的海 域中心周围的覆盖宽度。 (3) 问题三:在一个南北长 2 海里、东西宽 4 海里的矩形海域中,考虑到海域中心 点处的海水深度、西深东浅的地形特点和给定的坡度,设计一组最短的测量线路,以确 保完全覆盖整个待测海域,并确保相邻条带之间的重叠率在 10%-20% 的范围内。 (4) 问题四:给定在一个南北长 5 海里、东西宽 4 海里的海域中通过单波束测量得 到的一组旧的海水深度数据,利用这些数据为多波束测量船设计最优的测量布线,以满 足特定的覆盖、重叠率和测量长度要求,并计算相关的指标。 二、 问题分析 2 . 1 问题一分析 问题 1 要求建立一个数学模型来描述海底坡面为斜线的情况下多波束测深的覆盖 宽度及相邻条带之间的重叠率,并提供了多波束换能器的开角、坡度和海域中心点处的 海水深度,并要求计算指定位置的指标值。根据题目所给的背景及信息可知,在一定的 合理假设下,可以将原多波束测深场景抽象为一个平面几何模型,该模型包含多波束换 能器的开角,坡度,海域中心点处的海水深度等参数,并且可做出合适的辅助线,用平 面几何分析求解该模型,得到覆盖宽度及相邻条带之间的重叠率与各个参数的关系。最 后,由题目中给出的参数的具体值代入上述的模型解中,将得到的结果放入正文并保存 到文件中。 在求解过程中,本文注意到,覆盖宽度 W 的定义未能明确给出;题目中所给出的 在海底平坦的情况下,相邻条带之间的重叠率 η 的关系式在海底不平坦的情况下并不能 很好地表征相邻条带之间重叠率,所以本文在模型求解前: • 明确覆盖宽度 W 的定义。 • 提出相邻条带之间的重叠率 η 的关系式在海底不平坦的情况下的修正公式,并在 文末分析其合理性。 4 2 . 2 问题二分析 问题 2 考虑了一个矩形待测海域,要求建立多波束测深覆盖宽度的数学模型。并给 出了多波束换能器的开角、坡度和海域中心点处的海水深度,运用建立的数学模型计算 指定位置多波束测深的覆盖宽度。相较于问题一建立平面几何模型,问题二研究三维空 间内的多波束测深场景,可以建立空间几何模型,同时可以观察到问题一中的平面几何 模型恰好为问题二中立体几何模型在模型右视图视角上的投影,故可以利用问题一中的 模型修改调整,并利用已有信息求解模型。由题目中给出的参数的具体值,包括测线方 向夹角,测量船距海域中心点处的距离等等代入上述的模型解中,将得到的结果放入正 文并保存到文件中。 2 . 3 问题三分析 问题 3 提供了各项参数,要求在满足一定重叠率的前提下,在一个矩形海域内设计 一组最短的测量线路,并确保完全覆盖整个待测海域。该问题实际上是一个优化问题, 需要在满足重叠率要求的前提下,找到最短的测量线路,同时要符合题目中多波束探测 的实际应用背景,具有可操作性。结合题目中所给信息,可以做出合理推理: (1)探测船的测线是一组平行的直线。倘若存在相邻的不平行的测线,其各自对应 的覆盖宽度线将不在同一竖直平面内,相邻两测线的重叠率无法计算。 (2)题目只给出了该矩形海域内的海况,由于缺乏对周围海域的资料,考虑到该情 况下多波束探测的可操作性(如问题三中海域的最东端水深仅有约 13.01m,这块海域 有一定概率存在礁石,浅滩,海崖等阻碍探测船的因素),以及问题二中模型的适用性 (未知海域的海底无法用斜坡近似) ,无法在基本情况未知的海域内设置测线。故问题三 的测线设计的范围在已知的矩形海域内。 由此分析可得,测线的设计可以分为以下三种: 图1 三种测线设计示意图 对于第一种设计(东西方向),可以发现其每条测线对应的覆盖投影形状相同,通 过计算发现其无法符合重叠率的约束条件,故排除。对于第二和第三种设计, 经过定性 和定量的比较,得到应选用第二种设计(南北方向)。运用贪心思想,同时考虑到本题 5 数据规模较小,采用搜索 + 迭代求得使测线总长度最小的每一条测线位置。 2 . 4 问题四分析 问题四提供了海域的由单波束测量的测深点数据,要求尽可能同时满足一系列有关 重叠率,覆盖海域与测线总长的要求,该问题实质上是一个带约束的多目标优化问题, 可对各项优化项构造目标函数 f (x)k 。分析可知各优化目标的目标函数在解空间上的下 降方向不一致(如“重叠率尽可能低”与“尽可能覆盖整个区域”是一对矛盾的目标), 所以该问题不存在一个令所有目标最优的解。本文使用线性加权法,对于每一项目标函 数 f (x)k 由 Topsis 熵权法根据其重要程度设定权重,从而转换为单目标优化问题。 在建立模型前需要进行数据预处理,通过线性插值法在离散的点数据中插入点数 据。考虑到问题三中建立的模型无法对曲面海底进行分析,本文采用微元思想,将实际 的海底曲面看做由许多足够小的与水平面平行的矩形“积分”而成。通过计算,可得误 差在可忽略的范围内。同时,由于地形的起伏,一条迹线产生的覆盖面积的投影并非规 则的几何图形,故采用微元思想将不规则的图形近似为可计算覆盖面积与重叠率的规则 图形。 测线设计问题,实际上就是设计各测线间距离 d 和测线方向的夹角 β。考虑到本题 优化目标的模糊性,基于贪心思想,对于每一个确定的 β 值,可运用迭代计算,结合问 题三中的模型设计算法得到该 β 值下的最优设计。再在一定精度下遍历可行的 β 值,通 过比较即可得到最终的设计方案。 三、 模型的假设 • 海面保持平静状态,测量船不受到任何颠簸或波动的影响。 • 在前三个问题的建模和分析中,我们假设海底可以被视为一个几何意义上的完美平 面,即不考虑海底的微小起伏和不规则性。 • 假设海水中的声速是均匀的,不考虑温度、盐度和深度对声速的影响。 • 假设海底的反射是完全的,且不考虑声波的折射。 • 假设多波束测深设备在固定的深度进行测量,不考虑设备的上下浮动。 • 假设多波束测深设备进行的是连续的测量,不考虑测量的间隔。 • 假设探测船不能到未知海域进行探测。 • 在第四问的模型建立中,假设多波束换能器的开角为 120°。 6 四、 符号说明 符号 意义 单位 D 海水深度 m D0 海域中心海水深度 m Di 第 i 条测线处海水深度 m Dj 位置 j 处海水深度 m Wi 第 i 条测线处多波束测距的覆盖宽度 m Wj 第 j 个位置处测线处多波束测距的覆盖宽度 m α 海床平面与水平面夹角(坡度) ° η 相邻两条测线覆盖宽度的重叠率 无 d 相邻两条测线的间距 m β 测线方向夹角 ° θ 测量船换能器开角 ° Li 第 i 条测线距海域中心点处距离 m xj 第 j 个位置处测量船距海域中心点处的距离 m d′i+1 第 i+1 条测线与第 i 条测线间的距离 m Xi 第 i 条测线与区域边界的距离 m Lsum 测线总长度 m L东西 海域东西方向上的长度 m L南北 海域南北方向上的长度 m N 测线个数 个 S漏 漏测海区面积 m2 P漏 漏测海区占总待测海域面积的百分比 无 lη 在重叠区域中,重叠率超过 20% 部分的长度 无 • 注:在文章其余部分公式中临时出现的符号会在公式后说明。 7 五、 模型的建立与求解 5 . 1 真实海底下各指标的明确与修正 5 . 1 . 1 覆盖宽度 W 定义的明确 由题目中所给信息,结合查阅相关资料,本文将覆盖宽度 W 定义为:覆盖宽度 W 为最边缘两条波束线与海底面交点连线在 xoy 坐标面上的投影的长度。,如下图所示: 图2 覆盖宽度图示 5 . 1 . 2 重叠率公式的修正 在海底平坦的情况下,重叠率公式为 d W −d η =1− = = W W W 2 − d− W W 2 即 重叠宽度 (1) 䨱盖宽度 但是在海底不平坦的真实海底情况下,两条相邻的条带的覆盖宽度一般是不一样 重叠率 = 的。例如,在问题一中,相邻条带覆盖情况大致如图 2 所示: 8 图3 重叠率修正模型示意图 如图所示,在计算这种情况下的两条相邻的条带的重叠率,存在对公式 1 中的分母 选取问题。“两条相邻条带的重叠率”应能同时较好地反映重叠面积在两条带各自的占 比。若选取较大的重叠宽度作为分母,得到的重叠率 η1 对覆盖宽度较小的条带显得过 大;同理,若选取较小的重叠宽度作为分母,得到的重叠率 η1 对覆盖宽度较大的条带 显得过小。 为此,本文设物理量 W̃i+1 , 表示第 i+1 测线的位于相对较深海域的那一部分覆盖宽 度加上第 i 条测线的位于相对较浅海域的那一部分覆盖宽度,其大小为: W̃i+1 = Wdi+1 + Wsi (2) 修正过的重叠率为: η̃i+1 = Wdi+1 + Wsi − d W̃i+1 − d d = =1− Wdi+1 + Wsi W̃i+1 W̃i+1 (3) 观察发现,在海底平坦的情况下,W̃i+1 = W , 所以海底平坦时的重叠率公式可以看 作该修正公式的一种特殊情况,这也说明修正公式具有更广泛的适用性。下文中修正重 叠率统一用 η 表示。 9 5 . 2 问题一模型的建立及求解 5 . 2 . 1 数学模型的建立与求解 根据题目所给的背景及信息,以将原多波束测深场景抽象为如下平面几何模型(如 图二所示): 图4 问题一的几何模型 临时变量解释如下:覆盖宽度 W 可由测量船所在位置的竖直线分成两个部分,其 属于海水深度相较更深的一部分为 Wdi ,属于海水深度相较更浅的一部分为 Wsi ;hd , h′d , hs ,h′s 均为辅助量。 对于该几何模型,运用三角函数相关公式可对覆盖宽度及相邻条带之间的重叠率进 行求解。由上述变量说明,可得: Wi = Wdi + Wsi (4) 第 i 条测线处的海水深度 Di 为: Di = D0 + Li · tan α (5) 其中,Li 为第 i 条测线距中心点处距离。 对于由 Wd ,hd 和 h′d 构成两条直角边的三角形 △AOB 做几何分析,由 ′ Di = hd − hd Wdi = hd · tan W = h′d di θ 2 (6) tan α 联立解得: Di · tan 2θ Wdi = 1 − tan 2θ · tan α 10 (7) 对于三角形 △EOC 做几何分析,由 ′ Di = hs + hs Wsi = hs · tan W = h′s si θ 2 (8) tan α 联立解得: Di · tan Wsi = 1 + tan θ 2 θ 2 (9) tan α 联立方程4,5,7,9, 可得: Wi = 2 · tan · (D0 + Li · tan α) 2 1 − tan 2θ · tan a θ 2 (10) 联立方程3,7,9, 可得重叠率为: ηi+1 = 1 − n d 1 − tan [2D0 + (Li + Li+1 ) · tan α] · tan θ 2 θ 2 2 o · tan a + (Li+1 − Li ) tan α · tan θ 2 2 (11) 在该模型中,θ 和 α 需要满足: θ+2·α≤π 5 . 2 . 2 问题一中待求表格的计算 使用 MATLAB 编写代码实现该数学模型,将题干表格中的数值带入该数学模型, 得到结果如下表所示: 表1 问题一求解结果 测线距中心点 -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.705 297.526 279.346 261.167 242.987 224.807 206.628 188.448 170.269 —— 34.9 30.8 26.1 20.8 14.6 7.5 处的距离/m 与前一条测线 的重叠率/% 11 -1(漏测) -1.13(漏测) 5 . 3 问题二模型的建立及求解 5 . 3 . 1 数学模型的建立与求解 根据题目所给的背景及信息,以将原多波束测深场景抽象为如下立体几何模型(如 图三所示): 图5 问题二的几何模型 可以看出,该模型在右视图上的投影符合模型一中的平面几何模型,故可运用立体 几何分析相关知识,结合问题一建立模型,过程如下: 第 j 条个位置处的海水深度 Dj 为: Dj = D0 + Xj · tan α · cos β 由 D = hd − h′d j hd = tanWdθ (2) hd′ = Wd · cos β − π · tan α = Wd · sin β · tan α 2 得 Wd = 由 tan 1 − tan θ 2 θ 2 Dj · sin β · tan α D = hs + hs ′ j hs = tanWsθ (2) ′ h = Ws · cos β − π · tan α = Ws · sin β · tan α s 2 得 Ws = tan 1 + tan θ 2 θ 2 Dj · sin β · tan α 联立上式可得第 j 条个位置处的覆盖宽度 Wj 为: 2 tan 2θ · (D0 + Xj · tan α · cos β) Wj = Wd + Ws = 2 1 − tan 2θ sin β · tan α 12 (12) (13) (14) (15) (16) (17) 5 . 3 . 2 问题二中待求表格的计算 使用 MATLAB 编写代码实现该数学模型,将题干表格中的数值带入该数学模型, 得到结果如下表所示: 表2 问题二求解结果 测量船距海域中心点处的距离/海里 覆盖宽度/m 0 0.3 0.6 0.9 1.2 1.5 1.8 2.1 0 415.692 466.091 516.490 566.889 617.288 667.686 718.085 768.484 45 416.120 451.794 487.468 523.142 558.816 594.491 630.165 665.839 90 416.549 416.549 416.549 416.549 416.549 416.549 416.549 416.549 135 416.120 380.446 344.772 309.098 273.424 237.750 202.076 166.402 180 415.692 365.293 314.894 264.496 214.097 163.698 113.299 62.900 225 416.120 380.446 344.772 309.098 273.424 237.750 202.076 166.402 270 416.549 416.549 416.549 416.549 416.549 416.549 416.549 416.549 315 416.120 451.794 487.468 523.142 558.816 594.491 630.165 665.839 测线 方向 夹角/° 5 . 4 问题三模型的建立及求解 5 . 4 . 1 设计一(东西方向)的分析 东西方向测线的特点是:每条测线的覆盖区域在水平面上的投影都是全等的梯形。 同时,为了满足覆盖整个区域的条件,该梯形的高应为区域的宽,即 4 海里;梯形的上 底和下底分别为在东侧和西侧的覆盖宽度,如下图所示: 观察可知,相邻条带的重叠率最高处为西侧边界,重叠率最低处为东侧边界,且重 叠率从西到东递减。为满足重叠率的要求,先令重叠率最高处(西侧边界)的重叠率为 20%,解得东侧边界的重叠率为-1173.31%, 出现了严重的漏测;再令重叠率最低处(东 侧边界)的重叠率为 10%,解得西侧的重叠率为 5.66%, 重叠率过小。如下图所示: 13 图6 设计一的重叠率问题 故设计一不能满足关于重叠率的约束条件。 5 . 4 . 2 设计二与设计三的分析 设计三(斜向)的俯视图如下图所示,为了满足完全覆盖整个待测海域的条件,考 虑到测线间都是平行的,需要相邻两条带的覆盖宽度的最短处的重叠率至少为 10%,覆 盖宽度的最宽处的重叠率至少为 20%,结合探测船的测线设计需在已知海域内的条件, 在测线斜向设计时会面临如下情况,可以看出,“覆盖整个海域”这一限制条件会令斜 向设计的测线重叠率偏高,效果上劣与设计二(南北方向)。 图7 斜向设计测线时会面临的情况 进一步考虑到,虽然测线在斜向设计时理论航线比竖直或者水平航线更短,但由于 测线两侧海深不一并且分布不均等原因,会造成测线起始和终止两端的覆盖宽度相差 较大,运用问题二中对于覆盖宽度和问题一中对于重叠率的数学模型,结合问题分析中 提出的两个合理假设,通过计算得出:不存在斜向的相邻两条测线,能同时满足“相邻 两条带的覆盖宽度的最短处的重叠率至少为 10%,覆盖宽度的最宽处的重叠率至少为 20%”的条件。综上,应选用设计二(南北方向)作为测线的设计方向。 5 . 4 . 3 设计二的求解算法 设计二(南北方向)的特点是:每条测线的覆盖区域在水平面上的投影都是以覆盖 宽度为宽,以矩形区域的长为长的矩形。运用贪心思想:为了达到在完全覆盖整个待测 14 海域的条件下使测线尽可能短的目标,必须使得每一条测线的有效覆盖面积最大,考虑 到重叠率越小重叠的总面积越小,可以以重叠率最小即 10%。即: d′ ηi+1 = 1 − fi+1 = 1 − Wi+1 L轱 Li = 2 − X i X = X + d′ i+1 i d′i+1 Wdi+1 +Wsi = 10% (18) i+1 其中,d′i+1 为第 i+1 条测线与第 i 条测线间的距离;Xi 为第 i 条测线与区域边界的 距离;L东西 为海域东西方向上的长度,即 7408 米。 由方程18可以由 Xi 求得 Xi+1 , 并令测线总数 N 加一。直到满足以下条件: Xi + Wsi ⩾ L东西 (19) 由于 Xi+1 需要由 Xi 求得,所以 X1 需要单独计算,由贪心思想,希望第一条测线 的覆盖区域的边界与矩形区域的边界恰重合。即由下式可解得 X1 : h D0 + X1 = Wdr = i − X1 · tan a · tan 1 − tan 2θ · tan α L东西 2 θ 2 (20) 最后,设计测线的总长度即为: Lsum = N ∗ L南北 其中,L南北 =3204 米。 求解问题三的伪代码如下: Algorithm 1 求解问题三的伪代码 INITIALIZE: i=0,N=0 Output: Lsum 1: 由公式 (20) 计算 X1 2: 由 X1 和公式 (9) 计算 Ws1 3: while Xi + Wsi ⩾ L东西 do 4: i=i+1 5: 由 Xi 和方程组(18)求解 Xi+1 6: 由 Xi+1 和公式 (9) 计算 Wsi+1 7: end while 8: N=i+1 9: Lsum = N ∗ L南北 15 (21) 5 . 4 . 4 问题三的求解 运用 MATLAB 按照上述流程进行编程计算,由于考虑到探测船从西侧到东侧与从 东侧到西侧的最终结果可能不同,故分别计算。探测船从东侧到西侧时其测线设计结果 如表所示: 表3 问题三测线详情 序号 i 1 2 3 4 5 6 7 8 9 Xi/m 358.52 950.55 1496.13 1998.90 2462.23 2889.22 3282.70 3645.31 3979.48 覆盖宽度/m 685.93 632.12 582.53 536.83 494.71 455.90 420.13 387.17 356.80 序号 i 10 11 12 13 14 15 16 17 18 Xi/m 4287.43 4571.22 4832.74 5073.75 5295.85 5500.52 5689.14 5862.96 6023.15 覆盖宽度/m 328.80 303.01 279.24 257.33 237.14 218.54 201.39 185.59 171.03 序号 i 19 20 21 22 23 24 25 26 27 Xi/m 6170.76 6306.80 6432.16 6547.69 6654.15 6752.27 6842.68 6926.00 7002.79 覆盖宽度/m 157.61 145.25 133.85 123.35 113.67 104.76 96.54 88.96 81.98 序号 i 28 29 30 31 32 33 34 Xi/m 7073.55 7138.76 7198.85 7254.23 7305.26 7352.29 7395.63 覆盖宽度/m 75.55 69.63 64.16 59.13 54.49 50.22 46.28 其中,Xi 为第 i 条测线与区域边界(也就是东侧边界)的距离。 运用 MATLAB 将测线可视化如下: 16 图8 问题三测线的可视化 测线个数为: N = 34 由此计算得到测线总长度为: Lsum = 108936m 经过计算,探测船从西侧到东侧时其测线设计结果与此相差很小,故可以认为以上 结果就是最终的测线设计结果。 5 . 5 问题四模型的建立及求解 5 . 5 . 1 数据预处理与模型近似 由题中附件可知,其东西和南北方向上的测量分度值皆为 0.02 海里,即 37.04 米, 存在单波束测线法测线间缺少数据的问题,为提高求解精度,采用线性插值法在相邻数 据点之间进行插值,使得原本离散的数据在一定精度上近似连续,插值后的海域深度可 视化如下: 17 图9 插值后的海域深度 考虑到问题三中建立的模型无法对曲面海底进行分析,需要对该海底区域进行近 似,运用微元思想,对以下几方面进行近似分析: •1. 将实际的海底曲面看做由许多 1m*1m 的与水平面平行的矩形“积分”而成。以 一块深度变化较为均匀的海域为例,近似方法如下图所示: 图 10 海底曲面的近似方法 同时,由于地形的起伏,一条迹线产生的覆盖面积的投影并非规则的几何图形,将 18 一条测线分为多条长 1m 的小段,对于相邻条带之间的重叠率和覆盖面积近似计算: •2. 针对每一小段,其覆盖面积为:该段中点处的覆盖宽度 W小段 i *1m,整条测线的 覆盖面积为所有小段的覆盖宽度 W小段 i 之和,即 第 k 条测线的覆盖面积Sk = n X W小段i i 近似方法如下图所示: 图 11 关于覆盖面积的近似方法 •3. 每一小段的中点与相邻测线的平行位置处可计算该点的重叠率 η小段 i , 统计第 k 条测线整条测线的重叠率超过 20% 的小段数占所有段数的比例,记为 pk ,即 pk = 大于 20% 的 η小段 i 的个数 第 k 条测线的小段总数 通过计算,在单位为米的情况下上述两项近似的误差的数量级最高为 10−1 ,认为可 忽略。 5 . 5 . 2 Topsis 熵权法建立综合评价指标 针对每一条测线 i, 在搜寻下一条测线 i + 1 的最优位置时,需要考虑:(1)漏测的 海域占比,(2)重叠率超过 20 % 的测线长度占比,(3)测线长度三个指标。考虑到海 底实际地形复杂多异,这三种指标受环境影响程度较大。本文选取 Topsis 熵权法进行综 合指标评价。 考虑到这三项指标皆为极小值指标,故在运用 Topsis 法之前进行正向化,将其转变 为极大型指标:X = max(x)−x。正向化后,为了消除指标由于不同量纲带来的影响,需 要对数据组进行标准化,对 X 进行标准化后的矩阵记为 Xstandard ,其中元素为 sij 。 熵权法是一种较客观的赋权方法, 对矩阵 Xstandard 中的负数进行修正后得到 Xstandard , 引入核心参数信息熵,信息熵的自变量为概率矩阵 P , 其求解公式为: Xstandard Pij = Pn i=1 Xstandard 19 (22) 得到概率矩阵 P 后,可用来计算上述三种指标的信息熵: 1 X kj = − Pij ln(Pij ) ln(n) i=1 n (23) 得到信息熵后,要对信息熵定义信息效用值定义 zj = 1 − kj ,将信息效用值进行归 一化后,得到熵权: zj w j = P2 j=1 zj (24) 熵权法相较更为客观,但是对异常数据的抗干扰能力不强,故结合优劣解矩法(Topsis),利用其专业性科学性强的特点能得到更为合理地权重,过程如下:首先定义一行 向量 Xmax ,其中每一个元素为对应列的最大值,同理定义 Xmin 。利用得到的权重 wj , 计算第 i 个评价对象与最大值的距离 Dmax 如下 (Dmin 同理): v u 2 uX wj · (Xmax (j) − sij )2 Dmax (i)t (25) j=1 由此计算出评价对象的得分,将其归一化后得到最终的指标权重: Ci = Dmin (i) Ci , Ci = Pn Dmax (i) + Dmin (i) i=1 Ci (26) 5 . 5 . 3 问题四模型的建立 考虑到本题优化目标的模糊性,如果能使所有相邻两条测线的重叠情况和漏测情况 在本模型的评价体系中达到最优,那么在全局上该结果近似最优。基于此思想,本文将 全局测线设计问题转化为多个“寻找当前测线的最优下一测线”的子问题。参考问题三 中的模型:对于每一条已有的测线,分别建立其综合评价指标,在一定可行范围内搜索 使得指标最优的测线位置,作为下一条测线位置,直至当前测线能完全覆盖海域边界。 对于该区域,令一条经过整个区域平面的中点测线作为第一条已知测线,向左右两 个方向分别迭代求解测线,算法流程图如下所示: 20 图 12 问题四算法流程图 5 . 5 . 4 问题四模型的求解 利用上述算法,运用 MATLAB 编程求解,从 0° 到 180° 以 1° 为单位遍历 β ,解得 每一个 β 值对应的最佳测线设计,并统计各指标的值,得到的结果如下图所示: 图 13 重叠率超过 20% 的测线占总测线的比例随 β 的变化关系图 21 图 14 漏测海区面积占比随 β 的变化关系图 图 15 测线总长度随 β 的变化关系图 利用上述数据通过 Topsis 熵权法得到上述三个指标各自对最终效果的影响权重为: 序号 指标值 重叠率超过 20% 的测线占总测线的比例 28.4% 漏测海区面积占比 61.7% 测线总长度 9.9% 即综合评价指标 = 0.284* 重叠率超过 20% 的测线占总测线的比例 + 0.617* 漏测海 区面积占比 + 0.099* 测线总长度,利用已有数据,结算得到综合评价指标最高时: β = 115° 各项指标分别为: 22 序号 指标值 重叠率超过 20% 的部分测线总长度 31349.21m 漏测海区面积占比 10.04% 测线总长度 381806.19m 此时的测线图为: 图 16 问题四测线图 六、 模型的检验与分析 6 . 1 修正重叠率公式的合理性检验 设四个待选重叠率 ηi , ηi+1 , ηave , η̃, 其计算公式分别为: (1)ηi = 1 − d Wi ,表示第 i 和 i+1 个条带间的重叠面积占第 i 个条带覆盖宽度的比 例。 (2)ηi+1 = 1 − Wid+1 ,表示第 i 和 i+1 个条带间的重叠面积占第 i+1 个条带覆盖宽度 的比例。 (3)ηave = 2(W̃i+1 −d) Wi +Wi+1 ,表示第 i 和 i+1 个条带间的重叠面积占第 i 和 i+1 个条带覆盖 宽度平均值的比例。 (4)η̃i+1 = 1 − d ,表示第 W̃i+1 i 和 i+1 个条带间的重叠面积占 W̃i+1 的比例。 为检验各重叠率公式的合理性,需要分别考虑待选重叠率对于相邻两个条带各自的 重叠率(也就是 ηi 和 ηi+1 )的偏差,所以设如下判断指标: v u 8 uX ε = 100 ∗ t (η待 − ηi )2 + (η待 − ηi+1 )2 i=1 23 (27) 采用问题一中得到的数据编程计算,η待 分别带入各待选重叠率,得到对应的 ε 值, 结果如下表所示: 序号 指标值 ε(1) 20.3211 ε(2) 20.3211 ε(3) 14.43 ε(4) 14.4257 由此可见,第四种重叠率,也就是修正后的重叠率具有最小的指标值,能够最好地 表示“相邻两条带间的重叠率”。而 ε(4) 与 ε(3) 相差不大的原因可能是问题一中坡度较 小。 6 . 2 灵敏度分析 现针对问题二中建立的模型进行灵敏度分析。在问题二建立的数学模型中,覆盖宽 度 W 与多波束换能器的开角 θ,测线方向夹角 β,海床平面与水平面夹角(坡度)α 等 有关,故分别选取上述各因素作为自变量,控制其他因素相等,计算其在一定取值范围 内覆盖宽度的变化情况,并对结果做可视化与分析。 (1)多波束换能器的开角 θ:令 D=120m,β=90°,α=1.5°,θ 取值范围为(0°,160°) , 计算覆盖宽度的变化情况: 图 17 W 随 θ 的变化情况 可以看出,覆盖宽度 W 随着多波束换能器的开角 θ 的增大而增大,且敏感度在 120° 之后显著提高。但较大的 θ 会造成对设备性能要求的提高,也会使波束从发射到接受的 路程增加,在实际探测过程中需要进行权衡。 24 (2)测线方向夹角 β:令 D=120m,θ=120°,α=1.5°,β 取值范围为(0°,180°) ,计算 覆盖宽度的变化情况: 图 18 W 随 β 的变化情况 由图可以看出,探测船在坡度较小的近似斜坡上时,某一确认位置的覆盖宽度 W 随 β 变化而变化的幅度不大,且关于 β = 90° 对称,在 β = 90° 时达到最大值。在实际 探测中,可借此减少探测任务量或者判断探测地形。 (3)坡度 α:令 D=120m,θ=120°,β=90°,α 取值范围为(0°,30°)(当 α ≥ 30° 时将 测线与坡面无交点),计算覆盖宽度的变化情况: 图 19 W 随 α 的变化情况 可以看出,覆盖宽度 W 随着多波束换能器的开角 θ 的增大而增大,且角度较小时 敏感度较小时,角度较大时敏感度显著增大,这是由于坡度的提升造成了波束测线可以 探测到更深更远的地方。 在实际探测中,在坡度不同的区域探测船可以灵活地选取多波束换能器的开角和测 线方向夹角以获取最优的探测效果。 25 6 . 3 误差分析 本文中的多波束测线模型的误差主要来自以下几个方面: 1. 若干年前的数据单波束测深数据可能存在测量误差或已经不再准确地反映当前 的海底地形。 2. 在建模过程中,可能需要对海底地形进行一些简化或假设,例如假设海底地形是 均匀的或呈线性变化。这些假设可能与实际情况不符,从而导致误差。 3. 海流、风向、天气等因素可能会影响多波束测深的效果。 七、 模型的评价 7 . 1 模型的优点 1. 数据处理方面:本文对需要参与几何运算、模型测试的数据进行了归一化与标准 化,保证了数据的合理、科学性。 2. 模型建立方面:本文使用数学相关知识严密推导建立模型,符合几何公式基本性 质,具有严密性、可靠性。 3. 数据可视化方面:本文根据求解出的数据进行了不同程度的可视化;包括海床曲 面、测量船覆盖宽度、测线示意图等。 4. 指标选取方面:本文采用 Topsis 熵权法,兼顾优化指标的客观性与科学性,能够 有效地评测出求解结果的优劣。 7 . 2 模型的缺点 1. 本文所采取的算法基于搜索,导致在算法运行上需要一定的时间 2. 本文中的测线设计算法基于贪心思想,由于对模型的简化过程种可能产生一定 的误差,因此最终得到的结果可能偏离全局最优解。 7 . 3 模型的推广 本文对海洋探测中多波束测线的应用进行了较为完整的分析,通过构建几何模型和 优化算法进行测线的设计任务。在几何模型的建立中进行严密的推导,对真实海底情况 在误差可接受的范围内近似处理,同时产生有效的总和评价指标,因此,该模型对于实 际操作中具有一定实践意义。资料显示,多波束测线的应用在海洋地质研究,海洋资源 勘探,环境保护与监测,考古与文化遗产保护等领域都有重要的应用空间,本文中模型 的研究能为多波速测线在多领域的应用设计提供一些帮助。 26 八、 参考文献 [1]Manchester R,Lyne A,Camilo F, et al. The Parkes multi‐beam pulsar survey –I. Observing and data analysis systems, discovery and timing of 100 pulsars[J]. Monthly Notices of the Royal Astronomical Society,2001,328(1). [2] 刘经南, 赵建虎. 多波束测深系统的现状和发展趋势 [J]. 海洋测绘, 2002, 22(5): 3-6. [3]W.J.Capell and K. C. Kiesel, ”An Extended Capability Multibeam Bathymetric Mapping Systems,” Proceedings OCEANS, Seattle, WA, USA, 1989, pp. 1124-1129, doi: 10.1109/OCEANS.1989.587492. [4]Glenn M F. Introducing an operational multi-beam array sonar[J]. The International Hydrographic Review, 1970. [5]Renard V, Allenou J P. Sea Beam, Multi-Beam Echo-Sounding in” Jean Charcot”Description, Evaluation and First Results[J]. The International Hydrographic Review, 1979. 27 附录 A 支撑材料的文件列表 MATLAB源码 问题一结果(result1).xlsx 问题二结果(result2).xlsx 问题三结果.xlsx 问题三结果图.png 问题四结果图.png 附录 B 根据求解结果画航线图 function [] = draw_lines(lines,beta,sea_depth_matrix) for i=1:100 datax = cell2mat(lines(i)); if isempty(datax) n=i-1; break; end end data2 = zeros(n,3); for i=1:n data1 = cell2mat(lines(i)); data2(i,1) = data1(1,4) - cos(beta*pi/180); data2(i,2) = data1(1,5) - sin(beta*pi/180); data2(i,3) = beta; end n=size(data2,1); %定义一个n*4数组,存航线起点与终点 side = zeros(n,4); [nrows, ncols] = size(sea_depth_matrix); x = 0 : 0.02 : (ncols-1)*0.02; y = 0 : 0.02 : (nrows-1)*0.02; x = x.*1852; y = y.*1852; figure; surf(x, y, sea_depth_matrix,'FaceAlpha',0.5,'EdgeColor','none'); xlabel('西WE东'); ylabel('南SN北'); zlabel('Depth'); colormap(jet(30)); colorbar; set(gca, 'ZDir', 'reverse'); % 反转 Z 轴的方向 28 [x, y] = meshgrid(0:0.02:(size(sea_depth_matrix,2)-1)*0.02, 0:0.02:(size(sea_depth_matrix,1)-1)*0.02); xq = x(:); yq = y(:); vq = sea_depth_matrix(:); hold on view(0,90); % 设置视角为 3D 视角 for i=1:n [side(i,1),side(i,2),side(i,3),side(i,4)] = draw_line(data2(i,1),data2(i,2),data2(i,3)); %在一个矩阵上画图 hold on plot([side(i,1),side(i,3)],[side(i,2),side(i,4)],'LineStyle','-','Color',[ 0 0 0],'LineWidth',1); axis('square'); axis('equal'); end ylabel('南SN北'); xlabel('西WE东'); % hold on plot([0,7408],[0,0],'LineStyle','-','Color',[ 1 0 0]); hold on plot([0,0],[0,9260],'LineStyle','-','Color',[ 1 0 0]); hold on plot([0,7408],[9260,9260],'LineStyle','-','Color',[ 1 0 0]); hold on plot([7408,7408],[0,9260],'LineStyle','-','Color',[ 1 0 0]); legend('','','','','','','','','','','','','','','','','','','','','','','','','','', ... '','','','','航迹线'); end function [x_e,y_e,x_0,y_0] = draw_line(x0,y0,beta) %先判断起始点的横纵坐标是否在坐标轴上 if (y0-0<1e-4) &&beta ~=0 &&beta ~=90 %直接求终点 x_0 = x0; f =@(x) tan(beta*pi/180)*x+y0-x0*tan(beta*pi/180); y_e = round(f(7408)); x_e = 7408; x_0 =x0; 29 y_0 =y0; %判断y_e有没有超出去 if y_e >9260 y_e = 9260; x_e = x0 +y_e/tan(beta*pi/180); end elseif (x0-0<1e-4)&&beta ~=0 &&beta ~=90 y_0 = y0; f =@(x) tan(beta*pi/180)*x+y0-x0*tan(beta*pi/180); x_e = 7408; y_e = f(x_e); x_0 =x0; y_0 =y0; if y_e > 9260 y_e = 9260; x_e = x0 +(y_e-y0)/tan(beta*pi/180); end elseif beta ==0 x_0 = x0; y_0 = y0; x_e = 7408; y_e = y_0; elseif beta ==90 x_0 = x0; y_0 = y0; x_e = x_0; y_e = 9260; end end 附录 C 画曲面图 planeSize = 1; xDim =20; yDim = 20; %zDim = xDim * yDim zDim =400; zzdim = sqrt(zDim); %引入原本的曲面部分 x = 0:1:20; y = 0:1:20; z = depth_plate(1:21,1:21); 30 figure(1); surf(x, y, z,'FaceAlpha',0.5,'EdgeColor','none'); xlabel('西WE东'); ylabel('南SN北'); zlabel('Depth'); % 反转 Z 轴的方向 set(gca, 'ZDir', 'reverse'); [x, y] = meshgrid(0:0.02:(size(z,2)-1)*0.02, 0:0.02:(size(z,1)-1)*0.02); xq = x(:); yq = y(:); vq = z(:); %将得到的矩形平面数据进行拼接 figure(2); number =1; for m =1:zzdim for z = 1:zzdim k=1; for y = 1:yDim for x = 1:xDim % 定义矩形平面 X = [x+z-1, x+z+planeSize-1, x+z+planeSize-1, x+z-1]./1852; Y = [y+m-1, y+m-1, y+planeSize+m-1, y+planeSize+m-1]./1852; if k~=0 Z = [depth_plate(x+z-1,y+m-1), ... depth_plate(x+z-1,y+m-1), ... depth_plate(x+z-1,y+m-1),... depth_plate(x+z-1,y+m-1)]; %进行拼接 patch(X, Y, Z, [0 1 0]); else Z = [18 ,18 ,18 ,18]; end hold on; k=0; end end end end % 反转 Z 轴的方向 set(gca, 'ZDir', 'reverse'); daspect([1 1 1]); view(3) 31 附录 D 问题一建模求解 %calculate_sea_depth.m function sea_depth=calculate_sea_depth(length2central,alpha,benchmark) sea_depth=benchmark-tan(alpha*pi/180)*length2central; %根据几何关系计算海水深度 end %calculate_coverage_width.m function coverage_width=calculate_coverage_width(sea_depth,theta,alpha) wd=sea_depth/(tan(alpha*pi/180)+1/tan(theta*pi/360)); %深侧 ws=sea_depth/(-tan(alpha*pi/180)+1/tan(theta*pi/360)); %浅侧 coverage_width=[wd+ws,wd,ws]; %覆盖宽度由两侧的测量宽度组成 end %calculateq1.m length2centrals=[-800,-600,-400,-200,0,200,400,600,800]; depths=zeros(9,1); widths=zeros(9,3); overlaprate=zeros(8,1); d=200; for i=1:9 depths(i)=calculate_sea_depth(length2centrals(i),1.5,70); widths(i,:)=calculate_coverage_width(depths(i),120,1.5); end for j=1:8 overlaprate(j)=1-d/(widths(j,3)+widths(j+1,2)); end 附录 E 问题二建模求解 %calculate_sea_depth2.m function sea_depth=calculate_sea_depth2(length2central,beta,alpha,benchmark) sea_depth=benchmark+tan(alpha*pi/180)*length2central*cos(beta*pi/180); %根据几何关系计算海水深度 end %calculate_coverage_width2.m function coverage_width=calculate_coverage_width2(sea_depth,theta,alpha,beta) ws=sea_depth/(tan(alpha*pi/180)*sin(beta*pi/180)+1/tan(theta*pi/360)); wd=sea_depth/(-tan(alpha*pi/180)*sin(beta*pi/180)+1/tan(theta*pi/360)); coverage_width=[wd+ws,wd,ws]; %覆盖宽度由两侧的测量宽度组成 end %calculateq2.m length2centrals2=[0,0.3,0.6,0.9,1.2,1.5,1.8,2.1]; 32 length2centrals2=length2centrals2*1852; depths2=zeros(8,1); widths2=zeros(8,3); beta=45; %取不同�值 for i=1:8 depths2(i)=calculate_sea_depth2(length2centrals2(i),beta,1.5,120); widths2(i,:)=calculate_coverage_width2(depths2(i),120,1.5,beta); end 附录 F 问题三建模求解 %search_next3.m function result=search_next3(alpha,benchmark) index=zeros(1,50); widths=zeros(3,50); depths=zeros(1,50); index(1,1)=tan(120*pi/360)*(benchmark+3704*tan(alpha*pi/180)); depths(1,1)=calculate_sea_depth(index(1,1)-3704,1.5,110); widths(:,1)=calculate_coverage_width2(depths(1,1),120,1.5,90); %计算出第一根航迹的具体位置及相关数据 for i=2:50 index(1,i)=(0.9*widths(3,i-1)+index(1,i-1)+((990+9*3704*tan(alpha*pi/180))/(10* ... (-tan(alpha*pi/180)+1/tan(60*pi/180)))))/(1+(0.9*tan(alpha*pi/180)/(-tan(alpha*pi/180)+1/tan(60*pi/180))) if index(1,i)>=7408 break end depths(1,i)=calculate_sea_depth(index(1,i)-3704,1.5,110); widths(:,i)=calculate_coverage_width2(depths(1,i),120,1.5,90); result=[index;widths;depths]; end %calculateq3.m sea_routes=zeros(5,50); sea_routes=search_next3(1.5,110); %paintq3.m x = interval32(1:34, 1); dline=interval32(1:34, 3); sline=interval32(1:34, 2); widthpatch=interval32(1:34, 2:3); widthpatch(1,2)=358; % 创建一个空画布 figure; % 绘制长方形 x_rect = [0, 7408, 7408, 0, 0]; 33 y_rect = [0, 0, 3704, 3704, 0]; plot(x_rect, y_rect, 'b'); % 绘制竖线 for i = 1:34 line([x(i), x(i)], [1, 3704], 'Color', 'black','LineWidth', 1.5); end hold on for i = 1:34 line([x(i)-dline(i), x(i)-dline(i)], [0, 3704], 'Color', 'k', 'LineStyle', '--','LineWidth', 1); end hold on for i = 1:34 line([x(i)+sline(i), x(i)+sline(i)], [0, 3704], 'Color', 'k', 'LineStyle', '--'); end hold on x_rect = [0, 7408, 7408, 0]; y_rect = [0, 0, 3704, 3704]; alpha=0.5; fill(x_rect, y_rect, [0.85,0.85,0.85], 'FaceAlpha', alpha, 'EdgeColor', 'none'); hold on; for i=1:33 x_rect = [x(i)-dline(i), x(i+1)+sline(i+1), x(i+1)+sline(i+1), x(i)-dline(i)]; y_rect = [0, 0, 3704, 3704]; alpha=0.5; fill(x_rect, y_rect, [0.5,0.5,0.5], 'FaceAlpha', alpha, 'EdgeColor', 'none'); end % 设置坐标轴范围 xlim([2, 6]); ylim([2, 4]); % 设置坐标轴范围 xlim([1, 7408]); ylim([1, 3704]); % 显示图像 title('航迹图'); xlabel('x'); ylabel('y'); 附录 G 问题四建模求解 interpolated_depth.m % 已经有了网格数据的 x,y 坐标和对应的海水深度值 q4x = 0:0.02:4; q4y = 0:0.02:5; q4x=q4x*1852; 34 q4y=(q4y*1852)'; q4depth = Untitled; % 定义插值网格的 x 和 y 坐标 xi = 0:7408; yi = (0:9260)'; % 使用 griddata 函数进行插值 interpolated_depth = griddata(q4x, q4y, q4depth, xi, yi); % 现在,interpolated_depth 中包含了插值后的每个点的海水深度值 %calculate_depth_plate.m %生成1m*1m水深数据 depthplate2=zeros(9260,7408); for i=1:9260 for j=1:7408 depthplate2(i,j)=(interpolated_depth(i,j)+interpolated_depth(i+1,j)+interpolated_depth(i,j+1)+interpolate end end %caculate_coverage_width4.m function result=caculate_coverage_width4(startpoint,beta) flag=0; depthplate2 = evalin('base', 'depthplate2'); if beta==0 endpoint=[7408,startpoint(1,2)]; linelength=7408; end if beta==90 endpoint=[startpoint(1,1),9260]; linelength=9260; end if (tan(beta*pi/180) <= (9260-startpoint(1,2))/(7408-startpoint(1,1))) && beta~=0 endpoint=[7408,startpoint(1,2)+(7408-startpoint(1,1))*tan(beta*pi/180)]; linelength=floor(sqrt((endpoint(1,1)-startpoint(1,1))^2 +(endpoint(1,2)-startpoint(1,2))^2)); end if tan(beta*pi/180) > (9260-startpoint(1,2))/(7408-startpoint(1,1)) && beta~=90 endpoint=[startpoint(1,1)+(9260-startpoint(1,2))*tan((90-beta)*pi/180),9260]; linelength=floor(sqrt((endpoint(1,1)-startpoint(1,1))^2 +(endpoint(1,2)-startpoint(1,2))^2)); end linelengths=ones(linelength,1); linelengths=linelengths*linelength; testpoint=zeros(linelength,2); pointwidth=zeros(linelength,2); for i=1:linelength testpoint(i,:)=[startpoint(1,1)+i*cos(beta*pi/180),startpoint(1,2)+i*sin(beta*pi/180)]; calculate_depth=0;j=0; hx=ceil(startpoint(1,1)+i*cos(beta*pi/180));hy=ceil(startpoint(1,2)+(i*sin(beta*pi/180))+0.0000000001); 35 avgdepth=depthplate2(hx,hy); while calculate_depth<=avgdepth j=j+1; hx=ceil(startpoint(1,1)+i*cos(beta*pi/180)+j*cos((90-beta)*pi/180));hy=ceil(startpoint(1,2)+i*sin(beta*pi if hx==7409 || hy==0 if hx==7409 pointwidth(i,2)=(7408-testpoint(i,1))/sin(beta*pi/180); elseif hy==0 pointwidth(i,2)=testpoint(i,2)/cos(beta*pi/180); end flag=1; break end flag=0; avgdepth=depthplate2(hx,hy); calculate_depth=calculate_depth+1/sqrt(3); end if flag ==0 j=j-1; hx=ceil(startpoint(1,1)+i*cos(beta*pi/180)+j*cos((90-beta)*pi/180));hy=ceil(startpoint(1,2)+i*sin(beta*pi avgdepth=depthplate2(hx,hy); pointwidth(i,2)=avgdepth*sqrt(3); end end for i=1:linelength testpoint(i,:)=[startpoint(1,1)+i*cos(beta*pi/180),startpoint(1,2)+i*sin(beta*pi/180)]; calculate_depth=0;j=0; hx=ceil(startpoint(1,1)+i*cos(beta*pi/180));hy=ceil(startpoint(1,2)+(i*sin(beta*pi/180))+0.00000000000001); avgdepth=depthplate2(hx,hy); while calculate_depth<=avgdepth j=j+1; hx=ceil(startpoint(1,1)+i*cos(beta*pi/180)-j*cos((90-beta)*pi/180));hy=ceil(startpoint(1,2)+i*sin(beta*pi if hx==0 || hy==9261 if hx==0 pointwidth(i,1)=testpoint(i,1)/sin(beta*pi/180); elseif hy==9261 pointwidth(i,1)=((9260-testpoint(i,2))/cos(beta*pi/180)); end flag=1; break end flag=0; avgdepth=depthplate2(hx,hy); calculate_depth=calculate_depth+1/sqrt(3); end if flag ==0 j=j-1; 36 hx=ceil(startpoint(1,1)+i*cos(beta*pi/180)-j*cos((90-beta)*pi/180));hy=ceil(startpoint(1,2)+i*sin(beta*pi avgdepth=depthplate2(hx,hy); pointwidth(i,1)=avgdepth*sqrt(3); end end result=[pointwidth,linelengths,testpoint]; end %calculate_overlap_rate.m function overlap_rate=calculate_overlap_rate(csize,line1,line2,angleflag,direction,passflag,incorner,beta) if direction==1 gap=csize*tan(beta*pi/180); else gap=csize/tan(beta*pi/180); end overrate12=zeros(min(line2(1,3),line1(1,3)-csize),1); if direction==1 && angleflag==1 && incorner==0 %1 for i=1:line2(1,3) overrate12(i)=1-gap/(line1(i+csize,2)+line2(i,1)); end elseif direction==0 && angleflag==1 && passflag==0 && incorner==0 %2 for i=1:(line2(1,3)-csize) overrate12(i)=1-gap/(line1(i+csize,1)+line2(i,2)); end elseif direction==0 && angleflag==1 && passflag==1 && incorner==0 %3 for i=1:line2(1,3) overrate12(i)=1-gap/(line1(i+csize,1)+line2(i,2)); end elseif angleflag==0 && direction==0 && incorner==0 %4 for i=1:line2(1,3) overrate12(i)=1-gap/(line1(i+csize,1)+line2(i,2)); end elseif angleflag==0 && direction==1 && passflag==0 && incorner==0 %5 for i=1:(line2(1,3)-csize) overrate12(i)=1-gap/(line1(i+csize,2)+line2(i,1)); end elseif angleflag==0 && direction==1 && passflag==1 && incorner==0 %6 for i=1:line2(1,3) overrate12(i)=1-gap/(line1(i+csize,2)+line2(i,1)); end 37 elseif angleflag==1 && direction==0 && passflag==0 && incorner==1 %7 for i=1:(min(line2(1,3),line1(1,3)-csize)) overrate12(i)=1-gap/(line1(i+csize,1)+line2(i,2)); end elseif angleflag==0 && direction==1 && passflag==0 && incorner==1 %8 for i=1:(min(line2(1,3),line1(1,3)-csize)) overrate12(i)=1-gap/(line1(i+csize,2)+line2(i,1)); end end overlap_rate=[sum(overrate12>0.2)/numel(overrate12);numel(overrate12);overrate12]; end %calculate_missing_rate.m function result=calculate_missing_rate(csize,line1,line2,angleflag,direction,passflag,incorner,beta,overrate12) overrate12(1,:)=[]; missing_rate=0;totalarea12=0; if direction==1 gap=csize*tan(beta*pi/180); else gap=csize/tan(beta*pi/180); end if direction==1 && angleflag==1 && incorner==0 %1 for i=1:csize totalarea12=totalarea12+line1(i,2); end for i=(csize+line2(1,3)):line1(1,3) totalarea12=totalarea12+line1(i,2); end for i=1:line2(1,3) if overrate12(i)>=0 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-2*totalarea12/((line1(1,3)+line2(1,3))*gap); elseif direction==0 && angleflag==1 && passflag==0 && incorner==0 %2 for i=1:csize totalarea12=totalarea12+line1(i,1); end for i=(-csize+line2(1,3)):line2(1,3) 38 totalarea12=totalarea12+line2(i,2); end for i=1:(line2(1,3)-csize) if overrate12(i)>=0 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-2*totalarea12/((line1(1,3)+line2(1,3))*gap); elseif direction==0 && angleflag==1 && passflag==1 && incorner==0 %3 for i=1:csize totalarea12=totalarea12+line1(i,1); end for i=(csize+line2(1,3)):line1(1,3) totalarea12=totalarea12+line1(i,1); end for i=1:line2(1,3) if overrate12(i)>=0 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-2*totalarea12/((line1(1,3)+line2(1,3))*gap); elseif angleflag==0 && direction==0 && incorner==0 %4 for i=1:csize totalarea12=totalarea12+line1(i,2); end for i=(csize+line2(1,3)):line1(1,3) totalarea12=totalarea12+line1(i,2); end for i=1:line2(1,3) if overrate12(i)>=0 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-2*totalarea12/((line1(1,3)+line2(1,3))*gap); elseif angleflag==0 && direction==1 && passflag==0 && incorner==0 %5 for i=1:csize totalarea12=totalarea12+line1(i,2); end 39 for i=(-csize+line2(1,3)):line2(1,3) totalarea12=totalarea12+line2(i,1); end for i=1:(line2(1,3)-csize) if overrate12(i)>=0 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-2*totalarea12/((line1(1,3)+line2(1,3))*gap); elseif angleflag==0 && direction==1 && passflag==1 && incorner==0 %6 for i=1:csize totalarea12=totalarea12+line1(i,2); end for i=(csize+line2(1,3)):line1(1,3) totalarea12=totalarea12+line1(i,2); end for i=1:line2(1,3) if overrate12(i)>=0 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-2*totalarea12/((line1(1,3)+line2(1,3))*gap); elseif angleflag==1 && direction==0 && passflag==0 && incorner==1 %7 for i=1:csize totalarea12=totalarea12+line1(i,1); end for i=1:(min(line2(1,3),line1(1,3)-csize)) if overrate12(i)>=0 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-totalarea12/((line1(1,3)*gap)-(line1(1,3)-line2(1,3))*(line1(1,3)-line2(1,3))*sin(beta*pi/180 elseif angleflag==0 && direction==1 && passflag==0 && incorner==1 %8 for i=1:csize totalarea12=totalarea12+line1(i,2); end for i=1:(min(line2(1,3),line1(1,3)-csize)) if overrate12(i)>=0 40 totalarea12=totalarea12+gap; else totalarea12=totalarea12+gap/(1-overrate12(i)); end end missing_rate=1-totalarea12/((line1(1,3)*gap)-(line1(1,3)-line2(1,3))*(line1(1,3)-line2(1,3))*sin(beta*pi/180 end result=[missing_rate,totalarea12]; end %calculate_best.m function x_end = calculate_best(X) % X表示数据组,行数表示数据个数,列数表示评价指标个数 %需要导入的数据是X [n,m]=size(X); %正向化 for i = 1 : m X_z(:,i) = calculate_positivization(X(:,i)); end %对正向化后的矩阵进行标准化 x_next=X_z./repmat(sum(X_z.*X_z).^0.5,n,1); %% 在此处输入权重,此权重非常主观 %weight = [0.7 0.3]; %熵权法 %如果之前标准化后的Z矩阵中存在负数,则重新对X进行标准化 if sum(sum(x_next<0)) >0 for i = 1:n for j = 1:m x_next(i,j) = (X_z(i,j) - min(X_z(:,j))) / (max(X_z(:,j)) - min(X_z(:,j))); end end end weight_l = calculate_weight_method(x_next); %数据重组 rep_weight_next_max = repmat(max(x_next),n,1); rep_weight_next_min = repmat(min(x_next),n,1); rep_weight =repmat(weight_l,n,1) ; %计算最大值的距离和最小值的距离,给出得分 D_max = sum(((x_next - rep_weight_next_max) .^ 2 ) .* rep_weight ,2) .^ 0.5; 41 D_min = sum(((x_next - rep_weight_next_min) .^ 2 ) .* rep_weight ,2) .^ 0.5; %未归一化的得分放进Socer Socer = D_min ./ (D_max+D_min); %归一化之后的得分放进stand_Scoer stand_Scoer = Socer / sum(Socer); %如果要对分数进行可视化,就把~改成数组,输出 %这里对分数进行排序,分数越大,越好 [~,index] = sort(stand_Scoer ,'descend'); %循环,取排名第一的分数所在位置 k=index(1); %将分数最大的存入x_end x_end = X(k,:); x_end=[x_end,k]; end function [data_x] = calculate_positivization(x) %对极小值进行正向化 data_x = zeros(size(x,1),1); for i=1:size(x,1) data_x(i) = max(x) - x(i); end end %熵权法公式 function[Weight] = calculate_weight_method(Z) %导入数据 [n,m] = size(Z); z = zeros(1,m); for i = 1:m x = Z(:,i); %p为概率矩阵 p = x / sum(x); k = -sum(p .* lns(p)) / log(n); z(i) = 1- k; end %得到权重 Weight = z ./ sum(z); Weight(1)=2*Weight(1)/9; Weight(2)=5*Weight(2); end 42 function [lndata] = lns(data) %这个函数用来修正概率矩阵中元素为0的情况 n = length(data); lndata = zeros(n,1); for i = 1:n if data(i) == 0 lndata(i) = 0; else lndata(i) = log(data(i)); end end end %find_next_left.m function find_line=find_next_left(line1,beta,angleflag,direction,passflag,incorner) avg1 = mean(line1(:, 1)); mingap=1.8*avg1;maxgap=2.2*avg1; if beta==0 minmove=ceil(mingap);maxmove=floor(maxgap); else minmove=ceil(mingap*tan(beta*pi/180))/sin(beta*pi/180); maxmove=floor(maxgap*tan(beta*pi/180))/sin(beta*pi/180); end nexty=zeros(1,20); startpoints1=zeros(20,2); ratess1=zeros(20,3); csizes1=zeros(20,1); lines1=cell(1,20); shadowarea=zeros(20,1); overlaplength=zeros(20,1); for i=1:20 nexty(1,i)=line1(1,5)-sin(beta*pi/180)+i*(maxmove-minmove)/20+minmove; if nexty(1,i)>=9200 find_line=0; return end startpoints1(i,:)=[0,nexty(1,i)]; lines1{i}=caculate_coverage_width4(startpoints1(i,:),beta); ratess1(i,3)=lines1{i}(1,3); if lines1{i}(1,5)>=(9620-(7408*tan(beta*pi/180))) && line1(1,5)<(9620-(7408*tan(beta*pi/180))) incorner=1; end if lines1{i}(1,5)>=(9620-(7408*tan(beta*pi/180))) && line1(1,5)>=(9620-(7408*tan(beta*pi/180))) passflag=1; 43 end csizes1(i)=floor((i*(maxmove-minmove)/20+minmove)*sin(beta*pi/180)); trans=calculate_overlap_rate(csizes1(i),line1,lines1{i},angleflag,direction,passflag,incorner,beta); ratess1(i,1)=trans(1,1); trans(1,:)=0; overlaplength(i,1)=trans(2,1); trans(2,:)=0; transs=calculate_missing_rate(csizes1(i),line1,lines1{i},angleflag,direction,passflag,incorner,beta,trans); ratess1(i,2)=transs(1,1); shadowarea(i,1)=transs(1,2); end attt=zeros(1,4); attt=calculate_best(ratess1); find_line=lines1{attt(1,4)}; dataa=zeros(lines1{attt(1,4)}(1,3),4); dataa(:,1)=shadowarea(attt(1,4),1); dataa(:,2)=attt(1,1); dataa(:,3)=overlaplength(attt(1,4),1); dataa(:,4)=attt(1,2); find_line=[find_line,dataa]; end %find_next_right2.m function find_line=find_next_right2(line1,beta,angleflag,direction,passflag,incorner) avg1 = mean(line1(:, 2)); mingap=1.8*avg1;maxgap=2.2*avg1; if beta==90 minmove=ceil(mingap);maxmove=floor(maxgap); else minmove=ceil(mingap/tan(beta*pi/180))/cos(beta*pi/180); maxmove=floor(maxgap/tan(beta*pi/180))/cos(beta*pi/180); end nextx=zeros(1,20); startpoints1=zeros(20,2); ratess1=zeros(20,3); csizes1=zeros(20,1); lines1=cell(1,20); shadowarea=zeros(20,1); overlaplength=zeros(20,1); overlaprate=zeros(20,1); for i=1:20 nextx(1,i)=line1(1,4)-cos(beta*pi/180)+i*(maxmove-minmove)/20+minmove; if nextx(1,i)>=7350 find_line=0; return end startpoints1(i,:)=[nextx(1,i),0]; 44 lines1{i}=caculate_coverage_width4(startpoints1(i,:),beta); ratess1(i,3)=lines1{i}(1,3); if lines1{i}(1,4)>=(7408-(9260/tan(beta*pi/180))) && line1(1,4)<(7408-(9260/tan(beta*pi/180))) incorner=1; end if lines1{i}(1,4)>=(7408-(9260/tan(beta*pi/180))) && line1(1,4)>=(7408-(9260/tan(beta*pi/180))) passflag=1; end csizes1(i)=floor((i*(maxmove-minmove)/20+minmove)*cos(beta*pi/180)); trans=calculate_overlap_rate(csizes1(i),line1,lines1{i},angleflag,direction,passflag,incorner,beta); ratess1(i,1)=trans(1,1); overlaprate trans(1,:)=0; overlaplength(i,1)=trans(2,1); trans(2,:)=0; transs=calculate_missing_rate(csizes1(i),line1,lines1{i},angleflag,direction,passflag,incorner,beta,trans); ratess1(i,2)=transs(1,1); shadowarea(i,1)=transs(1,2); end attt=zeros(1,4); attt=calculate_best(ratess1); find_line=lines1{attt(1,4)}; dataa=zeros(lines1{attt(1,4)}(1,3),4); dataa(:,1)=shadowarea(attt(1,4),1); dataa(:,2)=attt(1,1); dataa(:,3)=overlaplength(attt(1,4),1); dataa(:,4)=attt(1,2); find_line=[find_line,dataa]; end %calculateq4.m lines1to89re=cell(89,1); for ii=1:89 beta=ii; startpoint=[0,0]; startpoints=zeros(50,2); startpoints(1,:)=startpoint; zeroflag=0;nintyflag=0; if (pi*beta/180)>atan(5/4) angleflag=0; else angleflag=1; end 45 if beta==0 zeroflag=1; elseif beta==90 nintyflag=1; end lines1to89re{ii}=cell(1,100); line1=caculate_coverage_width4(startpoint,beta); lines1to89re{ii}{1}=line1; count=0; if angleflag==1 %角度小于arctan(5/4) direction=1; passflag=0; incorner=0; if(zeroflag==0) %向右搜索 % for i=1:49 sum_result = sum(lines1to89re{ii}{i}(:, 2), 'all'); if sum_result>(7408-lines1to89re{ii}{i}(1,4)+cos(beta*pi/180))*(7408-lines1to89re{ii}{i}(1,4)+cos count=i; break; end if find_next_right2(lines1to89re{ii}{i},beta,angleflag,direction,passflag,incorner)==0 count=i; break; else lines1to89re{ii}{i+1}=find_next_right2(lines1to89re{ii}{i},beta,angleflag,direction,passflag,i end end end %向左搜索 direction=0; passflag=0; incorner=0; lines1to89re{ii}{count+1}=find_next_left(line1,beta,angleflag,direction,passflag,incorner); for i=(count+1):89 sum_result = sum(lines1to89re{ii}{i}(:, 1), 'all'); if sum_result>(9260-lines1to89re{ii}{i}(1,5)+sin(beta*pi/180))*(9260-lines1to89re{ii}{i}(1,5)+sin(be && beta~=0 && beta~=90 break 46 end if beta==0 && sum_result>(9260-lines1to89re{ii}{i}(1,5)+sin(beta*pi/180))*7408*0.8 break end if find_next_left(lines1to89re{ii}{i},beta,angleflag,direction,passflag,incorner)==0 break else lines1to89re{ii}{i+1}=find_next_left(lines1to89re{ii}{i},beta,angleflag,direction,passflag,incorne end end elseif angleflag==0 %角度大于arctan(5/4) %向右搜索 direction=1; passflag=0; incorner=0; for i=1:49 sum_result = sum(lines1to89re{ii}{i}(:, 2), 'all'); if sum_result>(7408-lines1to89re{ii}{i}(1,4)+cos(beta*pi/180))*(7408-lines1to89re{ii}{i}(1,4)+cos(be && beta~=90 count=i; break end if beta==90 && sum_result>(7408-lines1to89re{ii}{i}(1,4)+cos(beta*pi/180))*9260*0.8 break end if find_next_right2(lines1to89re{ii}{i},beta,angleflag,direction,passflag,incorner)==0 count=i; break else lines1to89re{ii}{i+1}=find_next_right2(lines1to89re{ii}{i},beta,angleflag,direction,passflag,incor end end if(nintyflag==0) %向左搜索 direction=0; passflag=0; incorner=0; lines1to89re{ii}{count+1}=find_next_left(line1,beta,angleflag,direction,passflag,incorner); for i=(count+1):89 sum_result = sum(lines1to89re{ii}{i}(:, 1), 'all'); if sum_result>(9260-lines1to89re{ii}{i}(1,5)+sin(beta*pi/180))*(9260-lines1to89re{ii}{i}(1,5)+sin 47 break end if find_next_left(lines1to89re{ii}{i},beta,angleflag,direction,passflag,incorner)==0 break else lines1to89re{ii}{i+1}=find_next_left(lines1to89re{ii}{i},beta,angleflag,direction,passflag,inc end end end end end %calculate_total.m function result=calculate_total(lines) total_length=0; total_overlap_rate=0; total_missing_rate=0; total_cover_area=0; total_overlap_length=0; total_overlap_length1=0; mark=0; num=nnz(~cellfun('isempty', lines)); for i=1:num total_length=total_length+lines{i}(1,3); end for i=2:num total_cover_area=total_cover_area+lines{i}(1,6); if lines{i-1}(1,3)<lines{i}(1,3) mark=i-1; end end if mark==0 total_cover_area=total_cover_area+sum(lines{1}(:, 2))+sum(lines{num}(:,1)); else total_cover_area=total_cover_area+sum(lines{mark}(:, 2))+sum(lines{num}(:,1)); end total_missing_rate=1-total_cover_area/(7408*9260); for i=2:num total_overlap_length=total_overlap_length+lines{i}(1,8); total_overlap_length1=total_overlap_length1+lines{i}(1,8)*lines{i}(1,9); end total_overlap_rate=total_overlap_length1/total_overlap_length; result=[total_length,total_missing_rate,total_overlap_rate]; end 48 %find_thebest.m total_data=zeros(180,3); for i=1:89 total_data(i+1,:)=calculate_total(lines1to89{i}); end for i=90:178 total_data(i+2,:)=calculate_total(lines1to89re{i-89}); end total_data(1,:)=calculate_total(lines0); total_data(91,:)=calculate_total(lines90); the_best=calculate_best(total_data); 49