基于模糊控制 simulink仿真双容水箱液位控制系统
模糊pid控制、pid控制对比实验
仿真效果所如图,跟随曲线非常好
有6k文档,仿真文件,模糊控制搭建过程都有
以下文字及示例代码仅供参考
文章目录
设计一个基于 模糊控制(Fuzzy Control) 的 双容水箱液位控制系统(Two-Tank Liquid Level System),并使用 Simulink 进行仿真。以下是完整的实现步骤、Simulink 模型结构、控制器设计与 MATLAB 脚本代码。
🧠 一、系统概述
双容水箱系统是一个典型的非线性、时滞、耦合系统,在工业过程控制中广泛存在。其控制目标是通过调节泵的输入流量来维持下水箱液位在设定值附近。
✅ 控制目标:
- 维持下水箱液位稳定在设定值
- 抑制扰动影响(如进水波动)
⚙️ 二、系统建模与 Simulink 结构图
🔧 Simulink 模型组成:
- Fuzzy Controller:模糊控制器
- Plant Model:双容水箱动态模型
- Reference Input (Setpoint):设定液位值
- Feedback Loop:反馈实际输出液位
- Scope:显示仿真结果
- Step / Disturbance Inputs:用于测试响应性能
📦 模块连接示意图:
[Setpoint] ----> (+)----> [Fuzzy Controller] ----> [Pump & Two-Tank Plant] ----> [Liquid Level Output]
↑ ↓
└-------- [Feedback] <-------------------┘
🧪 三、双容水箱数学模型(传递函数或状态方程)
简化模型描述:
设上下两个水箱之间通过小孔连接,下水箱流出液体。假设为线性近似模型:
状态空间表示:
x ˙ 1 = 1 A 1 ( q i n − a 1 2 g x 1 ) x ˙ 2 = 1 A 2 ( a 1 2 g x 1 − a 2 2 g x 2 ) \begin{aligned} \dot{x}_1 &= \frac{1}{A_1}(q_{in} - a_1 \sqrt{2g x_1}) \\ \dot{x}_2 &= \frac{1}{A_2}(a_1 \sqrt{2g x_1} - a_2 \sqrt{2g x_2}) \end{aligned} x˙1x˙2=A11(qin−a12gx1)=A21(a12gx1−a22gx2)
其中:
- $ x_1, x_2 $:上、下水箱液位
- $ q_{in} $:输入流量
- $ A_1, A_2 $:水箱横截面积
- $ a_1, a_2 $:出流口面积系数
- $ g = 9.81 m/s^2 $
为了简化 Simulink 实现,我们可以用 传递函数近似 或 S-Function 编写非线性模型。
💡 四、模糊控制器设计(MATLAB)
使用 fuzzyLogicDesigner
工具创建模糊推理系统(FIS),并保存为 twoTankFIS.fis
。
输入变量:
error
(e):设定液位与实际液位之差derror
(Δe):误差的变化率
输出变量:
control_signal
(u):控制信号(即泵的输入电压/流量)
示例模糊规则(简化的 5 条规则):
Error | ΔError | Control Signal |
---|---|---|
NB | NB | PB |
NS | ZO | PS |
ZO | ZO | ZO |
PS | ZO | NS |
PB | PB | NB |
📁 五、Simulink 模型搭建步骤(使用 MATLAB 命令生成)
% 创建 Simulink 模型
modelName = 'TwoTank_Control_Fuzzy';
new_system(modelName);
% 添加模块
add_block('simulink/Sources/Step','TwoTank_Control_Fuzzy/Setpoint');
add_block('simulink/Math Operations/Sum','TwoTank_Control_Fuzzy/Error_Calc');
set_param('TwoTank_Control_Fuzzy/Error_Calc', 'Inputs', '+-');
add_block('fuzzy/FIS Importer','TwoTank_Control_Fuzzy/Fuzzy_Controller');
set_param('TwoTank_Control_Fuzzy/Fuzzy_Controller', 'FISFile', 'twoTankFIS.fis');
% 使用 Transfer Fcn 模拟双容水箱
add_block('simulink/Continuous/Transfer Fcn','TwoTank_Control_Fuzzy/Tank_Plant');
set_param('TwoTank_Control_Fuzzy/Tank_Plant', 'Numerator', '[1]', 'Denominator', '[100 20 1]');
% 添加增益和微分模块
add_block('simulink/Math Operations/Gain','TwoTank_Control_Fuzzy/Error_Diff');
set_param('TwoTank_Control_Fuzzy/Error_Diff', 'Gain', '1');
add_block('simulink/Sinks/Scope','TwoTank_Control_Fuzzy/Liquid_Level_Scope');
% 连接模块
add_line(modelName, 'Setpoint/1', 'Error_Calc/1');
add_line(modelName, 'Tank_Plant/1', 'Error_Calc/2');
add_line(modelName, 'Error_Calc/1', 'Fuzzy_Controller/1');
add_line(modelName, 'Fuzzy_Controller/1', 'Tank_Plant/1');
add_line(modelName, 'Tank_Plant/1', 'Liquid_Level_Scope/1');
% 设置仿真时间
set_param(modelName, 'StopTime', '100');
% 打开模型
open_system(modelName);
🧾 六、模糊控制器初始化脚本(MATLAB)
% 创建模糊逻辑控制器
fis = mamfis;
% 添加输入变量
fis = addInput(fis, [-5 5], 'Name', 'error');
fis = addMF(fis, 'error', 'trimf', [-5 -5 0], 'Name', 'NB');
fis = addMF(fis, 'error', 'trimf', [-3 0 3], 'Name', 'ZO');
fis = addMF(fis, 'error', 'trimf', [0 5 5], 'Name', 'PB');
fis = addInput(fis, [-2 2], 'Name', 'derror');
fis = addMF(fis, 'derror', 'trimf', [-2 -2 0], 'Name', 'NB');
fis = addMF(fis, 'derror', 'trimf', [-1 0 1], 'Name', 'ZO');
fis = addMF(fis, 'derror', 'trimf', [0 2 2], 'Name', 'PB');
% 添加输出变量
fis = addOutput(fis, [-10 10], 'Name', 'control_signal');
fis = addMF(fis, 'control_signal', 'trimf', [-10 -10 0], 'Name', 'NB');
fis = addMF(fis, 'control_signal', 'trimf', [-5 0 5], 'Name', 'ZO');
fis = addMF(fis, 'control_signal', 'trimf', [0 10 10], 'Name', 'PB');
% 添加模糊规则
rules = [
"error==NB & derror==NB => control_signal=PB";
"error==NS & derror==ZO => control_signal=PS";
"error==ZO & derror==ZO => control_signal=ZO";
"error==PS & derror==ZO => control_signal=NS";
"error==PB & derror==PB => control_signal=NB"
];
fis = addRule(fis, rules);
% 保存为 .fis 文件
writeFIS(fis, 'twoTankFIS');
📈 七、运行与分析
- 在 MATLAB 中运行上述脚本以生成
.fis
和 Simulink 模型。 - 打开模型并点击“Run”按钮开始仿真。
- 观察 Scope 输出,查看液位响应曲线。
- 可添加扰动(如 Step 干扰)测试鲁棒性。
📌 八、总结
本方案实现了基于模糊控制的双容水箱液位控制系统设计,具备以下优点:
- 不依赖复杂数学模型
- 鲁棒性强,适用于非线性系统
- 易于通过 GUI 调整隶属函数和规则
📦 附件说明:
twoTankFIS.fis
:模糊控制器文件TwoTank_Control_Fuzzy.slx
:Simulink 模型文件(由脚本生成)- 可进一步扩展为 S-Function 编写非线性模型或加入 PID 对比模块