[忤旭]《模糊控制》模糊控制理论及Python简单模糊控制

大家好,我是忤旭!
今天分享内容的主题是模糊控制,因为最近需要用到这个技术,所以学习了相关内容。文中将会从模糊意义、模糊理论和Python实现简单模糊控制三部分进行分享。下面直接开始

一.模糊意义
从理论上讲,一切事物都可以用数学模型来描述,但可惜的是我们无法建立出每一个事物的精确数学模型,于是模糊数学诞生了。模糊数学不关注建立事物的精确数学模型,只注重以人们的经验来建立数学模型,这就使得人们可以不用求出事物的精确数学模型而以对事物的经验来表征事物的表现规律,如
欧姆定律U=IR,表征电压、电阻和电流三者的关系,这是一个精确数学模型。但假如我们根据经验得出,电压增大,电流增大,就可以得到欧姆定律的模糊数学模型。
这对于解决不清楚事物精确数学模型,只知道事物的表现规律的问题,很有用处。但由于模糊模型基于对事物认识的经验或规律,故若这些经验或规律认知不到位,则模糊模型将不会有很好的性能,所以这些对事物认识的经验或规律又称为专家经验。
二.模糊理论
在讲模糊控制之前,先了解一下模糊理论。学艺不精,有问题欢迎指出。
论域:论域就是全集,一般用大写字母表示,如X=[0,10],代表包含0~10的一个集合;论域中的元素一般用小写字母表示,如x。
论域量化:论域量化就是区间缩放并离散,将当前论域长度缩放到指定长度后按一定规律离散。如一个论域为X=[0,10],将其量化到新论域Y=[-2,2]中,那我们就需要知道原论域长度和新论域长度,这样就可以得到原论域到新论域的量化因子,即比例尺
式中,——新论域中最大取值;
——新论域中最小取值;
——旧论域中最大取值;
——旧论域中最小取值。
有了比例尺后,根据量化公式(本文中给出的量化公式理解为X论域中任意元素距离X论域中间值的距离,再乘上比例尺),就可以将X论域量化到Y论域,y中元素为
如k=0.4,x取4,则x量化值y为
模糊集:模糊描述论域中一个子集的集合。
隶属度函数:隶属度函数描述一个元素对一个模糊集的归属情况,即一个元素有多大可能是一个模糊集中的,取值范围[0,1],可以根据经验建立,也可以利用现有隶属度函数。如论域X={1,2,3,4,5,6},模糊集Y=[‘比较大的数’],如果设定模糊集Y的隶属度函数为

则论域X中的元素x对模糊集Y的隶属度为{0,0,0,0,0.5,0.9}。
当然你也可以利用你自己的经验来设定,如{0,0,0,0,0,0.3,0.9}。
其它还有一些常见的隶属度函数有Triangle

钟形

梯型

最后隶属度函数及模糊集需要满足以下几点要求才能比较好的发挥隶属作用
模糊集数量:3~10。
完备性:模糊集要覆盖每个区间。
一致性:论域任一模糊集的隶属度不能有1个以上的1。
隶属度函数交点适中:0.2~0.7。
序偶:2个论域之间各元素的线性组合,称为序偶。如有2个论域X={1,2},Y={3,4},则有序偶(1,3),(1,4),(2,3),(2,4)。序偶的计算可以通过将X看作列向量,Y看作行向量,进行矩阵乘后得到一个序偶矩阵。
论域的普通关系:论域的普通关系描述的是2个论域的序偶对某种约束关系的隶属度。对上面提到的序偶矩阵,求该矩阵对某种约束关系的隶属度,就可以得到2个论域的关系矩阵。如2个论域X={1,2},Y={3,4},可以得到序偶矩阵

若现在给定该序偶矩阵的约束关系为

则可以得到X,Y的关系矩阵

论域关系的合成:将2个论域关系进行关系合成运算后得到的新的论域关系,可以通过已知的论域关系,推导出未知的论域关系。如论域X,Y,Z,已知有X和Y的关系矩阵R,Y和Z的关系矩阵S,则X和Z的关系矩阵Q可以直接通过R和S的关系矩阵合成获得,表示为

计算方法有Zadeh和Mamdani,Zadeh计算法为R直积S后并R补集

表达的关系为“如果A就B,如果不A就不B”。Mamdani计算法为R直积S

表达的关系为“如果A就B”,Mamdani计算法用的更多。其实就是类似于矩阵乘,但不同的是计算时的乘用交(取小)代替,加用并(取大)代替。如某个矩阵元素的值为0.4*1+0.5*1=0.5。此外需要注意关系合成只适用于刚性系统,即关系可传递的系统。
条件语句:描述2个集合之间关系的语句。如“如果x很大,那么y很小”,那这句话实则是在描述x很大集合和y很小集合之间的关系,换言之就是2个模糊集之间的关系,故也叫模糊推理关系。
论域的模糊蕴含关系:描述的是在给定条件语句后,2个论域的模糊集之间的关系,因此求该关系需要先求出2个论域对其各模糊集的隶属度。如有X,Y论域,给定1个条件语句“如果x很大,那么y很小”,那这个模糊处理机在同一时刻能激活的规则只有这一条,只要进行输入模糊集与输出模糊集的关系合成,不需要输入模糊集之间的关系合成和输出模糊集的关系合成,下面举例说明输出模糊集的关系合成
如果给定了2个条件语句,如“如果x很大,那么y很小”和“如果x很大,那么y比较小”,可以发现输入条件能够在同一时刻激活了2个规则,这个时候就需要分别对2个条件语句进行模糊推理,最后将结果进行关系合成,得到一个输出模糊集。
接着讲例子,利用经验写出X对x很大模糊集和Y对y很小模糊集的隶属度,假设我的经验是A={0.9,0.1},B={0.1,0.9},在输入给定并量化后激活的模糊集为A,为什么要说激活,因为刚才说过可能输入论域不止一个模糊集,若还有一个C={0.5, 0.3},那它同样是要激活并参加制定好的模糊推理的。
然后根据输入量化后的值来选择模糊集A中的元素,如论域为[-1,1],得到的输入量化值为-1,能够激活的非0模糊集只有1个模糊集A,所以输入隶属度取0.9,然后再对0.9与B取交集,表示的意思是现在输入在x很大模糊集中的概率为0.9,这个时候引起输出论域中各元素对x很大并且y很小的模糊集的隶属度各为多少。
下面以一个完整例子来说明,条件如下

给定3个条件语句,来实现模糊推理
“如果x小并且y小,则z大”
“如果x0并且y0,则z0”
“如果x大并且y大,则z小”
现在有输入x=80,y=80,求输出z
第一步,量化输入,根据量化公式,得量化x为0.6,量化y为0.6,四舍五入后为1,1
第二步,激活输入模糊集
根据x和y的隶属度函数,可以知道x激活了Z和P,值为0.3和0.9,y激活了Z和P,值为0.1和0.9
第三步,根据激活的模糊集来激活条件语句进行模糊推理
根据x和y激活的模糊集,发现第二句和第三句满足前置条件,故它们被激活。然后根据前置条件合成隶属度。在第二句中,x和y对Z的隶属度因为并且关系而取交集,结果为0.1;同理,在第三句中,x和y对P的隶属度因为并且关系而取交集,结果为0.9。
在完成前置条件的关系合成后,还要合成出各自的输出模糊集。在第二句中,z0的模糊集为{0,0.3,0.9,0.3,0},将先前合成出的0.1与之合成,可得{0,0.1,0.1,0.1,0};在第三句中,z小的模糊集为{0.9,0.3,0,0,0},将先前合成出的0.9与之合成,可得{0.9,0.3,0,0,0}。
最后需要对所有得到的输出模糊集进行合成,由于这些模糊集是同时成立的,故对它们取并运算。{0,0.1,0.1,0.1,0}U{0.9,0.3,0,0,0},可得最后输出模糊集{0.9,0.3,0.1,0.1,0}。
逆模糊:将模糊集以某种算法推算出量化输出量。常见算法有最大隶属度法,极左最大隶属度法,极右最大隶属度法,面积中心法、面积平分法等。
最大隶属度法是指取最后输出模糊集中最大隶属度所对应的量化值。
极左最大隶属度法是指取最后输出模糊集中多个相同最大隶属度最左侧所对应的量化值。
极右最大隶属度法是指取最后输出模糊集中多个相同最大隶属度最右侧所对应的量化值。
面积中心法又称为重心法,是指按隶属度为权重,从而计算出距离各个量化值满足权重要求的最佳量化值。

式中,xi——论域中的元素;f(xi)——xi对某模糊集的隶属度。
面积平分法是指找到可以2等分隶属度与量化值包围面积的量化值,表达式为

式中,——面积一部分量化值。
论域逆量化:论域量化的逆向运算,将量化论域缩放到一个连续区间,同样存在比例尺

式中,——输出论域最大值;
——输出论域最小值;
——输出量化论域最大值;
——输出量化论域小小值。
然后可以利用下式计算逆量化后的连续值

式中,z——输出的量化值。
三.Python简单模糊控制
分享2段程序,第一段是极简模糊控制,第二段是比较完整的模糊控制
运行结果
实际输入:0 量化输出:-1 量化输出:1 实际输出:100.0
实际输入:10 量化输出:-1 量化输出:1 实际输出:100.0
实际输入:20 量化输出:-1 量化输出:1 实际输出:100.0
实际输入:30 量化输出:0 量化输出:0 实际输出:50.0
实际输入:40 量化输出:0 量化输出:0 实际输出:50.0
实际输入:50 量化输出:0 量化输出:0 实际输出:50.0
实际输入:60 量化输出:0 量化输出:0 实际输出:50.0
实际输入:70 量化输出:0 量化输出:0 实际输出:50.0
实际输入:80 量化输出:1 量化输出:-1 实际输出:0.0
实际输入:90 量化输出:1 量化输出:-1 实际输出:0.0
实际输入:100 量化输出:1 量化输出:-1 实际输出:0.0
运行结果
实际输入:0 量化输入:-1 量化输出:1 实际输出:100.0
实际输入:10 量化输入:-1 量化输出:1 实际输出:100.0
实际输入:20 量化输入:-1 量化输出:1 实际输出:100.0
实际输入:30 量化输入:0 量化输出:0 实际输出:50.0
实际输入:40 量化输入:0 量化输出:0 实际输出:50.0
实际输入:50 量化输入:0 量化输出:0 实际输出:50.0
实际输入:60 量化输入:0 量化输出:0 实际输出:50.0
实际输入:70 量化输入:0 量化输出:0 实际输出:50.0
实际输入:80 量化输入:1 量化输出:-1 实际输出:0.0
实际输入:90 量化输入:1 量化输出:-1 实际输出:0.0
实际输入:100 量化输入:1 量化输出:-1 实际输出:0.0
可以看到比较模糊的推理,得到的输出也是范围较大,所以如果要增加输出的精度,应增加模糊集的数量,即细化