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.mzph.cn/news/872045.shtml

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

相关文章

【SpringBoot】SpringCache轻松启用Redis缓存

目录&#xff1a; 1.前言 2.常用注解 3.启用缓存 1.前言 Spring Cache是Spring提供的一种缓存抽象机制&#xff0c;旨在通过简化缓存操作来提高系统性能和响应速度。Spring Cache可以将方法的返回值缓存起来&#xff0c;当下次调用方法时如果从缓存中查询到了数据&#xf…

基于 jenkins 部署接口自动化测试项目!

引言 在现代软件开发过程中&#xff0c;自动化测试是保证代码质量的关键环节。通过自动化测试&#xff0c;可以快速发现和修复代码中的问题&#xff0c;从而提高开发效率和产品质量。而 Jenkins 作为一款开源的持续集成工具&#xff0c;可以帮助我们实现自动化测试的自动化部署…

自动化(二正)

Java接口自动化用到的技术栈 技术栈汇总&#xff1a; ①Java基础&#xff08;封装、反射、泛型、jdbc&#xff09; ②配置文件解析(properties) ③httpclient&#xff08;发送http请求&#xff09; ④fastjson、jsonpath处理数据的 ⑤testng自动化测试框架重点 ⑥allure测试报…

JMeter CSV 参数文件的使用教程

在 JMeter 测试过程中&#xff0c;合理地使用参数化技术是提高测试逼真度的关键步骤。本文将介绍如何通过 CSV 文件实现 JMeter 中的参数化。 设定 CSV 文件 首先&#xff0c;构建一个包含需要参数化数据的 CSV 文件。打开任何文本编辑器&#xff0c;输入希望模拟的用户数据&…

IGBT参数学习

IGBT&#xff08;绝缘栅双极晶体管(Insulated Gate Bipolar Transistor)&#xff09;的内部架构如下所示&#xff1a; IGBT是个单向的器件&#xff0c;电流只能朝一个方向流动&#xff0c;通常IGBT会并联一个续流二极管 IGBT型号&#xff1a;IKW40N120T2 IKW40N120T2 电路符号…

【代码规范】.train(False)和.eval()的相似性和区别

【代码规范】.train(False)和.eval()的相似性和区别 文章目录 一、.train(False) 和 .eval() 的功能二、.train(False) 和 .eval() 的区别2.1 .eval()2.2 .train(False)2.3 总结 三、.eval()更加规范 一、.train(False) 和 .eval() 的功能 .train(False) 和 .eval() 在功能上非…

Centos7 安装Redis6.2.6 gcc报错问题解决

Redis 报错信息 make: *** [all] 错误 2 安装gcc 修改yum源,在安装更新rpm包时获得比较理想的速度&#xff0c;走阿里云镜像通道 发现报错信息如下: 正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)… 失败&#xff1a;未知的名称或服务。 wget: 无法解析主机地址 “mi…

数据中心内存RAS技术发展背景

随着数据量的爆炸性增长和云计算的普及&#xff0c;数据中心内存的多比特错误及由无法纠正错误(UE)导致的停机问题日益凸显&#xff0c;这些故障不仅影响服务质量&#xff0c;还会带来高昂的修复或更换成本。随着工作负载、硬件密度以及对高性能要求的增加&#xff0c;数据中心…

01--IptablesFirewalld详解

前言&#xff1a;这里写一下&#xff0c;前面文章里都是直接关闭然后实验&#xff0c;感觉这样有点草率&#xff0c;这里写一下大概的概念和用法&#xff0c;作为知识的补充&#xff0c;这章写轻松点&#xff0c;毕竟是网安毕业的&#xff0c;算是给自己放松一下吧。 1、iptabl…

RK3568笔记三十八:DS18B20驱动开发测试

若该文为原创文章&#xff0c;转载请注明原文出处。 DS18B20驱动参考的是讯为电子的单总线驱动第十四期 | 单总线_北京迅为的博客-CSDN博客 博客很详细&#xff0c;具体不描述。 只是记录测试下DS18B20读取温度。 一、介绍 流程基本和按键驱动差不多&#xff0c;主要功能是…

为什么要做USB转多路UART项目 - 技术角度

前言 之前专门为USB转多路UART项目写了个序&#xff0c;提到了技术方案原因&#xff0c;这个文章打算展开讲一下。 一、工业物联网关 最初是因为有个工业物联网关的项目&#xff0c;需要出多路RS485接口&#xff0c;每路外接几十个三相电表PLC之类的电力电子设备。其中一款需…

【论文极速读】 可微分检索索引(Differential Search Index, DSI)

【论文极速读】 可微分检索索引&#xff08;Differential Search Index&#xff0c; DSI&#xff09; FesianXu 20240714 at WeChat Search Team 前言 最近从朋友处得知了DSI这个概念&#xff0c;所谓的可微分检索索引DSI&#xff0c;就是通过语言模型将检索过程中的索引和召回…

pixelRNN与pixelCNN

目的&#xff1a;为了找到一个最能解释得到的生成样本的模型 PixelRNN 我们需要利用概率链式法则将图像x的生成概率转变为每个像素生成概率的乘积&#xff0c;也就是每个通道生成概率的乘积。 公式&#xff1a; 公式解释&#xff1a;p(x)是每个图像x的概率&#xff1b;右侧为…

浅聊授权-spring security和oauth2

文章目录 前言自定义授权spring security授权oauth2授权概述 前言 通常说到授权&#xff0c;就会想到登录授权、token令牌、JWT等概念&#xff0c;授权。顾名思义就是服务器授予了客户端访问资源的权益&#xff0c;那么要实现授权有几种方案呢&#xff0c;三种授权方式在公司项…

c++dll库的制作和使用

01、dll库的创建使用 创建dll项目 dllexport到处 dllimport导入 分别制定dll和lib的生成目录 调用&#xff1a; 包含头文件 常规添加 最后把dll文件拷贝到程序 成功调用

使用Keepalived实现双机热备(虚拟漂移IP地址)详细介绍

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

uniapp发送Form Data格式请求

设置header的Content-Type为 application/x-www-form-urlencoded 即可 uni.request({url: , // 接口urldata: {input: 写一篇一千字的作文}, // 入参method: POST, // 参数类型header: {"Content-Type": "application/x-www-form-urlencoded"}, // 请求头…

进销存管理系统设计

进销存管理系统&#xff08;Inventory Management System&#xff0c;简称IMS&#xff09;是一种帮助企业有效管理商品的入库、出库及库存情况的信息系统。良好的进销存管理系统能够提升库存周转率、减少库存成本、提高订单处理效率&#xff0c;从而增强企业的市场竞争力。以下…

[JS]Generator

介绍 Generator函数是 ES6 提供的一种异步编程解决方案, async是该方案的语法糖 核心语法 Generator对象由生成器函数返回, 并且它符合可迭代协议和迭代器协议 生成器函数在执行时能暂停, 后面又从暂停处继续执行 <script>// 1.定义生成器函数function* testGenerato…

VMware与centos安装

目录 VM安装 安装centos VM安装 VMware Workstation Pro是VMware&#xff08;威睿公司发布的一袋虚拟机软件&#xff09;&#xff0c;它主要功能是可以给用户在单一的桌面上同时运行不同的操作系统&#xff0c;也是可以进行开发、测试、部署新的应用程序的最佳解决方案。 开始…