以水位的模糊控制为例,设有一个水箱,通过调节阀门可向内注水和向外抽水,设计一个模糊控制器,通过调节阀门将水位稳定在固定点附近,按照日常的操作经验,可以得到基本的控制规则为:
“若水位高于O点,则向外排水,差值越大,排水越快”;
“若水位低于O点,则向内注水,差值越大,注水越快”
实验内容:
clear all;
close all;
a=newfis('fuzz-tank');%创建一个模糊推理系统(FIS)
%水位变化e划分,NB:负大 NS:负小 Z:零 PS:正小 PB:正大
a=addvar(a,'input','e',[-3,3]);%向模糊推理系统中添加语言变量
a=addmf(a,'input',1,'NB','zmf',[-3,-1]); %Z形隶属函数
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,'PB','smf',[1,3]);%S形隶属函数
%控制量u变化划分,NB:负大 NS:负小 Z:零 PS:正小 PB:正大
a=addvar(a,'output','u',[-4,4]);
a=addmf(a,'output',1,'NB','zmf',[-4,-1]);
a=addmf(a,'output',1,'NS','trimf',[-4,-2,1]);
a=addmf(a,'output',1,'Z','trimf',[-2,0,2]);
a=addmf(a,'output',1,'PS','trimf',[-1,2,4]);
a=addmf(a,'output',1,'PB','smf',[1,4]);
%模糊规则
%若e负大,则u负大
%若e负小,则u负小
%若e为零,则u为零
%若e正小,则u正小
%若e正大,则u正大
rulelist=[1 1 1 1;2 2 1 1;3 3 1 1;4 4 1 1;5 5 1 1];
a=addrule(a,rulelist);
a1=setfis(a,'DefuzzMethod','mom');%将DefuzzMethod属性设置为mom
writefis(a1,'tank');%保存文件到磁盘上
a2=readfis('tank');%读取模糊控制系统
figure(1);
plotfis(a2);%绘制FIS系统结构
figure(2);
plotmf(a,'input',1);
figure(3);
plotmf(a,'output',1);
flag=1;
if flag==1
showrule(a);
ruleview('tank');
end
disp('------------------------------------------------------');
disp(' fuzzy controller table:e=[-3,+3],u=[-4,+4] ');
disp('------------------------------------------------------');
for i=1:1:7
e(i)=i-4;
Ulist(i)=evalfis([e(i)],a2);
end
Ulist=round(Ulist)%取整
e=-3;
u=evalfis([e],a2)