今天简单用MATLAB语言写一个RBF神经网络优化PID参数的程序。
基于RBF神经网络PID的控制原理是使用RBF神经网络对被控对象的雅克比信息进行辨识,依据设定的整定指标通过梯度下降法计算Δkp、Δki、Δkd,实现PID参数的自适应调整。
RBF神经网络依据PID控制器的输出u(k)和实际输出y(k),辨识得到雅克比信息;将雅克比信息作为依据,调节PID控制器的Kp 、Ki 、Kd 参数,使PID 控制器的参数获得自适应调整。下图为RBF神经网络PID控制原理图:
基于RBF神经网络PID 的控制流程如图:
本期代码以以下传函为例,采用MATLAB语言直接编写(不适用simulink):
传递函数为:
采用RBF神经网络优化PID参数,直接代码怼脸:
%微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%%
clear
clc
close all
ts=0.0001;%单个时间步长
Gp=tf([10000],[1,120,300,600]);%传递函数
Gpz=c2d(Gp,ts,'z');%离散化传递函数
[num,den]=tfdata(Gpz,'v');%取出z变换后传递函数的分子分母系数
h=zeros(6,1);%RBF函数,这里的6是隐含层节点个数
w=[-0.5359;0.1741;0.5042;0.7119;-0.0304;0.2666];
c=[10.8282 8.7916 11.9357 2.5122 -11.4472 5.4146;
-1.3515 3.2425 -6.6360 -2.7096 -1.8995 -3.1160;
-10.6009 -3.6080 3.6667 -8.5980 -7.6035 8.2084;];
b=[28.0810;8.4260;-38.7748;54.8844;-28.1179;50.9474];
w_1=w;w_2=w;w_3=w;%设定第k次,第k-1次和第k-2次权重初值
xite=0.02;%NNI网络的学习效率
alfa=0.15;%k-1次的惯性系数
belte=0.01;%k-2次的惯性系数
x=[0,0,0]';%NNI网络的输入量
c_1=c;c_2=c_1;c_3=c_2;
b_1=b;b_2=b_1;b_3=b_2;
xc=[0,0,0]';%神经网络的输入量
xitec=0.80;%神经网络的学习效率
%初始的kp,ki,kd三个参数
nnKp = 6000;
nnKd = 90;
nnKi = 1;
%设定PID参数初值
wc=[nnKp,nnKd,nnKi];%神经网络的输入权值
wc_1=wc;wc_2=wc;wc_3=wc;%初始化权值
error_1=0;error_2=0;%误差值初始化
y_1=0;y_2=0;y_3=0;%输出值初始化
u_1=0;u_2=0;u_3=0;%输入值初始化
ei=0;%ei用于存储误差累加值
c_size=size(c);%隐节点基带宽参数长度
T=5000;
for k=1:T
time(k)=k*ts;
rin(k)=1;
yrout(k)=1.0*rin(k);%yrout为参考模型的在输入下的输出
%Linear model
yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;%用差分方程求出输出
for j=1:1:c_size(2)%6列
h(j)=exp(-norm(x-c_1(:,j))^2/(2*b_1(j)*b_1(j)));%RBF函数为高斯函数
end
ymout(k)=w_1'*h;%网络辨识器的输出
id=abs(yout(k)-ymout(k));%检测误差是否大于0.0001
if id>0.0001
%-----------------Adjusting RBF parameters-----------------------%
d_w=0*w; % Defining matrix number of d_w equal to that of w
for j=1:1:6
d_w(j)=xite*(yout(k)-ymout(k))*h(j);
end
w=w_1+d_w+alfa*(w_1-w_2)+belte*(w_2-w_3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
d_b=0*b;
for j=1:1:6
d_b(j)=xite*(yout(k)-ymout(k))*w_1(j)*h(j)*(b_1(j)^-3)*norm(x-c_1(:,j))^2;
end
b=b_1+ d_b+alfa*(b_1-b_2)+belte*(b_2-b_3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:1:6
for i=1:1:3
d_c(i,j)=xite*(yout(k)-ymout(k))*w_1(j)*h(j)*(x(i)-c_1(i,j))*(b_1(j)^-2);
end
end
c=c_1+d_c+alfa*(c_1-c_2)+belte*(c_2-c_3);
end
%%%%%%%%%%% Calculating Jacobian %%%%%%%%%%%%
dyu=0;
for j=1:1:c_size(2)
dyu=dyu+w(j)*h(j)*(-x(1)+c(1,j))/b(j)^2;
end
dyout(k)=dyu;
%%%%%%Parameters Return%%%%%%%
error(k)=yrout(k)-yout(k);
xc(1)=error(k);
xc(2)=(error(k)-error_1)/ts;
ei=ei+error(k)*ts;%误差累加(理解为积分)
xc(3)=ei;
u(k)=wc*xc; %Control law
if u(k)>10
u(k)=10;
end
if u(k)<-10
u(k)=-10;
end
d_wc=0*wc; % Defining matrix number of d_w equal to that of w
for j=1:1:3
d_wc(j)=xitec*error(k)*xc(j)*dyout(k);
end
wc=wc_1+d_wc+alfa*(wc_1-wc_2)+belte*(wc_2-wc_3);
error_2=error_1;error_1=error(k);%误差值更新
u_3=u_2;u_2=u_1;u_1=u(k);%输入值更新
y_3=y_2;y_2=y_1;y_1=yout(k);%输出值更新
x(3)=y_2;
x(2)=y_1;
x(1)=u_1;
w_3=w_2;w_2=w_1;w_1=w;
c_3=c_2;c_2=c_1;c_1=c;
b_3=b_2;b_2=b_1;b_1=b;
wc_3=wc_2;wc_2=wc_1;wc_1=wc;
end
%%%%%%%%%%%%%%%%%%%%%%RBF NN PID%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
t=0:ts:ts*(T-1);
plot(t,yrout,t,yout);
%微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
结果:
代码直接复制到matlab即可运行。