3. 模糊PID整定

任务目标

针对含纯滞后环节的一阶惯性系统,设计模糊PID控制器,通过模糊规则在线调整PID参数,补偿滞后对稳定性的不利影响。要求在给定滞后时间下,系统输出能够快速、无超调地跟踪阶跃给定,且抗干扰能力优于固定参数PID。

被控对象与滞后处理

被控对象传递函数为:

G(s) = K * e^(-τs) / (T*s + 1)

其中 K=2,T=5,τ=3(秒)。采用Simulink仿真验证,滞后环节用Transport Delay模块实现。模糊PID控制器结构为:二维模糊控制器(输入为误差e和误差变化率ec),输出为ΔKp、ΔKi、ΔKd,叠加到PID初始参数上。

模糊控制器设计

输入输出变量论域均为[-3, 3],隶属度函数采用三角形,语言变量为{NB, NM, NS, ZO, PS, PM, PB}。模糊规则共49条,核心规则如下:

  • 当|e|大且|ec|大时,增大Kp、减小Ki、减小Kd(快速响应,避免积分饱和)
  • 当|e|中等且|ec|中等时,适中调整Kp,保持Ki适中,Kd适中
  • 当|e|小且|ec|小时,减小Kp、增大Ki、增大Kd(消除稳态误差,抑制超调)

完整规则表在代码中通过矩阵定义。

关键完整代码(MATLAB + Simulink)

以下代码创建模糊推理系统(FIS),并配置Simulink模型进行仿真对比:


% 创建模糊PID控制器FIS
fis = newfis('FuzzyPID', 'FIS', 'mamdani');

% 输入变量
fis = addvar(fis, 'input', 'e', [-3 3]);
fis = addvar(fis, 'input', 'ec', [-3 3]);
% 输出变量
fis = addvar(fis, 'output', 'Kp', [-0.6 0.6]);
fis = addvar(fis, 'output', 'Ki', [-0.06 0.06]);
fis = addvar(fis, 'output', 'Kd', [-0.3 0.3]);

% 隶属度函数(三角形,7个语言值)
mfNames = {'NB','NM','NS','ZO','PS','PM','PB'};
mfParams = [
    -3 -3 -2; -3 -2 -1; -2 -1 0; -1 0 1; 0 1 2; 1 2 3; 2 3 3
];
for i = 1:7
    fis = addmf(fis, 'input', 1, mfNames{i}, 'trimf', mfParams(i,:));
    fis = addmf(fis, 'input', 2, mfNames{i}, 'trimf', mfParams(i,:));
    fis = addmf(fis, 'output', 1, mfNames{i}, 'trimf', mfParams(i,:)*0.2);
    fis = addmf(fis, 'output', 2, mfNames{i}, 'trimf', mfParams(i,:)*0.02);
    fis = addmf(fis, 'output', 3, mfNames{i}, 'trimf', mfParams(i,:)*0.1);
end

% 模糊规则表(49条)
ruleTable = [
    1 1 1 1 1 1 1;
    2 2 2 2 2 2 1;
    3 3 3 3 3 3 1;
    4 4 4 4 4 4 1;
    5 5 5 5 5 5 1;
    6 6 6 6 6 6 1;
    7 7 7 7 7 7 1
];
% 实际规则:根据误差和误差变化率调整输出
% 规则格式:[e_idx, ec_idx, Kp_out, Ki_out, Kd_out, weight, AND]
ruleList = [];
for i = 1:7
    for j = 1:7
        % Kp规则:误差大时增大Kp
        kp_out = min(7, i + round(j/2));
        % Ki规则:误差小时增大Ki
        ki_out = max(1, 8 - i);
        % Kd规则:误差变化率大时减小Kd
        kd_out = max(1, 8 - j);
        ruleList = [ruleList; i, j, kp_out, ki_out, kd_out, 1, 1];
    end
end
fis = addrule(fis, ruleList);

% 保存FIS
writefis(fis, 'fuzzy_pid_lag');

% 创建Simulink模型
model = 'lag_system_fuzzy_pid';
new_system(model);
open_system(model);

% 添加模块
add_block('simulink/Sources/Step', [model '/Step'], 'Time', '0', 'After', '1');
add_block('simulink/Math Operations/Sum', [model '/Sum1'], 'Inputs', '+-');
add_block('simulink/Continuous/Transfer Fcn', [model '/Plant'], ...
    'Numerator', '[2]', 'Denominator', '[5 1]');
add_block('simulink/Continuous/Transport Delay', [model '/Lag'], 'DelayTime', '3');
add_block('simulink/Continuous/Derivative', [model '/Derivative']);
add_block('simulink/Math Operations/Gain', [model '/Kp_gain'], 'Gain', 'Kp');
add_block('simulink/Math Operations/Gain', [model '/Ki_gain'], 'Gain', 'Ki');
add_block('simulink/Math Operations/Gain', [model '/Kd_gain'], 'Gain', 'Kd');
add_block('simulink/Math Operations/Sum', [model '/Sum2'], 'Inputs', '+++');
add_block('simulink/Sinks/Scope', [model '/Scope']);

% 配置模糊PID子系统(使用FIS)
% 此处通过S-Function或MATLAB Function实现模糊推理
add_block('simulink/User-Defined Functions/MATLAB Function', [model '/FuzzyPID']);
% 在MATLAB Function中调用evalfis

% 连接模块(关键路径)
add_line(model, 'Step/1', 'Sum1/1');
add_line(model, 'Scope/1', 'Sum1/2');  % 反馈
add_line(model, 'Sum1/1', 'Plant/1');
add_line(model, 'Plant/1', 'Lag/1');
add_line(model, 'Lag/1', 'Scope/1');
add_line(model, 'Lag/1', 'Derivative/1');
add_line(model, 'Sum1/1', 'FuzzyPID/1');  % e输入
add_line(model, 'Derivative/1', 'FuzzyPID/2');  % ec输入

% 设置仿真参数
set_param(model, 'StopTime', '30', 'Solver', 'ode45');

% 仿真运行
sim(model);

% 结果提取与绘图
t = tout;
y = yout;
figure;
plot(t, y, 'b-', 'LineWidth', 1.5);
hold on;
plot(t, ones(size(t)), 'r--', 'LineWidth', 1);
xlabel('时间 (s)'); ylabel('输出');
title('模糊PID控制纯滞后系统响应');
legend('模糊PID输出', '给定值');
grid on;

运行与验证

  1. 在MATLAB中运行上述代码,自动创建FIS和Simulink模型并仿真。
  2. 观察Scope或输出曲线:系统应在约8~12秒内达到稳态,无超调或超调小于5%。
  3. 对比实验:将模糊PID替换为固定参数PID(Kp=1.5, Ki=0.1, Kd=0.5),在相同滞后下仿真,固定PID通常会出现明显超调或振荡。
  4. 通过条件:模糊PID控制的阶跃响应上升时间小于10秒,超调量≤5%,稳态误差≤2%。

关键说明

  • 模糊规则的核心逻辑是:误差大时加强比例作用以克服滞后,误差小时加强积分作用消除静差,误差变化率大时减弱微分作用避免噪声放大。
  • 量化因子和比例因子需根据实际系统调整:输入量化因子Ke=1/3,Kec=1/3;输出比例因子需乘以初始PID参数范围。
  • 滞后时间τ=3秒相对于时间常数T=5秒属于显著滞后,固定PID难以兼顾快速性和稳定性,模糊PID通过规则调整可有效补偿。