点击上方蓝字关注“公众号”
MATLAB基于BP神经网络的光伏发电太阳辐照度预测
光伏发电功率主要受太阳辐照度影响,所以准确预测太阳辐照度对光伏功率预测十分重要。程序采用小波分解先对辐照度数据进行分解,然后再用bp神经网络对分解的辐照度数据分别预测,再组合作为最后的预测结果。
人工神经网络(Artificial Neural Network,缩写为ANN)预测技术能从数据样本中自动地学习以前的经验而无需反复查询和表述过程,并自动地逼近那些最佳表征样本数据规律的函数,而不论这些函数具有怎样的形式,其考虑的系统表现的函数形式越复杂,神经网络这种特性的作用就越明显,即具有以任意精度逼近复杂的非线性函数的特性。
壹
01
仿真程序
clear all;
clc;
%载入辐照度数据
load irr-temp-data.mat
%提取每天8:00-18:00的辐照度数据
irr_train=trainirr(33:72,:);
irr_test=testirr(33:72,:);
%选择输入与期望
[M_train N_train]=size(irr_train);%训练集的行与列
[M_test N_test]=size(irr_test);%测试集的行与列
%
% %% 将前三天作为输入 后一天作为输出 重新构造训练集和测试集
%
% %训练集输入和期望
% for i=1:(N_train-3)
%
% irr_train_input(:,i)=[irr_train(:,i);irr_train(:,i+1);irr_train(:,i+2)];
% irr_train_target(:,i)=irr_train(:,i+3);
% end
%
% for i=1:(N_test-3)
% irr_test_input(:,i)=[irr_test(:,i);irr_test(:,i+1);irr_test(:,i+2)];
% irr_test_target(:,i)=irr_test(:,i+3);
% end
%% 将前一天数据作为输入 后一天作为输出个 构造训练集和测试集
%训练集输入和期望
irr_train_input=irr_train;
for i=1:(N_train-1)
irr_train_target(:,i)=irr_train(:,i+1);
end
%测试集输入和期望
irr_test_input=irr_test;
for i=1:(N_test-1)
irr_test_target(:,i)=irr_test(:,i+1);
end
贰
01
分解函数
%测试集输入和期望
%%
%利用小波对数据进行分解
%%分三层
[M_train_input N_train_input]=size(irr_train_input);%训练集的行与列
[M_train_target N_train_target]=size(irr_train_target);%训练目标集的行与列
[M_test_input N_test_input]=size(irr_test_input);%测试集的行与列
[M_test_target N_test_target]=size(irr_test_target);%测试目标集的行与列
n=5;%设置分解层数
A=cell(1,n+1);
A_target=cell(1,n+1);
B=cell(1,n+1);
B_target=cell(1,n+1);
%% 训练输入集进行小波分解
for i=1:N_train_input
s=irr_train_input(:,i)';
[c l]=wavedec(s,n,'db3');
for j=1:n
ca(j,:)=wrcoef('a',c,l,'db3',j);
cd(j,:)=wrcoef('d',c,l,'db3',j);
end
A{1,1}(:,i)=ca(n,:)';
for j=1:n
A{1,j+1}(:,i)=cd(j,:)';
end
end
%% 训练目标集进行小波分解
for i=1:N_train_target
s1=irr_train_target(:,i)';
[c1 l1]=wavedec(s1,n,'db3');
for j=1:n
ca1(j,:)=wrcoef('a',c1,l1,'db3',j);
cd1(j,:)=wrcoef('d',c1,l1,'db3',j);
end
A_target{1,1}(:,i)=ca1(n,:)';
for j=1:n
A_target{1,j+1}(:,i)=cd1(j,:)';
end
end
02
for i=1:N_test_input
s2=irr_test_input(:,i)';
[c2 l2]=wavedec(s2,n,'db3');
for j=1:n
ca2(j,:)=wrcoef('a',c2,l2,'db3',j);
cd2(j,:)=wrcoef('d',c2,l2,'db3',j);
end
B{1,1}(:,i)=ca2(n,:)';
for j=1:n
B{1,j+1}(:,i)=cd2(j,:)';
end
end
%% 进行训练和预测
for i=1:(n+1)
irr_train_input1=A{1,i}(:,1:400);
irr_train_target1=A_target{1,i}(:,1:400);
irr_test_input1=B{1,i}(:,18:27);
% irr_test_target1=B{1,i}(:,501:510);
%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(irr_train_input1);
[outputn,outputps]=mapminmax(irr_train_target1);
03
%% BP网络训练
% %初始化网络结构
net=newff(inputn,outputn,10);
net.trainParam.epochs=100;
net.trainParam.lr=0.05;
net.trainParam.goal=0.000004;
%网络训练
net=train(net,inputn,outputn);
%% BP网络预测
%预测数据归一化
inputn_test=mapminmax('apply',irr_test_input1,inputps);
%网络预测输出
an=sim(net,inputn_test);
%网络输出反归一化
BPoutput=mapminmax('reverse',an,outputps);
C{1,i}=BPoutput;
end
sum_predict=C{1,1};
for ii=1:n
sum_predict=sum_predict+C{1,ii+1};
end
sum_predict=sum_predict(:);
irr_test_target0=irr_test_target(:,18:27);
irr_test_target1=irr_test_target0(:);
%% 结果分析
figure(1)
plot(sum_predict,':og')
hold on
plot(irr_test_target1,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error=sum_predict-irr_test_target1;
figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
figure(3)
plot((irr_test_target1-sum_predict)./sum_predict,'-*');
title('神经网络预测误差百分比')
nn=size(error,1);%预测点的个数
RMSE=sqrt(sum(error.^2)/nn) ;
MSE=sum(error.^2)/nn;
MAE=sum(abs(error))/nn;
MAPE=sum(abs(error./sum_predict))/nn;
04
仿真结果图
具体仿真程序链接,微信公众号回复【光伏】即可获得链接。
海客談瀛洲,煙濤微茫信難求;越人語天姥,雲霞明滅或可睹。天姥連天向天橫,勢拔五嶽掩赤城。天臺四萬八千丈,對此欲倒東南傾。我欲因之夢吳越,壹夜飛度鏡湖月。湖月照我影,送我至剡溪。謝公宿處今尚在,淥水蕩漾清猿啼。腳著謝公屐,身登青雲梯。半壁見海日,空中聞天雞。千巖萬轉路不定,迷花倚石忽已暝。熊咆龍吟殷巖泉,栗深林兮驚層巔。雲青青兮欲雨,水淡淡兮生煙。列缺霹靂,丘巒崩摧。洞天石扉,訇然中開。青冥浩蕩不見底,日月照耀金銀臺。霓為衣兮風為馬,雲之君兮紛紛而來下。虎鼓瑟兮鸞回車,仙之人兮列如麻。忽魂悸以魄動,恍驚起而長嗟。惟覺時之枕席,失向來之煙霞。世間行樂亦如此,古來萬事東流水。別君去兮何時還?且放白鹿青崖間。須行即騎訪名山。安能摧眉折腰事權貴,使我不得開心顏!未完待续扫码关注
不迷路