在控制工程领域,模型预测控制(MPC)因其处理多变量约束优化问题的能力而广受青睐。传统MPC实现通常基于系统状态的绝对量进行预测和优化,而采用输入增量的状态空间MPC公式则提供了一种更灵活的控制框架。这种改进方案特别适合执行机构存在速率限制的场景,比如机械臂关节运动控制、无人机姿态调整等需要平滑控制信号的应用。
我在工业级运动控制系统的开发中发现,直接使用控制量绝对值进行优化的MPC控制器,在面对突发干扰时容易产生控制信号的剧烈跳变。而通过重构状态空间方程引入输入增量作为新状态变量,可以自然地将控制量变化率纳入优化目标,从而获得更平缓的控制轨迹。这个发现促使我系统性地研究了不同增量式MPC的数学表述形式及其实现细节。
考虑离散线性时不变系统:
code复制x(k+1) = A x(k) + B u(k)
y(k) = C x(k)
其中x∈R^n, u∈R^m, y∈R^p。为引入输入增量Δu(k)=u(k)-u(k-1),我们构建增广状态向量:
code复制ξ(k) = [x(k)^T, u(k-1)^T]^T
得到新的状态空间方程:
code复制ξ(k+1) = Ã ξ(k) + B̃ Δu(k)
y(k) = C̃ ξ(k)
其中:
code复制Ã = [A B; 0 I], B̃ = [B; I], C̃ = [C 0]
基于增广模型,预测时域p内的系统行为可表示为:
code复制Ξ = F ξ(k) + Φ ΔU
Y = Ψ ξ(k) + Θ ΔU
其中:
matlab复制% 定义原始系统矩阵
A = [1.2 0.1; -0.3 0.8];
B = [0.5; 1.2];
C = [1 0];
% 构建增广系统
n = size(A,1); m = size(B,2);
A_tilde = [A B; zeros(m,n) eye(m)];
B_tilde = [B; eye(m)];
C_tilde = [C zeros(size(C,1),m)];
% MPC参数
p = 10; % 预测时域
m_ctrl = 5; % 控制时域
Q = diag([10,5,1]); % 状态权重
R = 0.1*eye(m); % 输入增量权重
matlab复制% 计算预测矩阵F
F = zeros((p+1)*(n+m), n+m);
for i = 1:p+1
F((i-1)*(n+m)+1:i*(n+m), :) = A_tilde^(i-1);
end
% 计算预测矩阵Φ
Phi = zeros((p+1)*(n+m), m*m_ctrl);
for i = 1:p
for j = 1:min(i,m_ctrl)
Phi(i*(n+m)+1:(i+1)*(n+m), (j-1)*m+1:j*m) = A_tilde^(i-j)*B_tilde;
end
end
% 输出预测矩阵Ψ和Θ(类似方法构建)
matlab复制function [dU, U] = solveMPC(x_k, u_prev, Q, R, F, Phi, ref_traj)
% 构建增广状态
xi_k = [x_k; u_prev];
% 构造Hessian矩阵和梯度向量
H = Phi'*Q*Phi + R;
f = (F*xi_k - ref_traj)'*Q*Phi;
% 求解QP问题
options = optimoptions('quadprog','Display','none');
dU = quadprog(H, f', [], [], [], [], [], [], [], options);
% 计算实际控制量
U = u_prev + dU(1:length(u_prev));
end
如前述基础实现,特点包括:
结合绝对量和增量:
code复制J = Σ(||x(k+i)-x_ref||²_Q + ||u(k+i)-u_ref||²_S + ||Δu(k+i)||²_R)
实现要点:
将经济指标直接作为目标函数:
code复制J = Σ(α·能耗 + β·生产效率 + γ·Δu²)
实现差异:
matlab复制R = r*eye(m)/norm(B_tilde'*B_tilde);
其中r在0.1-10之间调整,过大导致响应迟缓,过小引起振荡
matlab复制Q = diag([1/(x1_max^2), 1/(x2_max^2), ...]);
增量式MPC容易因执行机构饱和导致积分效应,解决方法:
matlab复制% 在QP约束中添加
u_min <= u_prev + cumsum(dU) <= u_max
或采用反计算保护:
matlab复制if any(U > u_max)
U = min(U, u_max);
u_prev = U; % 重置历史值
end
可能原因:
诊断方法:
matlab复制% 检查开环预测响应
Y_ol = F*xi_k + Phi*dU;
plot(Y_ol(1:n:end)); % 查看预测趋势
解决方案:
matlab复制xi_aug = [xi_k; sum(y_ref - y_meas)];
matlab复制rank([eye(n)-A B; C 0]) == n+p % 是否能实现无静差跟踪
优化方向:
matlab复制H_cond = Phi'*Q*Phi + R; % 离线计算
f_cond = (F*xi_k - ref_traj)'*Q*Phi; % 在线计算
matlab复制Q(1:n,1:n) = 100; % 主被控量权重
Q(n+1:end,n+1:end) = 1; % 次要被控量
我在实际开发中发现,对于机械臂轨迹跟踪场景,采用m=4能在计算复杂度和控制性能间取得较好平衡。而过程控制中,将预测时域设置为达到稳态时间的60%左右(通常p=15-30)可获得理想效果。一个容易忽视的细节是,当系统存在明显延迟时,需要在状态增广时额外考虑延迟步数,这会使矩阵维度增大但能显著改善控制品质。