Il existe deux façons principales de prédire l'énergie éolienne, l'une est la prédiction du réseau neuronal BP et l'autre est la prédiction des séries chronologiques ARMA.
Voici le code d'implémentation du réseau de neurones BP pour prédire la vitesse du vent avec MATLAB.
Apprenez à utiliser les livres que vous avez lus à l'aide de la boîte à outils du réseau de neurones MATLAB.
Les données d'entrée sont les données de vitesse du vent.
%% 本脚为实现BP神经网络对时间序列数据的预测--应用于风速预测
%输入为一系列风速数据即可预测下一时间节点的风速值
%% 导入数据
clc,clear,close all
load('windspeedoutT.mat'); %导入风速的.mat文件
T=windspeedoutT; %输入风速文件
figure %创建新的窗口
plot(T) %在新窗口命令后画风速图,默认为在最新的窗口画图
%% 定义训练集与测试集的个数
num_all_data = length(T);
% 前75%的数据作为训练数据
num_train = floor( num_all_data * 0.75 ); %训练数据个数不能整除时向下取整
% 后25%的数据作为测试数据
num_test = num_all_data - num_train;
% 转化为narnet需要的序列数据(神经网络需要的数据为横向排列的元胞数组的形式)
y_train_nn = num2cell(T(1:num_train) )';
y_test_nn = num2cell(T(1+num_train:end))';
%% 网络的建立
%延迟,即当前值依赖于过去的多少个值
feedback_delays = 1:10;
% 隐含层节点的个数
num_hd_neuron = 4;
% narnet构建
net = narnet(feedback_delays, num_hd_neuron); %建立narnet网络(非线性自结合的时间序列网络)
[Xs,Xi,Ai,Ts] = preparets(net,{
},{
}, y_train_nn); %实现时间序列数据自动编排,Xs、Xi编排之后的输入和输出,Xi、Ai是初始化输入延迟状态和初始层延迟状态
[net,tr] = train(net,Xs,Ts,Xi,Ai); %训练网络 输入编排过后的相应数据
%view(net) %展示网络图形
figure
plotperform(tr) %输出训练过程均方差值变化过程
Y = net(Xs,Xi); %使用该网络得到输出
perf = perform(net,Ts,Y); %计算网络的均方差
fprintf( 'neural network: mse on training set : %.6f\n', perf ); %输出均方差
%% 神经网络进行预测(测试集范围内预测)
yini = y_train_nn(end-max(feedback_delays)+1:end); %取出训练集最后没用到的值
[Xs,Xi,Ai] = preparets(net,{
},{
},[yini y_test_nn]); %[数组1 数组2] 表示拼接
y_pred_nn = net(Xs,Xi,Ai)'; %调用网络进行预测
y_pred_nn = cell2mat( y_pred_nn );
y_test_nn = cell2mat( y_test_nn )';
%% 神经网络预测全数据集
y_train_test_all = num2cell(T)';
[Xs,Xi,Ai] = preparets(net,{},{},y_train_test_all); %[数组1 数组2] 表示拼接
y_pred_all = net(Xs,Xi,Ai)'; %调用网络进行预测
y_pred_all = cell2mat( y_pred_all );
figure
title('NARNET预测')
hold on
plot( T(10:1300), 'r', 'linewidth', 2 ); %测试数据实际值曲线
plot( y_pred_all, 'b--', 'linewidth', 2 ); %测试数据的预测值曲线
legend({
'真实值', '神经网络预测值'})
%% 预测测试集未来的数值
% [Y,Xf,Af] = net(Xs,Xi,Ai);
% [netc,Xic,Aic] = closeloop(net,Xf,Af); %实现闭环
% %view(netc)
% y_predict=netc(cell(0,2),Xic,Aic);
% y_predict = cell2mat( y_predict )';
% %plot(y22);
% %% 画图,计算mse
% figure
% title('NARNET预测')
% hold on
% plot( y_test_nn, 'r', 'linewidth', 2 ); %测试数据实际值曲线
% plot( y_pred_nn, 'b--', 'linewidth', 2 ); %测试数据的预测值曲线
% legend({ '真实值', '神经网络预测值'})
%
% figure
% title('NARNET预测之后')
% hold on
% plot( y_test_nn, 'r', 'linewidth', 2 ); %测试数据实际值曲线
% plot( [y_pred_nn;y_predict], 'b--', 'linewidth', 2 ); %测试数据的预测值曲线
nn_per_error = mean(abs(y_pred_nn-y_test_nn) ./ y_test_nn); %相对误差
nn_mse_error = mean( (y_pred_nn - y_test_nn).^2 ); %均方差
fprintf('nn model: relative error on test set: %.6f\n', nn_per_error);
fprintf('nn model: mse on test set: %.6f\n', nn_mse_error)
Prenez-le du CSDN, renvoyez-le au CSDN, enregistrez-le pour une utilisation future, bienvenue pour signaler s'il y a quelque chose qui ne va pas.