1. 模糊PID控制器基础结构搭建
任务目标
在Simulink中搭建一个模糊PID控制器基础结构,包含模糊推理系统(FIS)与PID控制器,构成完整闭环控制回路。本案例聚焦结构搭建与信号通路验证,不涉及模糊规则整定细节。
环境依赖
- MATLAB R2020a及以上版本(含Simulink、Fuzzy Logic Toolbox)
- Simulink Library Browser中确认已安装Fuzzy Logic Controller模块
实现步骤
1. 创建模糊推理系统(FIS)
在MATLAB命令行中执行以下代码,生成一个双输入单输出的Mamdani型FIS,作为模糊PID的前置推理部分:
% 创建FIS
fis = mamfis('Name', 'FuzzyPID');
% 添加输入:误差e(范围[-1 1])
fis = addInput(fis, [-1 1], 'Name', 'error');
fis = addMF(fis, 'error', 'trimf', [-1 -0.5 0], 'Name', 'N');
fis = addMF(fis, 'error', 'trimf', [-0.5 0 0.5], 'Name', 'Z');
fis = addMF(fis, 'error', 'trimf', [0 0.5 1], 'Name', 'P');
% 添加输入:误差变化率ec(范围[-1 1])
fis = addInput(fis, [-1 1], 'Name', 'ec');
fis = addMF(fis, 'ec', 'trimf', [-1 -0.5 0], 'Name', 'N');
fis = addMF(fis, 'ec', 'trimf', [-0.5 0 0.5], 'Name', 'Z');
fis = addMF(fis, 'ec', 'trimf', [0 0.5 1], 'Name', 'P');
% 添加输出:增益调整系数K(范围[0 2])
fis = addOutput(fis, [0 2], 'Name', 'K');
fis = addMF(fis, 'K', 'trimf', [0 0 1], 'Name', 'Low');
fis = addMF(fis, 'K', 'trimf', [0.5 1 1.5], 'Name', 'Mid');
fis = addMF(fis, 'K', 'trimf', [1 2 2], 'Name', 'High');
% 添加规则:误差与误差变化率同向时增强控制,反向时减弱
ruleList = [1 1 3 1 1;
1 2 2 1 1;
1 3 1 1 1;
2 1 2 1 1;
2 2 2 1 1;
2 3 2 1 1;
3 1 1 1 1;
3 2 2 1 1;
3 3 3 1 1];
fis = addRule(fis, ruleList);
% 保存FIS到工作区
assignin('base', 'fis', fis);
disp('FIS创建完成');
2. 搭建Simulink模型
新建Simulink模型,按以下结构添加模块并连接:
- 被控对象:使用Transfer Fcn模块,设为
1/(s²+2s+1) - Sum模块:计算误差 e = 参考输入 - 输出
- Gain模块:误差变化率通道,增益设为1,与单位延迟配合得到ec
- Fuzzy Logic Controller模块:双击后选择工作区中的
fis对象 - PID Controller模块:使用Simulink内置PID模块,初始参数设为P=1, I=0.5, D=0.1
- Gain模块(K_adj):将FIS输出与PID输出相乘,增益设为1
- Product模块:将FIS输出K与PID输出相乘,得到最终控制量
模型连接顺序:参考输入 → Sum(+) → [e分支→FIS输入1] [e→Gain→单位延迟→ec→FIS输入2],同时 e → PID控制器,FIS输出 → Product模块,PID输出 → Product模块,Product输出 → 被控对象,被控对象输出 → Sum(-)反馈。
3. 配置仿真参数
% 仿真配置
mdl = 'fuzzy_pid_basic';
open_system(mdl);
set_param(mdl, 'StopTime', '10');
set_param(mdl, 'Solver', 'ode45');
% 设置参考输入为阶跃信号
sigBuilder = [0 0; 0.1 1; 10 1]; % 0.1s时阶跃到1
assignin('base', 'ref_signal', sigBuilder);
在模型中使用Signal Editor或Step模块(Step time=0.1, Final value=1)作为参考输入。
验证方法
运行仿真后,观察以下判定条件:
- Scope中显示系统输出在1s内跟踪阶跃输入至稳态值1,无持续振荡
- FIS输出K值随误差变化而调整:初始误差大时K接近2,稳态时K回落至1附近
- 控制量输出平滑,无突变
若输出发散或剧烈振荡,检查FIS规则表方向是否正确(误差为正且误差变化率为正时应输出High增益)以及PID初始参数是否合理。
常见问题
- FIS模块无法选择fis对象:确认已执行第一步代码且未清除工作区,在模块对话框中点击刷新
- 代数环错误:在ec计算路径中插入Memory或Unit Delay模块打破代数环
- 输出不收敛:适当减小PID初始增益,或调整FIS输出范围至[0.5 1.5]