01 基本信息
摘要: 为解决光伏功率输出受光照、温度、气象条件等因素影响导致的强波动性与时序依赖性问题,本文构建了CNN-BiLSTM-Attention(卷积神经网络-双向长短期记忆网络-注意力机制)融合预测模型。模型首先对光伏相关数据集(如历史功率、气象特征)进行预处理(划分训练/测试集、归一化、维度重塑),再通过CNN层提取光伏数据中的局部时空特征(如短期气象突变对功率的影响);引入SE(Squeeze-and-Excitation)通道注意力机制,对CNN提取的特征进行通道权重分配,强化关键特征(如光照强度特征)的贡献、抑制冗余信息;随后通过BiLSTM层捕捉光伏功率的长短期时序依赖关系(如日内功率变化趋势、多日周期规律);最终经全连接层与回归层输出光伏功率预测值。模型采用Adam优化器训练,以均方根误差(RMSE)、决定系数(R²)等为评价指标,实现对光伏功率的高精度预测,为光伏电站的功率调度与并网稳定提供支撑。程序运行环境: matlab2020+版本,注释清晰,效果好!数据: 光伏数据包括太阳辐照度、温度和出力数据
02 主要内容
2.1 CNN 层:提取局部时空特征
光伏功率受短期局部因素影响显著(如1小时内云层遮挡导致的功率骤降),CNN通过卷积核滑动实现局部特征提取------将输入特征(如光照、温度)映射为高维特征图,捕捉特征间的局部关联(如光照强度与功率的短期非线性关系)。卷积层的核心公式如下:

上式中,Y为输出特征图,X为输入特征图,σ为激活函数。
2.2 SE注意力机制:通道权重分配
CNN提取的64维特征通道中,不同通道对光伏功率的影响差异显著(如"光照强度通道"比"湿度通道"更重要)。SE(Squeeze-and-Excitation)注意力通过"压缩-激励"两步,为每个通道分配自适应权重,强化关键通道特征,抑制冗余信息,提升模型对重要特征的敏感度。

2.3 BiLSTM层:捕捉长短期时序依赖
光伏功率具有显著的时序连续性(如日内功率从低到高再到低的趋势、多日功率受天气周期影响的规律),LSTM(长短期记忆网络)通过"遗忘门、输入门、输出门"解决传统RNN的梯度消失问题,而BiLSTM同时从"前向时序"(过去→现在)和"反向时序"(未来→现在)学习依赖关系,更全面捕捉光伏功率的时序特征。
03 部分代码
.rtcContent { padding: 30px; } .lineNode {font-size: 10pt; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; }warning off % 关闭报警信息close all % 关闭开启的图窗clear % 清空变量clc % 清空命令行tic% restoredefaultpath%% 导入数据res = xlsread('data1.xlsx');%% 数据分析num_size = 720; % 训练集占数据集比例outdim = 1; % 最后一列为输出num_samples = size(res, 1); % 样本个数% res = res(randperm(num_samples), :); % 打乱数据集(不希望打乱时,注释该行)num_train_s = 720; % 训练集样本个数f_ = size(res, 2) - outdim; % 输入特征维度%% 划分训练集和测试集P_train = res(1: num_train_s, 1: f_)';T_train = res(1: num_train_s, f_ + 1: end)';M = size(P_train, 2);P_test = res(num_train_s + 1: end, 1: f_)';T_test = res(num_train_s + 1: end, f_ + 1: end)';N = size(P_test, 2);%% 数据归一化[p_train, ps_input] = mapminmax(P_train, 0, 1);p_test = mapminmax('apply', P_test, ps_input);[t_train, ps_output] = mapminmax(T_train, 0, 1);t_test = mapminmax('apply', T_test, ps_output);%% 数据平铺% 将数据平铺成1维数据只是一种处理方式% 也可以平铺成2维数据,以及3维数据,需要修改对应模型结构% 但是应该始终和输入层数据结构保持一致p_train = double(reshape(p_train, f_, 1, 1, M));p_test = double(reshape(p_test , f_, 1, 1, N));t_train = double(t_train)';t_test = double(t_test )';
04 运行结果







优秀的预测代码能够帮文章增色不少,专门研究预测方向的同学可以研究此代码并开展对比分析,其他电力方向的同学可以在预测的基础上开展调度以及配置等研究