急!基于MATLAB的BP神经网络预测算法,预测短期电力负荷,算出来8%的误差是否可以了?

2025-01-05 11:45:42
推荐回答(1个)
回答1:

可以了,再给你个好一点的代码
clc
clear
load data
%% 数据累加作为网络输入
[n,m]=size(X);
for i=1:n
for j=1:m
y(i,j)=sum(X(1:i,j));
end
end

%% 网络参数初始化
a=0.3+rand(1)/4;
for k=1:(m-1)
b(k)=0.3+rand(1)/4;
end

%% 学习速率初始化
for k=1:(m-1)
u(k)=0.0015;
end

%% 权值阀值初始化
t=1;
w11=a;
w2(1,1)=-y(1,1);
for k=2:m
w2(k)=2*b(k-1)/a;
end
for k=1:m
w3(k)=1+exp(-a*t);
end
theta1=0;
for k=1:(m-1)
theta1=theta1+b(1,k)*y(1,(k+1))/a;
end
theta2=(1+exp(-a*t))*(theta1-y(1,1));
kk=1;

%% 循环迭代
for j=1:10
%循环迭代
E(j)=0;
for i=1:(n-6)

%% 网络输出计算
t=i;
%LB层输出
LB_b=1/(1+exp(-w11*t));

%LC层输出
LC_c(1,1)=LB_b*w2(1,1);
for k=2:m
LC_c(k)=y(i,k)*LB_b*w2(1,k);
end

%LD层输出
LD_d=0;
for k=1:m
LD_d=LD_d+w3(1,k)*LC_c(1,k);
end

%阀值
theta3=0;
for k=2:m
theta3=theta3+w2(1,k)*y(i,k)/2;
end
theta4=(1+exp(-w11*t))*(theta3-y(1,1));

%网络输出值
ym=LD_d-theta4;
yc(i)=ym;

%% 权值修正
error=ym-y(i,1); %计算误差
E(j)=E(j)+abs(error); %误差求和

%计算误差
for k=1:m
errorr(k)=error*(1+exp(-w11*t));
end
thetaE0=0;
for k=1:m
thetaE0=thetaE0+w2(1,k)*errorr(1,k);
end
thetaE=(1/(1+exp(-w11*t)))*(1-1/(1+exp(-w11*t)))*thetaE0;

%修改权值
for k=2:m
w2(1,k)=w2(1,k)-u(k-1)*errorr(1,k)*LB_b;
end
w11=w11+a*t*thetaE;
end
end

%画误差随进化次数变化趋势
figure(1)
plot(E)
title('训练误差','fontsize',12);
xlabel('进化次数','fontsize',12);
ylabel('误差','fontsize',12);
%print -dtiff -r600 28-3

%根据训出的神经网络进行预测
for i=(n-5):n
t=i;
LB_b=1/(1+exp(-w11*t)); %LB层输出
LC_c(1,1)=LB_b*w2(1,1); %LC层输出
for k=2:m
LC_c(1,k)=y(i,k)*LB_b*w2(1,k); %LC层输出
end

LD_d=0;
for k=1:m
LD_d=LD_d+w3(1,k)*LC_c(1,k); %LD层输出
end

theta5=0;
for k=2:m
theta5=theta5+w2(1,k)*y(i,k)/2;
end
theta6=(1+exp(-w11*t))*(theta5-y(1,1)); %阀值

ym=LD_d-theta6; %网络输出值
yc(i)=ym;
end
yc=yc*10;
y(:,1)=y(:,1);

%计算预测
for j=n:-1:2
ys(j)=(yc(j)-yc(j-1))/10;
end

figure(2)
plot(ys((n-5):n),'-*');
hold on
plot(X((n-5):n,1),'r:o');
legend('预测值','实际值')
title('灰色神经网络预测','fontsize',12)
xlabel('x','fontsize',12)
ylabel('y','fontsize',12)