基于RBF神经网络优化PID参数,MATLAB程序免费获取

今天简单用MATLAB语言写一个RBF神经网络优化PID参数的程序。

基于RBF神经网络PID的控制原理是使用RBF神经网络对被控对象的雅克比信息进行辨识,依据设定的整定指标通过梯度下降法计算Δkp、Δki、Δkd,实现PID参数的自适应调整。

RBF神经网络依据PID控制器的输出u(k)和实际输出y(k),辨识得到雅克比信息;将雅克比信息作为依据,调节PID控制器的Kp 、Ki 、Kd 参数,使PID 控制器的参数获得自适应调整。下图为RBF神经网络PID控制原理图:

757a9af09d7c877062b2638373a0f632.png

基于RBF神经网络PID 的控制流程如图:

20824e24cc37143ea6764e43b6fad394.png

本期代码以以下传函为例,采用MATLAB语言直接编写(不适用simulink):

传递函数为:

744023bc8546de6bf2a265bddd6d034e.png

采用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

结果:

945dc04b04ba15b7ee17419de0772ed1.png

代码直接复制到matlab即可运行。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值