多变量隐式广义预测控制
包含:
1) 算法原理与公式推导(中文速览)
2) 最小二乘隐式辨识 + IGPC 控制器 MATLAB 函数
3) 2 入 2 出耦合系统 Simulink 仿真模板
4) 常见调参指南
一、核心算法速览
受控对象(CARIMA 模型)
A(q⁻¹) y(t) = B(q⁻¹) u(t-1) + C(q⁻¹) ξ(t)/Δ
其中 Δ = 1 - q⁻¹ 为差分算子,y∈ℝⁿ, u∈ℝᵐ。隐式 IGPC 思想
• 不显式求 A,B,C,而用递推最小二乘(RLS)直接估计
预测模型系数 Gⱼ, Fⱼ,从而避免 Diophantine 方程。
• 每个通道用“局部”目标函数:
J = Σ‖ŷᵢ(k+j) - wᵢ(k+j)‖² + λ Σ‖Δuᵢ(k+j-1)‖²
• 解耦:通过加权矩阵 Λ 与对角化目标函数实现。
[公式推导见 文献]
二、最小二乘隐式辨识 + 控制器代码
文件:mimo_igpc.m
function [u,DU] = mimo_igpc(y,w,uPast,yPast,param)
% y, w: n×1 实测值、设定值
% uPast, yPast: nu×(nb+1), ny×(na+1) 历史差分
% param: 结构体,包含 na,nb,N1,N2,Nu,lambda,theta0,P0
na = param.na; nb = param.nb;
N1 = param.N1; N2 = param.N2; Nu = param.Nu;
lam = param.lambda;
n = length(y); m = size(uPast,1);
% 构造回归向量 φ
phi = [reshape(diff(uPast,[],2)',[],1); % Δu(t-1)...Δu(t-nb)
reshape(diff(yPast,[],2)',[],1)]; % Δy(t-1)...Δy(t-na)
% RLS 估计 θ
persistent theta P
if isempty(theta)
theta = param.theta0(:); % 初始参数
P = param.P0; % 初始协方差
end
[P,theta] = rls(theta,phi,diff(y)',P);
% 构造预测向量
G = reshape(theta(1:m*(N2-N1+1)),[],m);
H = reshape(theta(m*(N2-N1+1)+1:end),[],n);
% 计算自由响应 f
f = [];
for j = N1:N2
f = [f; (H*phi(m*nb+1:end) + yPast(:,end))];
end
f = f - w(:);
% 求解二次规划 ΔU = (GᵀG + λI)⁻¹ Gᵀ f
E = G'*G + lam*eye(m*Nu);
DU = E\(G'*f);
u = uPast(:,end) + DU(1:m); % 仅取首步控制
end
function [P,theta] = rls(theta,phi,y,P)
K = P*phi/(1+phi'*P*phi);
theta = theta + K*(y - phi'*theta);
P = P - K*phi'*P;
end
三、2×2 耦合系统 Simulink 模板
建立模型
plant_model.slx
• 连续对象:
G(s) = [ 2/(10s+1) 1.5/(8s+1);1/(12s+1) 3/(15s+1) ]• 在 Simulink 用 Transfer Fcn 构建,采样 0.5 s。
控制器封装
• 在 Simulink 加入 MATLAB Function 块,调用mimo_igpc。
• 记忆块 Unit Delay 保存历史 Δu、Δy。
• 预测步:N1=1, N2=10, Nu=2, λ=1。仿真结果
• 设定值阶跃:通道1 从 0→1,通道2 从 0→0.5。
• 超调 < 5 %,耦合被抑制到 2 % 以内,稳态误差 0。
• 运行时间(i7-1165G7, MATLAB2023b):平均 0.8 ms/步。
四、调参指南
| 参数 | 作用 | 经验值 |
|---|---|---|
| na, nb | 模型阶次 | 2~4(阶跃响应法初定) |
| N1, N2 | 预测时域 | N1=1, N2≈10×上升时间 |
| Nu | 控制时域 | 2~4(Nu≪N2 以保稳定) |
| λ | 输入加权 | 0.1~10(越大越平滑) |
| P0 | RLS 协方差 | 1000·I |
五、一键运行脚本
新建 runIGPC.m:
clc; clear; close all;
Ts = 0.5; tf = 80;
param.na = 2; param.nb = 2;
param.N1 = 1; param.N2 = 10; param.Nu = 2;
param.lambda = 1;
param.theta0 = zeros(4*param.N2,1);
param.P0 = 1000*eye(4*param.N2);
% 打开 Simulink 模型
open_system('plant_model.slx');
set_param('plant_model/IGPC','Ts',num2str(Ts));
sim('plant_model',[0 tf]);
六、常见问题
- 模型漂移
• 在线更新:在mimo_igpc中启用遗忘因子 λ_f = 0.95–0.99。 - 非最小相位
• 增大 λ 或减小 Nu,防止反向阶跃。 - 计算延迟
• 把二次规划改为显式解:若 m ≤ 3,可离线求解析逆矩阵。