Matlab下的模糊控制水箱液位

该模型实现了在Simulink模型中模糊推理系统(FIS)+水箱液位控制。

Simulink模型

该模型使用模糊逻辑控制器块实现的模糊推理系统来控制水箱中的水位。控制模型如下图

open_system('sltank')

对于这个系统,你可以使用阀门控制流入水箱的水。流出率取决于输出管的直径(恒定)和水箱中的压力(随水位变化)。因此,该系统具有非线性特性。

模糊推理系统

模糊系统在MATLAB工作空间中的FIS对象tank中定义。

模糊系统的两个输入是水位误差和水位变化率。每个输入有三个成员函数。

figureplotmf(tank,'input',1)figureplotmf(tank,'input',2)

模糊系统的输出是控制阀打开或关闭的速率,该控制阀有五个隶属函数。

plotmf(tank,'output',1)

由于出水管道的直径,该系统中的水箱排空的速度比注满的速度慢。为了补偿这种不平衡,关闭慢阀和打开慢阀的隶属函数是不对称的。PID控制器不支持这种不对称性。

模糊系统有五条规则。前三条规则仅根据水位误差调整阀门。

  • 如果水位正常,则不要调整阀门。

  • 如果水位低,则快速打开阀门。

  • 如果水位高,则快速关闭阀门。

当水位接近设定点时,其他两条规则根据水位变化率调整阀门。

  • 如果水位正常且正在上升,则缓慢关闭阀门。

  • 如果水位正常且下降,则缓慢打开阀门。

tank.Rulesans = 
  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块设置为大于或等于零的值。

模拟

该模型通过水位设定点的周期性变化来模拟控制器。运行模拟。

​​​​​​​

sim('sltank',100)open_system('sltank/Comparison')

水位很好地跟踪设定点。可以通过修改油箱FIS的规则来调整控制器的性能。例如,如果删除后两条类似于衍生控制动作的规则,控制器的性能会很差,水位会出现大幅波动。

 

  • 1
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
水箱液位模糊控制可以使用模糊控制技术来实现。模糊控制的基本思想是将人类专家的经验和知识转化为模糊规则,用以描述系统的行为。在水箱液位控制中,输入变量可以是水位传感器的测量值,输出变量可以是水泵的控制信号,通过模糊控制器对控制信号进行调节,从而控制水箱液位在设定范围内。 下面是一个基于 Matlab模糊控制示例: 1. 定义输入变量和输出变量 ``` % 输入变量 water_level = newfis('water_level'); water_level = addvar(water_level, 'input', 'water_level', [0 1]); % 输出变量 pump_signal = addvar(water_level, 'output', 'pump_signal', [0 1]); ``` 2. 定义模糊集合和隶属度函数 ``` % 模糊集合 water_level = addmf(water_level, 'input', 1, 'low', 'trimf', [0 0 0.5]); water_level = addmf(water_level, 'input', 1, 'medium', 'trimf', [0.25 0.5 0.75]); water_level = addmf(water_level, 'input', 1, 'high', 'trimf', [0.5 1 1]); pump_signal = addmf(pump_signal, 'output', 1, 'off', 'trimf', [0 0 0.5]); pump_signal = addmf(pump_signal, 'output', 1, 'on', 'trimf', [0.5 1 1]); % 隶属度函数 rule1 = [1 1 1 1]; rule2 = [2 1 2 1]; rule3 = [3 1 3 1]; rules = [rule1; rule2; rule3]; water_level = addrule(water_level, rules); ``` 3. 设计模糊控制器 ``` % 设计模糊控制器 water_level_control = newfis('water_level_control'); water_level_control = addvar(water_level_control, 'input', 'water_level', [0 1]); water_level_control = addvar(water_level_control, 'output', 'pump_signal', [0 1]); % 模糊集合 water_level_control = addmf(water_level_control, 'input', 1, 'low', 'trimf', [0 0 0.5]); water_level_control = addmf(water_level_control, 'input', 1, 'medium', 'trimf', [0.25 0.5 0.75]); water_level_control = addmf(water_level_control, 'input', 1, 'high', 'trimf', [0.5 1 1]); water_level_control = addmf(water_level_control, 'output', 1, 'off', 'trimf', [0 0 0.5]); water_level_control = addmf(water_level_control, 'output', 1, 'on', 'trimf', [0.5 1 1]); % 隶属度函数 rule1 = [1 1 1 1]; rule2 = [2 1 2 1]; rule3 = [3 1 3 1]; rules = [rule1; rule2; rule3]; water_level_control = addrule(water_level_control, rules); % 模拟输入变量值 water_level_value = 0.3; % 运行模糊控制器 pump_signal_value = evalfis([water_level_value], water_level_control); % 输出控制信号 disp(['Pump signal: ', num2str(pump_signal_value)]); ``` 这是一个简单的示例,实际应用中需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值