如何在matlab中建立pid神经网络,请教:Matlab中BP神经网络整定PID控制程序
我现在在做BP神经网络PID控制,遇到了问题,我是要做一个对比,一开始是常规的PID控制,仿真波形如图所示:然后我用BP神经网络PID控制进行仿真,得到的波形如图所示:反而效果不好了,求大神们帮忙解决下,谢谢大神们了。我的代码如下:是不是代码有问题?clear all;close all;%xite=0.20; %学习速率?%alfa=0.01; %惯性因子xite=0.3; %学习速率alf..
我现在在做BP神经网络PID控制,遇到了问题,我是要做一个对比,一开始是常规的PID控制,仿真波形如图所示:然后我用BP神经网络PID控制进行仿真,得到的波形如图所示:
反而效果不好了,求大神们帮忙解决下,谢谢大神们了。
我的代码如下:是不是代码有问题?
clear all;
close all;
%xite=0.20; %学习速率?
%alfa=0.01; %惯性因子
xite=0.3; %学习速率
alfa=0.1; %惯性系数
rate=0.002; %斜坡给定速率
target=1.0; %给定值
IN=4;H=5;Out=3; %NN Structure
wi=[ 0.2773 -0.1381 -0.1440 -0.2866 %输入层到隐层的权值
-0.1775 -0.3161 0.3253 0.3391
0.3126 -0.2484 0.0846 0.2476
-0.3079 0.1256 0.0537 -0.1814
0.4427 -0.0292 0.4158 0.7660];
wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo=[ -0.4302 0.2732 0.0628 -0.1689 -0.1948 %隐层到输出层的权值
-0.4521 0.4280 -0.0366 -0.3438 0.0225
0.0248 -0.3761 -0.4941 0.2883 -0.0908];
% wo=0.50*rands(Out,H);
wo_1=wo;wo_2=wo;wo_3=wo;
x=[0,0,0];
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
u_6=0;u_7=0;u_8=0;u_9=0;u_10=0;
u_11=0;u_12=0;u_13=0;u_14=0;u_15=0;u_16=0;u_17=0;u_18=0;u_19=0; %赋初值
y_1=0;y_2=0;y_3=0;
Oh=zeros(H,1); %中间层输出 创建一个H行,1列的零矩阵
I=Oh; %中间层输入
error_2=0;
error_1=0;
%ts=20;
ts=15;
% sys=tf(1.2,[208 1],'inputdelay',80);
% dsys=c2d(sys,ts,'zoh');
% [num,den]=tfdata(dsys,'v');
s=tf('s');
% sys=1.2*exp(-80*s)/(208*s+1);
sys=1.5*exp(-30*s)/(145*s+1);
%sys=1.04*exp(-10*s)/(300*s+1);
%sys=1.5*exp(-2*s)/(20*s+1);
sysd=c2d(sys,ts,'z');%把传递函数离散化
[num,den]=tfdata(sysd,'v')%离散化后提取分子、分母
%for k=1:1:500
for k=1:1:100
time(k)=k*ts; %时间
rin(k)=1.0;
% rin(k)=rate*time(k);
% if rin(k)>=target
% rin(k)=target;
% end
yout(k)=-den(2)*y_1+num(2)*u_3;
%yout(k)=-den(2)*y_1+num(2)*u_1;%根据差分方程计算系统当前输出y(k)
error(k)=rin(k)-yout(k);
xi=[error(k),error(k)-error_1,error(k)-2*error_1+error_2,1];
%xi=[rin(k),yout(k),error(k),1]; %输入层输入
%增量式PID控制算法
x(1)=error(k)-error_1; %比例输出
x(2)=error(k); %积分输出
x(3)=error(k)-2*error_1+error_2; %微分输出
epid=[x(1);x(2);x(3)];
I=xi*wi'; %隐含层输入
for j=1:1:H
Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j))); %隐含层输出
end
K=wo*Oh; %输出层输入
for l=1:1:Out
K(l)=exp(K(l))/(exp(K(l))+exp(-K(l))); %输出层输出
end
kp(k)=K(1);ki(k)=K(2);kd(k)=K(3);
% kp(k)=1.5;
% ki(k)=0.452;
% kd(k)=0.42;
Kpid=[kp(k),ki(k),kd(k)];
du(k)=Kpid*epid;
u(k)=u_1+du(k);
% if u(k)>=0.83
% u(k)=0.83;
% end
% if u(k)<=-0.83
% u(k)=-0.83;
% end
if u(k)>=1.0
u(k)=1.0;
end
if u(k)<=-1.0
u(k)=-1.0;
end
dyu(k)=sign((yout(k)-y_1)/(u(k)-u_1+0.00000001));
%权值调整
%输出层
for j=1:1:Out
dK(j)=2/(exp(K(j))+exp(-K(j)))^2;
end
for l=1:1:Out
delta3(l)=error(k)*dyu(k)*epid(l)*dK(l);
end
for l=1:1:Out
for i=1:1:H
d_wo=xite*delta3(l)*Oh(i)+alfa*(wo_1-wo_2);
end
end
wo=wo_1+d_wo+alfa*(wo_1-wo_2);
%隐含层
for i=1:1:H
dO(i)=4/(exp(I(i))+exp(-I(i)))^2;
end
segma=delta3*wo;
for i=1:1:H
delta2(i)=dO(i)*segma(i);
end
d_wi=xite*delta2'*xi;
wi=wi_1+d_wi+alfa*(wi_1-wi_2);
u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k); %参数更新
u_10=u_9;u_9=u_8;u_8=u_7;u_7=u_6;u_6=u_5;
u_19=u_18;u_18=u_17;u_17=u_16;u_16=u_15;u_15=u_14;u_14=u_13;u_13=u_12;u_12=u_11;u_11=u_10;
y_2=y_1;y_1=yout(k);
wo_3=wo_2;
wo_2=wo_1;
wo_1=wo;
wi_3=wi_2;
wi_2=wi_1;
wi_1=wi;
error_2=error_1;
error_1=error(k);
end
figure(1);
plot(time,rin,'r',time,yout,'b');
xlabel('时间(s)');ylabel('rin,yout');
figure(2);
plot(time,error,'r');
xlabel('时间(s)');ylabel('误差error');
figure(3);
plot(time,u,'r');
xlabel('时间(s)');ylabel('u');
figure(4);
subplot(311);
plot(time,kp,'r');
xlabel('时间(s)');ylabel('比例kp');
subplot(312);
plot(time,ki,'g');
xlabel('时间(s)');ylabel('积分ki');
subplot(313);
plot(time,kd,'b');
xlabel('时间(s)');ylabel('微分kd');
更多推荐
所有评论(0)