在工业控制领域,模型预测控制(MPC)因其出色的多变量处理能力和约束处理能力而备受青睐。传统状态空间MPC虽然理论成熟,但在实际工程应用中经常面临两个主要痛点:一是需要频繁进行矩阵求逆运算,这在嵌入式系统或实时性要求高的场景中可能成为性能瓶颈;二是当系统矩阵接近奇异时,数值稳定性问题会严重影响控制效果。
输入增量方法通过重新定义控制问题,将优化变量从绝对控制量改为控制量的增量变化(Δu=u(k)-u(k-1)),巧妙地规避了矩阵求逆的难题。这种方法的优势主要体现在三个方面:
以一个化工过程温度控制为例,当需要将反应釜温度从20℃升至100℃时,传统MPC可能直接计算加热功率的绝对值,而增量MPC则会计算功率需要增加或减少的幅度。后者不仅更符合操作人员的思维习惯,在实际调试中也表现出更好的鲁棒性。
考虑离散线性时不变系统:
code复制x(k+1) = Ax(k) + Bu(k)
y(k) = Cx(k)
其中x∈ℝⁿ,u∈ℝᵐ,y∈ℝᵖ。在预测时域Np内,传统MPC需要构建如下预测方程:
code复制Y = Fx(k) + ΦU
其中F和Φ是由A,B,C构成的预测矩阵,U=[u(k);...;u(k+Nc-1)]是控制序列。优化问题通常表述为:
code复制min 1/2 U'HU + f'U
s.t. GU ≤ b
核心痛点出现在H矩阵求逆环节。当控制维度m较大或Nc较长时,H∈ℝ^(mNc×mNc)的维数会急剧膨胀。在笔者参与的一个冶金过程控制项目中,m=6、Nc=20时,H矩阵尺寸达到120×120,每次采样周期内完成矩阵求逆需要约15ms,这已经接近控制周期(50ms)的1/3。
在造纸机厚度控制系统的调试中,我们发现当B矩阵某些列线性相关度较高时,Φ'QΦ矩阵会出现病态条件数。某次现场记录显示,当条件数达到10^8量级时,传统MPC的输出开始出现剧烈振荡。此时即便加入正则化项,控制品质也会显著下降。
关键发现:通过将优化变量转换为输入增量ΔU,预测方程变为X = F̃x(k) + G̃u(k-1) + Φ̃ΔU,其中ΔU=[Δu(k);...;Δu(k+Nc-1)]。新的Hessian矩阵H̃=Φ̃'QΦ̃+R̃通常具有更好的数值特性。
定义增量Δu(k)=u(k)-u(k-1),重构状态空间方程为:
code复制x(k+1) = Ax(k) + B(u(k-1)+Δu(k))
= Ax(k) + Bu(k-1) + BΔu(k)
扩展状态向量为z(k)=[x(k); u(k-1)],得到增广系统:
code复制z(k+1) = Ãz(k) + B̃Δu(k)
y(k) = C̃z(k)
其中Ã=[A B; 0 I], B̃=[B; I], C̃=[C 0]。
预测时域内的状态序列可表示为:
code复制Z = F̂z(k) + Φ̂ΔU
其中F̂和Φ̂是新的预测矩阵,具体构造方法如下:
matlab复制function [F_hat, Phi_hat] = build_prediction_matrix(A_tilde, B_tilde, Np, Nc)
nz = size(A_tilde,1);
F_hat = zeros(Np*nz, nz);
Phi_hat = zeros(Np*nz, Nc*size(B_tilde,2));
% 构造F_hat
for i = 1:Np
F_hat((i-1)*nz+1:i*nz, :) = A_tilde^i;
end
% 构造Phi_hat
for i = 1:Np
for j = 1:min(i,Nc)
Phi_hat((i-1)*nz+1:i*nz, (j-1)*size(B_tilde,2)+1:j*size(B_tilde,2)) = A_tilde^(i-j)*B_tilde;
end
end
end
目标函数转换为:
code复制J = (Y-Yref)'Q(Y-Yref) + ΔU'RΔU + ΔU'SΔU
其中S用于惩罚输入增量的变化率(即Δu(k)-Δu(k-1)),可进一步增强平滑性。展开后得到标准QP形式:
code复制J = 1/2 ΔU'H̃ΔU + f̃'ΔU + c
其中:
code复制H̃ = 2(Φ̂'C̃'QC̃Φ̂ + R + S)
f̃ = 2(z(k)'F̂'C̃'QC̃Φ̂ - Yref'QC̃Φ̂)
输入增量方法使约束表述更直观:
在实际编程中,建议采用如下结构处理约束:
matlab复制function [A_con, b_con] = build_constraints(u_prev, Nc, du_max, u_min, u_max)
% 输入增量约束
A_du = [eye(Nc); -eye(Nc)];
b_du = [repmat(du_max, Nc, 1); repmat(du_max, Nc, 1)];
% 绝对量约束
A_u = tril(ones(Nc));
A_u = [A_u; -A_u];
b_u = [repmat(u_max - u_prev, Nc, 1); repmat(u_prev - u_min, Nc, 1)];
% 合并约束
A_con = [A_du; A_u];
b_con = [b_du; b_u];
end
完整的增量MPC控制器应包含以下模块:
典型的主函数结构如下:
matlab复制function [u, opt_info] = incrMPC_controller(y, ref, model, mpc_param, prev_data)
% 状态更新
if isfield(prev_data, 'x_est')
x_est = update_state_estimator(y, prev_data.x_est, model);
else
x_est = model.C' * y; % 简单估计
end
% 构建QP问题
[H, f, A_con, b_con] = build_qp_problem(x_est, ref, model, mpc_param, prev_data);
% 求解QP
options = optimoptions('quadprog', 'Display', 'none', 'Algorithm', 'active-set');
[deltaU, ~, exitflag] = quadprog(H, f, A_con, b_con, [], [], [], [], [], options);
% 处理求解结果
if exitflag < 1
warning('QP求解失败,使用备用策略');
deltaU = zeros(mpc_param.Nc * model.nu, 1);
end
% 计算控制量
u = prev_data.u_prev + deltaU(1:model.nu);
% 更新持久化数据
opt_info.x_est = x_est;
opt_info.u_prev = u;
opt_info.deltaU = deltaU;
end
实测对比数据(i7-1185G7 @3.0GHz):
| 方法 | 平均求解时间(ms) | 最大迭代次数 |
|---|---|---|
| 标准QP | 2.45 | 18 |
| 热启动QP | 1.12 | 9 |
| 稀疏热启动QP | 0.76 | 7 |
推荐采用如下图所示的Simulink架构:
code复制[Reference] --> [MPC Controller] --> [Plant]
↑ ↓
[State Estimator] ← [Output]
具体实现时需注意:
对于高性能需求,可编写C Mex S-function。关键优化点包括:
示例S-function框架:
c复制static void mdlOutputs(SimStruct *S, int_T tid)
{
// 获取输入指针
real_T *y = ssGetInputPortRealSignal(S,0);
real_T *ref = ssGetInputPortRealSignal(S,1);
// 获取持久化数据
PersistData *pd = (PersistData*)ssGetPWorkValue(S,0);
// 状态更新
update_state_estimator(pd->x_est, y, pd->model);
// 构建QP
build_qp_problem(pd->qp, pd->x_est, ref);
// 求解QP
solve_qp(pd->qp);
// 输出控制量
real_T *u = ssGetOutputPortRealSignal(S,0);
u[0] = pd->u_prev + pd->qp->solution[0];
pd->u_prev = u[0];
}
在某塑料挤出机温度控制项目中,我们对比了传统MPC和增量MPC的表现:
控制对象:5区加热,模型参数:
code复制A = [0.92 0 0 0 0;
0.05 0.91 0 0 0;
0 0.03 0.93 0 0;
0 0 0.04 0.94 0;
0 0 0 0.02 0.95];
B = diag([0.18, 0.15, 0.16, 0.17, 0.14]);
调试发现:
XYZ三轴运动平台采用增量MPC后,轨迹跟踪误差降低明显:
| 指标 | 传统PID | 传统MPC | 增量MPC |
|---|---|---|---|
| 最大误差(μm) | 15.2 | 8.7 | 5.3 |
| 标准差(μm) | 4.1 | 2.3 | 1.2 |
| 计算时间(μs) | 12 | 45 | 38 |
关键改进:将机械系统的加速度约束直接转化为ΔU的约束,避免了复杂的约束线性化过程。
现象:quadprog返回非正退出标志
解决方案:
根源:模型失配或未建模扰动
解决方法:
优化手段:
在某燃料电池控制系统中,通过将Np从15降至10,同时采用热启动策略,单步计算时间从8.3ms降至3.1ms,满足了5ms控制周期的要求。
对于轻度非线性系统,可通过以下方法应用增量MPC:
结合机器学习方法:
在机器人抓取控制中,我们采用增量MPC与DDPG结合的方法,使抓取成功率从82%提升至95%。