风功率预测的方式主要有两种,一种为BP神经网络预测,另一种为ARMA时间序列预测。
以下为用MATLAB实现BP神经网络预测风速的代码。
学习使用MATLAB神经网络工具箱看过的书籍。
输入的数据是风速数据。
%% 本脚为实现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)
本着取自CSDN,还之CSDN,记录下来,以备后用,如有不妥的地方欢迎指出。