模糊控制设计控制器

模糊控制的具体过程不详细介绍,具体参考例子参考博客:https://www.cnblogs.com/long5683/p/9963488.html

问题

使用一个具体的问题来解释模糊控制器的设计:设计一个模糊控制器,通过控制进水电磁阀V1的开启度,将液位稳定在倒锥形容器的液位高度h。变量的量化等级均为5级,取5个语言值。设计模糊控制器
图如下:
在这里插入图片描述

一维模糊控制器

设计:
e = h 0 − h e=h_0-h e=h0h
则为 e e e的大小分成五类:负大(NB)、负小(NS)、零( Z O Z_O ZO)、正小(PS)、正大(PB)
根据偏差e的变化范围分为五个等级:-2,-1,0,+1,+2。得到水位变化(e)模糊表:
在这里插入图片描述
控制量u为调节阀门开度的变化。将其分为五个模糊集:负大(NB),负小(NS),零(ZO),正小(PS),正大(PB)。并将u的变化范围分为七个等级:-3,-2,-1,0,+1,+2,+3。得到控制量(u)模糊划分表。
在这里插入图片描述
根据日常的经验,设计以下模糊规则:

(1)“若e负大,则u负大”

(2)“若e负小,则u负小”

(3)“若e为0,则u为0”

(4)“若e正小,则u正小”

(5)“若e正大,则u正大”

其中,排水时,u为负,注水时,u为正。

上述规则采用“IF A THEN B”形式来描述:

(1) if e=NB then u=NB

(2) if e=NS then u=NS

(3) if e=0 then u=0

(4) if e=PS then u=PS

(5) if e=PB then u=PB

下面是matlab程序:

a=newfis('fuzzf');                  
%输入
f1=1; 
a=addvar(a,'input','e',[-2*f1,2*f1]);                   
a=addmf(a,'input',1,'NB','trimf',[-2*f1,-2*f1,-1*f1]);          
a=addmf(a,'input',1,'NS','trimf',[-2*f1,-1*f1,0]);      
a=addmf(a,'input',1,'Z','trimf',[-1*f1,0,1*f1]); 
a=addmf(a,'input',1,'PS','trimf',[0,1*f1,2*f1]);
a=addmf(a,'input',1,'PB','trimf',[1*f1,2*f1,2*f1]); 
%输出
f8=1;
a=addvar(a,'output','u',[-3*f8,3*f8]);                 
a=addmf(a,'output',1,'NB','trimf',[-3*f8,-3*f8,-1*f8]); 
a=addmf(a,'output',1,'NS','trimf',[-3*f8,-1*f8,1*f8]);
a=addmf(a,'output',1,'Z','trimf',[-2*f8,0,2*f8]);
a=addmf(a,'output',1,'PS','trimf',[-1*f8,1*f8,3*f8]);
a=addmf(a,'output',1,'PB','trimf',[1*f8,3*f8,3*f8]);
%规则库
rulelist=[1 1 1 1;            %第一列为输入,第二列为输出,第三列为权重(一般取1),第四列为and/or(1为and,2为or)
               2 2 1 1;			 %第一第二列的1为NB,2为NS,3为Zo,4为PS,5为PB,具体规则参考规则表上。
               3 3 1 1;
               4 4 1 1;
               5 5 1 1;
               ];   
a=addrule(a,rulelist);                
showrule(a)                             
a1=setfis(a,'DefuzzMethod','mom');              
writefis(a1,'fuzzf');                    
a2=readfis('fuzzf'); 
figure(1);plotfis(a2);  
figure(2);plotmf(a,'input',1);
figure(4);plotmf(a,'output',1);
%disp('fuzzy Controller table:e=[-3,+3],ec=[-3,+3]');%显示矩阵和数组内容
%推理
for i=1:1:5	%因为输入变化等级有五个
    e(i)=i-3;    %变化等级的范围在-2~+2
    Ulist(i)=evalfis([e(i)],a2);   
end
Ulist=round(Ulist) 
%单独推理
E=-1;   %e为NS时进行推理
u=evalfis(E,a2);

一维模糊控制器的系统框架图如下:
在这里插入图片描述
e的隶属函数图像如下:
在这里插入图片描述
u的隶属函数图如下:
在这里插入图片描述

二维模糊控制器

在上面的基础上,引入偏差变化量( e c ec ec),此处ec为NB意思是加水快,NS为加水慢,Z为加水无变化,PS为排水慢,PB为排水快速。因此我们可以得到25条规则如下:
在这里插入图片描述

这里仔细解释一下,黑色的字体为U的动作,红色字体横着的为输入水位偏差e,竖着的为偏差变化量ec。
举个例子:
If e=NB and ec=NB then U=NB (如果水位极高,水加的快,则排水排的快)
if e=PS and ec=PB then U=PB (如果水位略微低,水排的很快,则需要加水加大)
此时我们已经有了规则表,因此直接进入matlab上程序:

a=newfis('fuzzf');
%e
f1=1; 
a=addvar(a,'input','e',[-2*f1,2*f1]);                   
a=addmf(a,'input',1,'NB','trimf',[-2*f1,-2*f1,-1*f1]);          
a=addmf(a,'input',1,'NS','trimf',[-2*f1,-1*f1,0]); 
a=addmf(a,'input',1,'Z','trimf',[-1*f1,0,1*f1]); 
a=addmf(a,'input',1,'PS','trimf',[0,1*f1,2*f1]);
a=addmf(a,'input',1,'PB','trimf',[1*f1,2*f1,2*f1]); 
%ec
f2=1;
a=addvar(a,'input','ec',[-2*f2,2*f2]);               %这里我们的ec还是选择五个模糊集的语言
a=addmf(a,'input',2,'NB','trimf',[-2*f2,-2*f2,-1*f2]); 
a=addmf(a,'input',2,'NS','trimf',[-2*f2,-1*f2,0]);
a=addmf(a,'input',2,'Z','trimf',[-1*f2,0,1*f2]);
a=addmf(a,'input',2,'PS','trimf',[0,1*f2,2*f2]);
a=addmf(a,'input',2,'PB','trimf',[1*f2,2*f2,2*f2]); 
%u
f8=1;
a=addvar(a,'output','u',[-3*f8,3*f8]);                 
a=addmf(a,'output',1,'NB','trimf',[-3*f8,-3*f8,-1*f8]); 
a=addmf(a,'output',1,'NS','trimf',[-3*f8,-1*f8,1*f8]);
a=addmf(a,'output',1,'Z','trimf',[-2*f8,0,2*f8]);
a=addmf(a,'output',1,'PS','trimf',[-1*f8,1*f8,3*f8]);
a=addmf(a,'output',1,'PB','trimf',[1*f8,3*f8,3*f8]);
%rule
rulelist=[1 1 1 1 1;      %这里第一列为输入e,第二列为输入ec,第三列为输出u
               1 2 1 1 1;
               1 3 1 1 1;
               1 4 3 1 1;
               1 5 4 1 1;
               2 1 1 1 1;
               2 2 1 1 1;
               2 3 2 1 1;
               2 4 3 1 1;
               2 5 4 1 1;
               3 1 1 1 1;
               3 2 2 1 1;
               3 3 3 1 1;
               3 4 4 1 1;
               3 5 5 1 1;
               4 1 2 1 1;
               4 2 3 1 1;
               4 3 4 1 1;
               4 4 5 1 1;
               4 5 5 1 1;
               5 1 2 1 1;
               5 2 3 1 1;
               5 3 5 1 1;
               5 4 5 1 1;
               5 5 5 1 1;
               ];
a=addrule(a,rulelist);
showrule(a)  
a1=setfis(a,'DefuzzMethod','mom'); 
writefis(a1,'fuzzf'); 
a2=readfis('fuzzf');
disp('fuzzy Controller table:e=[-2,+2],ec=[-2,+2]');
%推理
Ulist=zeros(5,5);   %这里的ulist为一个5x5的矩阵
for i=1:5
       for j=1:5
           e(i)=-3+i;
           ec(j)=-3+j;
           Ulist(i,j)=evalfis([e(i),ec(j)],a2);
       end
end
   Ulist=round(Ulist)' 
figure(1); plotfis(a2);  
figure(2);plotmf(a,'input',1);
figure(3);plotmf(a,'input',2);
figure(4);plotmf(a,'output',1);

整个二维模糊控制器的框架图如下:
在这里插入图片描述
e的隶属函数图如下:在这里插入图片描述

ec的隶属函数图如下:
在这里插入图片描述
u的隶属函数图如下:
在这里插入图片描述

补充

此处的输入量化等级是题目要求为五级,正常情况,可以自行根据情况选择,若等级选择高了会更精细,但是系统复杂程度会上升。变量的语言值也可以选择多几个,例如PM、NM等。
二维模糊控制器的设计过程中,该控制器的规则表可以自行定义,程序运行后能与自己设计的规则对应到就行。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐