2023年数学建模国赛B题(多束波测距)助攻论文&支撑材料.doc

本博客下载链接包含修改的word版本, 可免费下载阅览学习, 也可作为数学建模相关课程作业修改上交:

链接:https://pan.baidu.com/s/1HxzDk3q0p6y2xpuJyxPgvw?pwd=qtnc

提取码:qtnc

       海洋地形探测是测量学中的重要课题,本文建立了多波束测深系统的数学模型分别考虑了二维和三维坡面的海底勘探问题.

       针对问题一, 我们利用测线间距与正切角度, 计算测线的海水深度. 利用测线开角边界与海底坡面构成的三角形, 以及其中的边与水平面构成的角度, 可以得到测线的覆盖宽度. 最后, 通过借助两条测线间的重叠区域与剩余区域的关系, 同时利用三角函数, 得到测线的覆盖比例.

       针对第二问, 我们利用构造全等三角形的方式, 在海底坡面附近构造辅助线, 接着利用三角函数的定义与正弦定理, 得到了测量船在任意位置的海底深度和海底坡面角度, 再根据问题一的计算方式, 得到测线的覆盖宽度.

        针对第三问, 我们要求测线均为平行布设的直线。对于测线具有固定的角度时, 所有测线的长度相加最少, 等价于测线之间的间隔肯定要尽量大. 同时需要满足覆盖整个区域. 测线之间的最大距离由该测线的所经过的海底深度最浅位置决定. 我们需要使所有的测线所经过的最浅位置尽量深, 最佳情况让所有的测线都纵向排布.接着,为了让测线之间的间隔尽量大, 我们可以使重叠率最低, 将其控制在10%, 得到最终的排布方案, 以及最短路径为140,752m.

        针对第四问, 首先本文根据附件数据将海底地形进行可视化. 通过对海底地形的分析, 本文将海底地形延较高的两角连线分为2个不同的坡面.并且本文为了简化计算将两个坡面均视为平面.其次考虑到较高坡面能够完全覆盖的情况下,较低的坡面同样可以能全面覆盖. 因此本文以较高的坡面为主设计测线. 结合第三问思路,测线应该延坡面等高线方向.通过几何计算得到测线方向与x轴夹角为21.80140948635182o。并计算出坡度为0.39983871280891276o最终计算得到所有测线与y轴交点.

关键词:  多波束测深  二维坡面探测  三维坡面探测 三角函数

问题 1 

与测线方向垂直的平面和海底坡面的交线构成一条与水平面夹角为 �� 的斜线(图 7),称 �� 为坡度。请建立多波束测深的覆盖宽度及相邻条带之间重叠率的数学模型。 若多波束换能器的开角为 120,坡度为 1.5 ,海域中心点处的海水深度为 70 m,利用上述模型计算表 1 中所列位置的指标值,将结果以表 1 的格式放在正文中.

问题 2 

考虑一个矩形待测海域(图 8),测线方向与海底坡面的法向在水平面上投影的夹角为 ,请建立多波束测深覆盖宽度的数学模型。若多波束换能器的开角为 120∘,坡度为 1.5∘,海域中心点处的海水深度为 120 m,利用上述模型计算表 2 中所列位置多波束测深的覆盖宽度,将结果以表 2 的格式放在正文中

问题 3

考虑一个南北长 2 海里、东西宽 4 海里的矩形海域内,海域中心点处的海水深度为 110 m,西深东浅,坡度为 1.5∘,多波束换能器的开角为 120∘。请设计一组测量长度最短、可完全覆盖整个待测海域的测线,且相邻条带之间的重叠率满足 10%~20% 的要求。

问题 4

海水深度数据(附件.xlsx)是若干年前某海域(南北长 5 海里、东西宽 4 海里). 单波束测量的测深数据,现希望利用这组数据为多波束测量船的测量布线提供帮助。

 

第一小问py代码:

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
W =lambda x :(70-x*np.tan(1.5*np.pi/180))*(np.sin(60*np.pi/180)/np.sin(31.5*np.pi/180) + np.sin(60*np.pi/180)/np.sin(28.5*np.pi/180))*np.cos(1.5*np.pi/180)
D =lambda x :(70-x*np.tan(1.5*np.pi/180))
YT= lambda d: d*(np.sin((90+60)*np.pi/180)/np.sin((90-60-1.5)*np.pi/180))*np.cos(1.5*np.pi/180)
x = np.arange(-800,1000,200)
print(x)
print(D(x))
print(W(x))
a = W(x)-YT(200)
print(a[:-1]/W(x)[1:])


# In[ ]:

第二小问py代码:

#!/usr/bin/env python
# coding: utf-8

# In[52]:


import numpy as np
De = lambda D0,y,ap,bp:D0-y*np.sin((bp-90)*np.pi/180)*np.tan(ap*np.pi/180)
po = lambda ap,bp: np.arctan(np.cos((bp-90)*np.pi/180)*np.tan(ap*np.pi/180))*180/np.pi
W = lambda D,x,po,th: (D-x*np.tan(po*np.pi/180))*(np.sin((th/2)*np.pi/180)/np.sin((90-po-th/2)*np.pi/180)+np.sin((th/2)*np.pi/180)/np.sin((90+po-th/2)*np.pi/180))*np.cos((po)*np.pi/180)
y = np.arange(0,2.4,0.3)*1852
bp = np.arange(0,360,45)
ap = 1.5
D0 = 120
th = 120
for i in bp:
    if i != 90 and i!= 270:
        print(i)
#         print(De(D0,y,ap,i))
#         print(po(ap,i if i < 180 else i-180))
        print(W(De(D0,y,ap,i),0,po(ap,i if i < 180 else i-180),th))
    else:
        print(i)
        print(W(D0,0,ap,th))

第三小问py代码:


import numpy as  np
import matplotlib.pyplot as plt
# 中文的使用
import matplotlib as mpl
x = [-3345.4782073578917,
 -2798.4782073578917,
 -2291.4782073578917,
 -1821.4782073578917,
 -1385.4782073578917,
 -980.4782073578917,
 -605.4782073578917,
 -257.47820735789173,
 65.52179264210827,
 365.52179264210827,
 643.5217926421083,
 901.5217926421083,
 1140.5217926421083,
 1362.5217926421083,
 1568.5217926421083,
 1759.5217926421083,
 1936.5217926421083,
 2100.5217926421083,
 2252.5217926421083,
 2393.5217926421083,
 2524.5217926421083,
 2645.5217926421083,
 2758.5217926421083,
 2862.5217926421083,
 2959.5217926421083,
 3049.5217926421083,
 3132.5217926421083,
 3209.5217926421083,
 3281.5217926421083,
 3348.5217926421083,
 3410.5217926421083,
 3467.5217926421083,
 3520.5217926421083,
 3569.5217926421083,
 3615.5217926421083,
 3657.5217926421083,
 3696.5217926421083,
 3733.5217926421083]
mpl.rcParams["font.sans-serif"]=["kaiti"]
mpl.rcParams["axes.unicode_minus"]=False
f = plt.figure(figsize = (8,4))
a = f.subplots(1,1)
a.set_ylim(-1852,1852)
a.set_xlim(-1852*2,1852*2)
a.set_ylabel("西",fontsize = 14)
a.set_xlabel("北",fontsize = 14)
a.axvline(x=-1852*2,color = "r",lw = 1)
a.axvline(x=1852*2,color = "r",lw = 1)
for kx in x:
    a.axvline(x=kx,ls = "-",lw = 1)
plt.show()



第四小问py代码:

import numpy as  np
import matplotlib.pyplot as plt
# 中文的使用
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["kaiti"]
mpl.rcParams["axes.unicode_minus"]=False
from matplotlib import cbook
from matplotlib import cm
from matplotlib.colors import LightSource
import pandas as pd
from mpl_toolkits.mplot3d import axes3d

data = pd.read_excel(r"E:\zm\附件.xlsx",index_col=0) # 《《《《要改路径
z = data.values
z = z.max()-z
# Load and format data
nrows, ncols = z.shape
x = np.linspace(0, 4, ncols)
y = np.linspace(0, 5, nrows)
x, y = np.meshgrid(x, y)

# region = np.s_[5:50, 5:50]
# x, y, z = x[region], y[region], z[region]

# Set up plot
fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))

ls = LightSource(270, 45)
# To use a custom hillshading mode, override the built-in shading and pass
# in the rgb colors of the shaded surface calculated from "shade".
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode='soft')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,linewidth=0, antialiased=False, shade=False)
ax.set_zticks(np.linspace(0,z.max(),8),np.round(np.linspace(0,z.max(),8)[::-1],2))
#plt.savefig(r"E:\zm\1.png",dpi = 1000)
plt.show()
import numpy as np
import pandas as pd
De = lambda D0,y,ap,bp:D0-y*np.sin((bp-90)*np.pi/180)*np.tan(ap*np.pi/180)
D =lambda x,De,po:(De-x*np.tan(po*np.pi/180))
po = lambda ap,bp: np.arctan(np.cos((bp-90)*np.pi/180)*np.tan(ap*np.pi/180))*180/np.pi
W = lambda D,x,po: (D-x*np.tan(po*np.pi/180))*(np.sin((th/2)*np.pi/180)/np.sin((90-po-th/2)*np.pi/180)+np.sin((th/2)*np.pi/180)/np.sin((90+po-th/2)*np.pi/180))*np.cos((po)*np.pi/180)
YT= lambda d,po: d*(np.sin((90+th/2)*np.pi/180)/np.sin((90-th/2-po)*np.pi/180))*np.cos(po*np.pi/180)
y = np.arange(0,2.4,0.3)*1852

apk = [0.39983871280891276]
D0 = 84.4
th = 120
dd = [0]
while dd[-1]<((5+5-3.3999999999999995)*4/((5-3.3999999999999995)**2+4**2)**0.5)*1852:
    di = np.arange(0,1000,1)
    dd+= [dd[-1]+di[np.argmin(np.abs((W(D0,dd[-1]+di,apk[-1])-YT(di,apk[-1]))/W(D0,dd[-1]+di,apk[-1]))-0.1)]]
    print(dd[-1])
    #apk += [apk[-1] -(apk[0]-0.3)*dd[-1]/(5*4/((5-3.3999999999999995)**2+4**2)**0.5)*1852]
# dd = [257.95,1257.94,2257.9300000000003,3087.21,4087.2,5087.19,6087.179999999999,7087.169999999999,7506.629999999999,8506.619999999999]
# print(dd)
xx = 5 - (np.array(dd)*((5-3.3999999999999995)**2+4**2)**0.5/4)/1852
# xx = [4.84998885,4.26844339,3.68689793,3.20462909,2.62308363,2.04153817,1.45999271,0.87844725,0.63450975,0.05296429]
# while xx[-1]>3.3999999999999995-5:
#     xx += [xx[-1]-(0.63450975-0.05296429)]
print(xx)

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值