%BP based PID Control
clear all;
close all;
%model parameter
x=[0,0,0];
du_1=0; %控制器输出变换量初始值
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;u_6=0; %
y_1=0;y_2=0;y_3=0;
%扰动部分的输入、输出初始化
u_1r=0;
y_1r=0;
u_1d=0;u_2d=0;u_3d=0;u_4d=0;u_5d=0;
y_1d=0;y_2d=0;
%前馈部分的输入
u_1b=0;u_2b=0;u_3b=0;u_4b=0;u_5b=0;u_6b=0;u_7b=0;
y_1b=0;y_2b=0;y_3b=0;y_4b=0;
ts=1; %采样周期
K=20;
A=1+0.1*K;
sys1=tf(0.0004*K,[30,(3+10*A),A,0],'inputdelay',3); %建立被控对象传递函数
dsys1=c2d(sys1,ts,'z'); %传递函数的离散化
[num1,den1]=tfdata(dsys1,'v'); %提取传递函数的分子分母
%扰动的一部分,惯性环节
B=0.01;
sys2=tf(B,[8,1]);
dsys2=c2d(sys2,ts,'z');
[num2,den2]=tfdata(dsys2,'v');
%扰动的另一部分
C=0.0003;
sys3=tf(C,[8,1,0],'inputdelay',3);
dsys3=c2d(sys3,ts,'z');
[num3,den3]=tfdata(dsys3,'v');
%扰动的前馈
K1=0.1;E=1;
sys4=tf(0.0004*K1*K1,[30*E,(30+(3+10*A)*E),((3+10*A)+A*E),(A+1*E),0],'inputdelay',3);
dsys4=c2d(sys4,ts,'z');
[num4,den4]=tfdata(dsys4,'v');
%NN set
xite=0.20;%%%%学习速率
alfa=0.01;%%%%惯性因子
IN=3;H=2;Out=3; %NN Structure
wi=0.50*rands(H,IN); %隐含层加权系数wi初始化
wi_1=wi;wi_2=wi;wi_3=wi;
wo=0.50*rands(Out,H); %输出层加权系数wo初始化
wo_1=wo;wo_2=wo;wo_3=wo;
Oh=zeros(H,1); %隐含层的输出
I=Oh; %隐含层的输入
error_2=0;
error_1=0;
for k=1:1:1000
time(k)=k*ts;
if(k>=500)
u_r(k)=-3;
u_b(k)=-3;
else
u_r(k)=0;
u_b(k)=0;
end
rin(k)=3.0;
%Unlinear model
y1out(k)=-den1(2)*y_1-den1(3)*y_2-den1(4)*y_3+num1(2)*u_4+num1(3)*u_5+num1(4)*u_6;
y2out(k)=-den2(2)*y_1r+num2(2)*u_1r;%u_1r为扰动输入,y_1r为惯性环节下的扰动输出
y3out(k)=-den3(2)*y_1d-den3(3)*y_2d+num3(2)*u_4d+num3(3)*u_5d;
y4out(k)=-den4(2)*y_1b-den4(3)*y_2b-den4(4)*y_3b-den4(5)*y_4b+num4(2)*u_4b+num4(3)*u_5b+num4(4)*u_6b+num4(5)*u_7b;
yout(k)=y1out(k)+y2out(k)-y3out(k)+y4out(k);%
%----------误差以及误差变化量-------------%
error(k)=rin(k)-yout(k);%给定值为3
xi=[error(k),u_r(k),1];%增加一个输入,
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))); %输出层的输出,Getting kp,ki,kd
end
kp(k)=K(1);ki(k)=K(2);kd(k)=K(3);%PID参数值
%Kpid=[kp(k)+10,0.001,0];
%Kpid=[kp(k) ki(k) kd(k)];
Kpid=[10,0.001,2];
du(k)=Kpid*epid; %PID控制器的输出增量
u(k)=u_1+du(k); %PID控制器的输出
if (u(k)>50) %控制器的饱和环节
u(k)=50;
end
if (u(k)<-50)
u(k)=-50;
end
dyu(k)=sign((yout(k)-y_1)/(du(k)-du_1+0.000001)); %y_1初始值为零
%Output layer
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);%权值更新
%Hidden layer
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);%权值更新
%Parameters Update
du_1=du(k);
u_6=u_5;u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=y1out(k);
u_1r=u_r(k);
y_1r=y2out(k);
u_5d=u_4d;u_4d=u_3d;u_3d=u_2d;u_2d=u_1d;u_1d=u_r(k);
y_2d=y_1d;y_1d=y3out(k);
u_7b=u_6b;u_6b=u_5b;u_5b=u_4b;u_4b=u_3b;u_3b=u_2b;u_2b=u_1b;u_1b=u_b(k);
y_4b=y_3b;y_3b=y_2b;y_2b=y_1b;y_1b=y4out(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('time(s)');ylabel('rin,yout');
figure(2);
plot(time,error,'r');
xlabel('time(s)');ylabel('error');
figure(3);
plot(time,u,'r');
xlabel('time(s)');ylabel('u');
figure(4);
plot(time,u_r,'r');
xlabel('time(s)');ylabel('u_r');
figure(5);
%subplot(211);
%plot(time,y2out,'r');
%xlabel('time(s)');ylabel('y2out');
%subplot(212);
plot(time,y1out,'r');
xlabel('time(s)');ylabel('y1out');
figure(6);
subplot(311);
plot(time,kp,'r');
xlabel('time(s)');ylabel('kp');
subplot(312);
plot(time,ki,'r');
xlabel('time(s)');ylabel('ki');
subplot(313);
plot(time,kd,'r');
xlabel('time(s)');ylabel('kd');
评论2