我现在在做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');

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐