2023数学建模国赛B代码

python 复制代码
import pandas as pd
import numpy as np
#初始化参数
D_0=70
theta=120
alpha=1.5
d=200
d=d*np.sin(np.radians(90-theta/2))/np.sin(np.radians(90-alpha+theta/2))
distances=np.array([-800,-600,-400,-200,0,200,400,600,800])
D=D_0-distances*np.tan(np.radians(alpha))

print(D)

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)))
print(W)
n=1-d/W
print(n)
#创建DataFrame用于保存结果
df=pd.DataFrame({'测线距中心点处的距离/m':distances})
df['海水深度/m']=D
df['覆盖宽度/m']=W
df['与前一条测线的覆盖率/%']=n

#将DataFrame保存为Excel文件
path=r'C:\Users\Administrator\Desktop\大学\数学建模\2023国B\result1.xlsx'
df.to_excel(path,index=False)

python 复制代码
import pandas as pd
import numpy as np
def get_width(B):
    #初始化参数
    D_0 = 120 #海底深度(单位:m)
    alpha=1.5 #坡度(单位:度)
    D=D_0-distances*np.tan(np.radians(alpha))*np.cos(np.radians(180-B))
    theta=120 #换能器的开角(单位:度)
    alpha=np.arctan(abs(np.sin(np.radians(B)))*np.tan(np.radians(alpha)))*180/np.pi
    print(D)
    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)))
    print(W)
    return W
distances=np.array([0,0.3,0.6,0.9,1.2,1.5,1.8,2.1])
distances=distances*1852
print(distances)

angel=[0,45,90,135,180,225,270,315]
W=[]
for i in angel:
    W.append(get_width(i))

#将DataFrame保存为Excel文件
path=r'C:\Users\Administrator\Desktop\大学\数学建模\2023国B\result2.xlsx'
pd.DataFrame(W).to_excel(path,index=False)

1、

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
def get_width(B,D_0):
    #初始化参数
    alpha=1.5 #坡度
    D=D_0
    theta=120
    alpha=np.arctan(abs(np.sin(np.radians(B)))*np.tan(np.radians(alpha)))*180/np.pi

    print(D)

    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)))

    print(W)
    return W

angle=np.linspace(0,360,360)
W=[]
for i in angle:
    W.append(get_width(i,150))

print(W)
plt.plot(angle,W)

plt.scatter(90,W[89],color='r')
plt.scatter(270,W[269],color='r')
plt.text(90,W[89],'({},{})'.format(90,W[89]))
plt.text(270,W[269],'({},{})'.format(270,W[269]))

angle=np.linspace(0,360,360)
W=[]
for i in angle:
    W.append(get_width(i,149.5))

print(W)
plt.plot(angle,W)

plt.scatter(90,W[89],color='r')
plt.scatter(270,W[269],color='r')
plt.text(90,W[89],'({},{})'.format(90,W[89]))
plt.text(270,W[269],'({},{})'.format(270,W[269]))

plt.xlabel("不同角度")
plt.ylabel("覆盖宽度")
plt.show()

2、

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
def sin(a):
    return np.sin(np.radians(a))
def cos(a):
    return np.cos(np.radians(a))
def tan(a):
    return np.tan(np.radians(a))

angle=np.linspace(0,360,360)
low=110-2*2852*np.tan(np.radians(1.5))
high=110+2*2852*np.tan(np.radians(1.5))

alpha=1.5#坡度
theta=120 #换能器的开角

n=np.linspace(0.1,0.2,100)
cnt=[]
for i in n:
    x=sin(theta/2)*cos(alpha)*high/(sin(90-theta/2-alpha)+sin(alpha)*sin(theta/2))
    x=high-x*tan(alpha)
    print(x)
    ans=[]
    ans.append(x)
    A = sin(90 - theta / 2 + alpha)
    B = sin(90 - theta / 2 - alpha)
    C=sin(theta/2)/A-1/tan(alpha)
    D=i*sin(theta/2)*(1/A+1/B)-sin(theta/2)/B-1/tan(alpha)

    while True:
        x=x*C/D
        if x<low:
            break
        ans.append(x)

    #print(len(ans))
    cnt.append(len(ans))
    #print(ans[-1])

n=np.array(n)
print(n)
print(cnt)
plt.plot(n,cnt,color='r')
plt.xlabel("不同重复率")
plt.ylabel("测线总数")
plt.show()

3、

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
def sin(a):
    return np.sin(np.radians(a))
def cos(a):
    return np.cos(np.radians(a))
def tan(a):
    return np.tan(np.radians(a))

angle=np.linspace(0,360,360)
low=110-2*2852*np.tan(np.radians(1.5))
high=110+2*2852*np.tan(np.radians(1.5))

alpha=1.5#坡度
theta=120 #换能器的开角

n=0.1
cnt=[]
x = sin(theta / 2) * cos(alpha) * high / (sin(90 - theta / 2 - alpha) + sin(alpha) * sin(theta / 2))
x = high - x * tan(alpha)
print(x)
ans = []
ans.append(x)
A = sin(90 - theta / 2 + alpha)
B = sin(90 - theta / 2 - alpha)
C = sin(theta / 2) / A - 1 / tan(alpha)
D = n * sin(theta / 2) * (1 / A + 1 / B) - sin(theta / 2) / B - 1 / tan(alpha)

while True:
    x = x * C / D
    if x < low:
        break
    ans.append(x)

#print(len(ans))
#print(ans[-1])
index=np.arange(len(ans))
ans=np.array(ans)
dis=[]
for i in range(len(ans)-1):
    dis.append((ans[i]-ans[i+1])/tan(alpha))
for i in range(len(dis)-1):
    dis[i+1]+=dis[i]

#plt.scatter(index,ans,color='g')
#plt.xlabel("测线编号")
#plt.ylabel("水深")
#plt.show()

print(dis)
dis.insert(0,0)
dis=np.array(dis)/1852
y=np.zeros(len(dis))
#plt.scatter(dis,y,marker='x',s=10)
plt.xlabel("各测线得到水平位置")
plt.ylim(-1.2,1.2)
plt.yticks(alpha=0)
plt.tick_params(axis='y',width=0)
y=np.linspace(-1,1,10000)
for i in range(len(dis)-1):
    x=np.full((1,10000),dis[i])
    plt.scatter(x,y,s=0.0001,color='c')
    tx=np.linspace(dis[i],dis[i+1],1000)
    if i%2==0:
        ty=1
    else:
        ty=-1
    ty=np.full((1,1000),ty)
    plt.scatter(tx,ty,s=0.0001,color='c')
    x=np.full((1,10000),dis[-1])
    plt.scatter(x,y,x=0.0001,color='c')
    plt.show()
    path=r'C:\Users\Administrator\Desktop\大学\数学建模\2023国B\距离.xlsx'

pd.DataFrame(dis).to_excel(path)
path = r'C:\Users\Administrator\Desktop\大学\数学建模\2023国B\距离.xlsx'
pd.DataFrame(ans).to_excel(path)

4、

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
def sin(a):
    return np.sin(np.radians(a))
def cos(a):
    return np.cos(np.radians(a))
def tan(a):
    return np.tan(np.radians(a))

def get_Wleft(D):
    return D*sin(theta/2)/sin(90-theta/2-alpha)

def get_WRight(D):
    return D*sin(theta/2)/sin(90-theta/2+alpha)

angle=np.linspace(0,360,360)
low=110-2*2852*np.tan(np.radians(1.5))
high=110+2*2852*np.tan(np.radians(1.5))

alpha=1.5#坡度
theta=120 #换能器的开角

n=0.1
cnt=[]
x = sin(theta / 2) * cos(alpha) * high / (sin(90 - theta / 2 - alpha) + sin(alpha) * sin(theta / 2))
x = high - x * tan(alpha)
print(x)
ans = []
ans.append(x)
while True:
    high=x-(get_WRight(x)-(get_WRight(x)+get_Wleft(x))*n)*sin(alpha)
    x=sin(theta/2)*cos(alpha)*high/(sin(90-theta/2-alpha)+sin(alpha)*sin(theta/2))
    x=high-x*tan(alpha)
    if x < low:
        break
    ans.append(x)

print(ans)
print(len(ans))
print(ans[-1])
index=np.array(len(ans))
plt.scatter(index,ans,color='g')
plt.xlabel("测线编号")
plt.ylabel("水深")
plt.show()

#path = r'C:\Users\Administrator\Desktop\大学\数学建模\2023国B\水深.xlsx'
#pd.DataFrame(ans).to_excel(path)

5、

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def sin(a):
    return np.sin(np.radians(a))
def cos(a):
    return np.cos(np.radians(a))
def tan(a):
    return np.tan(np.radians(a))

def get_Wleft(D):
    return D*sin(theta/2)/sin(90-theta/2-alpha)

angle=90
alpha=np.linspace(0.5,10,100)
theta=np.linspace(90,150,100)
x_d=70
w=[]
for i in alpha:
    for j in theta:
        w.append(x_d*sin(j/2)*(1/sin(90-j/2-i)+1/sin(90-j/2+i)))
print(w)
w=np.array(w).reshape(100,100)
alpha,theta=np.meshgrid(alpha,theta)

#创建三位图形对象和坐标轴
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')

#绘制三维图形
ax.plot_surface(alpha,theta,w,cmap='viridis')

#设置坐标轴标签
ax.set_xlabel('alpha')
ax.set_ylabel('theta')
ax.set_zlabel('w')

#显示图形
plt.show()

相关推荐
m0_689618281 小时前
数学建模助力干细胞研究,配体纳米簇如何影响干细胞命运
笔记·数学建模
数小模.3 小时前
数学建模与数学建模竞赛
数学建模
gang_unerry3 天前
量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多
人工智能·python·算法·机器学习·数学建模·矩阵·量子计算
C灿灿数模5 天前
备战美赛!2025美赛数学建模C题模拟预测!用于大家练手模拟!
数学建模
数模竞赛Paid answer6 天前
2023年西南大学数学建模C题天气预报解题全过程文档及程序
算法·数学建模·数据分析
AI Dog7 天前
数学建模问题中的整数规划
算法·数学建模·整数规划·运筹学·malab
C灿灿数模分号17 天前
备战美赛!2025美赛数学建模C题模拟预测!用于大家练手模拟!
数学建模
从以前7 天前
python练习:“互联网 +” 时代的出租车资源配置的数学建模(二)
开发语言·python·数学建模
从以前7 天前
python练习:“互联网 +” 时代的出租车资源配置的数学建模(一)
开发语言·javascript·人工智能·python·算法·数学建模
Yaooooo88 天前
【数学建模】利用Matlab绘图(2)
开发语言·数学建模·matlab