1. 状态空间MPC与输入增量的核心概念
在控制工程领域,模型预测控制(MPC)因其处理多变量约束系统的能力而备受青睐。传统MPC直接操作控制输入,而基于输入增量的方法通过处理控制输入的变化率来设计控制器,这种方法在工业过程控制中尤为常见。
状态空间模型为MPC提供了自然的数学框架。一个离散时间线性时不变系统的状态空间表示通常写作:
code复制x(k+1) = Ax(k) + Bu(k)
y(k) = Cx(k) + Du(k)
其中x是状态向量,u是控制输入,y是系统输出。当采用输入增量方法时,我们需要将系统方程重新表述为包含控制输入变化量Δu(k)=u(k)-u(k-1)的形式。
提示:输入增量公式特别适合处理执行器有速率限制的场景,如机械臂控制、化工过程等需要平滑控制信号的应用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 增量型MPC的数学推导
2.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 D]
这种表示将系统动力学转化为以Δu为输入的形式,为后续优化问题奠定基础。
2.2 预测方程构建
基于增广模型,我们可以推导未来N步的状态预测:
code复制Ξ = Fξ(k) + ΦΔU
其中Ξ是预测状态序列,ΔU是待优化的输入增量序列,F和Φ是由Ã和B̃构成的预测矩阵。
2.3 目标函数设计
典型的目标函数包含输出跟踪误差和输入增量惩罚:
code复制J = Σ(||y(k+i)-r(k+i)||_Q^2) + Σ(||Δu(k+i)||_R^2)
其中Q和R是权重矩阵,r是参考轨迹。这个凸二次规划问题的解给出了最优输入增量序列。
3. MATLAB实现细节
3.1 基础框架搭建
首先建立增广状态空间模型:
matlab复制A = [...]; % 原系统矩阵
B = [...];
C = [...];
D = [...];
% 构建增广系统
A_tilde = [A, B; zeros(size(B,2), size(A,2)), eye(size(B,2))];
B_tilde = [B; eye(size(B,2))];
C_tilde = [C, D];
3.2 预测矩阵生成
编写函数生成预测矩阵F和Φ:
matlab复制function [F, Phi] = build_prediction_matrices(A_tilde, B_tilde, Np)
[n, m] = size(B_tilde);
F = zeros(n*Np, size(A_tilde,1));
Phi = zeros(n*Np, m*Np);
% 填充F矩阵
for i = 1:Np
F((i-1)*n+1:i*n, :) = A_tilde^i;
end
% 填充Phi矩阵
for i = 1:Np
for j = 1:i
Phi((i-1)*n+1:i*n, (j-1)*m+1:j*m) = A_tilde^(i-j)*B_tilde;
end
end
end
3.3 优化问题求解
使用quadprog求解二次规划问题:
matlab复制function [dU, U] = solve_mpc(Q, R, F, Phi, xi, ref_traj, u_prev, du_max)
H = Phi'*Q*Phi + R;
f = (F*xi - ref_traj)'*Q*Phi;
% 输入增量约束
A_con = [eye(size(Phi,2)); -eye(size(Phi,2))];
b_con = [repmat(du_max, size(Phi,2)/size(u_prev,1), 1);
repmat(du_max, size(Phi,2)/size(u_prev,1), 1)];
options = optimoptions('quadprog', 'Display', 'none');
dU = quadprog(H, f', A_con, b_con, [], [], [], [], [], options);
U = u_prev + dU(1:size(u_prev,1));
end
4. Simulink集成与实时控制
4.1 MATLAB Function模块封装
将MPC算法封装为MATLAB Function模块:
- 在Simulink库中添加MATLAB Function模块
- 定义输入端口:当前状态x(k)、上一控制输入u(k-1)、参考轨迹ref
- 定义输出端口:最优控制量u(k)
- 将前述代码整合到函数内部
4.2 速率限制处理
在Simulink模型中添加Rate Limiter模块,确保控制输入变化率不超过物理执行器的能力:
code复制Max rate of change: 根据执行器规格设置
Sample time: 与控制器周期一致
4.3 闭环测试配置
构建完整的闭环测试环境:
- 被控对象模型(State-Space或Transfer Function模块)
- MPC控制器(封装的MATLAB Function)
- 参考信号生成(Signal Builder或From Workspace)
- 示波器模块用于监控关键信号
5. 实际应用中的调参经验
5.1 权重矩阵选择
Q和R的选择直接影响控制性能:
- 增大Q对角线元素:加强输出跟踪,但可能导致控制动作剧烈
- 增大R对角线元素:平滑控制输入,但可能降低响应速度
- 初始建议:从Q=eye(p), R=0.1*eye(m)开始,p是输出维数,m是输入维数
5.2 预测时域选择
预测步长Np的权衡:
- 过小:预见性不足,可能导致不稳定
- 过大:计算负担增加,可能引入不必要的远未来信息干扰
- 经验法则:Np应覆盖系统主要动态,通常选为系统阶跃响应达到稳态的20-90%时间
5.3 数值稳定性处理
改善计算精度的技巧:
- 对状态变量进行缩放,使各状态量级相近
- 在quadprog中添加小的正则化项:H = H + 1e-6*eye(size(H))
- 使用更稳定的求解器如OSQP替代quadprog
6. 扩展应用:四轮车辆动力学控制
将增量MPC应用于车辆控制时,需特别注意:
- 模型线性化:在工作点附近线性化非线性动力学模型
- 时变参考:处理轨迹跟踪时的时变参考信号
- 约束处理:显式考虑转向角速率限制和加速度限制
核心调整包括:
matlab复制% 时变参考处理
for i = 1:Np
ref_traj((i-1)*ny+1:i*ny) = reference(k+i);
end
% 状态约束添加
A_con = [A_con; Phi; -Phi];
b_con = [b_con; x_max - F*xi; -x_min + F*xi];
我在实际车辆控制项目中发现,将纵向和横向动力学解耦处理,然后分别设计MPC控制器,往往比单一集中式控制器更容易调试和实现。
