模糊控制控制器设计
模糊控制设计控制器模糊控制的具体过程不详细介绍,具体参考例子参考博客:https://www.cnblogs.com/long5683/p/9963488.html问题使用一个具体的问题来解释模糊控制器的设计:设计一个模糊控制器,通过控制进水电磁阀V1的开启度,将液位稳定在倒锥形容器的液位高度h。变量的量化等级均为5级,取5个语言值。设计模糊控制器图如下:一维模糊控制器设计:e=h0−he=h_0
模糊控制设计控制器
模糊控制的具体过程不详细介绍,具体参考例子参考博客:https://www.cnblogs.com/long5683/p/9963488.html
问题
使用一个具体的问题来解释模糊控制器的设计:设计一个模糊控制器,通过控制进水电磁阀V1的开启度,将液位稳定在倒锥形容器的液位高度h。变量的量化等级均为5级,取5个语言值。设计模糊控制器
图如下:
一维模糊控制器
设计:
e
=
h
0
−
h
e=h_0-h
e=h0−h
则为
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等。
二维模糊控制器的设计过程中,该控制器的规则表可以自行定义,程序运行后能与自己设计的规则对应到就行。
更多推荐
所有评论(0)