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

前言

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

问题求解

第一题

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

# 导入相关第三方包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math# 生成测线距离中心点处的距离
list1=[]
d=200for 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/180list1.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*1852W=(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+dres_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]/1852right_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.5radian1=a*math.pi/180radian2=b/2* math.pi/180D0=110Les=4*1852 #待测海域东西宽度D=D0+Les/2*math.tan(radian1) #此处Dmaxx=D*math.tan(radian2)D=D-x*math.tan(radian1)W1=0W2=0res_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+dres_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=120radian1=a*math.pi/180radian2=b/2* math.pi/180D0=110Les=4*1852 #待测海域东西宽度D=D0+Les/2*math.tan(radian1) #此处Dmaxx=D*math.tan(radian2)D=D-x*math.tan(radian1)W1=0W2=0res_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+dres_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.rhkb.cn/news/377589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10远程ubuntu服务器桌面且显示图像窗口工具及配置说明

仅需一个MobaXterm_Personal工具就可以实现 网上的教程比较多&#xff0c;实现起来比较复杂&#xff0c;这个是经过自己的钻研找到的方法&#xff08;请勿转载和抄袭&#xff09; 报错&#xff1a;cannot connect to X server :0.0 操作1&#xff1a;export DISPLAY自己windo…

数学建模·熵权法

熵权法 一种计算评价指标之间权重的方法。熵权法是一种客观的方法&#xff0c;没有主观性&#xff0c;比较可靠。 具体定义 熵权法的核心在于计算信息熵&#xff0c;信息熵反映了一个信息的紊乱程度&#xff0c;体现了信息的可靠性 具体步骤 Step1正向化处理 将所以评价指标转…

玩客云刷入海纳思系统

玩客云(晶晨S805)刷机 | 海纳思系统 (ecoo.top) https://www.ecoo.top/update/soft_init/amlproject/USB_Burning_Tool_v2.1.3.exe https://node4.histb.com:9088/update/system/s805/hinas_s805_eMMC.burn.img.zip

LabVIEW液压数据采集测试系统

液压系统是装载机的重要组成部分&#xff0c;通过液压传动和控制实现各项作业功能&#xff0c;如提升、倾斜、转向等。液压系统的性能直接影响装载机的作业效率和稳定性。为了保证装载机液压系统的正常运行和优化设计&#xff0c;需要对其进行数据采集和测试。本文介绍了一套基…

Wireshark 对 https 请求抓包并展示为明文

文章目录 1、目标2、环境准备3、Wireshark 基本使用4、操作步骤4.1、彻底关闭 Chrome 进程4.2、配置 SSLKEYLOGFILE [核心步骤]4.3、把文件路径配置到 Wireshark 指定位置4.4、在浏览器发起请求4.5、抓包配置4.6、过滤4.6.1、过滤域名 http.host contains "baidu.com4.6.2…

通用图形处理器设计GPGPU基础与架构(三)

一、前言 前两篇已经介绍了 GPGPU 的背景 和 GPGPU 的编程模型相关的内容&#xff0c;本文将在 SIMT 计算模型的基础上&#xff0c;介绍 GPGPU 控制核心架构和微体系结构的设计。 二、CPU-GPGPU 异构计算系统 一个由 CPU 和 GPGPU 构成的异构计算平台如下图所示&#xff0c;GP…

树结构添加分组,向上向下添加同级,添加子级

树结构添加分组&#xff0c;向上向下添加同级&#xff0c;添加子级 效果代码实现页面js 效果 代码实现 页面 <el-tree :data"treeData" :props"defaultProps" :expand-on-click-node"false":filter-node-method"filterNode" :ref&…

Hive的基本操作(查询)

1、基础查询 基本语法 select 字段列表|表达式|子查询 from 表(子查询|视图|临时表|普通表) where [not] 条件A and|or 条件B --先&#xff1a;面向原始行进行筛选 group by 字段A[,字段B,...] > 分组【去重处理】 having 聚合条件(非原始字段条件) --再&#x…

iPhone数据恢复:如何从iPhone恢复误删除的短信

来自iPhone的意外删除的短信可能很关键。它们可能是来自您常用应用程序、银行交易、付款收据的重要通知&#xff0c;也可能是来自朋友的重要文本、孩子的学校通知等。 如果您也从iPhone丢失了此类消息&#xff0c;我们在这里分享如何在没有备份以及有备份的情况下在iPhone上恢…

热门软件缺陷管理工具2024:专业评测与建议

国内外主流的10款软件缺陷管理工具软件对比&#xff1a;PingCode、Worktile、禅道、Tapd、Teambition、Tower、JIRA、Bugzilla、MantisBT、Trac。 在软件开发过程中&#xff0c;管理缺陷和漏洞常常成为一项挑战&#xff0c;尤其是在项目规模庞大时。选择一个高效的软件缺陷管理…

object-C 解答算法:两数之和(leetCode-1)

两数之和(leetCode-1) 题目如下图:(也可以到leetCode上看完整题目,题号1) 解答方法一: 最简单的方法就是双指针遍历数组.代码如下 - (NSMutableArray *)sumOfTwoNumbers:(NSMutableArray *)array target:(int)target {NSMutableArray * resultArray [[NSMutableArray alloc…

探索Facebook在人工智能领域的最新进展

在当今快速发展的科技领域中&#xff0c;人工智能&#xff08;AI&#xff09;作为一项关键技术&#xff0c;正在逐步改变着社交媒体的面貌。作为全球最大的社交平台之一&#xff0c;Facebook积极探索和应用人工智能&#xff0c;以提升用户体验、增强平台安全性并推动技术创新。…

数学建模·灰色关联度

灰色关联分析 基本原理 灰色关联分析可以确定一个系统中哪些因素是主要因素&#xff0c;哪些是次要因素&#xff1b; 灰色关联分析也可以用于综合评价&#xff0c;但是由于数据预处理的方式不同&#xff0c;导致结果 有较大出入 &#xff0c;故一般不采用 具体步骤 数据预处理…

实战案例:用百度千帆大模型API开发智能五子棋

前随着人工智能技术的迅猛发展&#xff0c;各种智能应用层出不穷。五子棋作为一款经典的棋类游戏&#xff0c;拥有广泛的爱好者。将人工智能技术与五子棋结合&#xff0c;不仅能提升游戏的趣味性和挑战性&#xff0c;还能展现AI在复杂决策问题上的强大能力。在本篇文章中&#…

WPF实现一个带旋转动画的菜单栏

WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目&#xff0c;如下所示 2、创建文件夹及文件 创建资源文件夹&…

LVS+Nginx高可用集群---keepalived原理与实战

1.高可用集群架构keepalived双机主备原理 高可用&#xff1a;(HA) 部署nginx存在两台nginx。当主节点的nginx宕机停止服务的时候&#xff0c;nginx备用机起到跟nginx(主) keepalived的概念&#xff1a;解决单点故障&#xff1b;组件免费&#xff1b;可以实现高可用HA机制&…

Unity不用脚本实现点击按钮让另外一个物体隐藏

1.首先在场景中创建一个按钮和一个其他随便什么东西 2.点击按钮中的这个加号 3.然后将刚刚你创建的物体拖到这里来 4.然后依次点击下面这些给按钮绑定事件 5.运行游戏并点击按钮&#xff0c;就会发现拖进来的物体消失了 总结&#xff1a;如果按钮的功能单一&#xff0c;可以使用…

EPLAN 去掉PDF中的红色跳转标识

EPLAN PDF图纸导出后体验跳转标识会有红色标识&#xff0c;如何去掉呢&#xff1f;下面介绍一下方法&#xff1a; 此为现象&#xff1a; EPLAN 2.9的帮助文档里提示&#xff1a; 在导出的 PDF 文档中&#xff0c;跳转后的跳转目标现在通过红色的闪烁框进行标识。可能的跳转目…

尚硅谷大数据技术-数据湖Hudi视频教程-笔记03【Hudi集成Spark】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

让AI语言模型自由飞翔:LangChain框架的奇妙世界

今天&#xff0c;我将为大家揭开一项令人激动的技术——LangChain。想象一下&#xff0c;如果能将人工智能的强大能力与我们日常使用的数据和工具无缝连接&#xff0c;那将开启怎样崭新且无限的可能&#xff01; LangChain&#xff0c;一个专为大型语言模型设计的框架&#xf…