2023年高教杯数学建模2023B题解析(仅从代码角度出发)

news2024/11/15 13:23:10

前言

最近博主正在和队友准备九月的数学建模,在做往年的题目,博主主要是负责数据处理,运算以及可视化,这里分享一下自己部分的工作,相关题目以及下面所涉及的代码后续我会作为资源上传

问题求解

第一题

第一题的思路主要如下:
在这里插入图片描述
在这里插入图片描述
如果我们基于代码实现的话,代码应该是这样的:

# 导入相关第三方包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

# 生成测线距离中心点处的距离
list1=[]
d=200

for i in range(-800,1000,200):
    list1.append(i)
df=pd.DataFrame(list1,columns=["测线距离中心点处的距离"])

#计算海水深度和覆盖宽度
degree1 = 1.5 
radian1 = degree1 * (math.pi / 180)
df["海水深度"]=(70-df["测线距离中心点处的距离"]*math.tan(radian1))
df["海水深度"]=df["海水深度"].round(2)
degrees2 = 120/2
radian2 = degrees2 * (math.pi / 180)
df["覆盖宽度"]=(df["海水深度"]*math.sin(radian2)/math.cos(radian2+radian1))+(df["海水深度"]*math.sin(radian2)/math.cos(radian2-radian1))
df["覆盖宽度"]=df["覆盖宽度"].round(2)

# 计算重叠率
leftlist=df["海水深度"]*math.sin(radian2)*1/math.cos(radian1+radian2)
rightlist=df["海水深度"]*math.sin(radian2)*1/math.cos(radian1-radian2)
leftlist=leftlist.round(2)
rightlist=rightlist.round(2)
leftlist=leftlist.tolist()
leftlist=leftlist[1:]
rightlist=rightlist.tolist()
rightlist=rightlist[:8]
heights = df["覆盖宽度"].tolist()
heights=heights[:8]
list2=[0]
for i in range(0,8):
    a=(1-200/((leftlist[i]+rightlist[i])*math.cos(radian1)))
    list2.append(a*100)

df["重叠率"]=list2
df.to_excel("2023B题1.xlsx",index=False)

这样我们就基本上完成了对相关数据的求解,然后我们可以实现一下对于它的可视化,代码与相关结果如下:

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题


# Plotting sea depth
plt.figure(figsize=(10, 6))
plt.plot(df["测线距离中心点处的距离"], df["海水深度"], marker='o', linestyle='-', color='b', label='海水深度')

# Plotting coverage width
plt.plot(df["测线距离中心点处的距离"], df["覆盖宽度"], marker='o', linestyle='-', color='g', label='覆盖宽度')

# Plotting overlap rate
plt.plot(df["测线距离中心点处的距离"], df["重叠率"], marker='o', linestyle='-', color='r', label='重叠率')

# Adding labels and title
plt.xlabel('测线距离中心点处的距离')
plt.ylabel('海水深度 / 覆盖宽度 / 重叠率')
plt.title('海水深度、覆盖宽度和重叠率随距离变化的折线图')
plt.legend()

# Display plot
plt.grid(True)
plt.tight_layout()
plt.show()

在这里插入图片描述

第二题

第二题的思路主要是下面的式子:
在这里插入图片描述
博主的求解代码基本如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

# 生成相关数据
list1=[]
list2=[]
a=0
for i in range(8):
    ans=a*math.pi/180
    list1.append(ans)
    a+=45
a=0
for i in range(8):
    list2.append(a)
    a+=0.3
b=1.5
c=60
randian11=b*math.pi/180
randian12=c*math.pi/180

# 求解覆盖宽度:
list3=[]
for i in range(8):
    list4=[]
    for j in range(8):
        randian21=math.tan(randian11)*-1*math.cos(list1[i])
        randian31=math.tan(randian11)*math.sin(list1[i])
        randian22=math.atan(randian21)
        randian32=math.atan(randian31)
        Da=120-list2[j]*randian21*1852
        W=(Da*math.sin(randian12)/math.cos(randian12+randian32))+(Da*math.sin(randian12)/math.cos(randian12-randian32))
        list4.append(W)
    list3.append(list4)

最后我们的工作就是数据的可视化了,首先是我们的代码部分:

#对结果的可视化
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
df=pd.DataFrame()
df["β=0°"]=list3[0]
df["β=45°"]=list3[1]
df["β=90°"]=list3[2]
df["β=135°"]=list3[3]
df["测量船距海域中心点的距离"]=list2
plt.figure(figsize=(10, 6))
plt.plot(df["测量船距海域中心点的距离"], df["β=0°"], label="β=0°")
plt.scatter(df["测量船距海域中心点的距离"], df["β=0°"]) 
plt.plot(df["测量船距海域中心点的距离"], df["β=45°"], label="β=45°")
plt.scatter(df["测量船距海域中心点的距离"], df["β=45°"])  
plt.plot(df["测量船距海域中心点的距离"], df["β=90°"], label="β=90°")
plt.scatter(df["测量船距海域中心点的距离"], df["β=90°"]) 
plt.plot(df["测量船距海域中心点的距离"], df["β=135°"], label="β=135°")
plt.scatter(df["测量船距海域中心点的距离"], df["β=135°"]) 
plt.xlabel('测量船距海域中心点的距离')
plt.ylabel('list3 values')
plt.legend()
plt.grid(True)
plt.show()
        

在这里插入图片描述

第三题

前言

这题与上面的题目仅仅需要我们求解不同,这题的工作主要分为两份:

  1. 求解
  2. 灵敏度分析

求解

这题求解的主要思路如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(PS:浅浅吐槽一下,公式真的多,理顺花了我好一会…)
博主的求解代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

# 设置相关参数
a=1.5
b=60
radian1=a*math.pi/180
radian2=b* math.pi/180
D0=110
Les=4*1852 #待测海域东西宽度
D=D0+Les/2*math.tan(radian1) #此处Dmax
x=D*math.tan(radian2)
D=D-x*math.tan(radian1)
W1=0
W2=0
res_list=[x]  # 存储x
left_list=[]  # 存储左线坐标
right_list=[] # 存储右线坐标

while x+W2*math.cos(radian1)<=Les:
    W2=D*math.sin(radian2)/math.cos(radian2-radian1)
    W1=D*math.sin(radian2)/math.cos(radian2+radian1)
    d=(W1+W2)*0.9*math.cos(radian1)/(1+math.sin(radian1)*math.sin(radian2)/math.cos(radian2+radian1)*0.9)
    left_list.append(x-W1*math.cos(radian1))
    right_list.append(x+W2*math.cos(radian1))
    D=D-d*math.tan(radian1)
    x=x+d
    res_list.append(x)

W2=D*math.sin(radian2)/math.cos(radian2-radian1)
W1=D*math.sin(radian2)/math.cos(radian2+radian1)
d=(W1+W2)*0.9*math.cos(radian1)/(1+math.sin(radian1)*math.sin(radian2)/math.cos(radian2+radian1)*0.9)
left_list.append(x-W1*math.cos(radian1))
right_list.append(x+W2*math.cos(radian1))

print("总条数:%d"%(len(res_list)))  #总条数
print("最大长度:%f"%(res_list[-1]))  #最大长度
for i in range(len(res_list)):
    res_list[i]=res_list[i]/1852   
    left_list[i]=left_list[i]/1852
    right_list[i]=right_list[i]/1852

然后就是我们对相关结果的可视化:

# 可视化
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.axvline(res_list[0], color='red',label='Red Line (测线)')
plt.axvline(left_list[0], color='green',label='Green Line (条线左侧)')
plt.axvline(right_list[0], color='blue',label='Blue Line (条线右侧)')

for i in range(1, len(res_list)):
    plt.axvline(res_list[i], color='red')
    plt.axvline(left_list[i], color='green')
    plt.axvline(right_list[i], color='blue')

# 设置图形属性
plt.title('问题三结果')
plt.ylabel('由南向北/海里')
plt.legend()

# 显示图形
plt.grid(True)
plt.show()

在这里插入图片描述

灵敏度分析

灵敏度的分析思路其实还是很简单,主要是我们要改变开角和坡角的大小来看一下
看一下对结果的影响:

  • 基于开角变化实现的灵敏度分析及其可视化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

# 设置相关参数

for b in range(100,150,10):
    a=1.5
    radian1=a*math.pi/180
    radian2=b/2* math.pi/180
    D0=110
    Les=4*1852 #待测海域东西宽度
    D=D0+Les/2*math.tan(radian1) #此处Dmax
    x=D*math.tan(radian2)
    D=D-x*math.tan(radian1)
    W1=0
    W2=0
    res_list=[x]
    left_list=[]
    right_list=[]

    while x+W2*math.cos(radian1)<=Les:
        W2=D*math.sin(radian2)/math.cos(radian2-radian1)
        W1=D*math.sin(radian2)/math.cos(radian2+radian1)
        d=(W1+W2)*0.9*math.cos(radian1)/(1+math.sin(radian1)*math.sin(radian2)/math.cos(radian2+radian1)*0.9)
        left_list.append(x-W1*math.cos(radian1))
        right_list.append(x+W2*math.cos(radian1))
        D=D-d*math.tan(radian1)
        x=x+d
        res_list.append(x)

    W2=D*math.sin(radian2)/math.cos(radian2-radian1)
    W1=D*math.sin(radian2)/math.cos(radian2+radian1)
    d=(W1+W2)*0.9*math.cos(radian1)/(1+math.sin(radian1)*math.sin(radian2)/math.cos(radian2+radian1)*0.9)
    plt.plot(range(len(res_list)), res_list, linestyle='-', label=f'开角为{b}°')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
# 设置标签和标题
plt.xlabel('i')
plt.ylabel('res_list[i]')
plt.title('基于开角变化实现的灵敏度分析及其可视化')

# 添加网格线和图例(可选)
plt.grid(True)
plt.legend()

# 显示图形
plt.show()
    

结果如下:
在这里插入图片描述

  • 基于开角变化实现的灵敏度分析及其可视化:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

# 设置相关参数
a_list=[1.3,1.4,1.5]
for i in range(len(a_list)):
    a=a_list[i]
    b=120
    radian1=a*math.pi/180
    radian2=b/2* math.pi/180
    D0=110
    Les=4*1852 #待测海域东西宽度
    D=D0+Les/2*math.tan(radian1) #此处Dmax
    x=D*math.tan(radian2)
    D=D-x*math.tan(radian1)
    W1=0
    W2=0
    res_list=[x]
    left_list=[]
    right_list=[]

    while x+W2*math.cos(radian1)<=Les:
        W2=D*math.sin(radian2)/math.cos(radian2-radian1)
        W1=D*math.sin(radian2)/math.cos(radian2+radian1)
        d=(W1+W2)*0.9*math.cos(radian1)/(1+math.sin(radian1)*math.sin(radian2)/math.cos(radian2+radian1)*0.9)
        left_list.append(x-W1*math.cos(radian1))
        right_list.append(x+W2*math.cos(radian1))
        D=D-d*math.tan(radian1)
        x=x+d
        res_list.append(x)

    W2=D*math.sin(radian2)/math.cos(radian2-radian1)
    W1=D*math.sin(radian2)/math.cos(radian2+radian1)
    d=(W1+W2)*0.9*math.cos(radian1)/(1+math.sin(radian1)*math.sin(radian2)/math.cos(radian2+radian1)*0.9)
    plt.plot(range(len(res_list)), res_list, linestyle='-', label=f'坡角为{a}°')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
# 设置标签和标题
plt.xlabel('i')
plt.ylabel('res_list[i]')
plt.title('基于坡角变化实现的灵敏度分析及其可视化')

# 添加网格线和图例(可选)
plt.grid(True)
plt.legend()

# 显示图形
plt.show()

在这里插入图片描述

第四题

这题的主要工作就不是我做了,我主要是负责海水深度与横纵坐标数据的可视化,代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

# 导入相关数据
filepath="../resource/data.xlsx"
df=pd.read_excel(filepath)

# 数据预处理
df = df.iloc[1:, 2:]
list1=df.values.tolist()

list2=[]
for i in range(251):
    list3=[]
    for j in range(201):
        list3.append(list1[i][j]*-1)
    list2.append(list3)
list4 = np.arange(0,4.02,0.02) 
list3 = np.arange(0, 5.02, 0.02)

# 数据可视化

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

x, y = np.meshgrid(list4, list3)
z = np.array(list2)

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_surface(x, y, z, cmap='viridis')

ax.set_xlabel('横向坐标(由西向东)/海里')
ax.set_ylabel('纵向坐标(由南向北)/海里')

ax.view_init(elev=30, azim=-45) 

fig.colorbar(surf, aspect=5) 

# 显示图形
plt.show()

三维图如下:
在这里插入图片描述

结语

以上就是我所做的所有相关工作了,从这个学期有人找我打一下这个比赛,在此之前我从来都没有写过多少python,前一段时间打数维杯才开始看,没几天就上战场了,所幸最后也水了一个一等奖(感谢我的队友们),之前我的好几个学弟也问过怎么学语言之类,我还是觉得除了我们的第一门语言外,其他的就不要找几十小时的视频看了,你看我没看不也是硬逼出来了吗,事情往往不会在你有充分准备时到来,我们更应该学会边做边学,而不是等到学完再做,种一棵树最好的时间是十年前,其次是现在,写给可能有一些纠结的大家,也写给自己,那我们下篇见!over!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1914723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【雷达原理】数字波束形成(DBF)

目录 一、数字波束形成1.1 DBF原理1.2 工程应用实现方式1.2.1 预先存储权矢量1.2.2 利用DFT/FFT实现DBF 二、DBF应用2.1 通道间相干积累2.2 测量目标角度 三、MATLAB代码 一、数字波束形成 数字波束形成&#xff08;Digital Beam Forming&#xff0c;DBF) 技术&#xff0c;是针…

大数据Spark--核心编程

文章目录 IDEA 配置Spark环境增加scala插件创建Maven项目&#xff0c;配置pom.xml配置log4j.properties Spark 三大数据结构RDDRDD概念核心属性执行原理基础编程RDD创建RDD 并行度与分区RDD转换算子Value类型双Value类型Key - Value类型reduceByKey和groupByKey的区别&#xff…

为什么说java只要还是泛型擦除,就不要吹自己高性能?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;关于“Java只要还是泛型擦除…

内存迎来革命性升级,只装一条就能组成双通道

相信用过台式机的同学或多或少都遇到过一个情况&#xff0c;那就是按下开机键后&#xff0c;除了显示器不亮&#xff0c;哪儿都亮。 拿着自己的故障满世界发帖求助&#xff0c;得到最多的回答就是&#xff0c;断电拔下内存用橡皮擦擦擦金手指再装回。而这样的操作确实能解决大部…

漏洞挖掘 | 记某证书站任意账号接管漏洞

下文中所述漏洞已修复 在前段时间的漏洞挖掘中&#xff0c;上了某证书站&#xff0c;打点的一处逻辑漏洞 访问某一站点&#xff0c;发现了一处登录页 点击登录按钮之后&#xff0c;发现该站点大概率是自写站点&#xff0c;存在逻辑漏洞的可能性大大增大&#xff0c;利用前期信…

西门子S7-1500PLC与ABB变频器通讯及控制程序

文章目录 前言一、硬件组态二、编写通讯程序1.新建数据类型“ABB_UDT”2.新建DB块“变频DB”3.新建FC块“轴流风机” 二、编写模拟量转换程序1.编写速度设定程序2.编写速度反馈程序3.编写电流反馈程序4.编写力矩反馈程序 三、编写启/停控制程序总结 前言 本文基于某实际项目&a…

Linux和Windows配置公钥到服务器上【免密登录/传输文件】

文章目录 1.Windows配置公钥到服务器上1.1.生成SSH密钥对&#xff08;如果尚未生成&#xff09;&#xff1a;1.2.复制公钥到远程服务器&#xff1a;1.3.手动复制公钥到远程服务器&#xff1a;1.4.测试SSH连接&#xff1a; 2.Linux配置公钥到服务器上2.1生成SSH密钥对&#xff0…

开发个人Go-ChatGPT--6 OpenUI

开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由&#xff0c;OpenAI 的接口需要密钥才…

手撸俄罗斯方块(五)——游戏主题

手撸俄罗斯方块&#xff08;五&#xff09;——游戏主题 当确定游戏载体&#xff08;如控制台&#xff09;后&#xff0c;界面将呈现出来。但是游戏的背景色、方块的颜色、方框颜色都应该支持扩展。 当前游戏也是如此&#xff0c;引入了 Theme 的概念&#xff0c;支持主题的扩…

iOS UITableView自带滑动手势和父视图添加滑动手势冲突响应机制探索

场景 我们有时候会遇到这样的一个交互场景&#xff1a;我们有一个UITableView 放在一个弹窗中&#xff0c;这个弹窗可以通过滑动进行展示和消失&#xff08;跟手滑动的方式&#xff09;&#xff0c;然后这个UITableView放在弹窗中&#xff0c;并且可以滚动&#xff0c;展示一些…

成都晨持绪:抖音电商带货需要交钱吗

在抖音这个充满创意与可能的平台上&#xff0c;电商带货成为了一种新兴而又时尚的职业。然而&#xff0c;伴随着无数的点击与转发&#xff0c;有一个问题始终萦绕在人们心头——抖音电商带货需要交钱吗? 如画卷展开&#xff0c;抖音平台以其独特的算法和庞大的用户基础构建了一…

spark shuffle写操作——UnsafeShuffleWriter

PackedRecordPointer 使用long类型packedRecordPointer存储数据。 数据结构为&#xff1a;[24 bit partition number][13 bit memory page number][27 bit offset in page] LongArray LongArray不同于java中long数组。LongArray可以使用堆内内存也可以使用堆外内存。 Memor…

构建高精度室内定位导航系统,从3DGIS到AI路径规划的全面解析

室内定位导航系统是一种利用多种技术实现室内精准定位和导航的智能系统&#xff0c;即便没有卫星信号&#xff0c;也能实现精准导航。维小帮室内定位导航系统是基于自研的地图引擎与先进定位技术&#xff0c;结合智能路径规划算法&#xff0c;解决了人们在大型复杂室内场所最后…

python怎么判断字符串以什么结尾

在python编辑器中新建一个data.py。 写上自己的注释。 然后新建一个变量testname。 利用endswith来判断字符串是不是以“ar”结尾。 将结果打印出来。 选择“run”->“run”。 运行该程序&#xff0c;如果是&#xff0c;就会返回true。

深度探讨:无法恢复主文件表的挑战与解决方案

在数字时代&#xff0c;数据的安全与恢复成为了不容忽视的重要议题。其中&#xff0c;主文件表&#xff08;Master File Table, MFT&#xff09;作为文件系统的核心组件&#xff0c;一旦受损或无法恢复&#xff0c;将直接导致数据访问的障碍&#xff0c;给用户带来巨大困扰。本…

Vue在一个页面调用另一个同级页面的方法

1、建个中转站 2、然后在两个页面都引入它&#xff0c;注意引入路径。 import Utils from src/utils/way 3、调用方的写法 //eg :Utils.$emit(demo, msg) 4、被调用方的写法 //eg :Utils.$on(demo, val>{})

Playwright使用教程【附爬取Leetcode题目URLs以及有道翻译小软件】

前言 playwright是微软设计的一款工具&#xff0c;可以爬取网页&#xff0c;还可以自动化测试自己编写的网站&#xff0c;而且不像bs4、request编写爬虫那么复杂&#xff0c;也不需要考虑反爬技术&#xff0c;只需要知道最基础的前端知识&#xff0c;就可以高效、便捷的编写爬…

【算法训练记录——Day43】

Day43——动态规划Ⅴ 1.kamacoder52_携带研究材料2.leetcode518_零钱兑换Ⅱ3.leetcode377_组合总和Ⅳ 完全背包 1.kamacoder52_携带研究材料 思路&#xff1a;这里每种材料可以选择无数次&#xff0c;因此属于完全背包&#xff0c; 首先回顾一下01背包的核心代码 for(int i 0…

vue3 + tsx 表格 Action 单独封装组件用法

前言 先上图看右侧列 action 的 UI 效果&#xff1a; 正常来说&#xff0c;如果一个表格的附带 action 操作&#xff0c;我们一般会放在最右侧的列里面实现&#xff0c;这个时候有些UI 框架支持在 SFC 模板里面定义额外的 solt&#xff0c;当然如果不支持&#xff0c;更通用的…

医疗器械网络安全 | 漏洞扫描、渗透测试没有发现问题,是否说明我的设备是安全的?

尽管漏洞扫描、模糊测试和渗透测试在评估系统安全性方面是非常重要和有效的工具&#xff0c;但即使这些测试没有发现任何问题&#xff0c;也不能完全保证您的医疗器械是绝对安全的。这是因为安全性的评估是一个多维度、复杂且持续的过程&#xff0c;涉及多个方面和因素。以下是…