当前位置:文档之家› 基于simulink的模糊PID控制例子

基于simulink的模糊PID控制例子

1模糊PID
用命令Fuzzy打开模糊控制工具箱。

Anfisedit打开自适应神经模糊控制器,它用给定的输入输出数据建个一个模糊推理系统,并用一个反向传播或者与最小二乘法结合的来完成隶属函数的调节。

Surfview(newfis)可以打开表面视图窗口
8.1 模糊PID 串联型
新建一个simulink模型同时拖入一个fuzzy logic controller 模块,双击输入已经保存的fis模糊控制器的名字。

由于这个控制模块只有一个输入端口,需要用到mux模块。

模糊结合PID,当输出误差较大时,用模糊校正,当较小时,用PID 校正。

8.2 模糊自适应PID
(1)PID 参数模糊自整定的原则
PID 调节器的控制规律为: u( k) = Kp e( k) + Ki Σe( i) + Kd ec( k)
其中: Kp 为比例系数; Ki 为积分系数; Kd为微分系数; e( k) 、ec( k) 分别为偏差和偏差变化率.模糊自整定PID 参数的目的是使参数Kp 、Ki 、Kd随着e 和ec 的变化而自行调整,故应首先建立它们间的关系. 根据实际经验,参数Kp 、Ki 、Kd在不同的e 和ec 下的自调整要满足如下调整原则:
(1) 当e 较大时,为加快系统的响应速度,防止因开始时e 的瞬间变大可能会引起的微分溢出,应取较大的Kp 和较小的Kd ,同时由于积分作用太强会使系统超调加大,因而要对积分作用加以限制,通常取较小的Ki值;
(2) 当e 中等大小时,为减小系统的超调量, 保证一定的响应速度, Kp 应适当减小;同时Kd 和Ki的取值大小要适中;
(3) 当e 较小时,为了减小稳态误差, Kp 与Ki 应取得大些,为了避免输出响应在设定值附近振荡,同时考虑系统的抗干扰性能,Kd 值的选择根据|ec|值较大时,Kd 取较小值,通常Kd 为中等大小。

同时按照需要,将输入语言变量E 和EC 分为7 个模糊子集,分别用语言值正大( PB) 、正中( PM) 、正小( PS) 、零(Z) 、负小(NS) 、负中(NM) 、负大(NB) 来表示,它们的隶属函数为高斯型(gaussmf) ,输出语言变量Kp′、Ki′、Kd′用语言值小正大( PB) 、正中( PM) 、正小( PS) 、零(Z) 、负小(NS) 、负中(NM) 、负大(NB) 来表示隶属函数为三角型(t rimf) ,
方法二:
图-1模糊自适应simulink模型根据各模糊子集的隶属度赋值表和各参数模糊控制模型,应用模糊合成推理设计分数阶PID参数的模糊矩阵表,算出参数代入下式计算:
Kp=Kp0+(E,EC)p;Ki=Ki0+(E,EC)I;Kd=Kd0+(E,EC)d
式中:Kp0、Ki0、Kd0为PID参数的初始设计值,由传统的PID控制器的参数整定方法设计。

(E,EC)p、(E,EC)i、(E,EC)d即(ΔKp, ΔKi, ΔKd)为模糊控制器的3个输出,可根据被控对象的状态自动调整PID三个控制参数的取值。

PID控制器部分
例子:下面是一个例子工业控制常见例子二阶惯性加纯滞后环节,传递函数为
)
1)(1(21++=-s T s T e G s
s τ,T1=1,T2=1,τ=0.3,模糊化因子,ke=kec=0.01;解模糊因子k1=0.5,k2=0.05,k3=0.05;PID 初始值Kp0=6.5;Ki0=1;Kd0=3.5;设置采样频率为0.01s 。

建立simulink 系统模型如下。

其中模糊控制器变量论域取[-6 6]. 同时按照需要,将输入语言变量 E 和EC 分为7 个模糊子集,分别用语言值正大( PB) 、正中( PM) 、正小( PS) 、零(Z) 、负小(NS) 、负中(NM) 、负大(NB) 来表示。

对于模糊控制规则按照上面的表选取。

图5-绿色线为fuzzy_pid输出,红色线为常规PID输出
四、量化因子Ke,Kec,Ku 该如何确定?
有个一般的公式:Ke=n/e(max),Kec=m/ec(max),Ku=u(max)/l。

n,m,l 分别为
Ke,Kec,Ku 的
量化等级,一般可取6 或7。

e(max),ec(max),u(max)分别为误差,误差变化率,控制输出的
论域。

不过通过我实际的调试,有时候这些公式并不好使。

所以我一般都采用凑试法,根
据你的经验,先确定Ku,这个直接关系着你的输出是发散的还是收敛的。

再确定Ke,这
个直接关系着输出的稳态误差响应。

最后确定Kec,前面两个参数确定好了,这个应该也
不会难了。

五、在仿真的时候会出现刚开始仿真的时候时间进度很慢,从e-10 次方等等开始,该怎么
解决?
这时候肯定会有许多人跳出来说是步长的问题,等你改完步长,能运行了,一看结果,惨
不忍睹!我只能说这个情况有可能是你的参数有错误,但如果各项参数是正确的前提下,
你可以在方框图里面加饱和输出模块或者改变阶跃信号的sample time,让不从
0 开始或者加个延迟模块或者加零阶保持器看看……
六、仿真到一半的时候仿真不动了是什么原因?
仿真图形很有可能发散了,加个零阶保持器,饱和输出模块看看效果。

改变Ke,Kec,
Ku 的参数。

七、仿真图形怎么反了?
把Ku 里面的参数改变一下符号,比如说从正变为负。

模糊PID 的话改变Kp 的就可以。

八、还有人问我为什么有的自适应模糊PID 里有相加的模块而有的没有?
相加的是与PID 的初值相加。

最后出来的各项参数Kp=△Kp+Kp0,Ki=△
Ki+Ki0,Kd=△
Kd+Kd0。

Kp0,Ki0,Kd0 分别为PID 的初值。

有的系统并没有设定PID 的初值。

九、我照着论文搭建的,什么都是正确的,为什么最后就是结果不对?
你修改下参数或者重新搭建一遍。

哪一点出了点小问题,都有可能导致失败。

huarongdao 工程师
精华0
积分237
帖子118
水位237
技术分0 问关于单点模糊化和matlab仿真的问题,了!
最近粗学了模糊控制。

对于模糊化很不理解。

书上看到的输入模糊化方法是把输入对应输入隶属度大选取相应的模糊集合。

规则前件的隶属函数是否与输入隶属函数选取应该一样?看到很多地方都谈到输入模糊化用单点模糊的方法,感觉很难理解。

如果每个点对应一个模糊集合,那么不是有无穷多个输入模糊集合?规则前件的隶属函数是否也要选取单点的?matlab里的fis editor 没有选取模糊化的方法,那么默认的方法是单点还是输入对应输入隶属度大选取相应模糊集的方法呢??
大家的回复,不胜感激!!
2007-7-4 01:52 #1
joedahachi
工程师
精华0 积分326 帖子154 水位311 技术分0 单点模糊化只是针对集合的元素只有一个的情况。

一般情况下不用单点模糊化。

在设计以控制器时首先选取控制器的输入变量,然后对输入变量进行模糊划分,比如我们选“速度”作为语言变量,速度有快、慢、合适之分,我们可以把“速度”这个语言变量定义为由快、慢、合适等语言值组成的模糊集合,然后把快慢合适用隶属度函数表示,,规则的前件就是输入语言变量的各个语言值的隶属度函数。

matlab里的fise ditor里有模糊化的方法,模糊化的方法就是选取各个输入语言变量值的隶属度函数,那里边包含的是一些常用的隶属度函数如:gaussmf、gbellmf等函数。

隶属度函数的定义是否是单点模糊化要看相应的集合的元素是一个元素还是多个,或者说是离散的还是连续的,不能一概而论。

2007-7-4 17:00 #2
wnjnan
助理工程师
精华0
积分35 帖子17
水位35
技术分0 楼上答复。

但是很多书在写模糊系统的数学表达式的时候,都是用单点模糊化的方法。

而且有几本书里都说单点模糊化是很常用的方法啊。

2007-7-4 18:30 #3
`
Word 文档 andonchol
工程师
精华 0
积分 300
帖子 149
水位 300
技术分 0
昨晚上细看了下模糊推理过程,对这问题比较清楚了。

我理解matlab 的FIS editor 就是用单点模糊化方法进
行输入模糊化的。

模糊化隶属函数和规则前件的隶属函数没有必然的联系。

相关主题