我是靠谱客的博主 阔达招牌,最近开发中收集的这篇文章主要介绍模糊控制(FL)算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

模糊控制算法(理论知识)

模糊(Fuzzy)控制是用语言归纳操作人员的控制策略,运用语言变量和模糊集合理论形成控制算法的一种控制。模糊控制的最重要特征是不需要建立被控对象精确的数学模型,只要求把现场操作人员的经验和数据总结成较完善的语言控制规则,从而能够对具有不确定性、不精确性、噪声以及非线性、时变性、时滞等特征的控制对象进行控制。模糊控制系统的鲁棒性强,尤其适用于非线性、时变、滞后系统的控制。模糊控制的基本结构如图所示。
在这里插入图片描述
1.模糊控制器的输入变量与输出变量
(1)模糊控制器的输入、输出变量
模糊控制器是模仿人的一种控制。在对被控对象进行控制的过程中,一般根据设定值与被控量的偏差、偏差变化EC和偏差变化的速率ER进行决策。人对偏差最敏感,其次是偏差的变化,再次是偏差变化的速率。因此,模糊控制器的输入变量通常取、和EC或者, EC和ER,分别构成所谓一维、二维和三维模糊控制器。一维模糊控制器的动态性能不佳,通常用于一阶被控对象,二维模糊控制器的控制性能和控制复杂性都比较好,是目前广泛采用的一种形式。并且,一般选择增量算法作为模糊控制器的输出变量。
(2)描述输入、输出变量的词汇
在模糊控制中,输入、输出变量大小是以语言形式描述的,因此要选择描述这些变量的词汇。我们的日常语言中对各种事物和变量的描述,总是习惯于分为三个等级,例如,物体的大小分为大、中、小;运动的速度分为快、中、慢;年龄的大小分为老、中、青。实际应用中一般都选用“大、中、小”三个词汇来描述模糊控制器的输入、输出变量的状态,再加上正、负两个方向和零状态,共有7个词汇,即{负大,负中,负小,零,正小,正中,正大} 一般用这些词的英文字头缩写,即{NB, NM, NS, O, PS, PM, PB}。一般情况下,选择上述7个词汇比较合适,但也可以多选或少选。选择较多的词汇,可以精确描述变量,提高控制精度,但会使控制规则变得复杂;选择的词汇过少,则对变量的描述过于粗糙,导致控制器的性能变差。
(3)变量的模糊量
某个变量变化的实际范围称为该变量的基本论域。记偏差的基本论域为 [ − X e , X e ] [-Xe,Xe] [Xe,Xe],偏差变化的基本论域为 [ − X c , X c ] [-Xc,Xc] [Xc,Xc],模糊控制器的输出变量(系统的控制量)的基本论域为 [ − Y u , Y u ] [-Yu,Yu] [Yu,Yu]。显然,基本论域内的量是精确量,因而模糊控制器的输入和输出都是精确量,但是模糊控制算法需要模糊量。因此,输入的精确量(数字量)需要转换为模糊量,这个过程称为“模糊化”(Fuzzification);另一方面,模糊算法所得到的模糊控制量需要转换为精确的控制量,这个过程称为“清晰化”或者“反模糊化”(Defuzzification)。
比较实用的模糊化方法是将基本论域分为n个档次,即取变量的模糊子集论域为在这里插入图片描述
从基本论域到模糊子集论域的转换公式为
在这里插入图片描述

增加论域中的元素个数可以提高控制精度,但增大了计算量,而且模糊控制效果的改善并不明显。一般选择模糊论域中所含元素的个数为模糊语言词集总数的两倍以上,以确保各模糊集能较好地覆盖论域,避免出现失控现象。例如在选择上述7个词汇的情况下,可选择E和EC的论域均为在这里插入图片描述
选择模糊控制器的输出变量即系统的控制量U的论域为在这里插入图片描述(4)隶属度
为了实现模糊化,要在上述离散化了的精确量与表示模糊语言的模糊量之间建立关系,即确定论域中的每个元素对各个模糊语言变量的隶属度。
隶属度是描述某个确定量隶属于某个模糊语言变量的程度。例如,在上述和EC的论域中,+6隶属于 P B PB PB(正大),隶属度为1.0;+5也隶属于 P B PB PB,但隶属度要比+6差,可取为0.8;+4隶属于的程度更小,隶属度可取为0.4;显然-6~0就不隶属于了 P B PB PB,所以隶属度取为0。
确定隶属度的值要根据实际问题的具体情况而定。实验研究结果表明,人进行控制活动时的模糊概念一般可以用正态型模糊变量描述。下面给出常用的确定模糊变量隶属度的赋值表,如表3.1、表3.2和表3.3所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.建立模糊控制规则
模糊控制是语言控制,因此要用语言归纳专家的手动控制策略,从而建立模糊控制规则表。手动控制策略一般都可以用条件语句加以描述。条件语句的基本类型为
if A or B and C or D then U
下面介绍一种根据系统输出的误差及误差的变化趋势,消除误差的模糊控制规则。该规则用下述21条模糊条件语句来描述。

[1]if E = NB or NM and EC = NB or NM then U = PB
[2]if E = NB or NM and EC = NS or  O then	 U = PB
[3]if E = NB or NM and EC = PS then	U = PM
[4]if E = NB or NM and EC = PM or PB then	 U = O
[5]if E = NS and EC = NB or NM then	 U = PM
[6]if E = NS and EC = NS or O  then	 U = PM
[7]if E = NS and EC = PS then	 U = O
[8]if E = NS and EC = PM or PB then	 U = NS
[9]if E = NO or  PO and EC = NB or NM then U = PM
[10]if E = NO or PO and EC = NS then U = PS
[11]if E = NO or PO and EC = O  then U = O
[12]if E = NO or PO and EC = PS then U = NS
[13]if E = NO or PO and EC = PM  or PB then U = NM
[14]if E = PS and EC = NB or NM then U = PS
[15]if E = PS and EC = NS then U = O
[16]if E = PS and EC = O or PS then	 U = NM
[17]if E = PS and EC = PM or PB then U = NM
[18]if E = PM or PB and EC = NB or NM then U = O
[19]if E = PM or PB and EC = NS then U = NM
[20]if E = PM or PB and EC = O or PS then	 U = NB
[21]if E = PM or PB and EC = PM or PB then U = NB

以上21条模糊条件语句可以归纳为模糊控制规则表3.4。在这里插入图片描述
3.模糊关系与模糊推理
模糊控制规则实际上是一组多重条件语句,可以表示为从偏差论域到控制论域的模糊关系矩阵 R R R,通过偏差的模糊向量 E ′ E' E和偏差变化的模糊向量 E C ′ EC' EC ,与模糊关系矩阵 R R R的合成进行模糊推理,得到控制量的模糊向量,然后采用“反模糊化”方法将模糊控制向量转换为精确量。
根据模糊集合和模糊关系理论,对于不同类型的模糊规则可用不同的模糊推理方法。下面仅介绍其中的对if A then B类型的模糊规则的推理。
若已知输入为 A A A,则输出为 B B B ;若现在已知输入为 A ′ A' A ,则输出 B ′ B' B 用合成规则求取:

其中模糊关系 R R R定义为 B ′ = A ′ ∗ R B'=A'*R B=AR
在这里插入图片描述
例如,已知当输入的模糊集合和输出的模糊集合分别为
在这里插入图片描述
这里采用模糊集合的Zadeh表示法,其中 a i ai ai, b i bi bi 表示模糊集合所对应的论域中的元素,而 u i ui ui 表示相应的隶属度,“ — — ”不表示分数的意思。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在上述运算中,“∪”为取小运算,“∩”为取大运算。
由于系统的控制规则库是由若干条规则组成的,因此对于每一条推理规则都可以得到一个相应的模糊关系。n条规则就有n个模糊关系: R 1 , R 2... R n R1,R2...Rn R1,R2...Rn ,对于整个系统的全部控制规则所对应的模糊关系可对 n个模糊关系 ( R i , i = 1 , 2 , 3... n Ri,i=1,2,3...n Ri,i=1,2,3...n)取“并”操作得到,即
在这里插入图片描述
4.模糊控制向量的模糊判决
由上述得到的控制量是一个模糊集合,需要采用“反模糊化”方法将模糊控制项转换为精确量。下面介绍两种简单实用的方法。
(1)最大隶属度法
这种方法是在模糊控制向量中,取隶属度最大的控制量作为模糊控制器的输出。例如,当得到模糊控制向量为
(3.24)
由于控制量隶属于等级5的隶属度为最大,所以取控制量为
在这里插入图片描述
这种方法的优点是简单易行,缺点是完全排除了其他隶属度较小的控制量的影响和作用,没有充分利用取得的信息。
(2)加权平均判决法
为了克服最大隶属度法的缺点,可以采用加权平均判决法,即
在这里插入图片描述
例如在这里插入图片描述
在这里插入图片描述
5.模糊控制表
模糊关系、模糊推理以及模糊判决的运算可以离线进行,最后得到模糊控制器输入量的量化等级 , EC与输出量即系统控制量的量化等级之间 的确定关系,这种关系通常称为“控制表”。对应于前面介绍的21条控制规则的“控制表”如表3.5所列。
模糊控制表可以离线求出,作为文件存储在计算机中,计算机实时控制时只要将A/D转换得到的偏差和偏差变化 ec 进行量化,得到相应的等级 E 和 EC ,然后从文件中直接查询所需采取的控制策略。
在这里插入图片描述
6.确定实际的控制量
显然,实际的控制量 应为从控制表中查到的量化等级 乘以比例因子。设实际的控制量 的变化范围为 [ a , b ] [a, b] [a,b],量化等级为 − n , − n + 1 , . . . , 0 , . . . , n − 1 , n { -n,-n+1,...,0,...,n-1,n} n,n+1,...,0,...,n1,n,则实际的控制量应为在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例如在上述二维模糊控制器中,当 E 和 EC 的量化等级分别为-3和+1时,由控制表查得 U = 3 U=3 U=3,则模糊控制器输出的实际控制量应为 。

模糊控制器的设计步骤

  1. 选择输入和输出模糊集
  2. 定义输入输出隶属度函数
  3. 建立模糊控制表
  4. 建立模糊控制规则
  5. 模糊推理
  6. 反模糊化

模糊逻辑实现

以洗衣机洗衣粉投放量控制为例,令污渍stain和油渍oil为输入变量,洗衣粉powder为输出。假定输入和输出范围均为1~10。步骤如下:
引用相关模块并设置各个变量范围
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201021143449925.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjc4ODA3OA==,size_16,color_FFFFFF,t_70#pic_center
定义输入输出模糊集和其隶属度函数(使用三角函数),同时定义输出解模糊规则。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
建立模糊控制规则
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试:系统建立完成后,通过输入变量值来查看系统的输出

令输入污渍为5,油渍为6
在这里插入图片描述
完整代码:

import numpy as np
import skfuzzy as fuzz
import skfuzzy.control as ctrl

x_stain_range=np.arange(1,11,1,np.float32)
x_oil_range=np.arange(1,11,1,np.float32)
y_powder_range=np.arange(1,11,1,np.float32)

# 创建模糊控制变量
x_stain=ctrl.Antecedent(x_stain_range, 'stain')
x_oil=ctrl.Antecedent(x_oil_range, 'oil')
y_powder=ctrl.Consequent(y_powder_range, 'powder')

# 定义模糊集和其隶属度函数
x_stain['N']=fuzz.trimf(x_stain_range,[1,1,5])
x_stain['M']=fuzz.trimf(x_stain_range,[1,5,10])
x_stain['P']=fuzz.trimf(x_stain_range,[5,10,10])

x_oil['N']=fuzz.trimf(x_oil_range,[1,1,5])
x_oil['M']=fuzz.trimf(x_oil_range,[1,5,10])
x_oil['P']=fuzz.trimf(x_oil_range,[5,10,10])

y_powder['N']=fuzz.trimf(y_powder_range,[1,1,5])
y_powder['M']=fuzz.trimf(y_powder_range,[1,5,10])
y_powder['P']=fuzz.trimf(y_powder_range,[5,10,10])

# 设定输出powder的解模糊方法——质心解模糊方式
y_powder.defuzzify_method='centroid'

# 输出为N的规则
rule0 = ctrl.Rule(antecedent=((x_stain['N'] & x_oil['N']) |
                              (x_stain['M'] & x_oil['N']) ),
                  consequent=y_powder['N'], label='rule N')

# 输出为M的规则
rule1 = ctrl.Rule(antecedent=((x_stain['P'] & x_oil['N']) |
                              (x_stain['N'] & x_oil['M']) |
                              (x_stain['M'] & x_oil['M']) |
                              (x_stain['P'] & x_oil['M']) |
                              (x_stain['N'] & x_oil['P']) ),
                  consequent=y_powder['M'], label='rule M')

=# 输出为P的规则
rule2 = ctrl.Rule(antecedent=((x_stain['M'] & x_oil['P']) |
                              (x_stain['P'] & x_oil['P']) ),
                  consequent=y_powder['P'], label='rule P')

# 环境初始化
system = ctrl.ControlSystem(rules=[rule0, rule1, rule2])
sim = ctrl.ControlSystemSimulation(system)
sim.input['stain'] = 5
sim.input['oil'] = 6
sim.compute()   # 运行系统
output_powder = sim.output['powder']
# 打印输出结果
print(output_powder)

模糊逻辑python包:

https://github.com/scikit-fuzzy/scikit-fuzzy

最后

以上就是阔达招牌为你收集整理的模糊控制(FL)算法的全部内容,希望文章能够帮你解决模糊控制(FL)算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部