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]