【预测】基于CNN-BiLSTM-Attention的光伏预测模型

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 运行结果

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

相关推荐
吃好睡好便好1 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
chhttty6 小时前
Design Verifier检查:整型数溢出检查与修复
matlab·simulink
吃好睡好便好11 小时前
判断函数的使用
学习·算法·matlab·生活·判断函数
hu92451955911 小时前
Matlab保护源代码—P文件和exe文件详细解析
开发语言·matlab
史上最甜的躯12 小时前
控制系统——基础、导论;以直流电机控制系统为例详解微分方程模型、拉普拉斯变换、传递函数模型的理论、推导及仿真
matlab·simulink·传递函数·控制系统·拉普拉斯·电机模型
lingchen19062 天前
用MATLAB r2010b和r2016b求解微分方程组
开发语言·算法·matlab
可编程芯片开发2 天前
基于李雅普诺夫算法的四旋翼无人机姿态跟踪控制系统simulink建模与仿真
matlab·无人机·制造·四旋翼无人机·李雅普诺夫·姿态跟踪控制
matlab代码3 天前
基于matlab的玉米种子计数设计(GUI界面)【源码58期】
开发语言·matlab
吃好睡好便好3 天前
转换函数的使用
学习·matlab·生活·转换函数
吃好睡好便好4 天前
取整函数的使用
学习·matlab·生活·取整函数