模糊控制算法实例解析(含代码)


首先来看一个实例,控制进水阀S1和出水阀S2,使水箱水位保持在目标水位O处。


按照日常操作经验,有以下规则:

1、  若当前水位高于目标水位,则向外排水,差值越大,排水越快;

2、  若当前水位低于目标水位,则向内注水,差值越大,注水越快;

3、  若当前水位和目标水位相差很小,则保持排水速度和注水速度相等。

 

下面来设计一个模糊控制器

1、选择观测量和控制量

一般选择偏差e,即目标水位和当前水位的差值作为观察量,选取阀门开度u为控制量。

 

2、输入量和输出量的模糊化

将偏差e划分为5个模糊集,负大(NB)、负小(NS)、零(ZO)、正小(PS)、正大(PB),e为负表示当前水位低于目标水位,e为正表示当前水位高于目标水位。设定e的取值范围为[-3,3],隶属度函数如下。


偏差e对应的模糊表如下:

隶属度

变化等级

-3

-2

-1

0

1

2

3

模糊集

PB

0

0

0

0

0

0.5

1

PS

0

0

0

0.5

1

0.5

0

ZO

0

0

0.5

1

0.5

0

0

NS

0

0.5

1

0.5

0

0

0

NB

1

0.5

0

0

0

0

0

 

 

同样将控制量u划分为5个模糊集,负大(NB)、负小(NS)、零(ZO)、正小(PS)、正大(PB),u为负表示增大进水阀门S1的开度(同时减小出水阀门S2的开度),u为正表示减小进水阀门S1的开度(同时增大出水阀门S2的开度)。设定u的取值范围为[-4,4],隶属度函数如下。


控制量u对应的模糊表如下:

隶属度

变化等级

-4

-3

-2

-1

0

1

2

3

4

模糊集

PB

0

0

0

0

0

0

0

0.5

1

PS

0

0

0

0

0

0.5

1

0.5

0

ZO

0

0

0

0.5

1

0.5

0

0

0

NS

0

0.5

1

0.5

0

0

0

0

0

NB

1

0.5

0

0

0

0

0

0

0

 

3、制定模糊规则

模糊规则的制定是模糊控制的核心内容,控制性能的好坏很大程度上由模糊规则决定,目前主要是根据经验来制定相应的规则。【后面可以结合神经网络来学习模糊规则】

(1)若e负大,则u负大;

(2)若e负小,则u负小;

(3)若e为零,则u为零;

(4)若e正小,则u正小;

(5)若e正大,则u正大;

将上述用语言描述的规则转化为’’IF A THEN B’’的语句如下:



4、求解模糊关系 

根据制定的模糊规则,通过相应的模糊集合运算,可得到模糊关系集合R。

 


5、进行模糊决策

我们最终需要获得的控制量u即为模糊控制的输出,u可由偏差矩阵e和模糊关系矩阵R合成得到。

 

6、控制量的反模糊化

我们模糊决策得到的控制量u是一个矩阵,并不能直接应用在工程上,因此需要将u解释为实际中的特定行为,即反模糊化操作。目前常用的反模糊化方法有以下几种:

(1)最大隶属度法—-计算简单控制要求不高场合

(2)重心法—-输出更平滑

(3)加权平均法—-工业上应用最广泛

具体方法的介绍请参照刘金琨《智能控制》一书P45-P46,博文最后会附上书籍相关链接。

 

7、matlab实现

所幸的是,在matlab模糊控制工具箱中已经帮我们实现了4-6步求解矩阵运算的操作,只需要直接调用evalfis函数就可以得到相应的决策控制量。


通过matlab集成的模糊控制模块,我们能够更加方便地对应偏差e和控制量u的关系,并可以调节e在不同值下u的对应输出。



Matlab程序

%水位模糊控制算法
clear all;
close all;

a = newfis('fuzzy tank');

a = addvar(a,'input','e',[-3,3]);
a = addmf(a,'input',1,'NB','zmf',[-3,-1]);
a =addmf(a,'input',1,'NS','trimf',[-3,-1,1]);
a =addmf(a,'input',1,'ZO','trimf',[-2,0,2]);
a =addmf(a,'input',1,'PS','trimf',[-1,1,3]);
a = addmf(a,'input',1,'PB','smf',[1,3]);

a = addvar(a,'output','u',[-4,4]);
a = addmf(a,'output',1,'NB','zmf',[-4,-2]);
a =addmf(a,'output',1,'NS','trimf',[-4,-2,0]);
a =addmf(a,'output',1,'ZO','trimf',[-2,0,2]);
a =addmf(a,'output',1,'PS','trimf',[0,2,4]);
a = addmf(a,'output',1,'PB','smf',[2,4]);

%建立模糊规则
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');
writefis(a1,'tank');
a2 = readfis('tank');

figure(1);
plotfis(a2);
figure(2);
plotmf(a,'input',1);
figure(3);
plotmf(a,'output',1);


showrule(a);
ruleview('tank');

for i=1:1:7
   e(i)=i-4;
   Ulist(i)=evalfis([e(i)],a2);
end
Ulist = round(Ulist);  %对决策结果四舍五入取整

disp('------------------------------------------------------');
disp('----------模糊控制表:e =[-3,3], u = [-4,4]-----------');
disp('------------------------------------------------------');
fprintf('| a  |');
fprintf(' %d  |',e);
fprintf('\n');
fprintf('| u  |');
fprintf(' %d  |',Ulist);
fprintf('\n');
 


备注:

1、模糊规则矩阵rulelist的含义:模糊矩阵是由模糊规则转化而来,这里矩阵规模为5*4,矩阵第一列表示输入e(5个模糊集合PB/PS/ZO/NS/NB依次对应1-5),矩阵第二列表示输出u(含义同理),第三列为规则的权重weight,第四列为AND模糊运算(1对应AND,2对应OR),如果是多输入多数出模糊控制器,规则列表的含义请参考:

The first mcolumns refer to the inputs of the system. Each column contains a number thatrefers to the index of the membership function for that variable.
The next n columns refer to the outputs of thesystem. Each column contains a number that refers to the index of themembership function for that variable.

The m + n + 1 column contains the weight that isto be applied to the rule. The weight must be a number between zero and one andis generally left as one.
The m + n + 2 column contains a 1 if the fuzzyoperator for the rule’s antecedent is AND. It contains a 2 if the fuzzyoperator is OR.

 

2、设置反模糊化方法setfis(a,’DefuzzMethod’,‘mom’);反模糊化方法不同最终输出控制量也不同。

mom 最大隶属度平均法

centroid 面积重心法

bisector 面积等分法

som 最大隶属度取小法

lom 最大隶属度去大法

 

3、如果要对决策结果取整有三种方法:round(四舍五入)、ceil(向上取整)、floor(向下取整)。

 

最后总结一下模糊控制器的设计步骤:

 

参考书籍:

刘金琨《智能控制》  PDF下载链接:http://pan.baidu.com/s/1dFxdoqt 密码:ehom

 


首先来看一个实例,控制进水阀S1和出水阀S2,使水箱水位保持在目标水位O处。


按照日常操作经验,有以下规则:

1、  若当前水位高于目标水位,则向外排水,差值越大,排水越快;

2、  若当前水位低于目标水位,则向内注水,差值越大,注水越快;

3、  若当前水位和目标水位相差很小,则保持排水速度和注水速度相等。

 

下面来设计一个模糊控制器

1、选择观测量和控制量

一般选择偏差e,即目标水位和当前水位的差值作为观察量,选取阀门开度u为控制量。

 

2、输入量和输出量的模糊化

将偏差e划分为5个模糊集,负大(NB)、负小(NS)、零(ZO)、正小(PS)、正大(PB),e为负表示当前水位低于目标水位,e为正表示当前水位高于目标水位。设定e的取值范围为[-3,3],隶属度函数如下。


偏差e对应的模糊表如下:

隶属度

变化等级

-3

-2

-1

0

1

2

3

模糊集

PB

0

0

0

0

0

0.5

1

PS

0

0

0

0.5

1

0.5

0

ZO

0

0

0.5

1

0.5

0

0

NS

0

0.5

1

0.5

0

0

0

NB

1

0.5

0

0

0

0

0

 

 

同样将控制量u划分为5个模糊集,负大(NB)、负小(NS)、零(ZO)、正小(PS)、正大(PB),u为负表示增大进水阀门S1的开度(同时减小出水阀门S2的开度),u为正表示减小进水阀门S1的开度(同时增大出水阀门S2的开度)。设定u的取值范围为[-4,4],隶属度函数如下。


控制量u对应的模糊表如下:

隶属度

变化等级

-4

-3

-2

-1

0

1

2

3

4

模糊集

PB

0

0

0

0

0

0

0

0.5

1

PS

0

0

0

0

0

0.5

1

0.5

0

ZO

0

0

0

0.5

1

0.5

0

0

0

NS

0

0.5

1

0.5

0

0

0

0

0

NB

1

0.5

0

0

0

0

0

0

0

 

3、制定模糊规则

模糊规则的制定是模糊控制的核心内容,控制性能的好坏很大程度上由模糊规则决定,目前主要是根据经验来制定相应的规则。【后面可以结合神经网络来学习模糊规则】

(1)若e负大,则u负大;

(2)若e负小,则u负小;

(3)若e为零,则u为零;

(4)若e正小,则u正小;

(5)若e正大,则u正大;

将上述用语言描述的规则转化为’’IF A THEN B’’的语句如下:



4、求解模糊关系 

根据制定的模糊规则,通过相应的模糊集合运算,可得到模糊关系集合R。

 


5、进行模糊决策

我们最终需要获得的控制量u即为模糊控制的输出,u可由偏差矩阵e和模糊关系矩阵R合成得到。

 

6、控制量的反模糊化

我们模糊决策得到的控制量u是一个矩阵,并不能直接应用在工程上,因此需要将u解释为实际中的特定行为,即反模糊化操作。目前常用的反模糊化方法有以下几种:

(1)最大隶属度法—-计算简单控制要求不高场合

(2)重心法—-输出更平滑

(3)加权平均法—-工业上应用最广泛

具体方法的介绍请参照刘金琨《智能控制》一书P45-P46,博文最后会附上书籍相关链接。

 

7、matlab实现

所幸的是,在matlab模糊控制工具箱中已经帮我们实现了4-6步求解矩阵运算的操作,只需要直接调用evalfis函数就可以得到相应的决策控制量。


通过matlab集成的模糊控制模块,我们能够更加方便地对应偏差e和控制量u的关系,并可以调节e在不同值下u的对应输出。



Matlab程序

%水位模糊控制算法
clear all;
close all;

a = newfis('fuzzy tank');

a = addvar(a,'input','e',[-3,3]);
a = addmf(a,'input',1,'NB','zmf',[-3,-1]);
a =addmf(a,'input',1,'NS','trimf',[-3,-1,1]);
a =addmf(a,'input',1,'ZO','trimf',[-2,0,2]);
a =addmf(a,'input',1,'PS','trimf',[-1,1,3]);
a = addmf(a,'input',1,'PB','smf',[1,3]);

a = addvar(a,'output','u',[-4,4]);
a = addmf(a,'output',1,'NB','zmf',[-4,-2]);
a =addmf(a,'output',1,'NS','trimf',[-4,-2,0]);
a =addmf(a,'output',1,'ZO','trimf',[-2,0,2]);
a =addmf(a,'output',1,'PS','trimf',[0,2,4]);
a = addmf(a,'output',1,'PB','smf',[2,4]);

%建立模糊规则
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');
writefis(a1,'tank');
a2 = readfis('tank');

figure(1);
plotfis(a2);
figure(2);
plotmf(a,'input',1);
figure(3);
plotmf(a,'output',1);


showrule(a);
ruleview('tank');

for i=1:1:7
   e(i)=i-4;
   Ulist(i)=evalfis([e(i)],a2);
end
Ulist = round(Ulist);  %对决策结果四舍五入取整

disp('------------------------------------------------------');
disp('----------模糊控制表:e =[-3,3], u = [-4,4]-----------');
disp('------------------------------------------------------');
fprintf('| a  |');
fprintf(' %d  |',e);
fprintf('\n');
fprintf('| u  |');
fprintf(' %d  |',Ulist);
fprintf('\n');
 


备注:

1、模糊规则矩阵rulelist的含义:模糊矩阵是由模糊规则转化而来,这里矩阵规模为5*4,矩阵第一列表示输入e(5个模糊集合PB/PS/ZO/NS/NB依次对应1-5),矩阵第二列表示输出u(含义同理),第三列为规则的权重weight,第四列为AND模糊运算(1对应AND,2对应OR),如果是多输入多数出模糊控制器,规则列表的含义请参考:

The first mcolumns refer to the inputs of the system. Each column contains a number thatrefers to the index of the membership function for that variable.
The next n columns refer to the outputs of thesystem. Each column contains a number that refers to the index of themembership function for that variable.

The m + n + 1 column contains the weight that isto be applied to the rule. The weight must be a number between zero and one andis generally left as one.
The m + n + 2 column contains a 1 if the fuzzyoperator for the rule’s antecedent is AND. It contains a 2 if the fuzzyoperator is OR.

 

2、设置反模糊化方法setfis(a,’DefuzzMethod’,‘mom’);反模糊化方法不同最终输出控制量也不同。

mom 最大隶属度平均法

centroid 面积重心法

bisector 面积等分法

som 最大隶属度取小法

lom 最大隶属度去大法

 

3、如果要对决策结果取整有三种方法:round(四舍五入)、ceil(向上取整)、floor(向下取整)。

 

最后总结一下模糊控制器的设计步骤:

 

参考书籍:

刘金琨《智能控制》  PDF下载链接:http://pan.baidu.com/s/1dFxdoqt 密码:ehom

 

猜你喜欢

转载自blog.csdn.net/cyb519/article/details/77940895