模糊控制——(三)模糊洗衣机

系列文章目录

模糊控制——(一)理论基础
模糊控制——(二)设计流程
模糊控制——(三)模糊洗衣机
模糊控制——(四)模糊自适应整定PID控制
模糊控制——(五)Sugeno模糊模型


关键字:模糊控制器;MATLAB;Simulink


前言

  现在许多的洗衣机都加入了模糊控制的功能,如果我们看自己家的洗衣机说不定上面就有”Fuzzy Control“这样的字眼,不知道多年以后会不会i洗衣机上也会有”AI智能“这样的标签😂。接下来本文将介绍一个简单的模糊洗衣机的🧉帮助小伙伴进一步了解模糊控制器的设计原理与步骤。


一、模糊洗衣机

  有一台模糊洗衣机,根据待洗衣物的污泥和油脂决定洗涤时间,根据以上条件设计设计模糊控制器。

二、MATLAB实现

1.工程环境

  以下的案例基于:

  • PC操作系统:WIN11
  • MATLAB:2019a

2.确定模糊控制器结构

  上文中提到的条件中,洗衣机需要根据污泥油脂决定洗涤时间,也就是说我们需要设计一个两输入一输出的模糊控制器:
Alt

图2.1 模糊洗衣机控制器结构

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)=5050xμMD(x)=50xμMD(x)=50100xμLD(x)=50x500x500x5050<x10050<x100(1)图像如下:
Alt

图2.2 污泥质量x的隶属函数

实现代码如下:

% 为污泥和油脂设计一个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)=5050xμMG(y)=50xμMG(y)=50100xμLG(xy)=50x500y500y5050<y10050<y100(2)图像如下:
Alt

图2.3 油脂质量y的隶属函数
实现代码如下:
% 为污泥和油脂设计一个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)=1010zμS(z)=10xμS(z)=1525zμM(z)=15z10μM(z)=1540zμL(z)=15x25μL(z)=2060zμVL(z)=20z400x100x1010<x2510<x2525<x4025<x4040<x6040x60(3)图像如下:
Alt

图2.4 洗涤时间z的隶属函数

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.建立模糊控制表

Alt

图2.5 模糊控制表

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的推理结果
Alt

图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} RULE1RULE2RULE3RULE4IFxisMDandyisMGthenzisMIFxisMDandyisLGthenzisLIFxisLDandyisMGthenzisLIFxisLDandyisLGthenzisVL(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} RULE1min(54,53)=53RULE2min(54,52)=52RULE3min(51,53)=51RULE4min(51,52)=51(7)提前可信度表,也叫做规则强度表
Alt

图2.7 规则前提可信度表

7.4 规则总可信度

  上述前提可信度还需要结合洗涤时间的隶属函数才能得到总的可信度,即图2.6与图2.7对应位置的数值进行取小运算
Alt

图2.8 规则总的可信度输出

以上计算规则总可信度的过程中的取小运算在MATLAB中是被称为ImplicationMethod所包含的算法中的一种,如图2.9所示
Alt

图2.9 mamfis模糊结构的结构

当然除了取小运算也有其他的算法,在命令行窗口中输入help mamfis并打开帮助页面,如图2.10可以看到ImplicationMethod包含了minprod两个可以直接使用的算法,其中 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也支持自定义的算法,可使用自定义算法的字符串名称字符向量名称函数句柄(对于函数句柄不太明白的小伙伴可以走传送门——函数句柄传送门)。
Alt

图2.10 mamfis的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)可以得到洗涤时间的三个触发规则:
Alt

图2.11 洗衣机的三个触发规则

将上述三个规矩的函数进行取大运算
Alt

图2.12 洗涤时间的组合输出

其中,对应的数值可由公式(3)求得。以上计算规则总可信度的过程中的取大运算在MATLAB中是被称为AggregationMethod所包含的算法中的一种,如图2.13所示:
Alt

图2.13 mamfis模糊结构的结构

除了取大运算也有其他的算法,在命令行窗口中输入help mamfis并打开帮助页面,如图2.14可以看到ImplicationMethod包含了maxsumprobor三个可以直接使用的算法。其中 sum的含义是将计算得到的总可信度相加得到规则总输出;probor的含义是两个输入之和减去两个输入只之积。除此之外,ImplicationMethod也支持自定义的算法,可使用自定义算法的字符串名称字符向量名称函数句柄
Alt

图2.14 mamfis的AggregationMethod

然而上述得到的是洗涤时间隶属度的并集输出函数,还不是一个确切的值,以上模糊结果还需要进一步反模糊化处理。

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已经集成好的隶属函数。
Alt

图2.11 MATLAB运行结果

总结

  以上就是针对一个具体的🧉——模糊洗衣机,重点详细介绍了以mom为基础的模糊推理与反模糊化过程,相信小伙伴对于模糊控制器的设计有了更深的理解,下一篇将介绍模糊自适应整定的PID控制,不过最近要出差了,咕咕咕🕊️。

参考文献

[1]刘金琨.智能控制.第4版[M].电子工业出版社,2017.

### 解析 Import Error 的常见原因 当遇到 `ImportError: cannot import name 'Generic'` 错误时,通常意味着尝试从模块中导入的对象不存在或无法访问。此问题可能由多种因素引起: - 版本不兼容:不同库之间的版本冲突可能导致此类错误。 - 安装缺失:目标库未正确安装或路径配置有误。 - 导入语句不当:可能存在循环依赖或其他语法层面的问题。 ### 针对 Generic 类型的具体解决方案 对于特定于 `Generic` 的情况,考虑到 Python 中 `Generic` 是 typing 模块的一部分,在处理该类别的 ImportError 时可采取如下措施[^1]: #### 方法一:确认typing模块可用性 确保环境中已安装标准库中的 typing 模块,并且其版本支持所使用的特性。可以通过以下命令验证: ```bash python -c "from typing import Generic; print(Generic)" ``` 如果上述命令执行失败,则可能是由于 Python 或者相关扩展包的版本过低造成的。此时应考虑升级至更高版本的解释器以及对应的开发工具链。 #### 方法二:调整导入方式 有时直接通过顶层命名空间来获取所需组件会更稳定可靠。修改代码以采用这种做法可能会解决问题: ```python from collections.abc import Iterable # 如果是迭代器相关接口 from typing import TypeVar, Protocol # 对于协议和泛型定义 T = TypeVar('T') class MyContainer(Protocol[T]): ... ``` 注意这里并没有显式提到 `Generic` ,而是利用了更为基础的数据结构抽象基类或是其他替代方案实现相同功能[^2]。 #### 方法:排查环境变量设置 检查系统的 PYTHONPATH 和虚拟环境配置是否正常工作。任何异常都可能导致某些第方软件包找不到必要的资源文件而引发类似的错误提示。建议清理并重建项目专属的工作区以便排除干扰项的影响。 #### 示例修正后的代码片段 假设原始代码试图这样引入 `Generic` : ```python from some_module import Generic # 可能导致 ImportError ``` 改为遵循官方文档推荐的方式后变为: ```python from typing import Generic # 正确的做法 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hvp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值