[已更新前两问代码+全部建模]2024华为杯C题详细思路代码文章建模分享研究生数学建模竞赛数学建模研赛

请添加图片描述
请添加图片描述

截止9.21 12点 已更新问题一二的代码和全部内容的建模

下面我们会先进行代码讲解,之后给出全部内容的建模公式


## https://docs.qq.com/doc/DVWhyZ1NFY01XcmNw

基于磁通密度数据的特征提取与分类分析。

问题一代码详解

1. 导入必要的库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
  • pandas 用于数据处理与操作。
  • numpy 用于科学计算。
  • matplotlib.pyplotseaborn 用于数据可视化。

2. 读取训练数据

data = pd.read_excel('附件一(训练集).xlsx', sheet_name='材料1')
  • 读取Excel中的训练数据,特别是“材料1”这一页。

3. 设置中文字体与负号显示

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
  • 设置中文字体为黑体,确保图表中的中文能够正常显示。
  • 解决了负号无法显示的问题。

4. 绘制磁通密度曲线

def plot_magnetic_flux_density(sample_id):sample = data.iloc[sample_id, 4:].valuestime = np.linspace(0, 1, len(sample))plt.figure(figsize=(8, 4))plt.plot(time, sample)plt.title(f"磁通密度随时间的变化 - 样本 {sample_id}")plt.xlabel("时间 (周期内归一化)")plt.ylabel("磁通密度 (T)")plt.grid(True)plt.show()plot_magnetic_flux_density(0)
  • 定义了一个函数 plot_magnetic_flux_density,通过样本ID绘制样本的磁通密度随时间的变化曲线。
  • 该函数读取样本的磁通密度数据,并生成与时间对应的曲线图。

5. 特征提取

from scipy.stats import kurtosis, skew
from scipy.fft import fftdef extract_features(sample):features = {}sample = sample.astype(float)sample = sample[~np.isnan(sample)]# 时间域特征features['mean'] = np.mean(sample)features['std'] = np.std(sample)features['max'] = np.max(sample)features['min'] = np.min(sample)features['kurtosis'] = kurtosis(sample)features['skew'] = skew(sample)# 频域特征fft_values = np.abs(fft(sample))features['fft_1'] = fft_values[1]features['fft_2'] = fft_values[2]features['fft_3'] = fft_values[3]return features
  • 定义了 extract_features 函数用于从磁通密度数据中提取特征。
  • 包括时间域特征(如均值、标准差、峰度等)和频域特征(通过傅里叶变换提取主要频率成分)。

6. 分类模型训练

from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report, confusion_matrixX = features_df.drop('label', axis=1)
y = features_df['label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=5, random_state=42)
gbdt.fit(X_train, y_train)y_pred = gbdt.predict(X_test)
print(classification_report(y_test, y_pred))cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues", xticklabels=['正弦波', '三角波', '梯形波'], yticklabels=['正弦波', '三角波', '梯形波'])
plt.show()
  • 使用 GradientBoostingClassifier 模型进行分类训练。
  • 使用训练集数据训练模型,并评估模型在测试集上的性能,输出分类报告和混淆矩阵。

7. 测试集数据处理与预测

test_data = pd.read_excel('附件二(测试集).xlsx')
test_data_features_df = pd.DataFrame(test_data_features)
y_pred = gbdt.predict(test_data_features_df)
  • 读取测试数据,提取特征,并使用训练好的模型对测试集进行分类预测。

8. 结果保存与输出

test_data_features_df.to_csv('results.csv', index=False)
sample_df.to_csv("附件二_特定样本分类结果.csv", index=False)
  • 将预测结果保存为 CSV 文件,并将特定样本的分类结果输出。

9. 可视化特定样本分类结果

categories = {1: '正弦波', 2: '三角波', 3: '梯形波'}
fig, axs = plt.subplots(3, 1, figsize=(10, 12))for category, ax in zip([1, 2, 3], axs):selected_samples = sample_df[sample_df['分类结果'] == category]for _, row in selected_samples.iterrows():sample_id = row['样本序号']sample = test_data.iloc[sample_id - 1, 4:].valuestime = np.linspace(0, 1, len(sample))ax.plot(time, sample, label=f'样本 {sample_id}')ax.set_title(f"{categories[category]} 分类下的样本磁通密度曲线")ax.set_xlabel("时间 (周期归一化)")ax.set_ylabel("磁通密度 (T)")ax.grid(True)ax.legend(loc='best')plt.tight_layout()
plt.show()
  • 绘制了属于三种分类结果的样本的磁通密度曲线,方便可视化分类结果的准确性。

代码通过读取磁通密度数据,进行特征提取和分类模型训练,最后对测试集进行预测并展示了结果。

问题一部分结果
请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

问题二代码详解:

使用**斯坦麦茨方程(Steinmetz equation)**及其修正形式来拟合并预测材料的磁芯损耗。

1. 导入必要的库

import pandas as pd
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
  • pandas 用于读取和处理数据。
  • numpy 用于数值计算。
  • scipy.optimize.curve_fit 用于非线性曲线拟合。
  • matplotlib.pyplot 用于可视化。

2. 读取数据

data = pd.read_excel('附件一(训练集).xlsx', sheet_name='材料1')
  • 从 Excel 文件中读取训练数据,特别是“材料1”这一页的数据。

3. 筛选出正弦波数据

data = data[data['励磁波形']=='正弦波']
  • 筛选出励磁波形为“正弦波”的数据进行分析。

4. 提取变量

frequency = data['频率,Hz'].values
P_loss = data['磁芯损耗,w/m3'].values
flux_density_data = data.iloc[:, 4:1029]
B_max = flux_density_data.max(axis=1).values
  • 提取数据中的频率、磁芯损耗和磁通密度峰值数据,准备用于后续的拟合。

5. 定义斯坦麦茨方程

def steinmetz(f, B_max, k1, alpha1, beta1):return k1 * (f ** alpha1) * (B_max ** beta1)
  • 定义了斯坦麦茨方程,它描述了磁芯损耗 ( P ) 与频率 ( f ) 和磁通密度峰值 ( B_{\text{max}} ) 的关系。这里 ( k1 )、( \alpha1 ) 和 ( \beta1 ) 是需要拟合的参数。

6. 拟合斯坦麦茨方程

popt, pcov = curve_fit(lambda xdata, k1, alpha1, beta1: steinmetz(xdata[0], xdata[1], k1, alpha1, beta1), (frequency, B_max), P_loss, p0=initial_guess
)
  • 使用 curve_fit 函数来拟合斯坦麦茨方程,popt 是拟合得到的参数,包括 ( k1 )、( \alpha1 ) 和 ( \beta1 )。

7. 绘制拟合结果

P_pred_steinmetz = steinmetz(frequency, B_max, k1_opt, alpha1_opt, beta1_opt)
plt.plot(P_loss, label='实际磁芯损耗', marker='o')
plt.plot(P_pred_steinmetz, label='拟合磁芯损耗', linestyle='--')
  • 使用拟合得到的参数,计算预测的磁芯损耗,并与实际损耗进行对比。代码通过绘图直观展示了拟合结果的准确性。

8. 评估拟合效果

mse = mean_squared_error(P_loss, P_pred_steinmetz)
mae = mean_absolute_error(P_loss, P_pred_steinmetz)
r2 = r2_score(P_loss, P_pred_steinmetz)
  • 通过均方误差(MSE)、均绝对误差(MAE)和决定系数(R²)评估拟合的准确性。

9. 修正斯坦麦茨方程

def steinmetz_with_temp(T, f, B_max, k1, alpha1, beta1, a, b):gamma_T = 1 + a * (T - 25) + b * (T - 25)**2return k1 * (f ** alpha1) * (B_max ** beta1) * gamma_T
  • 为了提高模型的准确性,定义了一个包含温度修正因子的斯坦麦茨方程。这个修正方程引入了两个额外的参数 ( a ) 和 ( b ),用来修正温度对磁芯损耗的影响。

10. 拟合修正后的斯坦麦茨方程

popt, pcov = curve_fit(lambda inputs, k1, alpha1, beta1, a, b: steinmetz_with_temp(inputs[0], inputs[1], inputs[2], k1, alpha1, beta1, a, b),(temperature, frequency, B_max), P_loss, p0=initial_guess)
  • 使用 curve_fit 对修正后的斯坦麦茨方程进行拟合,拟合得到的参数包括温度修正因子的参数 ( a ) 和 ( b )。

11. 绘制修正后的拟合结果

P_pred = steinmetz_with_temp(temperature, frequency, B_max, k1_opt, alpha1_opt, beta1_opt, a_opt, b_opt)
plt.plot(P_loss, label='实际磁芯损耗', marker='o')
plt.plot(P_pred, label='拟合磁芯损耗', linestyle='--')
  • 使用修正后的方程预测磁芯损耗,并绘制实际损耗与预测损耗的对比图。

12. 计算误差与评估模型

mse = mean_squared_error(P_loss, P_pred)
mae = mean_absolute_error(P_loss, P_pred)
r2 = r2_score(P_loss, P_pred)
  • 再次使用均方误差、均绝对误差和决定系数对修正后的模型进行评估,判断其拟合效果。

13. 绘制误差对比

plt.fill_between(range(len(P_loss)), P_loss, P_pred_steinmetz, color='red', label='误差 (Steinmetz)')
plt.fill_between(range(len(P_loss)), P_loss, P_pred, color='blue', alpha = 0.5, label='误差 (修正)')
  • 通过图形展示传统斯坦麦茨方程和修正方程的误差对比,验证修正后的模型在误差方面的改进。

该代码通过斯坦麦茨方程及其温度修正形式,对数据集中的磁芯损耗进行拟合与预测,并通过绘图和误差计算来评估模型的准确性。修正后的模型考虑了温度对磁芯损耗的影响,进一步提高了预测的精度。

问题二代码结果展示:

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

问题3-5详细的思路建模:

问题三:磁芯损耗因素分析

问题分析:
温度、励磁波形和磁芯材料是影响磁芯损耗的关键因素。我们需要分析这些因素的独立及协同作用。

建模步骤:

  1. 单因素分析:
    对每个因素进行回归分析,计算它们对损耗的影响。可以采用多项式回归,考虑非线性关系:

  2. 协同作用分析:
    使用交互作用项来建模不同因素的协同作用,例如温度和频率的交互作用:
    在这里插入图片描述

    可以采用多因子方差分析(ANOVA)或广义线性模型(GLM)来评估这些交互作用的显著性。

  3. 高级算法:
    偏最小二乘回归(Partial Least Squares Regression, PLSR):PLSR 是一种多变量统计方法,适合用于处理高维相关性强的输入变量。在处理温度、波形、材料等多因素时,PLSR 可以有效提取出主要影响因素。

  4. 结果分析:
    分析不同条件下磁芯损耗最小的工况组合,例如使用梯度下降法优化不同因素的组合。

问题四:基于数据驱动的磁芯损耗预测模型

问题分析:
使用给定的实验数据,构建磁芯损耗预测模型,并在测试集中进行预测。

建模步骤:

  1. 数据处理:
    数据集较大,可能需要对特征进行降维。可以使用主成分分析(PCA)降维:

  2. 模型构建:
    XGBoost:XGBoost 是一种提升树模型,适合处理复杂的非线性回归问题。

  3. 模型评价:
    使用均方误差(MSE)和R平方作为模型评价指标。

问题五:磁性元件的最优化条件

问题分析:
基于磁芯损耗和传输磁能两个目标,建立优化模型,寻找最优工况。

建模步骤:

  1. 目标函数:
    损耗最小和传输磁能最大为优化目标:
    在这里插入图片描述

  2. 优化算法:
    可以使用遗传算法(GA)或粒子群优化(PSO)来解决这个多目标优化问题。

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

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

相关文章

Elastic 的 OpenTelemetry PHP 发行版简介

作者:Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…

十九、石英晶体振荡电路

石英晶体振荡电路 1、石英晶体的特点、等效电路、特性曲线; 2、石英晶体振动器的特点, 3、石英晶体振动器的振荡频率

【爱给网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

滑动窗口算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 目录 滑动窗口算法的简介 209. 长度最小的子数组 3.无重复字符的最长子串 1004. 最大连续1的个数III 1658. 将减到0的最小…

Java调用数据库 笔记06 (修改篇)

1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类调用方法进行连接,得到连接对象 DriverManager.getConnection(url, user, password); 其中设置参数: static final String url "jdbc:my…

python中ocr图片文字识别样例(二)

一、说明 本次解决图片相关出现中文乱码问题,属于上篇文章的优化,前提条件依赖上篇文章的包,当然ocr的具体应用场景很多,根据自身需求进行调整 二、具体实现 2.1 代码实现: # -*- coding: utf-8 -*- import easyoc…

电气设备施工现场风险状态判断ai模型训练数据集

电气设备施工现场风险状态判断ai模型训练数据集 id:18 电气设备施工现场工人人工智能学习数据和工作环境安全数据,建立系统化管理体系,改变全球EHS范式,预防工业事故。数据集记录了387709例子电力设施建设以及施工现场相关的灾害安全环境数据…

电力行业螺钉螺帽螺丝缺失检测数据集 voc yol

电力行业螺钉螺帽螺丝缺失检测数据集 数据集描述 该数据集旨在用于电力行业中的螺钉、螺帽、螺丝等紧固件的缺失检测任务。数据集包含了大量的图像及其对应的标注信息,可用于训练计算机视觉模型,以识别和定位电力设施中的螺钉、螺帽、螺丝等部件是否存在…

【零成本】七日杀 服务器搭建 异地联机 无需公网IP、服务器

主要内容 什么是七日杀 搭建前需要准备什么 详细步骤 1.Steam中下载七日杀服务器工具 2.修改七日杀服务配置文件 3.启动七日杀服务器应用 4.运行 MoleSDN 进行异地联机 5.小伙伴打开游戏加入 鼠鼠的服务器 什么是七日杀 《七日杀》是一款沙盒生存恐怖游戏,…

【2025】儿童疫苗接种预约小程序(源码+文档+解答)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

LeetCode[中等] 54.螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 思路:定义方向数组,按照顺时针顺序:右(0,1),下(1,0),左(0,-1),上(0,-1) 从矩阵的左上角开始遍历…

5. 数字证书与公钥基础设施

5. 数字证书与公钥基础设施 (1) PKI 的定义、组成及应用 PKI(Public Key Infrastructure,公钥基础设施) 是一个使用公钥技术来提供安全服务的框架。它定义了如何管理和维护公钥,以及如何通过证书来验证公钥的真实性。PKI的核心组成部分包括: 证书颁发机构(CA, Certifica…

Maven 安装

Maven 安装 Maven 下载安装 下载MAVEN 选择版本注意: IDEA 2022 兼容maven 3.8.1及之前的所用版本 IDEA 2021 兼容maven 3.8.1及之前的所用版本 IDEA 2020 兼容Maven 3.6.3及之前所有版本 IDEA 2018 兼容Maven3.6.1及之前所有版本 打开MAVEN官网 下载需要的版本 Wi…

软件设计师——操作系统

📔个人主页📚:秋邱-CSDN博客☀️专属专栏✨:软考——软件设计师🏅往期回顾🏆:C: 类和对象(上)🌟其他专栏🌟:C语言_秋邱 一、操作系统…

Qt_窗口界面QMainWindow的介绍

目录 1、菜单栏QMenuBar 1.1 使用QMainWindow的准备工作 1.2 在ui文件中设计窗口 1.3 在代码中设计窗口 1.4 实现点击菜单项的反馈 1.5 菜单中设置快捷键 1.6 菜单中添加子菜单 1.7 菜单项中添加分割线和图标 1.8 关于菜单栏创建方式的讨论 2、工具栏QToolBar …

谷歌-BERT-“bert-base-chinese ”

1 需求 需求:自动下载模型和分词器 需求:手动导入模型和分词器 需求:pipeline使用预训练模型 需求:训练和评估 需求:测试 关键词:训练数据集、评估数据集、测试数据集 需求:上线 2 接口 3 自…

[UTCTF2020]sstv

用goldwave和010editor打开均未发现线索, 网上搜索sstv,豆包回答如下: 慢扫描电视(Slow Scan Television,简称 SSTV)是一种通过无线电传输和接收静态图像的技术。 一、工作原理 SSTV 通过将图像逐行扫描并…

鸿蒙OpenHarmony【轻量系统内核通信机制(互斥锁)】子系统开发

互斥锁 基本概念 互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理。 任意时刻互斥锁的状态只有两种,开锁或闭锁。当任务持有互斥锁时,该互斥锁处于闭锁状态,这个任务获得该互斥锁…

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中,我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …

基于python上门维修预约服务数据分析系统

目录 技术栈和环境说明解决的思路具体实现截图python语言框架介绍技术路线性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求,本系统采用运用较为广…