新年第一篇,一位读者朋友后台留言咨询关于水箱液位控制的问题,因为没描述具体的问题需求,本文分享一篇Matlab自带的样例-基于模糊理论的水箱液位控制。
该模型实现了在Simulink模型中模糊推理系统(FIS) 水箱液位控制。
Simulink模型
该模型使用模糊逻辑控制器块实现的模糊推理系统来控制水箱中的水位。控制模型如下图
代码语言:javascript复制open_system('sltank')
对于这个系统,你可以使用阀门控制流入水箱的水。流出率取决于输出管的直径(恒定)和水箱中的压力(随水位变化)。因此,该系统具有非线性特性。
模糊推理系统
模糊系统在MATLAB工作空间中的FIS对象tank中定义。
模糊系统的两个输入是水位误差和水位变化率。每个输入有三个成员函数。
代码语言:javascript复制figure
plotmf(tank,'input',1)
figure
plotmf(tank,'input',2)
模糊系统的输出是控制阀打开或关闭的速率,该控制阀有五个隶属函数。
代码语言:javascript复制plotmf(tank,'output',1)
由于出水管道的直径,该系统中的水箱排空的速度比注满的速度慢。为了补偿这种不平衡,关闭慢阀和打开慢阀的隶属函数是不对称的。PID控制器不支持这种不对称性。
模糊系统有五条规则。前三条规则仅根据水位误差调整阀门。
- 如果水位正常,则不要调整阀门。
- 如果水位低,则快速打开阀门。
- 如果水位高,则快速关闭阀门。
当水位接近设定点时,其他两条规则根据水位变化率调整阀门。
- 如果水位正常且正在上升,则缓慢关闭阀门。
- 如果水位正常且下降,则缓慢打开阀门。
tank.Rules
ans =
1×5 fisrule 数组 - 属性:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
______________________________________________________
1 "level==okay => valve=no_change (1)"
2 "level==low => valve=open_fast (1)"
3 "level==high => valve=close_fast (1)"
4 "level==okay & rate==positive => valve=close_slow (1)"
5 "level==okay & rate==negative => valve=open_slow (1)"
在此模型中,还可以使用PID控制器控制水位。要切换到PID控制器,将const块设置为大于或等于零的值。
模拟
该模型通过水位设定点的周期性变化来模拟控制器。运行模拟。
代码语言:javascript复制sim('sltank',100)
open_system('sltank/Comparison')
水位很好地跟踪设定点。可以通过修改油箱FIS的规则来调整控制器的性能。例如,如果删除后两条类似于衍生控制动作的规则,控制器的性能会很差,水位会出现大幅波动。