用MATLAB玩转绿色能源!零基础实现光伏发电AI预测(附完整数据集)
太阳能发电受天气、温度、光照强度等多种因素影响,具有间歇性和波动性,准确预测太阳能发电功率对于电网调度和能源管理至关重要。人工神经网络(ANN)由于其自适应、自学习和非线性映射能力,在太阳能发电预测中得到了广泛应用。本文将从神经网络的基本原理入手,逐步深入到其在太阳能发电预测中的应用,并以Matlab神经网络工具箱为例,展示如何利用神经网络构造预测模型。
太阳能发电受天气、温度、光照强度等多种因素影响,具有间歇性和波动性,准确预测太阳能发电功率对于电网调度和能源管理至关重要。人工神经网络(ANN)由于其自适应、自学习和非线性映射能力,在太阳能发电预测中得到了广泛应用。本文将从神经网络的基本原理入手,逐步深入到其在太阳能发电预测中的应用,并以Matlab神经网络工具箱为例,展示如何利用神经网络构造预测模型。
1 神经网络的基本原理
人工神经网络(ANN)是一种模拟人脑神经元网络结构和功能的数学模型。它由大量的神经元(节点)相互连接而成,通过调整连接权重来学习和存储知识。典型的神经元结构及对应的公式如下:

其中, x 1 , x 2 , ⋯ , x d x_1, x_2, \cdots, x_d x1,x2,⋯,xd 为一个神经元的输入, a a a 为输出, f ( ) f() f() 为激活函数包括Sigmoid函数、tanh函数和ReLU函数等,可以查阅资料查看不同激活函数对应的数学公式。
神经元是神经网络的基本单元,一个神经网络包含大量神经元的堆叠,其基本结构包括输入层、隐藏层和输出层。输入层接收外部数据输入,隐藏层对数据进行处理和变换,输出层则给出最终结果:

其中,隐藏层的神经元的个数和层数可以自己定义,如图中共有2个隐藏层,第1个隐藏层的神经元个数为5个,第2个隐藏层的神经元个数为3个。
输入层和输出层则不同,输入层的神经元个数需要看输入的特征有几个,例如影响太阳能发电的因素有环境温度、光伏组件温度以及太阳辐射量这三个量,则输入的特征和输入层的神经元个数也就是3个。输出层的神经元数量则根据输出的数量来决定,本案例太阳能板输出量为产生的直流功率,因此输出层的神经元数量只有1个。
2 Matlab神经网络工具箱简介
Matlab神经网络工具箱提供了一套完整的神经网络建模工具,使得用户能够方便地创建、训练和评估各种类型的神经网络。该工具箱支持多种神经网络架构,包括前馈神经网络、径向基函数网络、卷积神经网络等。用户可以通过图形界面或编程方式来操作神经网络。我是用的是 MATLAB R2024a 版,打开方式如下:
1.点击界面顶端的APP,然后点开选项栏。

2.然后找到机器学习和深度学习板块,选择神经网络拟合工具。

3.打开界面如下:

在使用Matlab神经网络工具箱时,首先需要定义网络的结构,包括输入层、隐藏层和输出层的神经元数量以及连接方式。然后,选择合适的训练算法和性能函数,对网络进行训练。训练过程中,工具箱会自动调整网络的连接权重和偏置,以最小化网络的输出误差。最后,通过测试集对训练好的网络进行评估,验证其泛化能力。下面将以太阳能板预测发电案例来进行实战演练。
3 神经网络在太阳能发电预测中的应用案例
3.1 数据处理
首先,收集历史太阳能发电数据以及相关的气象数据,并对数据进行归一化处理,以便于网络的训练。本案例所使用的数据来源于GitHub上面的Solar-Power-Plant,如果上不去的小伙伴可以点击光伏数据进行下载。我们只取其中一个光伏发电厂的数据来进行演示。
Plant_1_Generation_Data.csv文件存储的是发电量信息,数据结构如下:
| DATE_TIME | PLANT_ID | SOURCE_KEY | DC_POWER | AC_POWER | DAILY_YIELD | TOTAL_YIELD |
|---|
这里只简要介绍案例所要用到的信息:DATE_TIME(发电数据的采样时间,每15分钟采样21次);DC_POWER(光伏板产生的直流电功率,单位为kW);AC_POWER(光伏板产生的交流电功率,单位为kW)。
(这里有点问题,光伏板只产生直流,如果要产生交流需加逆变器,因此我猜测这里应该是将光伏板产生的一部分直流转化成了交流电,因此我们在预测发电的时候需预测这两个量,才能代表光伏发电总功率)
Plant_1_Weather_Sensor_Data.csv文件存储的是天气信息,数据结构为:
| DATE_TIME | PLANT_ID | SOURCE_KEY | AMBIENT_TEMPERATURE | MODULE_TEMPERATURE | IRRADIATION | TOTAL_YIELD |
|---|
DATE_TIME(天气数据的采样时间,每15分钟采样1次);AMBIENT_TEMPERATURE(环境温度℃);MODULE_TEMPERATURE(光伏组件温度℃);IRRADIATION(太阳辐射量)
这里我们可以看到,发电功率每15分钟采样21次,而天气数据每15分钟采样1次,两者的数据量不匹配,因此我们这里做一个调整。我们将21次发电功率采样的平均值作为这15分钟的发电功率代表。
因此我们进行如下数据处理:
1.将原始数据导入matlab中
首先打开MATLAB进入到数据所在文件夹,然后创建一个process.m脚本文件,输入以下代码:
clc
clear
% 指定文件路径
generation_filename = 'Plant_1_Generation_Data.csv';
% 使用 readtable 函数读取 CSV 文件
generation_data = readtable(generation_filename);
% 将时间戳列转换为 datetime 格式
generation_data.DATE_TIME = datetime(generation_data.DATE_TIME, 'InputFormat', 'dd-MM-yyyy HH:mm');
% 提取时间戳、DC_POWER 和 AC_POWER 列
time_stamps = generation_data.DATE_TIME;
dc_power = generation_data.DC_POWER;
ac_power = generation_data.AC_POWER;
% 找到所有唯一的时间戳
unique_times = unique(time_stamps);
% 初始化存储平均值的表格
mean_table = table('Size', [length(unique_times), 3], ...
'VariableTypes', {'datetime', 'double', 'double'}, ...
'VariableNames', {'DATE_TIME', 'DC_POWER_mean', 'AC_POWER_mean'});
% 遍历每个唯一的时间戳,计算平均值
for i = 1:length(unique_times)
current_time = unique_times(i);
% 找到当前时间戳对应的所有行
idx = time_stamps == current_time;
% 计算当前时间戳对应的 DC_POWER 和 AC_POWER 的平均值
mean_dc = mean(dc_power(idx));
mean_ac = mean(ac_power(idx));
% 将结果存储到表格中
mean_table.DATE_TIME(i) = current_time;
mean_table.DC_POWER_mean(i) = mean_dc;
mean_table.AC_POWER_mean(i) = mean_ac;
end
由于时间是唯一值,所以我们对时间相同的所有行取平均值,就可代表这个时间的平均发电功率。(这里我们只对DC_POWER和AC_POWER两列数据进行处理)
处理完成后,我们打开变量 mean_table,发现时间都是单独的,且间隔15min,说明我们已经将15min内多次采样转化成了1次采样,这样的数据能够与天气数据进行匹配。

然后我们处理天气数据,由于天气数据是15min采样1次,因此不需要过多处理。我们在原来的代码基础上添加如下代码:
weather_data = readtable('Plant_1_Weather_Sensor_Data.csv');
% 提取我们需要的列数据
selected_weather_Data = weather_data(:, {'DATE_TIME', 'AMBIENT_TEMPERATURE', 'MODULE_TEMPERATURE', 'IRRADIATION'});
同样打开 selected_weather_Data 变量,发现结构与上面 mean_table 类似。

通过以上处理,我们需要的数据已经全部导入MATLAB。通过观察发现,上面两个变量的行数不一样,一个为3158,另一个为3182,说明第一个变量中的数据有缺失。为确保输入和输出形成一一对应关系,我们只取两个变量在DATA_TIME都有的时间所对应的行,继续输入以下代码:
commonElements = intersect(mean_table.DATE_TIME, selected_weather_Data.DATE_TIME); % 返回两个列的交集(按升序排列)
% 在原来的时间序列DATE_TIME中提取两个文件中都有的时间数据(有的文件中数据不完整),形成一一对应关系
used_gen_data = mean_table(ismember(mean_table.DATE_TIME, commonElements), :);
used_weather_data = selected_weather_Data(ismember(selected_weather_Data.DATE_TIME, commonElements),:);
最后我们单独建立两个数组矩阵来创建输入(Input)和标签(Label)。继续在原来的代码中输入下面代码:
% 构建输入和标签
Input = [used_weather_data.AMBIENT_TEMPERATURE, used_weather_data.MODULE_TEMPERATURE, used_weather_data.IRRADIATION];
Label = [used_gen_data.DC_POWER_mean, used_gen_data.AC_POWER_mean];
Input即为神经网络的输入,Label为输入所对应的标签值。下面我们来构造神经网络进行训练。
3.2 神经网络训练
1.找到机器学习和深度学习板块,选择神经网络拟合工具,打开后点击导入数据:

2.预测变量一栏选择 Input 变量,响应一栏选择 Label 变量,观察值勾选 行 的原因在于MATLAB默认是以列为一组特征向量,看到 Input 和Label 的描述为3个特征和2个特征就说明设置成功了,然后点击确定。

3.界面显示如下,我们可以调整验证数据和测试数据的百分比,以及调整隐藏层的神经元个数(层大小),前面我们提到神经网络的隐藏层的层数在这里只有1层,且无法增加层数(如果想要添加隐藏层数量需要使用代码来构建神经网络,请关注后续文章)

4.我们使用默认的参数进行训练,点击训练,迭代完成后显示以下界面:

我们可以看到只训练了11轮,模型就已经收敛了,如果想查看训练的结果图,可以点上面蓝色圈里面的 训练状态 性能 误差直方图 等,该工具箱默认绘制了常使用到的图像,可以稍微更改后放入论文之中。
比如我们点击 性能 图,然后可选择 将绘图导出为图窗 。
图像更改完成后,鼠标移至画布上,然后会出现几个选项,最后移至红色箭头处点击复制为图像,即可保存绘图。 ``
5.模型训练完成后的目的是为了去预测新的数据,因此我们需要将模型保存在本地,点击 导出到工作区 即可将模型文件保存到工作区,然后再保存到本地

6.回到主界面,我们可以看到模型文件已经保存到工作区中的 results ,可以右键选择另存到本地文件夹中,方便下次直接加载使用

7.由于模型已经在工作区中,因此无需重新加载,我们新建一个 forest.m 文件来预测新的数据,输入下面代码:
new_weather_data = [25,25,0.5]'
prediction = results.Network(new_weather_data)
取出 results 变量中的 Network 来进行预测,新的天气数据为环境温度为25,光伏组件温度为25,太阳辐射量为0.5,构建一个行矩阵, 记住模型的输入特征向量默认为列向量,我们构建的数据为行向量,因此需要加 ' 来进行转置。
预测结果如下,预测出来的直流功率为7088.4kW,交流功率为700.1kW。

4 总结
通过使用人工神经网络和Matlab神经网络工具箱,我们成功构建了一个太阳能发电预测模型。该模型能够根据历史数据和相关气象信息,预测未来的太阳能发电量。这有助于电力公司和电网运营商提前做好调度安排,提高电网的稳定性和可靠性。
然而,这样的模型十分简陋,并没有考虑到时间序列信息,数据也没有进行归一化处理,正负样本比例也没有调整,后续可以在此基础上加以完善。也可以考虑使用能够识别时间序列的模型,例如LSTM、RNN、Transformer等模型,后续有时间我会逐一以实战的方式来实现对更多能源系统的预测,敬请关注后续文章,感谢您的阅览!
欢迎在评论区进行交流!
更多推荐


所有评论(0)