在控制工程领域,模型预测控制(MPC)因其处理多变量约束问题的能力而广受青睐。传统MPC实现通常采用标准状态空间模型,但在实际工业应用中,我们常常需要处理带有输入增量的控制场景。这种需求在电机控制、过程工业等需要平滑控制信号的应用中尤为突出。
最近我在一个伺服电机控制项目中遇到了这样的需求:客户要求控制信号的变化率必须限制在±5V/s以内,同时还要保证系统的快速响应。这促使我深入研究基于输入增量的状态空间MPC实现方法。通过Matlab仿真验证,发现这种改进方案不仅能更好地处理控制增量约束,还能显著降低控制信号的抖动现象。
标准状态空间MPC基于如下模型:
code复制x(k+1) = Ax(k) + Bu(k)
y(k) = Cx(k)
其中u(k)是绝对控制量。在预测时域内,我们需要求解一组最优控制序列u(k|k), u(k+1|k), ..., u(k+Np-1|k)。
将控制量表示为增量形式:
code复制Δu(k) = u(k) - u(k-1)
状态空间模型需要相应扩展为:
code复制[x(k+1); u(k)] = [A B; 0 I] [x(k); u(k-1)] + [B; I] Δu(k)
y(k) = [C 0] [x(k); u(k-1)]
这种增广系统将控制增量显式包含在状态变量中,使得我们可以直接对Δu进行约束。
代价函数需要相应调整为:
code复制J = Σ [x'(k+i)Qx(k+i) + Δu'(k+i-1)RΔu(k+i-1)]
其中Q和R分别是状态和输入增量的权重矩阵。这种形式更符合许多实际应用中对控制信号平滑性的要求。
matlab复制% 示例:二阶系统
A = [0.9 0.2; -0.1 0.8];
B = [0.5; 0.3];
C = [1 0];
Ts = 0.1; % 采样时间
% 扩展为增量形式
A_aug = [A B; zeros(1,2) 1];
B_aug = [B; 1];
C_aug = [C 0];
matlab复制Np = 10; % 预测时域
Nc = 3; % 控制时域
% 构建预测矩阵
[Phi, Gamma] = predict_mats(A_aug, B_aug, Np, Nc);
function [Phi, Gamma] = predict_mats(A, B, Np, Nc)
n = size(A,1);
m = size(B,2);
Phi = zeros(n*Np, n);
Gamma = zeros(n*Np, m*Nc);
% 构造Phi矩阵
for i = 1:Np
Phi((i-1)*n+1:i*n,:) = A^i;
end
% 构造Gamma矩阵
for i = 1:Np
for j = 1:Nc
if j <= i
Gamma((i-1)*n+1:i*n,(j-1)*m+1:j*m) = A^(i-j)*B;
end
end
end
end
matlab复制% 输入增量约束
delta_u_min = -0.5;
delta_u_max = 0.5;
% 构造约束矩阵
A_con = [eye(Nc); -eye(Nc)];
b_con = [delta_u_max*ones(Nc,1); -delta_u_min*ones(Nc,1)];
% 添加输入幅值约束(可选)
u_min = -2;
u_max = 2;
[Au, bu] = build_input_constraints(A_aug, B_aug, u_min, u_max, Nc);
通过对比标准MPC和增量式MPC的阶跃响应,可以观察到:
增量式MPC在以下方面表现更优:
在实际调参中发现:
为提高实时性能:
增量式MPC天然具有抗积分饱和特性,但还需注意:
将经济指标直接作为代价函数:
code复制J = Σ [L(x(k+i), Δu(k+i-1))]
其中L(·)是经济成本函数。增量形式更适合处理与变化率相关的成本项。
对于非线性系统,可通过以下方式扩展:
在多子系统场景下,增量式MPC可以:
在一个造纸机控制项目中,我们遇到了以下问题及解决方案:
问题:当系统长时间处于约束状态时,控制器性能下降
解决:添加约束激活检测逻辑,动态调整预测时域
问题:采样时间不固定导致控制量跳动
解决:在状态更新中显式考虑Δt的影响
问题:执行机构存在死区
解决:在代价函数中添加Δu的死区补偿项
这些经验表明,增量式MPC虽然理论优美,但在工程实现中仍需考虑各种非理想因素。