feu(j)=fe(j);
else
feu(j)=R(j,i);
end
end
FU(i)=max(feu);
end
%单输入模糊控制仿真程序FC_SI_main.m,被控对象W(s)=-1.1/(35s+1)^4)
clearall
DT=1;ST=1500;LP=ST/DT;
A1=exp(-DT/35);B1=1-A1;
x(1:
4)=0;ur=0;
%###设置e、u的初始论域及其等级量论域,计算量化因子及比例因子##########
em=1.5;EM=3;Ke=EM/em;
UM=3;um=1.5;Ku=um/UM;
%#########调用计算模糊关系矩阵R的子程序F_Relation_1.m#############
[R,mfc,ne,nu,Me]=F_Relation_1;
%#############################################################
fork=1:
LP
%############计算FC的输出###################################
e=1-x(4);%计算偏差量e
e1=round(Ke*e);%把e转化成等级量
ife1>EM;e1=EM;end
ife1<-EM;e1=-EM;end
j=e1+EM+1;
Fi=1;
fori=2:
mu
ifMe(i,j)>Me(i-1,j);Fi=i;end;%得到模糊语言值
end
U=F_Deduce_1(Me(Fi,:
),R,ne,nu);%调用模糊决策子程序
%加权平均法判决控制器的输出
Su=0;S=0;
fori=-UM:
UM
Su=Su+i*U(i+UM+1);S=S+U(i+UM+1);
end
u=Ku*Su/S+ur;
%***************仿真计算被控对象********************
x
(1)=A1*x
(1)-1.1*B1*u;
x
(2)=A1*x
(2)+B1*x
(1);
x(3)=A1*x(3)+B1*x
(2);
x(4)=A1*x(4)+B1*x(3);
y1(k)=x(4);
u1(k)=u;
t(k)=k*DT;
ift(k)>800;ur=0.5;end;%800秒后加入内扰
end
plot(t,y1)
holdon;
plot(t,u1,'--')
图5.11单输入模糊控制器的控制效果
从上述的仿真结果可以看到,定值扰动时系统可以达到稳定,但是有很大的静差,不能满足工程上的要求,究其原因是,模糊控制器实质上是一个具有继电器型非线性特性的控制器(如图5.11中所示的u),没有积分作用,对于有自平衡对象一定会产生静差,而且系统极容易产生震荡。
从图5.11就可看出,虽然设计的模糊控制器对定值扰动是稳定的,但对于内扰并不能使其稳定。
非线性控制器的控制效果取决于各变量的论域及扰动量的大小【1】,因此,模糊控制器的大范围工程应用还有许多问题需要研究。
2、双输入模糊控制器的设计
【例5.13】对于图5.10所示的系统,设计双输入模糊控制器,观察定值扰动和内部扰动的控制效果。
下面考虑两个输入的情况:
设温度偏差e、偏差变化率ec及控制量u的实际论域:
,选择它们的等级量论域分别为
量化因子
,
假设选取E的模糊变量词集为
选取模糊变量E的赋值表如表5-5所示。
表5-5e的等级量与模糊量的关系
E
E
-6
-5
-4
-3
-2
-1
-0
+0
+1
+2
+3
+4
+5
+6
PB
0
0
0
0
0
0
0
0
0
0
0.1
0.4
0.8
1.0
PM
0
0
0
0
0
0
0
0
0
0.2
0.7
1.0
0.7
0.2
PS
0
0
0
0
0
0
0
0.3
0.8
1.0
0.5
0.1
0
0
PO
0
0
0
0
0
0
0
1.0
0.6
0.1
0
0
0
0
NO
0
0
0
0
0.1
0.6
1.0
0
0
0
0
0
0
0
NS
0
0
0.1
0.5
1.0
0.8
0.3
0
0
0
0
0
0
0
NM
0.2
0.7
1.0
0.7
0.2
0
0
0
0
0
0
0
0
0
NB
1.0
0.8
0.4
0.1
0
0
0
0
0
0
0
0
0
0
选取EC、U的模糊变量词集为
选取模糊变量EC的赋值表如表5-2所示,模糊变量U的赋值表如表5-6所示。
表5-6等级量U与模糊量U的关系
U
U
-7
-6
-5
-4
-3
-2
-1
0
+1
+2
+3
+4
+5
+6
+7
PB
0
0
0
0
0
0
0
0
0
0
0
0.1
0.4
0.8
1.0
PM
0
0
0
0
0
0
0
0
0
0.2
0.7
1.0
0.7
0.2
0
PS
0
0
0
0
0
0
0
0.4
1.0
0.8
0.4
0.1
0
0
0
ZO
0
0
0
0
0
0
0.5
1.0
0.5
0
0
0
0
0
0
NS
0
0
0
0.1
0.4
0.8
1.0
0.4
0
0
0
0
0
0
0
NM
0
0.2
0.7
1.0
0.7
0.2
0
0
0
0
0
0
0
0
0
NB
1.0
0.8
0.4
0.1
0
0
0
0
0
0
0
0
0
0
0
现将操作者在操作过程中遇到的各种出现的情况和相应的控制策略汇总为表5-7。
表5-7双输入时的模糊控制规则表
E
U
EC
NB
NM
NS
NO
PO
PS
PM
PB
NB
PB
PB
PM
PM
PM
PS
ZO
ZO
NM
PB
PB
PM
PM
PM
PS
ZO
ZO
NS
PB
PB
PM
PS
PS
ZO
NS
NM
ZO
PB
PM
PS
ZO
ZO
NS
NM
NB
PS
PM
PM
PS
ZO
NS
NS
NM
NB
PM
PM
PS
ZO
NS
NM
NM
NB
NB
PB
PS
ZO
NS
NM
NM
NB
NB
NB
下面说明建立模糊控制规则表的基本思想。
首先考虑误差为负的情况,当误差(希望值减去温度值)为负大时(说明温度高于希望值),若误差变化率也为负,这时误差有增大的趋势,为尽快消除已有的负大误差并抑制误差变大,所以控制量的变化取正大(控制量增大,意味着喷水阀门开度增大,喷水量增加,使得温度下降,下同)。
当误差为负而误差变化率为正时,系统本身已有减少误差的趋势,所以,为尽快消除误差而又不超调,应取较小的控制量。
当误差为负中时,控制量的变化应使误差尽快消除,基于这种原则,控制量的变化选取同误差为负大时相同。
当误差为负小时,系统接近稳态,若误差变化微小时,选取控制量变化为正中,以抑制误差往负方向变化;若误差变化为正时,系统本身有消除负小的误差的趋势,选取控制量变化为正小。
上述选取控制量变化的原则:
当误差大或较大时,选择控制量以尽快消除误差为主;当误差较小时,选择控制量要注意防止超调,以系统稳定性为主要出发点。
按着上述控制规则,可以得到温度偏差及偏差变化率与喷水阀门开度之间的模糊关系
:
其中角标E,EC,U分别表示误差、误差变化率和控制量。
设e、ec、u的等级量分别为nfe、nfec、nfu,则R是一个
行
列的矩阵。
计算模糊关系矩阵R的子程序如F_Relation_2.m所示。
%模糊关系计算子程序F_Relation_2.c
function[R,n,nE,nEC,nU,nfe,nfec,nfu,Me,Mec]=func()
%##定义E的模糊变量值1=PB,2=PM,3=PS,4=-O,5=+0,6=NS,7=NM,8=NB并输入表(5-5)####
nE=8;%模糊变量E的语言值个数¸控制表列数
E=[87654321];
nfe=14;%E的等级量个数
Me=[00000000000.10.40.81.0;
0000000000.20.71.00.70.2;
00000000.30.81.00.50.100;
00000001.00.60.10000;
00000.10.61.00000000;
000.10.51.00.80.30000000;
0.20.71.00.70.2000000000;
1.00.80.40.10000000000];
%###定义EC的模糊变量值1=PB,2=PM,3=PS,4=0,5=NS,6=NM,7=NB并输入表(5-2)#####
nEC=7;%模糊变量EC的语言值个数¸控制表行数
EC=[7654321];
nfec=13;%EC的等级量个数
Mec=[0000000000.10.40.81.0;
000000000.20.71.00.70.2;
00000000.91.00.70.200;
000000.51.00.500000;
000.20.71.00.90000000;
0.20.71.00.70.200000000;
1.00.80.40.1000000000];
%###定义U的模糊变量值1=PB,2=PM,3=PS,4=0,5=NS,6=NM,7=NB并输入表(5-6)#####
nU=7;%模糊变量U的语言值个数
U=[7654321];
nfu=15;%U的等级量个数
Mu=[000000000000.10.40.81.0;
0000000000.20.71.00.70.20;
00000000.41.00.80.40.1000;
0000000.51.00.5000000;
0000.10.40.81.00.40000000;
00.20.71.00.70.2000000000;
1.00.80.40.100000000000];
%#######################输入模糊控制规则表(表5-7)#########################
nfc=8;%模糊变量E的语言值个数,模糊控制表列数
mfc=7;%模糊变量EC的语言值个数,模糊控制表行数
UC=[11222344;11222344;11233456;12344567;
22345567;23456677;34566777];
%###########################计算R=(E×EC×U)#######################################
R=zeros(nfe*nfec,nfu);
fori=1:
mfc
forj=1:
nfc
%E×EC
ie=E(j);
iec=EC(i);
fork=1:
nfe
forl=1:
nfec
ifMe(ie,k)Reec(k,l)=Me(ie,k);
else
Reec(k,l)=Mec(iec,l);
end
end
end
%E×EC×U
iu=UC(i,j);
n=0;
fork=1:
nfe
forl=1:
nfec
n=n+1;
fort=1:
nfu
ifReec(k,l)Reecu(n,t)=Reec(k,l);
else
Reecu(n,t)=Mu(iu,t);
end
end
end
end
fork=1:
n
forl=1:
nfu
ifReecu(k,l)>R(k,l)
R(k,l)=Reecu(k,l);
end
end
end
end
end
双输入时,先根据e、ec计算出相应的等级量E、EC,再根据表(5-2)查出相应的
,然后按式(5-6)计算出模糊控制器的输出。
其模糊决策子程序如F_Deduce_2.m所示。
%双输入时模糊决策子程序F_Deduce_2.m
functionFU=F_Deduce_2(fe,fec,R,n,nfe,nfec,nfu)
%#######################计算E×EC#####################################
n=0;
fori=1:
nfe
forj=1:
nfec
n=n+1;
iffe(i)feec(n)=fe(i);
else
feec(n)=fec(j);
end
end
end
%#######################计算(E×EC)。
R################################
forl=1:
nfu
fori=1:
n
iffeec(i)fu(i)=feec(i);
else
fu(i)=R(i,l);
end
FU(l)=max(fu);
end
end
按着前面的设计过程,可以得到双输入模糊控制主程序,如FC_MI_main.m所示。
%单输入单变量模糊控制仿真程序FC_SI_main.m,被控对象W(s)=-1.1/(35s+1)^4)
clearall
DT=1;ST=1500;LP=ST/DT;
A1=exp(-DT/35);B1=1-A1;
x(1:
4)=0;ur=0;e0=0;
%###设置e、ec、u的初始论域及其等级量论域,计算量化因子及比例因子##########
em=2;EM=6;Ke=EM/em;
ecm=2;ECM=6;Kec=ECM/ecm;
UM=7;um=2;Ku=um/UM;
U=[-7-6-5-4-3-2-101234567];
%#########调用计算模糊关系矩阵R的子程序F_Relation_2.m#################
[R,n,nE,nEC,nU,nfe,nfec,nfu,Me,Mec]=F_Relation_2;
%################################################################
fork=1:
LP
%############计算FC输出#######################################
%#########变量e模糊化处理#############################
e=1-x(4);%计算输入e的确切量
e1=round(Ke*e);%把e转换成等级量
ife1>EM;e1=EM;end
ife1<-EM;e1=-EM;end
ife1<0;j=e1+EM+1;end
if(e1==0)&(e<0);j=7;end
if(e1==0)&(e>0);j=8;end
ife1>0;j=e1+EM+2;end
%得到e的模糊语言值
Fi=1;mfE=Me(1,j);
fori=2:
nE
ifMe(i,j)>mfE;Fi=i;mfE=Me(i,j);end
end
fe=Me(Fi,:
);
%##########变量ec模糊化处理############################
ec=(e-e0)/DT;e0=e;计算ec的确切量
ec1=round(Kec*ec);%把ec转换成等级量
ifec1>ECM;ec1=ECM;end
ifec1<-ECM;e1=-ECM;end
j=ec1+ECM+1;
Fi=1;
%得到ec的模糊语言值
Fi=1;mfEC=Mec(1,j);
fori=2:
nEC
ifMec(i,j)>mfEC;Fi=i;mfEC=Mec(i,j);end
end
fec=Mec(Fi,:
);
%################调用模糊决策子程序,求出控制量##########
FU=F_Deduce_2(fe,fec,R,n,nfe,nfec,nfu);
%最大隶属度法判决控制器的输出
nU=1;mFU=FU
(1);
fori=2:
nfu
ifFU(i)>mFU;nU=i;mFU=FU(i);end
end
u=Ku*U(nU)+ur;
%***************仿真计算被控对象********************
x
(1)=A1*x
(1)-1.1*B1*u;
x
(2)=A1*x
(2)+B1*x
(1);
x(3)=A1*x(3)+B1*x
(2);
x(4)=A1*