模糊控制入门

写在开始

由于毕业设计的需求,前段时间学习了一下模糊控制的相关内容,先在此做一点入门的总结。模糊控制在上世级七十年代开始出现,用于描述多变量、关系不明确的系统行为。模糊控制将精确的变量模糊化为模糊变量然后按照语言规则进行模糊推理得到推理结果之后再进行逆模糊化得到精确的结果变量。看似反复的操作,但是为中间的模糊推理的实现创造了可能,在人类的认知中经验性的知识往往就是模糊不能量化的,典型的就是“如果…则…”,模糊推理为这种经验知识的数学实现提供了一种方法,下面我将介绍“if-then”型模糊控制器。

模糊控制器的结构

模糊控制器主要由三部分组成:模糊化模块、模糊推理(模糊蕴含)、逆模糊化模块组成,其中模糊化模块的作用是将精确的变量模糊化成为模糊变量,只有模糊变量才能作为输入参与模糊推理;模糊推理包含了专家的经验值知识,即“if…then…”的内容,模糊推理的结果仍然是一个模糊变量,要想使用它需要一个逆模糊化的过程将模糊变量转换为精确的变量,这三部分的关系如下图所示,下面将逐一介绍各个环节。

模糊化

模糊化是将精确量变换为模糊变量,即将一个确定的结果变得不确定,比如输入误差数值为e=10,模糊化后会出现隶属度的概念,误差是极大隶属度为E1、中的隶属度为E2、极小的隶属度为E3…隶属度是属于某种状态的程度,可以类比概率来理解它。

首先确定输入变量的的范围,称之为论域,然后将论域划分为几个部分,划分的数目与模糊状态的数量相等,比如选取的模糊状态有7个:负大、负中、负零、零、正零、正中、正大,也要将论域划分为7个部分。划分好论域之后要为每个论域选取一个隶属度函数,即根据精确变量计算各个状态的隶属度,常用的隶属度函数有高斯型、三角形等。

高斯型隶属度函数

三角型隶属度函数

高斯型隶属函数形状类似钟形函数,其计算公式也与高斯分布的计算公式一致,它的优点是结果平滑,缺点是计算量大;三角形隶属度函数的计算公式为分段一次函数,不如高斯型平滑,但是计算量更小,具体选择哪种隶属度函数要根据实验平台的硬件计算能力选择。在每个论域区间选择合适的隶属度函数,模糊化完成。

模糊推理

模糊推理的过程就是进行“if…then…”的实现过程,在上一节完成模糊化之后就可以根据模糊变量进行模糊推理了,假设模糊控制器有两个输入,每个输入有7个模糊状态,这样模糊推理的规则条目就是7*7=49条,需要逐一编辑49条规则,这也是模糊控制最繁琐的地方。模糊推理中用到最多的就是模糊交,即if…and…then…两个模糊变量取模糊交定义结果为取隶属度最小的模糊变量,这样输入两个精确变量经过模糊化之后可以得到激活的模糊规则数目,对每条模糊规则进行模糊推理就可以得到模糊变量结果,将结果逆模糊化就可以输出了。

逆模糊化

逆模糊化同样有多种方法,

  • 最大隶属度法:选取最大隶属度的模糊变量,根据输出的隶属度函数反算精确输出
  • 重心法:取所有隶属度与模糊重心心的乘积的和除隶属度和
    最大隶属度法误差较大有时得不到较好的效果,重心法计算量大,但是结果精确,当规则条目不是太多时,重心法逆模糊化是最好的选择。要注意重心法是要计算论域的重心,对于等腰三角形来说刚好是它的中线,但是对于其它形状,如不规则三角形、梯形等都要根据面积的计算结果得出重心。

    matlab 仿真

    matlab 自带模糊控制工具箱,只需要一些简单的配置就可以得到一个模糊控制器,在matlab命令行窗口输入,若加载已有的模糊控制器则在括弧里输入控制器的名字,若新建则不用输入。
    1
    fuzzy('fuzzytoolname')


可以点击Edit->Add Variable…添加input或output端口,双击端口就可以编辑论域,隶属度函数的个数、形状等等。

双击中间的白块就可以编辑“if…then…”规则了,

在最开始的对话框选择Defuzzification就可以选择去模糊化的方式,这样一个模糊控制器就搭建好了,也可以点击view->rules手动验证模糊规则的激活情况。点击File->Export->To Workspace就可以将模糊控制器导入工作空间,从simulink中拖拽Fuzzy Logic Controller 配置与工作空间中名字相同的.fis文件,这样模糊控制器就搭建好了,可以在simulink仿真文件中使用它。

总结

疯狂的6月终于过去,我的生活也该步入正轨,这篇模糊控制入门是对很久之前学习的内容的补充,之后我会尽量保持一定频率的更新,包括控制理论、c++、java等内容,最后还想再说一句:毕业的朋友,farwell!!!