模糊PID控制仿真

一、简介

模糊PID控制器是将模糊算法与PID控制参数的自整定相结合的一种控制算法。可以说是模糊算法在PID参数整定上的应用。

自适应模糊PID控制器以误差e和误差变化ec作为输人(利用模糊控制规则在线对PID参数进行修改),以满足不同时刻的e和ec对PID参数自整定的要求。

PID参数模糊自整定是找出PID的3个参数kp、ki|kd与e和ec之间的模糊关系,在运行中通过不断检测e和ec ,根据模糊控制原理来对3个参数进行在线修改,以满足不同e和ec时对控制参数的要求,从而使被控对象有良好的动、静态性能。

模糊控制这里不赘述了,可以网上查资料。
 

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_5e

 

1)、Kp模糊规则设计

在PID控制器中,Kp值的选取决定于系统的响应速度。增大Kp能提高响应速度,减小稳态偏差;但是,Kp值过大会产生较大的超调,甚至使系统不稳定减小Kp可以减小超调,提高稳定性,但Kp过小会减慢响应速度,延长调节时间。因此,调节初期应适当取较大的Kp值以提高响应速度,而在调节中期,Kp则取较小值,以使系统具有较小的超调并保证一定的响应速度;而在调节过程后期再将Kp值调到较大值来减小静差,提高控制精度。基于上述描述我们定义Kp的模糊规则如下:

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_matlab_02

2)、Ki模糊规则设计

在系统控制中,积分控制主要是用来消除系统的稳态偏差。由于某些原因(如饱和非线性等),积分过程有可能在调节过程的初期产生积分饱和,从而引起调节过程的较大超调。因此,在调节过程的初期,为防止积分饱和,其积分作用应当弱一些,甚至可以取零;而在调节中期,为了避免影响稳定性,其积分作用应该比较适中;最后在过程的后期,则应增强积分作用,以减小调节静差。依据以上分析,我们制定的Ki模糊规则如下:

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_matlab_03

3)、Kd模糊规则设计

微分环节的调整主要是针对大惯性过程引入的,微分环节系数的作用在于改变系统的动态特性。系统的微分环节系数能反映信号变化的趋势,并能在偏差信号变化太大之前,在系统中引入一个有效的早期修正信号,从而加快响应速度,减少调整时间,消除振荡.最终改变系统的动态性能。因此,Kd值的选取对调节动态特性影响很大。Kd值过大,调节过程制动就会超前,致使调节时间过长;Kd值过小,调节过程制动就会落后,从而导致超调增加。根据实际过程经验,在调节初期,应加大微分作用,这样可得到较小甚至避免超调;而在中期,由于调节特性对Kd值的变化比较敏感,因此,Kd值应适当小一些并应保持固定不变;然后在调节后期,Kd值应减小,以减小被控过程的制动作用,进而补偿在调节过程初期由于Kd值较大所造成的调节过程的时间延长。依据以上分析,我们制定Kd的模糊规则如下:

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_matlab_04

 

整个自适应模糊PID控制的流程如下所示:

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_matlab_05

二、题目要求

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_自适应_06

三、实验代码

1、规则表的建立

%Fuzzy Tunning PID Control
clear all;
close all;

a=newfis('fuzzpid');

a=addvar(a,'input','e',[-3,3]);                        %Parameter e
a=addmf(a,'input',1,'NB','zmf',[-3,-1]);
a=addmf(a,'input',1,'NM','trimf',[-3,-2,0]);
a=addmf(a,'input',1,'NS','trimf',[-3,-1,1]);
a=addmf(a,'input',1,'Z','trimf',[-2,0,2]);
a=addmf(a,'input',1,'PS','trimf',[-1,1,3]);
a=addmf(a,'input',1,'PM','trimf',[0,2,3]);
a=addmf(a,'input',1,'PB','smf',[1,3]);

a=addvar(a,'input','ec',[-3,3]);                       %Parameter ec
a=addmf(a,'input',2,'NB','zmf',[-3,-1]);
a=addmf(a,'input',2,'NM','trimf',[-3,-2,0]);
a=addmf(a,'input',2,'NS','trimf',[-3,-1,1]);
a=addmf(a,'input',2,'Z','trimf',[-2,0,2]);
a=addmf(a,'input',2,'PS','trimf',[-1,1,3]);
a=addmf(a,'input',2,'PM','trimf',[0,2,3]);
a=addmf(a,'input',2,'PB','smf',[1,3]);

a=addvar(a,'output','kp',[-0.3,0.3]);                   %Parameter kp
a=addmf(a,'output',1,'NB','zmf',[-0.3,-0.1]);
a=addmf(a,'output',1,'NM','trimf',[-0.3,-0.2,0]);
a=addmf(a,'output',1,'NS','trimf',[-0.3,-0.1,0.1]);
a=addmf(a,'output',1,'Z','trimf',[-0.2,0,0.2]);
a=addmf(a,'output',1,'PS','trimf',[-0.1,0.1,0.3]);
a=addmf(a,'output',1,'PM','trimf',[0,0.2,0.3]);
a=addmf(a,'output',1,'PB','smf',[0.1,0.3]);

a=addvar(a,'output','ki',[-0.06,0.06]);             %Parameter ki
a=addmf(a,'output',2,'NB','zmf',[-0.06,-0.02]);
a=addmf(a,'output',2,'NM','trimf',[-0.06,-0.04,0]);
a=addmf(a,'output',2,'NS','trimf',[-0.06,-0.02,0.02]);
a=addmf(a,'output',2,'Z','trimf',[-0.04,0,0.04]);
a=addmf(a,'output',2,'PS','trimf',[-0.02,0.02,0.06]);
a=addmf(a,'output',2,'PM','trimf',[0,0.04,0.06]);
a=addmf(a,'output',2,'PB','smf',[0.02,0.06]);

a=addvar(a,'output','kd',[-3,3]);                   %Parameter kd
a=addmf(a,'output',3,'NB','zmf',[-3,-1]);
a=addmf(a,'output',3,'NM','trimf',[-3,-2,0]);
a=addmf(a,'output',3,'NS','trimf',[-3,-1,1]);
a=addmf(a,'output',3,'Z','trimf',[-2,0,2]);
a=addmf(a,'output',3,'PS','trimf',[-1,1,3]);
a=addmf(a,'output',3,'PM','trimf',[0,2,3]);
a=addmf(a,'output',3,'PB','smf',[1,3]);

rulelist=[1 1 7 1 5 1 1;
          1 2 7 1 3 1 1;
          1 3 6 2 1 1 1;
          1 4 6 2 1 1 1;
          1 5 5 3 1 1 1;
          1 6 4 4 2 1 1;
          1 7 4 4 5 1 1;
          
          2 1 7 1 5 1 1;
          2 2 7 1 3 1 1;
          2 3 6 2 1 1 1;
          2 4 5 3 2 1 1;
          2 5 5 3 2 1 1;
          2 6 4 4 3 1 1;
          2 7 3 4 4 1 1;
          
          3 1 6 1 4 1 1;
          3 2 6 2 3 1 1;
          3 3 6 3 2 1 1;
          3 4 5 3 2 1 1;
          3 5 4 4 3 1 1;
          3 6 3 5 3 1 1;
          3 7 3 5 4 1 1;
          
          4 1 6 2 4 1 1;
          4 2 6 2 3 1 1;
          4 3 5 3 3 1 1;
          4 4 4 4 3 1 1;
          4 5 3 5 3 1 1;
          4 6 2 6 3 1 1;
          4 7 2 6 4 1 1;
          
          5 1 5 2 4 1 1;
          5 2 5 3 4 1 1;
          5 3 4 4 4 1 1;
          5 4 3 5 4 1 1;
          5 5 3 5 4 1 1;
          5 6 2 6 4 1 1;
          5 7 2 7 4 1 1;
          
          6 1 5 4 7 1 1;
          6 2 4 4 5 1 1;
          6 3 3 5 5 1 1;
          6 4 2 5 5 1 1;
          6 5 2 6 5 1 1;
          6 6 2 7 5 1 1; 
          6 7 1 7 7 1 1;

          7 1 4 4 7 1 1; 
          7 2 4 4 6 1 1;
          7 3 2 5 6 1 1;
          7 4 2 6 6 1 1;
          7 5 2 6 5 1 1;
          7 6 1 7 5 1 1;
          7 7 1 7 7 1 1];
       
a=addrule(a,rulelist);
a=setfis(a,'DefuzzMethod','centroid');
%%bisector 面积等分法 lom 最大隶属度取大法 som 最大隶属度取小法
%%centroid 面积重心法 mom 最大隶属度平均法
writefis(a,'fuzzpid');

a=readfis('fuzzpid');

figure(1);
plotmf(a,'input',1);
figure(2);
plotmf(a,'input',2);
figure(3);
plotmf(a,'output',1);
figure(4);
plotmf(a,'output',2);
figure(5);
plotmf(a,'output',3);
figure(6);
plotfis(a);

fuzzy fuzzpid;
showrule(a);
ruleview fuzzpid;

得出上述的规则表:

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_自适应_07

2、函数版本仿真

%Fuzzy PID Control
close all;
clear all;

a=readfis('fuzzpid');   %Load fuzzpid.fis

ts=0.5;
s=tf('s');
%sys=tf(5.235e005,[1,87.35,1.047e004,0]);
sys=tf(1,[10,1],'outputdelay',0.5)
% sys=exp(-0.5*s)*sys
dsys=c2d(sys,ts,'tustin');
[num,den]=tfdata(dsys,'v')

u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0;y_2=0;y_3=0;

x=[0,0,0]';

e_1=0;
ec_1=0;
%kp0=0.40;
kp0=7;
% kp0=39.6498;
%kd0=1.0;
kd0=1.7;
% kd0=9.4295;
ki0=2.9;
% ki0=2.7887;

for k=1:1:30
time(k)=k*ts;

%r(k)=sign(sin(2*pi*k*ts));
r(k)=30;
%Using fuzzy inference to tunning PID
k_pid=evalfis([0.5*e_1,0.4*ec_1],a);
kp(k)=kp0+k_pid(1);
ki(k)=ki0+k_pid(3);
kd(k)=kd0+k_pid(2);
u(k)=kp(k)*x(1)+kd(k)*x(2)+ki(k)*x(3);

% if k==300     % Adding disturbance(1.0v at time 0.3s)
%    u(k)=u(k)+1.0;
% end

%y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(1)*u(k)+num(2)*u_1+num(3)*u_2+num(4)*u_3;
y(k)=-den(2)*y_1+num(1)*u(k)+num(2)*u_1;
%y(k)=-den(2)*y_1+num(2)*u_1;

e(k)=r(k)-y(k);
%%%%%%%%%%%%%%Return of PID parameters%%%%%%%%%%%%%%%
   u_3=u_2;
   u_2=u_1;
   u_1=u(k);
   
   y_3=y_2;
   y_2=y_1;
   y_1=y(k);
   
   x(1)=e(k);            % Calculating P
   x(2)=e(k)-e_1;        % Calculating D
   x(3)=x(3)+e(k)*ts;    % Calculating I

   ec_1=x(2);
   e_2=e_1;
   e_1=e(k);
end

figure(1);
plot(time,r,'b',time,y,'r');
xlabel('time(s)');ylabel('rin,yout');
figure(2);
plot(time,e,'r');
xlabel('time(s)');ylabel('error');
figure(3);
plot(time,u,'r');
xlabel('time(s)');ylabel('u');
figure(4);
plot(time,kp,'r');
xlabel('time(s)');ylabel('kp');
figure(5);
plot(time,ki,'r');
xlabel('time(s)');ylabel('ki');
figure(6);
plot(time,kd,'r');
xlabel('time(s)');ylabel('kd');

3、simulink仿真

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_自适应_08

子系统

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_2d_09

四、实验结果

1、函数版本

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_2d_10

 

2、simlink仿真

模糊pid控制算法讲解与代码Python 模糊pid控制器的设计仿真_matlab_11