RBF+PID參數自整定控制器設計

##RBF網絡實現PID參數自整定
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
代碼如下

clear;
clc;
%% 參數初始化
lr=0.1;%學習速率
beta=0.05;%動量因子
x=[0,0,0]';%初始化輸入
nn=6;%隱含層節點數

%RBF網絡3-6-1結構初始化參數
ci=30*ones(3,nn);%節點基函數中心向量
bi=40*ones(nn,1);%節點基函數方差
w=10*ones(nn,1); %輸出層權重

h=zeros(nn,1);%隱藏層輸出向量

ci_1=ci;ci_3=ci_1;ci_2=ci_1;
bi_1=bi;bi_2=bi_1;bi_3=bi_2;
w_1=w;w_2=w_1;w_3=w_1;

u_1=0;y_1=0;
ec=[0,0,0]';%誤差變化率ec,e,ecc
error_1=0;error_2=0;error=0;

% PID 初始參數設置
kp0 = 0.03;        
ki0 = 0.28;     
kd0 = 0.03;
flag=1;%控制模式flag=0 PID&RBF;flag=1 PID

kp_1=kp0;
kd_1=kd0;
ki_1=ki0;  

%pid參數學習率
kp_lr=0.20;
kd_lr=0.20;
ki_lr=0.20;
ts=0.01;
%%
for t = 1:1:200
   time(t)=t*ts;
   r(t)=1.0*sign(sin(2*pi*t*ts));%系統參考輸入
   y(t)=(-0.3*y_1+u_1)/(6+y_1^2);%系統輸出
   %% 前向傳播
   %1.計算每個節點RBF的輸出
   for j=1:1:nn
      h(j)=exp(-norm(x-ci(:,j))^2/(2*bi(j)*bi(j)));
   end
   %2. RBF網絡輸出
   ym(t)=w'*h;    
   %% 反向傳播
   %1. 輸出權重更新計算
   d_w=0*w;
   for j=1:1:nn
      d_w(j)=lr*(y(t)-ym(t))*h(j);
   end
   w=w_1+d_w+beta*(w_1-w_2);
   %2. 節點基函數方差更新
   d_bi=0*bi;
   for j=1:1:nn
      d_bi(j)=lr*(y(t)-ym(t))*w(j)*h(j)*(bi(j)^-3)*norm(x-ci(:,j))^2;
   end
   bi=bi_1+ d_bi+beta*(bi_1-bi_2);
   %3. 節點中心更新
   for j=1:1:nn
     for i=1:1:3
      d_ci(i,j)=lr*(y(t)-ym(t))*w(j)*h(j)*(x(i)-ci(i,j))*(bi(j)^-2);
     end
   end
   ci=ci_1+d_ci+beta*(ci_1-ci_2);
  
  %% 系統雅可比矩陣計算
   yu=0;
   for  j=1:1:nn
      yu=yu+w(j)*h(j)*(-x(1)+ci(1,j))/bi(j)^2; 
   end
   dyout(t)=yu;
   %% PID控制器參數修改
   error(t)=r(t)-y(t);
   kp(t)=kp_1+kp_lr*error(t)*dyout(t)*ec(1);
   kd(t)=kd_1+kd_lr*error(t)*dyout(t)*ec(2);
   ki(t)=ki_1+ki_lr*error(t)*dyout(t)*ec(3);  
   if kp(t)<0
      kp(t)=0;
   end
   if kd(t)<0
      kd(t)=0;
   end
   if ki(t)<0
      ki(t)=0;
   end
   switch flag
       case 0
       case 1 
            kp(t)=kp0;
            ki(t)=ki0;     
            kd(t)=kd0;
   end
   du(t)=kp(t)*ec(1)+kd(t)*ec(2)+ki(t)*ec(3); %增量PID控制
   u(t)=u_1+du(t);

   %Return of parameters
   x(1)=du(t);
   x(2)=y(t);
   x(3)=y_1;
   
   u_1=u(t);
   y_1=y(t);
   
   ci_3=ci_2;
   ci_2=ci_1;
   ci_1=ci;
   
   bi_3=bi_2;
   bi_2=bi_1;
   bi_1=bi;
   
   w_3=w_2;
   w_2=w_1;
   w_1=w;
   
   ec(1)=error(t)-error_1;
   ec(2)=error(t)-2*error_1+error_2;
   ec(3)=error(t);  
   
   error_2=error_1;
   error_1=error(t);
   
   kp_1=kp(t);
   kd_1=kd(t);
   ki_1=ki(t);
end
%% 繪圖
figure(1);
plot(time,r,'b',time,y,'r');
xlabel('time(s)');ylabel('r(t),y(t)');
title('RBF&PID控制器下系統輸出')
figure(2);
plot(time,error);
xlabel('times(s)');ylabel('error(t)');
title('RBF&PID控制器下系統誤差');
figure(3);
plot(time,kp,time,ki,time,kd);
xlabel('times(s)');
ylabel('kp,ki,kd');
title('kp,ki,kd整定');
legend('kp','ki','kd');
grid on;


系統輸出:
這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章