系列文章目录
模糊控制——(一)理论基础
模糊控制——(二)设计流程
模糊控制——(三)模糊洗衣机
模糊控制——(四)模糊自适应整定PID控制
模糊控制——(五)Sugeno模糊模型
关键字:模糊控制器;MATLAB;Simulink
文章目录
前言
现在许多的洗衣机都加入了模糊控制的功能,如果我们看自己家的洗衣机说不定上面就有”Fuzzy Control“这样的字眼,不知道多年以后会不会i洗衣机上也会有”AI智能“这样的标签😂。接下来本文将介绍一个简单的模糊洗衣机的🧉帮助小伙伴进一步了解模糊控制器的设计原理与步骤。
一、模糊洗衣机
有一台模糊洗衣机,根据待洗衣物的污泥和油脂决定洗涤时间,根据以上条件设计设计模糊控制器。
二、MATLAB实现
1.工程环境
以下的案例基于:
- PC操作系统:WIN11
- MATLAB:2019a
2.确定模糊控制器结构
上文中提到的条件中,洗衣机需要根据污泥和油脂决定洗涤时间,也就是说我们需要设计一个两输入一输出的模糊控制器:
3.定义输入\输出模糊集
将污泥的程度分为三个模糊集:SD——污泥少、MD——污泥中、LD——污泥多;同样将油脂分为三个模糊集:NG——油脂少、MG——油脂中、LG——油脂多;将洗涤时间分为五个模糊集:VS——很短、S——短、M——中等、L——长、VL——很长
4.定义输入\输出隶属函数
针对污泥使用三角形的隶属函数:
μ
D
=
{
μ
S
D
(
x
)
=
50
−
x
50
0
≤
x
≤
50
μ
M
D
(
x
)
=
x
50
0
≤
x
≤
50
μ
M
D
(
x
)
=
100
−
x
50
50
<
x
≤
100
μ
L
D
(
x
)
=
x
−
50
50
50
<
x
≤
100
(1)
\mu_D= \begin{cases} \mu_{SD}\left( x \right)=\frac{50-x}{50} & 0 \le x \le 50 \\ \mu_{MD}\left( x \right)=\frac{x}{50} & 0 \le x \le 50 \\ \mu_{MD}\left( x \right)=\frac{100-x}{50} & 50<x \le 100 \\ \mu_{LD}\left( x \right)=\frac{x-50}{50} & 50<x \le 100 \end{cases} \tag{1}
μD=⎩
⎨
⎧μSD(x)=5050−xμMD(x)=50xμMD(x)=50100−xμLD(x)=50x−500≤x≤500≤x≤5050<x≤10050<x≤100(1)图像如下:
实现代码如下:
% 为污泥和油脂设计一个N+1的三角形隶属函数
clc;
clear;
close all;
N=2;
x=0:0.1:100;
for i=1:N+1
f(i)=100/N*(i-1);
end
u=trimf(x,[f(1),f(1),f(2)]);
figure(1);
plot(x,u);
for j=2:N
u=trimf(x,[f(j-1),f(j),f(j+1)]);
hold on;
plot(x,u);
end
u=trimf(x,[f(N),f(N+1),f(N+1)]);
hold on;
plot(x,u);
xlabel('污泥质量x');
ylabel('Degree of membership');
针对油脂也使用三角形的隶属函数:
μ
G
=
{
μ
N
G
(
y
)
=
50
−
x
50
0
≤
y
≤
50
μ
M
G
(
y
)
=
x
50
0
≤
y
≤
50
μ
M
G
(
y
)
=
100
−
x
50
50
<
y
≤
100
μ
L
G
(
x
y
)
=
x
−
50
50
50
<
y
≤
100
(2)
\mu_G= \begin{cases} \mu_{NG}\left( y \right)=\frac{50-x}{50} & 0 \le y \le 50 \\ \mu_{MG}\left( y \right)=\frac{x}{50} & 0 \le y \le 50 \\ \mu_{MG}\left( y \right)=\frac{100-x}{50} & 50<y \le 100 \\ \mu_{LG}\left( xy\right)=\frac{x-50}{50} & 50<y \le 100 \end{cases} \tag{2}
μG=⎩
⎨
⎧μNG(y)=5050−xμMG(y)=50xμMG(y)=50100−xμLG(xy)=50x−500≤y≤500≤y≤5050<y≤10050<y≤100(2)图像如下:
% 为污泥和油脂设计一个N+1的三角形隶属函数
clc;
clear;
close all;
N=2;
y=0:0.1:100;
for i=1:N+1
f(i)=100/N*(i-1);
end
u=trimf(y,[f(1),f(1),f(2)]);
figure(1);
plot(y,u);
for j=2:N
u=trimf(y,[f(j-1),f(j),f(j+1)]);
hold on;
plot(y,u);
end
u=trimf(y,[f(N),f(N+1),f(N+1)]);
hold on;
plot(y,u);
xlabel('油脂质量y');
ylabel('Degree of membership');
洗涤时间的隶属函数如下:
μ
S
=
{
μ
V
S
(
z
)
=
10
−
z
10
0
≤
x
≤
10
μ
S
(
z
)
=
x
10
0
≤
x
≤
10
μ
S
(
z
)
=
25
−
z
15
10
<
x
≤
25
μ
M
(
z
)
=
z
−
10
15
10
<
x
≤
25
μ
M
(
z
)
=
40
−
z
15
25
<
x
≤
40
μ
L
(
z
)
=
x
−
25
15
25
<
x
≤
40
μ
L
(
z
)
=
60
−
z
20
40
<
x
≤
60
μ
V
L
(
z
)
=
z
−
40
20
40
≤
x
≤
60
(3)
\mu_S= \begin{cases} \mu_{VS}\left( z \right)=\frac{10-z}{10} & 0 \le x \le 10 \\ \mu_{S}\left( z \right)=\frac{x}{10} & 0 \le x \le 10 \\ \mu_{S}\left( z \right)=\frac{25-z}{15} & 10<x \le 25 \\ \mu_{M}\left( z \right)=\frac{z-10}{15} & 10<x \le 25 \\ \mu_{M}\left( z \right)=\frac{40-z}{15} & 25<x \le 40 \\ \mu_{L}\left( z \right)=\frac{x-25}{15} & 25<x \le 40 \\ \mu_{L}\left( z \right)=\frac{60-z}{20} & 40<x \le 60 \\ \mu_{VL}\left( z \right)=\frac{z-40}{20} & 40 \le x \le 60 \end{cases} \tag{3}
μS=⎩
⎨
⎧μVS(z)=1010−zμS(z)=10xμS(z)=1525−zμM(z)=15z−10μM(z)=1540−zμL(z)=15x−25μL(z)=2060−zμVL(z)=20z−400≤x≤100≤x≤1010<x≤2510<x≤2525<x≤4025<x≤4040<x≤6040≤x≤60(3)图像如下:
5.建立模糊规则
根据人的操作经验可以将规则总结为:
I
F
x
i
s
S
D
a
n
d
y
i
s
N
G
t
h
e
n
z
i
s
V
S
I
F
x
i
s
S
D
a
n
d
y
i
s
M
G
t
h
e
n
z
i
s
S
I
F
x
i
s
S
D
a
n
d
y
i
s
L
G
t
h
e
n
z
i
s
M
I
F
x
i
s
M
D
a
n
d
y
i
s
N
G
t
h
e
n
z
i
s
M
I
F
x
i
s
M
D
a
n
d
y
i
s
M
G
t
h
e
n
z
i
s
M
I
F
x
i
s
M
D
a
n
d
y
i
s
L
G
t
h
e
n
z
i
s
L
I
F
x
i
s
L
D
a
n
d
y
i
s
N
G
t
h
e
n
z
i
s
L
I
F
x
i
s
L
D
a
n
d
y
i
s
M
G
t
h
e
n
z
i
s
L
I
F
x
i
s
L
D
a
n
d
y
i
s
L
G
t
h
e
n
z
i
s
V
L
(4)
\begin{align} &IF \quad x \quad is \quad SD \quad and \quad y \quad is \quad NG \quad then \quad z \quad is \quad VS \\ &IF \quad x \quad is \quad SD \quad and \quad y \quad is \quad MG \quad then \quad z \quad is \quad S \\ &IF \quad x \quad is \quad SD \quad and \quad y \quad is \quad LG \quad then \quad z \quad is \quad M \\ &IF \quad x \quad is \quad MD \quad and \quad y \quad is \quad NG \quad then \quad z \quad is \quad M \\ &IF \quad x \quad is \quad MD \quad and \quad y \quad is \quad MG \quad then \quad z \quad is \quad M \\ &IF \quad x \quad is \quad MD \quad and \quad y \quad is \quad LG \quad then \quad z \quad is \quad L \\ &IF \quad x \quad is \quad LD \quad and \quad y \quad is \quad NG \quad then \quad z \quad is \quad L \\ &IF \quad x \quad is \quad LD \quad and \quad y \quad is \quad MG \quad then \quad z \quad is \quad L \\ &IF \quad x \quad is \quad LD \quad and \quad y \quad is \quad LG \quad then \quad z \quad is \quad VL \end{align} \tag{4}
IFxisSDandyisNGthenzisVSIFxisSDandyisMGthenzisSIFxisSDandyisLGthenzisMIFxisMDandyisNGthenzisMIFxisMDandyisMGthenzisMIFxisMDandyisLGthenzisLIFxisLDandyisNGthenzisLIFxisLDandyisMGthenzisLIFxisLDandyisLGthenzisVL(4)
利用MATLAB实现:
6.建立模糊控制表
7.模糊推理
在之前的文章中,我们对于MATLAB实现模糊推理到解模糊都知道是用了一些函数进行操作,比如解模糊的mom函数,这里将详细介绍是如何计算得到确切值的。
7.1 规则匹配
我们以
x
0
=
60
x_0=60
x0=60、
y
0
=
70
y_0=70
y0=70为例,将两个数值分别代入公式(1)与公式(2)求得污泥和油脂的隶属度:
μ
M
D
(
60
)
=
4
5
μ
L
D
(
60
)
=
1
5
μ
M
G
(
70
)
=
3
5
μ
L
G
(
70
)
=
2
5
(5)
\begin{align} \mu_{MD}\left( 60 \right) &=\frac{4}{5}\\ \mu_{LD}\left( 60 \right) &=\frac{1}{5} \\ \mu_{MG}\left( 70 \right) &=\frac{3}{5}\\ \mu_{LG}\left( 70\right) &=\frac{2}{5} \end{align} \tag{5}
μMD(60)μLD(60)μMG(70)μLG(70)=54=51=53=52(5)根据上述的结果可以得到如图2.6的推理结果
7.2 规则触发
根据上述的推理结果可以触发的规则如下:
R
U
L
E
1
:
I
F
x
i
s
M
D
a
n
d
y
i
s
M
G
t
h
e
n
z
i
s
M
R
U
L
E
2
:
I
F
x
i
s
M
D
a
n
d
y
i
s
L
G
t
h
e
n
z
i
s
L
R
U
L
E
3
:
I
F
x
i
s
L
D
a
n
d
y
i
s
M
G
t
h
e
n
z
i
s
L
R
U
L
E
4
:
I
F
x
i
s
L
D
a
n
d
y
i
s
L
G
t
h
e
n
z
i
s
V
L
(6)
\begin{align} RULE1:&IF \quad x \quad is \quad MD \quad and \quad y \quad is \quad MG \quad then \quad z \quad is \quad M \\ RULE2:&IF \quad x \quad is \quad MD \quad and \quad y \quad is \quad LG \quad then \quad z \quad is \quad L \\ RULE3:&IF \quad x \quad is \quad LD \quad and \quad y \quad is \quad MG \quad then \quad z \quad is \quad L \\ RULE4:&IF \quad x \quad is \quad LD \quad and \quad y \quad is \quad LG \quad then \quad z \quad is \quad VL \end{align} \tag{6}
RULE1:RULE2:RULE3:RULE4:IFxisMDandyisMGthenzisMIFxisMDandyisLGthenzisLIFxisLDandyisMGthenzisLIFxisLDandyisLGthenzisVL(6)
7.3 规则前提推理
在同一条规则内,前提之间通过与的关系得到规则结论→前提的可信度之间通过取小运算得到规则前提的可信度:
R
U
L
E
1
:
min
(
4
5
,
3
5
)
=
3
5
R
U
L
E
2
:
min
(
4
5
,
2
5
)
=
2
5
R
U
L
E
3
:
min
(
1
5
,
3
5
)
=
1
5
R
U
L
E
4
:
min
(
1
5
,
2
5
)
=
1
5
(7)
\begin{align} RULE1:\min \left( \frac{4}{5}, \frac{3}{5}\right)=\frac{3}{5} \\ RULE2:\min \left( \frac{4}{5}, \frac{2}{5}\right)=\frac{2}{5} \\ RULE3:\min \left( \frac{1}{5}, \frac{3}{5}\right)=\frac{1}{5} \\ RULE4:\min \left( \frac{1}{5}, \frac{2}{5}\right)=\frac{1}{5} \end{align} \tag{7}
RULE1:min(54,53)=53RULE2:min(54,52)=52RULE3:min(51,53)=51RULE4:min(51,52)=51(7)提前可信度表,也叫做规则强度表
7.4 规则总可信度
上述前提可信度还需要结合洗涤时间的隶属函数才能得到总的可信度,即图2.6与图2.7对应位置的数值进行取小运算:
以上计算规则总可信度的过程中的取小运算在MATLAB中是被称为ImplicationMethod所包含的算法中的一种,如图2.9所示
当然除了取小运算也有其他的算法,在命令行窗口中输入help mamfis并打开帮助页面,如图2.10可以看到ImplicationMethod包含了min、prod两个可以直接使用的算法,其中 prod的含义是将计算得到的前提可信度与隶属函数相乘得到总的可信度.如果使用prod则对于
m
i
n
(
3
5
,
μ
M
(
z
)
)
min\left( \frac{3}{5},\mu_M{\left( z \right)} \right)
min(53,μM(z))将变成
3
5
×
μ
M
(
z
)
\frac{3}{5}×\mu_M{\left( z \right)}
53×μM(z)。除此之外,ImplicationMethod也支持自定义的算法,可使用自定义算法的字符串名称、字符向量名称和函数句柄(对于函数句柄不太明白的小伙伴可以走传送门——函数句柄传送门)。
7.5 规则总输出
在当前
x
0
=
60
x_0=60
x0=60、
y
0
=
70
y_0=70
y0=70的情况下,我们可以得到洗衣机的洗涤时间模糊推理结果:
μ
a
g
g
(
z
)
=
max
(
min
(
3
5
,
μ
M
(
z
)
)
,
min
(
1
5
,
μ
L
(
z
)
)
,
min
(
2
5
,
μ
L
(
z
)
)
,
min
(
1
5
,
μ
V
L
(
z
)
)
)
=
max
(
min
(
3
5
,
μ
M
(
z
)
)
,
min
(
2
5
,
μ
L
(
z
)
)
,
min
(
1
5
,
μ
V
L
(
z
)
)
)
(8)
\begin{align} \mu_{agg}\left( z \right)&=\max \left( {\min\left( \frac{3}{5}, \mu_M\left( z \right)\right)}, {\min\left( \frac{1}{5}, \mu_L\left( z \right)\right)}, {\min\left( \frac{2}{5}, \mu_L\left( z \right)\right)}, {\min\left( \frac{1}{5}, \mu_{VL}\left( z \right)\right)} \right) \\ &=\max \left( {\min\left( \frac{3}{5}, \mu_M\left( z \right)\right)}, {\min\left( \frac{2}{5}, \mu_L\left( z \right)\right)}, {\min\left( \frac{1}{5}, \mu_{VL}\left( z \right)\right)} \right) \end{align} \tag{8}
μagg(z)=max(min(53,μM(z)),min(51,μL(z)),min(52,μL(z)),min(51,μVL(z)))=max(min(53,μM(z)),min(52,μL(z)),min(51,μVL(z)))(8)可以得到洗涤时间的三个触发规则:
将上述三个规矩的函数进行取大运算:
其中,对应的数值可由公式(3)求得。以上计算规则总可信度的过程中的取大运算在MATLAB中是被称为AggregationMethod所包含的算法中的一种,如图2.13所示:
除了取大运算也有其他的算法,在命令行窗口中输入help mamfis并打开帮助页面,如图2.14可以看到ImplicationMethod包含了max、sum和probor三个可以直接使用的算法。其中 sum的含义是将计算得到的总可信度相加得到规则总输出;probor的含义是两个输入之和减去两个输入只之积。除此之外,ImplicationMethod也支持自定义的算法,可使用自定义算法的字符串名称、字符向量名称和函数句柄
然而上述得到的是洗涤时间隶属度的并集输出函数,还不是一个确切的值,以上模糊结果还需要进一步反模糊化处理。
8.反模糊化
反模糊化在之前的文章中提到过,在MATLAB中提供了五种常用的反模糊化方法:①centroid,面积重心法;②bisector,面积等分法;③mom,最大隶属度平均法;④som,最大隶属度取小法;⑤lom,最大隶属度取大法。这里以mom法为例根据mom进行反模糊化:
z
=
19
+
31
2
=
25
z=\frac{19+31}{2}=25
z=219+31=25故可知洗涤时间为25分钟。
上述过程通过MATLAB实现如下:
% Fuzzy Control Design for washer
% 为洗衣机设计的模糊控制器
clc;
clear;
close all;
% Use a mamfis object to represent a Mamdani fuzzy inference system
% newfis指令未来将被移除 详情通过help newfis参见帮助页
% a=newfis('fuzzy washer');
% a=mamfis('Name','fuzzy washer');
a=mamfis();
a.Name='fuzzy washer';
%%
% 创建输入与输出模糊变量并设置隶属度函数
% 创建第一个输入模糊变量与隶属度函数
% addvar未来将被移除 详情通过help addvar参见帮助页
% a=addvar(a,'input','x',[0,100]);
a.Input(1).Name='x';
a.Input(1).Range=[0,100];
a=addMF(a,'x','trimf',[0,0,50] ,'Name','SD');
a=addMF(a,'x','trimf',[0,50,100] ,'Name','MD');
a=addMF(a,'x','trimf',[50,100,100] ,'Name','LD');
plotmf(a,"input",1);
% 创建第二个输入模糊变量与隶属度函数
% a=addvar(a,'input','y',[0,100]);
a.Input(2).Name='y';
a.Input(2).Range=[0,100];
a=addMF(a,'y','trimf',[0,0,50] ,'Name','NG');
a=addMF(a,'y','trimf',[0,50,100] ,'Name','MG');
a=addMF(a,'y','trimf',[50,100,100] ,'Name','LG');
plotmf(a,"input",2);
% 创建第一个输出模糊变量与隶属度函数
% a=addvar(a,'output','z',[0,60]);
a.Output(1).Name='z';
a.Output(1).Range=[0,60];
a=addMF(a,'z','trimf',[0,0,10] ,'Name','VS');
a=addMF(a,'z','trimf',[0,10,25] ,'Name','S' );
a=addMF(a,'z','trimf',[10,25,40] ,'Name','M' );
a=addMF(a,'z','trimf',[25,40,60] ,'Name','L' );
a=addMF(a,'z','trimf',[40,60,60] ,'Name','VL');
plotmf(a,"output",1);
%%
% 创建并添加模糊规则
rulelist=[1 1 1 1 1;
1 2 3 1 1;
1 3 4 1 1;
2 1 2 1 1;
2 2 3 1 1;
2 3 4 1 1;
3 1 3 1 1;
3 2 4 1 1;
3 3 5 1 1;];
a=addRule(a,rulelist); % 添加模糊规则
showrule(a) % 显示模糊规则
%%
% 保存当前模糊文件
% setfis指令未来将被移除,可用FIS对象的属性代替
% al=setfis(a,'DefuzzMethod','mom');
a.defuzzification='mom';
writeFIS(a,'fuzzy washer');
%%
% 用模糊工具箱进行仿真
a_new=readfis('fuzzy washer'); %读取模糊文件
disp('---------------------------------------------------------------');
disp('fuzzy controller table:x=[0,100], y=[0,100]');
disp('---------------------------------------------------------------');
u=evalfis([60,70],a_new)
%%
%绘图
figure(1);
plotfis(a_new);
figure(2);
plotmf(a,'input',1);
figure(3);
plotmf(a,'input',2);
figure(4);
plotmf(a,'output',1);
需要注意的是,在3.定义输入\输出隶属函数中的三段代码是为了展示隶属函数单独使用的,在模糊控制器设计中我们可以直接使用MATLAB已经集成好的隶属函数。
总结
以上就是针对一个具体的🧉——模糊洗衣机,重点详细介绍了以mom为基础的模糊推理与反模糊化过程,相信小伙伴对于模糊控制器的设计有了更深的理解,下一篇将介绍模糊自适应整定的PID控制,不过最近要出差了,咕咕咕🕊️。
参考文献
[1]刘金琨.智能控制.第4版[M].电子工业出版社,2017.