1. 状态空间MPC与输入增量的核心概念
在控制工程领域,模型预测控制(MPC)因其处理多变量约束问题的能力而广受青睐。不同于传统的PID控制,MPC通过在线求解优化问题来生成控制序列,特别适合具有状态和输入约束的复杂系统。而状态空间模型作为现代控制理论的基础框架,为MPC提供了清晰的系统动态描述方式。
输入增量(Δu)的引入是MPC实现中的一个重要技巧。通过将控制输入表示为上一时刻输入与当前增量的和(u_k = u_{k-1} + Δu_k),我们可以将优化问题的决策变量从绝对输入值转换为输入变化量。这种处理带来三个显著优势:
- 数学上更容易处理稳态误差问题,因为增量形式天然包含积分作用
- 优化问题的约束条件可以更直观地表达执行器的速率限制
- 在存在模型失配时表现出更好的鲁棒性
在Matlab中实现这类控制器时,通常需要构建增广状态空间模型。假设原始系统模型为:
code复制x_{k+1} = A x_k + B u_k
y_k = C x_k + D u_k
引入输入增量后,新的状态向量变为z_k = [x_k; u_{k-1}],对应的增广系统矩阵为:
code复制A_aug = [A B; 0 I], B_aug = [B; I], C_aug = [C D]
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Matlab实现中的关键步骤分解
2.1 增广状态空间建模
在Matlab中构建增广系统时,需要特别注意矩阵维度的匹配。以下是一个典型实现代码片段:
matlab复制% 原始系统矩阵
A = [1 0.1; 0 0.9];
B = [0.1; 0.2];
C = [1 0];
D = 0;
% 构建增广系统
[nx, nu] = size(B);
A_aug = [A B; zeros(nu,nx) eye(nu)];
B_aug = [B; eye(nu)];
C_aug = [C zeros(size(C,1),nu)];
sys_aug = ss(A_aug, B_aug, C_aug, D, 0.1); % 0.1秒采样时间
注意:当系统存在直接馈通项(D≠0)时,增广模型的输出方程需要特殊处理,否则会导致代数环问题。
2.2 预测方程构建
MPC的核心是通过预测模型计算未来状态轨迹。对于增广系统,预测方程的构建需要考虑预测时域(Np)和控制时域(Nc)的选择。实践中,Nc通常小于Np以实现"移动 horizon"效果。
预测方程的矩阵形式为:
code复制Y = S * z_k + T * ΔU
其中S和T矩阵可以通过以下方式计算:
matlab复制function [S, T] = build_prediction_matrices(A_aug, B_aug, C_aug, Np, Nc)
[ny, nz] = size(C_aug);
S = zeros(ny*Np, nz);
T = zeros(ny*Np, nu*Nc);
% 构建S矩阵
for i = 1:Np
S((i-1)*ny+1:i*ny,:) = C_aug * A_aug^i;
end
% 构建T矩阵
for i = 1:Np
for j = 1:min(i,Nc)
T((i-1)*ny+1:i*ny, (j-1)*nu+1:j*nu) = C_aug * A_aug^(i-j) * B_aug;
end
end
end
2.3 约束条件处理
输入增量形式下,常见的约束类型包括:
- 输入幅值约束:u_min ≤ u_k ≤ u_max
- 输入变化率约束:Δu_min ≤ Δu_k ≤ Δu_max
- 状态约束:x_min ≤ x_k ≤ x_max
这些约束需要转换为ΔU的线性不等式形式。例如,输入幅值约束可以表示为:
matlab复制% 转换输入约束
u_prev = last_u_value; % 上一时刻输入
M = tril(ones(Nc)); % 下三角矩阵
A_input = [M; -M];
b_input = [repmat(u_max-u_prev, Nc,1); repmat(u_prev-u_min, Nc,1)];
3. 不同状态空间公式的对比实现
3.1 标准形式与增量形式对比
标准MPC公式直接优化控制输入u,而增量形式优化输入变化Δu。这两种形式在Matlab实现中的主要区别体现在:
-
优化变量定义:
- 标准形式:U = [u_0; u_1; ...; u_{Nc-1}]
- 增量形式:ΔU = [Δu_0; Δu_1; ...; Δu_{Nc-1}]
-
成本函数表达:
- 标准形式:J = Σ(x'Qx + u'Ru)
- 增量形式:J = Σ(x'Qx + Δu'RΔu)
-
约束转换:
- 增量形式需要将绝对输入约束转换为Δu的累积形式
3.2 延迟补偿处理
实际系统中常存在计算延迟,需要在状态空间模型中考虑。对于增量形式MPC,延迟补偿可以通过以下方式实现:
matlab复制% 延迟补偿状态扩展
A_delay = [A_aug B_aug; zeros(nu,nz+nu)];
B_delay = [zeros(nz,nu); eye(nu)];
C_delay = [C_aug zeros(ny,nu)];
这种处理将上一时刻的计算延迟显式包含在状态中,使控制器能够主动补偿延迟影响。
4. Simulink集成与实时实现
4.1 MPC控制器模块化封装
为了在Simulink中重用MPC控制器,可以将其封装为自定义模块:
- 创建Matlab Function Block,包含核心优化算法
- 使用Initialize Function定义持久变量存储上一时刻状态
- 通过Mask界面暴露关键参数(Q,R,Np,Nc等)
matlab复制function u = mpc_incremental(y, r, u_prev)
persistent controller x_est
if isempty(controller)
% 初始化控制器参数
controller = init_mpc();
x_est = zeros(size(controller.A_aug,1),1);
end
% 状态估计
x_est = update_state_estimator(x_est, y, u_prev);
% 求解优化问题
delta_u = solve_mpc(x_est, r, controller);
% 计算实际输入
u = u_prev + delta_u(1:controller.nu);
end
4.2 代码生成注意事项
当需要生成C代码部署时,需特别注意:
- QP求解器选择:使用codegen兼容的求解器如quadprog
- 矩阵存储方式:强制使用列优先存储
- 内存分配:预分配所有工作变量内存
- 浮点精度:统一使用单精度或双精度
matlab复制% 启用代码生成配置
cfg = coder.config('lib');
cfg.DynamicMemoryAllocation = 'Off';
cfg.RowMajor = false;
% 定义输入参数类型
args = {coder.typeof(single(0),[10 1]),... % y
coder.typeof(single(0),[5 1]),... % r
coder.typeof(single(0),[2 1])}; % u_prev
% 生成代码
codegen -config cfg mpc_incremental -args args
5. 实际应用中的调参经验
5.1 权重矩阵选择策略
Q和R矩阵的选择直接影响控制性能。对于增量形式MPC:
-
状态权重Q:
- 对角线元素对应各状态的惩罚
- 通常将关键输出对应的状态权重设大
- 建议初始值:Q = C'*C
-
输入增量权重R:
- 过大会导致响应迟缓
- 过小会导致控制量抖动
- 经验公式:R = ρI,ρ=0.1~1.0max(Q)
5.2 时域参数调整
预测时域和控制时域的选择原则:
-
Np应覆盖系统主要动态:
- 对于快速系统:Np=10~20
- 对于慢速系统:Np=50~100
- 经验法则:Np ≥ 3*主导时间常数/采样时间
-
Nc通常取Np的1/5~1/3:
- 过大会增加计算负担
- 过小会限制控制自由度
5.3 抗积分饱和处理
增量形式虽然自带积分作用,但需防止积分饱和:
-
实现技术:
- 采用Clamping抗饱和
- 增加松弛变量处理约束冲突
- 实现参考值滤波
-
Matlab实现示例:
matlab复制function delta_u = anti_windup_mpc(x, r, u_prev, umax)
delta_u_nominal = solve_mpc(x, r);
% 检查输入约束
u_proposed = u_prev + delta_u_nominal(1);
if abs(u_proposed) > umax
% 激活抗饱和策略
delta_u = sign(u_proposed)*umax - u_prev;
% 调整状态估计中的积分项
x(end) = delta_u;
else
delta_u = delta_u_nominal;
end
end
6. 性能优化技巧
6.1 热启动策略
利用上一时刻的解作为初始猜测,可显著减少QP求解时间:
matlab复制function delta_u = solve_mpc_with_warmstart(x, r, prev_deltaU)
% 构建QP问题
[H, f, Acon, bcon] = build_qp_matrices(x, r);
% 设置初始点
options = optimoptions('quadprog', 'Algorithm', 'active-set',...
'InitBarrierParam', 0.01,...
'InitTrustRegionRadius', sqrt(length(prev_deltaU)));
% 求解
delta_u = quadprog(H, f, Acon, bcon, [], [], [], [], prev_deltaU, options);
end
6.2 稀疏矩阵利用
对于大规模系统,利用稀疏性可提升计算效率:
matlab复制% 稀疏化预测矩阵
S_sparse = sparse(S);
T_sparse = sparse(T);
% 稀疏QP构造
H = T_sparse'*Qbar*T_sparse + Rbar;
H = (H + H')/2; % 确保数值对称性
H_sparse = sparse(H);
6.3 显式MPC实现
对于快速系统,可考虑显式MPC:
- 使用MPT工具箱计算分段仿射控制律
- 将状态空间划分为不同区域
- 在线评估时只需查表
matlab复制% 使用MPT3工具箱
model = LTISystem('A', A_aug, 'B', B_aug);
model.x.min = [-10; -5];
model.x.max = [10; 5];
model.u.min = -1;
model.u.max = 1;
mpc = MPCController(model, Np);
explicit_mpc = mpc.toExplicit();
7. 典型问题排查指南
7.1 不稳定振荡问题
现象:闭环系统出现持续振荡
可能原因:
- 预测时域Np过短
- 控制时域Nc过长
- 输入增量权重R过小
排查步骤: - 检查开环系统极点
- 逐步增加Np观察响应变化
- 适当增大R值
7.2 计算延迟问题
现象:实际性能差于仿真
解决方法:
- 在模型中显式加入延迟环节
- 使用延迟补偿状态扩展
- 减小采样周期或简化模型
7.3 约束冲突问题
现象:QP求解频繁失败
处理策略:
- 检查约束可行性
- 引入松弛变量
- 优先级约束处理
matlab复制% 带松弛变量的QP构造
epsilon = 0.1; % 松弛权重
H = blkdiag(T'*Q*T + R, epsilon);
f = [T'*Q*(S*x0 - r); 0];
% 松弛约束
Acon = [A_input zeros(size(A_input,1),1)];
bcon = b_input + tolerance;
8. 进阶应用方向
8.1 非线性系统处理
对于非线性系统,可通过以下方式扩展:
- 序列线性化:在每个采样点线性化系统
- 多模型MPC:在不同工作点设计多个MPC
- 非线性MPC:直接处理非线性模型
matlab复制function [A_lin, B_lin] = linearize_system(x_op, u_op)
% 数值计算雅可比矩阵
epsilon = 1e-6;
nx = length(x_op);
nu = length(u_op);
A_lin = zeros(nx,nx);
for i = 1:nx
dx = zeros(nx,1);
dx(i) = epsilon;
A_lin(:,i) = (nonlinear_model(x_op + dx, u_op) - ...
nonlinear_model(x_op - dx, u_op))/(2*epsilon);
end
B_lin = zeros(nx,nu);
for i = 1:nu
du = zeros(nu,1);
du(i) = epsilon;
B_lin(:,i) = (nonlinear_model(x_op, u_op + du) - ...
nonlinear_model(x_op, u_op - du))/(2*epsilon);
end
end
8.2 鲁棒MPC实现
考虑模型不确定性的鲁棒MPC设计:
- 多胞形不确定性描述
- 最小-最大优化框架
- 约束紧缩技术
matlab复制% 多胞形顶点系统
systems = {
ss(A1, B1, C1, D1),...
ss(A2, B2, C2, D2),...
ss(A3, B3, C3, D3)
};
% 鲁棒预测矩阵构建
S_robust = cell(length(systems),1);
T_robust = cell(length(systems),1);
for i = 1:length(systems)
[S_robust{i}, T_robust{i}] = build_prediction_matrices(...
systems{i}.A, systems{i}.B, systems{i}.C, Np, Nc);
end
8.3 分布式MPC架构
对于大规模互联系统:
- 分解为多个子系统
- 设计协调机制
- 部分分布式优化
matlab复制function [u1, u2] = distributed_mpc(x1, x2, k)
% 子系统1优化
opt1 = optimproblem;
u1_var = optimvar('u1', nu1, Nc);
cost1 = compute_cost1(x1, u1_var);
opt1.Objective = cost1;
% 添加耦合约束
opt1.Constraints.interaction = u1_var(:,1) == k*u2_prev;
% 求解
[sol1,~,~] = solve(opt1);
u1 = sol1.u1(:,1);
% 类似处理子系统2...
end
在实际工程应用中,增量式状态空间MPC展现出比传统形式更好的控制性能和鲁棒性。特别是在执行器存在速率限制的场合,增量形式的约束处理更为直观有效。通过Matlab/Simulink平台的快速原型开发能力,可以高效验证不同MPC变体的性能差异,最终选择最适合具体应用场景的控制架构。
