2024華為杯C題:數(shù)據(jù)驅(qū)動下磁性元件的磁芯損耗建
責任編輯:傳說的落葉 時間:2024-09-24 10:47
[導讀]2024華為杯C題:數(shù)據(jù)驅(qū)動下磁性元件的磁芯損耗建模 Python代碼實現(xiàn)
數(shù)據(jù)驅(qū)動數(shù)學建模人工智能重要部分。
題目
【BetterBench博士】2024 “華為杯”第二十一屆中國研究生數(shù)學建模競賽 選題分析
【BetterBench博士】2024年中國研究生數(shù)學建模競賽 E題:高速公路應急車道緊急啟用模型 問題分析
【BetterBench博士】2024年中國研究生數(shù)學建模競賽 C題:數(shù)據(jù)驅(qū)動下磁性元件的磁芯損耗建模 問題分析
1 問題一
首先,針對磁通密度的數(shù)據(jù)進行預處理,去除噪聲和異常值,確保數(shù)據(jù)的完整性和一致性??梢允褂媒y(tǒng)計分析方法,例如異常值檢測,來清理數(shù)據(jù)。
對于磁通密度數(shù)據(jù),提取一些重要的特征來幫助分類波形,可能的特征包括:
- 波形的周期性:通過FFT(快速傅里葉變換)提取頻率特征。
- 幅度和對稱性:計算波形的最大值、最小值以及均值。
- 波峰和波谷數(shù)量:通過零交叉點和局部極值點的數(shù)量確定波形的形狀特征。
利用提取的特征訓練分類模型。常用的分類算法包括:
- 隨機森林
- 支持向量機(SVM)
- K近鄰算法(KNN)
- 神經(jīng)網(wǎng)絡
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report, roc_auc_score
import matplotlib.pyplot as plt
from scipy.fftpack import fft
from scipy.signal import find_peaks
plt.rcParams['font.sans-serif'] = 'SimSun' # 換成自己環(huán)境下的中文字體,比如'SimHei'
# 讀取附件1和附件2
df1 = pd.read_excel('data/附件一(訓練集).xlsx')
df2 = pd.read_excel('data/附件二(測試集).xlsx')
# 數(shù)據(jù)預處理:清理異常值
def clean_data(df):
# 去除不合理的異常值
df = df[(df['0(磁通密度B,T)'].abs() < 1)]
return df
df1 = clean_data(df1)
df2 = clean_data(df2)
# 特征提取:使用磁通密度數(shù)據(jù)提取特征
def extract_features(df):
features = []
for i in range(len(df)):
row = df.iloc[i, 4:] # 只考慮磁通密度數(shù)據(jù)
# FFT變換
fft_vals = fft(row)
fft_amplitude = np.abs(fft_vals[:len(fft_vals) // 2])
# 波峰波谷特征
peaks, _ = find_peaks(row)
troughs, _ = find_peaks(-row)
# 構(gòu)造特征
feature_row = [
np.max(row), # 最大值
np.min(row), # 最小值
np.mean(row), # 均值
len(peaks), # 波峰數(shù)量
len(troughs), # 波谷數(shù)量
np.max(fft_amplitude) # FFT幅度最大值
]
features.append(feature_row)
return pd.DataFrame(features, columns=['max_val', 'min_val', 'mean_val', 'n_peaks', 'n_troughs', 'max_fft_amp'])
# 提取特征
X = extract_features(df1)
y = df1['勵磁波形'].map({
'正弦波': 1, '三角波': 2, '梯形波': 3}) # 標簽編碼
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 模型評估
y_pred = clf.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
# 對附件2中的樣本進行預測
X_new = extract_features(df2)
y_new_pred = clf.predict(X_new)
# 將分類結(jié)果寫入附件3
df3 = pd.DataFrame({
'序號': df2['序號'], '勵磁波形分類結(jié)果': y_new_pred})
df3.to_csv('data/問題一預測結(jié)果-附件4.csv', index=False)
# 1. 波形圖:展示不同樣本的磁通密度波形,觀察波形的直觀差異
plt.figure(figsize=(10, 6))
for i in range(3): # 展示前三個樣本的波形
plt.plot(df1.iloc[i, 4:].to_list(), label=f'樣本 {i+1}')
plt.title('不同樣本的磁通密度波形')
plt.xlabel('時間')
plt.ylabel('磁通密度')
plt.legend()
plt.show()
import seaborn as sns
# 2. 混淆矩陣:展示分類模型的預測結(jié)果與實際標簽的匹配情況
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['正弦波', '三角波', '梯形波'], yticklabels=['正弦波', '三角波', '梯形波'])
plt.title('混淆矩陣')
plt.xlabel('預測標簽')
plt.ylabel('實際標簽')
plt.show()
2 問題二
2.1 思路
- 擬合原始斯坦麥茨方程擬合:通過 工具包 擬合原始斯坦麥茨方程,找到 、 和 。
- 然后擬合帶溫度修正的斯坦麥茨方程:通過擬合帶溫度修正的方程,找到溫度敏感系數(shù) 。
- 誤差比較:通過實際數(shù)據(jù)和預測數(shù)據(jù)的誤差進行比較,判斷哪個方程在不同溫度下更準確。
- 可視化分析:展示實際損耗和兩個方程預測損耗的曲線。
要在斯坦麥茨方程中引入溫度修正,以適應不同溫度變化對磁芯損耗的影響,可以假設溫度對損耗有指數(shù)或線性影響。那么在原方程中增加一個溫度相關項,如:
其中:
- 是帶有溫度修正的磁芯損耗。
- 是實際溫度, 是參考溫度(如25°C)。
- 是溫度敏感系數(shù),它表明溫度變化對損耗的影響程度。
import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
plt.rcParams['font.sans-serif'] = 'SimSun' # 換成自己環(huán)境下的中文字體,比如'SimHei'
# 讀取數(shù)據(jù)
data = pd.read_excel('data/附件一(訓練集).xlsx')
# 提取相關數(shù)據(jù)
df = pd.DataFrame({
'temperature': data['溫度,oC'],
'frequency': data['頻率,Hz'],
'core_loss': data['磁芯損耗,w/m3'],
'flux_density': data.iloc[:, 4:].max(axis=1) # 磁通密度峰值
})
# 去除異常值函數(shù),使用Z-score方法
def remove_outliers(df, column, threshold=3):
z_scores = np.abs((df[column] - df[column].mean()) / df[column].std())
return df[z_scores < threshold]
# 對整個DataFrame應用異常值去除
df_cleaned = df.copy()
for column in df_cleaned.columns:
df_cleaned = remove_outliers(df_cleaned, column)
# 歸一化處理
scaler = StandardScaler()
df_cleaned[['temperature', 'frequency', 'flux_density']] = scaler.fit_transform(df_cleaned[['temperature', 'frequency', 'flux_density']])
# df_cleaned = df_cleaned
# 提取處理后的數(shù)據(jù)
temperature = df_cleaned['temperature'].values
frequency = df_cleaned['frequency'].values
core_loss = df_cleaned['core_loss'].values
flux_density = df_cleaned['flux_density'].values
# 2. 斯坦麥茨方程和帶溫度修正方程的定義
# 斯坦麥茨方程
...略
# 帶溫度修正的斯坦麥茨方程
...略
# 3. 優(yōu)化函數(shù)的定義
# 定義誤差函數(shù)(目標函數(shù)),用于最小化
...略
# 進行斯坦麥茨方程優(yōu)化
result_steinmetz = differential_evolution(objective_steinmetz, bounds_steinmetz)
params_steinmetz = result_steinmetz.x
print(f"Steinmetz方程擬合參數(shù): k1={params_steinmetz[0]}, a1={params_steinmetz[1]}, beta1={params_steinmetz[2]}")
# 進行帶溫度修正的斯坦麥茨方程優(yōu)化
result_steinmetz_temp = differential_evolution(objective_steinmetz_temp, bounds_steinmetz_temp)
params_steinmetz_temp = result_steinmetz_temp.x
print(f"帶溫度修正的Steinmetz方程擬合參數(shù): k1={params_steinmetz_temp[0]}, a1={params_steinmetz_temp[1]}, beta1={params_steinmetz_temp[2]}, gamma={params_steinmetz_temp[3]}")
問題三
要分析溫度、勵磁波形和磁芯材料對磁芯損耗的獨立和協(xié)同影響,并找出在何種條件下磁芯損耗達到最小,分析步驟如下:
- 數(shù)據(jù)清洗與整理,將數(shù)據(jù)加載到Pandas數(shù)據(jù)框中,檢查是否存在缺失值或異常值,并對數(shù)據(jù)進行標準化或編碼(對于分類變量如勵磁波形類型,需要編碼)。
-
統(tǒng)計分析
- 計算描述性統(tǒng)計量(如均值、方差等),觀察每個因素與磁芯損耗的關系。
- 繪制箱型圖、散點圖等可視化圖表,分析不同因素對磁芯損耗的分布影響。
- 方差分析 (ANOVA),用于檢驗單個因素對磁芯損耗的影響顯著性。
- 多元線性回歸,構(gòu)建一個多元回歸模型來分析每個因素對磁芯損耗的影響程度,特別是兩兩因素的協(xié)同效應。
- 交互效應分析,使用可視化和回歸系數(shù)分析兩兩因素之間的協(xié)同效應,特別是交互作用項。
- 最優(yōu)條件探索,基于回歸模型,使用優(yōu)化方法來找到最優(yōu)的溫度、勵磁波形和磁芯材料組合,使磁芯損耗達到最小。
# 5. 交互作用分析
# 增加交互項(溫度*頻率,溫度*勵磁波形,頻率*勵磁波形)
data['Temperature_Frequency'] = data['Temperature'] * data['Frequency']
data['Temperature_Waveform'] = data['Temperature'] * data['Waveform_Encoded']
data['Frequency_Waveform'] = data['Frequency'] * data['Waveform_Encoded']
# 構(gòu)建包含交互項的多元回歸模型
interaction_model = ols('Core_Loss ~ C(Temperature) * C(Waveform_Encoded) * Frequency', data=data).fit()
print(interaction_model.summary())
# 6. 可視化交互效應
plt.figure(figsize=(10,6))
sns.boxplot(x='Temperature', y='Core_Loss', hue='Waveform', data=data)
plt.title('溫度與勵磁波形對磁芯損耗的影響')
plt.show()
plt.figure(figsize=(10,6))
sns.scatterplot(x='Frequency', y='Core_Loss', hue='Temperature', data=data)
plt.title('頻率與溫度對磁芯損耗的影響')
plt.show()
問題四
-
數(shù)據(jù)加載與預處理:
-
將磁通密度采樣點(從第4列到第1024列)的列名從數(shù)字轉(zhuǎn)換為字符串形式,方便后續(xù)操作。
-
首先對(勵磁波形)列使用LabelEncoder進行編碼,將正弦波、三角波、梯形波分別映射為0、1、2。
-
-
特征工程:
- 將溫度、頻率、磁通密度等數(shù)值特征進行標準化(StandardScaler),確保不同量綱的特征對模型的影響均衡。
-
模型選擇與構(gòu)建:
- 選擇隨機森林回歸模型(RandomForestRegressor)進行回歸任務,以預測磁芯損耗。
- 使用Pipeline構(gòu)建完整的模型管道,包括數(shù)據(jù)預處理(特征標準化)和模型訓練。
-
模型訓練與評估:
- 將數(shù)據(jù)劃分為訓練集和測試集,使用訓練集訓練模型。
- 在測試集上進行預測,計算均方誤差(MSE)和R²分數(shù),以評估模型的性能。
-
樣本預測與輸出:
- 讀取附件3中的數(shù)據(jù),對其按照附件1相同的編碼操作。
- 使用訓練好的模型對附件3中的樣本進行預測,將結(jié)果保存到附件4.csv中。
- 輸出指定樣本的預測結(jié)果,保留一位小數(shù)。
# 預測附件3中的磁芯損耗
attachment3_data = pd.read_excel('data/附件三(測試集).xlsx')
# 對附件3的'Waveform'列進行編碼處理
attachment3_data = attachment3_data.rename(columns={
'溫度,oC': '溫度',
'頻率,Hz': '頻率',
'磁芯損耗,w/m3': '磁芯損耗',
'勵磁波形': 'Waveform',
'0(磁通密度B,T)':'0'
})
attachment3_data['Waveform'] = waveform_encoder.transform(attachment3_data['Waveform'])
attachment3_data = attachment3_data.drop(columns=['序號','磁芯材料'])
attachment3_data.columns = ['溫度','頻率','Waveform']+ [str(i) for i in range(1024)]
attachment3_data
# 使用模型預測附件3中的數(shù)據(jù)
y_pred_attachment3 = model.predict(attachment3_data)
# 將預測結(jié)果填入附件4并保存,只保留小數(shù)點后一位
attachment4 = pd.DataFrame({
'序號': attachment3_data.index + 1,
'磁芯損耗預測結(jié)果': np.round(y_pred_attachment3, 1)
})
attachment4.to_csv('data/附件4-問題四.csv', index=False)
attachment4
# 輸出特定樣本的預測結(jié)果
sample_indices = [16, 76, 98, 126, 168, 230, 271, 338, 348, 379]
sample_results = attachment4.iloc[sample_indices]
print("指定樣本的磁芯損耗預測結(jié)果:")
print(sample_results)
問題五
為了同時優(yōu)化磁芯損耗與傳輸磁能,構(gòu)建一個優(yōu)化問題。目標是找到能夠最小化磁芯損耗且最大化傳輸磁能的條件。傳輸磁能可以簡化為頻率()與磁通密度峰值()的乘積:
- 目標函數(shù):
平衡兩個目標:
- 最小化磁芯損耗:,使用我們構(gòu)建的磁芯損耗預測模型來預測。
- 最大化傳輸磁能:。
為了將這兩個目標結(jié)合為一個優(yōu)化問題,定義一個加權(quán)目標函數(shù):
其中, 和 是權(quán)重參數(shù),表示磁芯損耗與傳輸磁能的相對重要性。通常需要調(diào)節(jié)這些參數(shù)以實現(xiàn)某種平衡。
- 約束條件:
-
頻率 的取值范圍:$f{\min} \leq f \leq f{\max}$
-
磁通密度峰值 $BmB{m,\min} \leq Bm \leq B{m,\max}$
-
溫度 、勵磁波形等其他變量的取值范圍。
完整資料
轉(zhuǎn)到B站視頻介紹
【2024年中國研究生數(shù)學建模競賽 C題:數(shù)據(jù)驅(qū)動下磁性元件的磁芯損耗建?!?br style="box-sizing: border-box;" />
bilibili.com/video/BV1fPskeqEQH/?share_source=copy_web&vd_source=d2dd5fcbeeeec396792650b25c110a13
- 分享到:
- 萬元大獎 南平市文化2024年11月13日
- 2024年長沙聯(lián)通智家品2024年11月11日
- 宣城市新聞傳媒中心2024年11月11日
- 安陽市文物考古研究2024年11月11日
- 西南巖溶國家公園形2024年11月11日
- 東方市漁業(yè)公用品牌2024年11月11日
- 桂林南藥首屆文創(chuàng)產(chǎn)2024年10月23日
- 第二屆長治文化創(chuàng)意2024年10月23日
- 第七屆“東風夢想車2024年10月23日
- 2024中國制造之美終評2024年10月23日