2025电工杯数学建模竞赛A题 光伏电站发电功率日前预测问题 完整论文+python代码发布!
缩略图如下:
如下是部分摘要和代码:
为了提升光伏电站在不确定气象条件下的发电功率预测能力,本文围绕“日前光伏发电功率预测”问题,从历史特性分析、数据驱动建模、多源信息融合及空间分辨率优化四个层面系统构建了解决方案。
针对问题一,本文基于光伏电站历史发电功率和辐照度数据,结合太阳辐射理论模型,从长周期(季节性变化)与短周期(日内波动)两个维度分析了功率输出的时序特性,并通过偏差量化揭示了气象因素对发电性能的扰动影响。
针对问题二,在不使用未来气象信息的前提下,本文提出基于历史数据的长短期记忆神经网络(LSTM)Seq2Seq预测模型,通过滑动窗口构造输入输出序列,实现对未来7天每15分钟粒度功率的逐步回归预测,模型展现出较强的趋势拟合能力与短期预测稳定性。
针对问题三,为提升模型在复杂天气场景下的泛化能力,引入数值天气预报(NWP)数据构建融合式LSTM模型,分别对历史功率与未来气象特征序列进行双通道编码,有效增强模型对非线性变化的识别与拟合能力,显著改善了白昼时段功率波动响应精度。
针对问题四,考虑到现有NWP产品的空间分辨率限制,本文引入LightGBM回归与反距离加权插值(IDW)方法对粗分辨率气象数据进行空间降尺度处理,并将降尺度后气象特征输入至预测模型。实验表明,该方法能在保持预测稳定性的同时提升对局地气象扰动的响应敏感性,在连续高频预测场景中表现出更优的拟合效果。
综上所述,本文构建了一套完整的光伏电站功率日前预测建模框架,在多源数据融合与复杂气象条件适应方面提出了切实可行的建模策略,具有良好的工程推广前景与理论研究价值。
关键词:LSTM、LSTMseq2seq、LightGBM
代码:
import pandas as pd
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 读取数据
radiation_df = pd.read_excel('测光数据.xlsx')
power_df = pd.read_excel('场站出力.xlsx')
radiation_df.head(), power_df.head()
# 时间列格式化
radiation_df['时间'] = pd.to_datetime(radiation_df['时间'])
power_df['时间'] = pd.to_datetime(power_df['时间'])# 合并数据
df = pd.merge(radiation_df, power_df, on='时间')
df.head()
# 假设参数
area = 600 # 光伏板总面积(平方米)
efficiency = 0.18 # 光伏转换效率# 计算理论功率
df['总辐照度(W/㎡)'] = pd.to_numeric(df['总辐照度(W/㎡)'], errors='coerce')
df['理论功率(kW)'] = df['总辐照度(W/㎡)'] * area * efficiency / 1000 # 转为kW# 计算偏差
df['功率偏差(kW)'] = df['实际功率(KW)'] - df['理论功率(kW)']
df.head()# 画图:某一整天的功率曲线对比
sample_day = '2019-06-15'
daily_df = df[df['时间'].dt.date == pd.to_datetime(sample_day).date()]
plt.figure(figsize=(12, 6))
plt.plot(daily_df['时间'], daily_df['实际功率(KW)'], label='实际功率')
plt.plot(daily_df['时间'], daily_df['理论功率(kW)'], label='理论功率', linestyle='--')
plt.title(f'{sample_day} 实际与理论功率对比')
plt.xlabel('时间')
plt.ylabel('功率(kW)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
# 添加月份列
df['月份'] = df['时间'].dt.month# 计算月平均实际功率与理论功率
df['实际功率(KW)'] = pd.to_numeric(df['实际功率(KW)'], errors='coerce')
monthly_avg = df.groupby('月份')[['实际功率(KW)', '理论功率(kW)']].mean()# 可视化
plt.figure(figsize=(10, 6))
monthly_avg.plot(kind='bar')
plt.title('各月实际功率与理论功率平均值对比')
plt.ylabel('平均功率(kW)')
plt.grid(True)
plt.tight_layout()
plt.show()
# 添加日期列
df['日期'] = df['时间'].dt.date# 每日偏差统计
daily_error_stats = df.groupby('日期')['功率偏差(kW)'].agg(['mean', 'std']).reset_index()# 绘制每日偏差曲线
plt.figure(figsize=(12, 6))
plt.plot(daily_error_stats['日期'], daily_error_stats['mean'], label='日均偏差')
plt.fill_between(daily_error_stats['日期'],daily_error_stats['mean'] - daily_error_stats['std'],daily_error_stats['mean'] + daily_error_stats['std'],color='gray', alpha=0.3, label='±1标准差')
plt.title('每日功率偏差趋势')
plt.xlabel('日期')
plt.ylabel('功率偏差(kW)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
# 每日气象平均值
daily_weather = df.groupby('日期')[['气温(°C)', '气压(hpa)', '相对湿度(%)']].mean()# 合并每日偏差数据
daily_merged = pd.merge(daily_error_stats, daily_weather, on='日期')# 计算相关系数
corr_matrix = daily_merged.corr()
print("每日偏差与气象因子的相关系数:")
print(corr_matrix[['mean']].drop(index='mean'))
其中更详细的思路、各题目思路、代码、讲解视频、成品论文及其他相关内容,可以点击下方名片获取哦!