模糊控制PID设计大作业--.docx
《模糊控制PID设计大作业--.docx》由会员分享,可在线阅读,更多相关《模糊控制PID设计大作业--.docx(15页珍藏版)》请在冰点文库上搜索。
参考教材中例子设计一包含了模糊技术与PID技术的混合智能控制器,其被控对象为:
采样时间为1ms,编写matlab仿真程序,确定其在阶跃输入的响应结果,并与经典PID控制仿真结果相比较。
要求详细描述控制系统的设计,控制系统工作流程,模糊系统中的输入输出的隶属函数设计及其采用的模糊规则,分析仿真结果并进行总结。
表1Δkp的模糊规则表
ec
Δkp
e
NB
NM
NS
ZO
PS
PM
PB
NB
PB
PB
PM
PM
PS
ZO
ZO
NM
PB
PB
PM
PS
PS
ZO
NS
NS
PM
PM
PM
PS
ZO
NS
NS
ZO
PM
PM
PS
ZO
NS
NM
NM
PS
PS
PS
ZO
NS
NS
NM
NM
PM
PS
ZO
NS
NM
NM
NM
NB
PB
ZO
ZO
NM
NM
NM
NB
NB
表2Δki的模糊规则表
Δki
ec
e
NB
NM
NS
ZO
PS
PM
PB
NB
NB
NB
NM
NM
NS
ZO
ZO
NM
NB
NB
NM
NS
NS
ZO
ZO
NS
NB
NM
NS
NS
ZO
PS
PS
ZO
NM
NM
NS
ZO
PS
PM
PM
PS
MN
NS
ZO
PS
PS
PM
PB
PM
ZO
ZO
PS
PS
PM
PB
PB
PB
ZO
ZO
PS
PM
PM
PB
PB
表3Δkd的模糊规则表
Δkd
ec
e
NB
NM
NS
ZO
PS
PM
PB
NB
PS
NS
NB
NB
NB
NM
PS
NM
PS
NS
NB
NM
NM
NS
ZO
NS
ZO
NS
NM
NM
NS
NS
ZO
ZO
ZO
NS
NS
NS
NS
NS
ZO
PS
ZO
ZO
ZO
ZO
ZO
ZO
ZO
PM
PB
NS
PS
PS
PS
PS
PB
PB
PB
PM
PM
PS
PS
PS
PB
Kp,ki,kd的模糊控制规则表建立好以后,可根据以下方法进行kp,ki,kd的自适应校正。
将系统误差e和误差变化ec变化范围定义为模糊集上的论域,即e,ec={-3,-2,-1,0,1,2,3},其模糊子集为e,ec={NB,NM,NS,ZO,PS,PM,PB},子集中元素分别代表负大,负中,负小,零,正小,正中,正大。
应用模糊合成推理设计PID参数的整定算法。
第k个采样时间的整定为
Kp(k)=kp0+Δkp(k)
Ki(k)=ki0+Δki(k)
Kd(k)=kd0+Δkd(k)
在线运行过程中,控制系统通过对模糊逻辑规则的结果处理、查表和运算,完成对PID参数的在线自校正。
其工作流程图如下图所示。
入口
e(k),ec(k)模糊化
e(k-1)=e(k)
PID控制器输出
计算当前kp,ki,kd
模糊整定Δkp,Δki,Δkd
ec(k)=e(k)-e(k-1)
e(k)=r(k)-y(k)
取当前采样值
返回
图1误差的隶属函数
图2误差变化率的隶属函数
图3kp的隶属函数
图4ki的隶属函数
图5kd的隶属函数
图6模糊系统fuzzpid.fis的结构
图7模糊推理系统的动态仿真环境
在程序PID_b.m中,利用所设计的模糊系统fuzzpid.fis进行PID控制参数的整定,并利用模糊PID控制进行阶跃响应,在第300个采样时间时控制器输出端加上1.0的干扰,响应结果及PID控制参数的自适应变化如图8到13所示。
图8模糊PID控制阶跃响应
图9模糊PID控制误差响应
图10控制器输入u
图11kp的自适应调整
图12ki的自适应调整
图13kd的自适应调整
在对三阶线性系统的控制中,利用稳定边界法进行参数整定的经典PID控制的超调量比模糊PID控制的超调量要大,但模糊PID控制存在一定的稳态误差。
模糊控制用模糊集合和模糊概念描述过程系统的动态特性,根据模糊集和模糊逻辑来做出控制决策,它在解决复杂控制问题方面有很大的潜力,可以动态地适应外界环境的变化。
附录1模糊系统设计程序PID_a
%FuzzyTurnningPIDControl
clearall;
closeall;
a=newfis('fuzzpid');
a=addvar(a,'input','e',[-3,3]);
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,0]);
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]);
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,0]);
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]);
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]);
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]);
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]);
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,0]);
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=[1171511;
1231311;
1362111;
1462111;
1553111;
1644211;
1744511;
2171511;
2271311;
2362111;
2453211;
2553211;
2644311;
2734411;
3161411;
3262311;
3363211;
3453211;
3544311;
3635311;
3735411;
4162411;
4262411;
4353311;
4444311;
4535311;
4626311;
4726411;
5152411;
5253411;
5344411;
5435411;
5535411;
5626411;
5727411;
6154711;
6244511;
6335511;
6425511;
6526511;
6627511;
6717711;
7144711;
7244611;
7325611;
7426611;
7526511;
7617511;
7717711];
a=addrule(a,rulelist);
a=setfis(a,'DefuzzMethod','centroid');
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);
fuzzyfuzzpid;
showrule(a);
ruleviewfuzzpid;
附录2模糊控制程序PID_b
%FuzzyPIDControl
closeall;
clearall;
a=readfis('fuzzpid');
ts=0.001;
sys=tf(4.23,[1,1.64,8.46]);
days=c2d(sys,ts,'tustin');
[num,den]=tfdata(days,'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;
kd0=1.0;
ki0=0.0;
fork=1:
1:
3000;
time(k)=k*ts;
r(k)=1.0;
%UsingfuzzyinferencetotuningPID
k_pid=evalfis([e_1,ec_1],a);
kp(k)=kp0+k_pid
(1);
ki(k)=ki0+k_pid
(2);
kd(k)=kd0+k_pid(3);
u(k)=kp(k)*x
(1)+kd(k)*x
(2)+ki(k)*x(3);
ifk==300%addingdisturbance(1.0vattime0.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;
e(k)=r(k)-y(k);
%%%%%%%%%%%%%%ReturnofPIDparameters%%%%%%%%%%%%%
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);%CalculatingP
x
(2)=e(k)-e_1;%CalculatingD
x(3)=x(3)+e(k)*ts%CalculatingI
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');