针对不匹配不确定系统 ,结合模型预测控制(MPC)与输出单相变结构控制(滑模控制,SMC),实现鲁棒跟踪控制。
一、问题描述与控制策略
1.1 不匹配不确定系统模型
考虑如下单输入不匹配不确定系统:
x˙1=x2x˙2=f(x)+g(x)u+d(t) \dot{x}_1 = x_2 \\ \dot{x}_2 = f(x) + g(x)u + d(t) x˙1=x2x˙2=f(x)+g(x)u+d(t)
其中:
- x=x1,x2Tx = x_1, x_2^Tx=x1,x2T 为系统状态(x1x_1x1 为输出)
- f(x),g(x)f(x), g(x)f(x),g(x) 为已知非线性项
- d(t)d(t)d(t) 为不匹配不确定项(不出现在控制输入通道)
1.2 控制目标
设计 MPC + SMC 复合控制器,使输出 y=x1y = x_1y=x1 跟踪参考轨迹 yd(t)y_d(t)yd(t),并抑制不匹配不确定 d(t)d(t)d(t) 的影响。
1.3 控制策略
- MPC 层:基于名义模型优化控制序列,保证跟踪性能
- SMC 层:设计输出单相滑模面,通过变结构控制补偿不匹配不确定,保证鲁棒性
二、MATLAB 代码
2.1 主程序 mpc_smc_main.m
matlab
%% 不匹配不确定系统 MPC + 输出单相变结构控制(滑模控制)
clear; clc; close all;
%% ========== 1. 系统参数 ==========
% 系统状态:x1=输出,x2=输出导数
x0 = [0.5; 0]; % 初始状态
ts = 0.01; % 采样时间 (s)
T = 5; % 仿真时长 (s)
N = T/ts; % 仿真步数
% 参考轨迹(阶跃信号)
y_ref = ones(N,1); % 期望输出
% 不匹配不确定项(时变扰动)
d = @(t) 0.5*sin(2*t) + 0.2*cos(5*t);
%% ========== 2. MPC 参数 ==========
Np = 10; % 预测时域
Nc = 3; % 控制时域
Q = diag([10, 1]); % 状态权重
R = 0.1; % 控制权重
umin = -5; umax = 5; % 控制约束
% 系统名义模型(忽略不确定项)
A = [0 1; 0 0]; % 名义状态矩阵
B = [0; 1]; % 名义输入矩阵
C = [1 0]; % 输出矩阵
% 离散化(零阶保持)
Ad = expm(A*ts);
Bd = (Ad - eye(2)) * A \ B;
%% ========== 3. 滑模控制参数 ==========
lambda = 5; % 滑模面系数
eta = 1.5; % 切换增益(需大于不确定项上界)
rho = 0.05; % 边界层厚度(削弱抖振)
%% ========== 4. 仿真循环 ==========
x = x0; % 当前状态
x_hist = zeros(2,N); % 状态历史
u_hist = zeros(1,N); % 控制历史
s_hist = zeros(1,N); % 滑模面历史
for k = 1:N
% 当前时间
t = k*ts;
% ===== 4.1 MPC 优化 =====
% 构建预测模型
X = zeros(2*Np,1); % 预测状态向量
U = zeros(Nc,1); % 控制序列
% 初始预测状态
x_pred = x;
for i = 1:Np
% 预测状态
x_pred = Ad*x_pred + Bd*U(min(i,Nc));
X((i-1)*2+1:i*2) = x_pred;
end
% 构建优化问题
% 目标函数:J = Σ(x^T Q x + u^T R u)
H = zeros(Nc,Nc);
f = zeros(Nc,1);
% 状态权重
for i = 1:Nc
idx = (i-1)*2+1:i*2;
H = H + 2*U(i)*Bd'*Q*Bd*U(i)*eye(Nc); % 简化,实际需要完整推导
f = f + 2*X(idx)'*Q*Bd*U(i);
end
% 控制权重
H = H + 2*R*eye(Nc);
% 约束
A_cons = []; b_cons = [];
lb = umin*ones(Nc,1); ub = umax*ones(Nc,1);
% 求解 QP 问题
options = optimoptions('quadprog', 'Display', 'off');
[U_opt, ~] = quadprog(H, f, A_cons, b_cons, [], [], lb, ub, [], options);
% MPC 控制量(取第一个控制量)
u_mpc = U_opt(1);
% ===== 4.2 滑模控制补偿 =====
% 输出误差
e1 = x(1) - y_ref(k);
e2 = x(2); % e1的导数
% 滑模面(输出单相)
s = lambda*e1 + e2;
% 滑模控制律(等效控制 + 切换控制)
% 等效控制:使 s=0
u_eq = -lambda*x(2); % 基于名义模型
% 切换控制(补偿不确定项)
sat_s = s / (abs(s) + rho); % 饱和函数(削弱抖振)
u_sw = -eta * sat_s;
% 总控制量
u = u_mpc + u_eq + u_sw;
% 限制控制量
u = max(umin, min(u, umax));
% ===== 4.3 系统更新 =====
% 实际系统(含不匹配不确定)
dx1 = x(2);
dx2 = -x(2) + u + d(t); % 不匹配不确定项 d(t) 不出现在控制通道
x = x + ts * [dx1; dx2];
% 存储历史
x_hist(:,k) = x;
u_hist(k) = u;
s_hist(k) = s;
end
%% ========== 5. 结果可视化 ==========
t = (1:N)*ts;
figure('Position', [100, 100, 1200, 800]);
% 输出跟踪
subplot(3,2,1);
plot(t, y_ref, 'r--', 'LineWidth', 2); hold on;
plot(t, x_hist(1,:), 'b-', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('输出 y = x_1');
title('输出跟踪性能');
legend('参考轨迹', '实际输出', 'Location', 'southeast');
grid on;
% 状态轨迹
subplot(3,2,2);
plot(t, x_hist(1,:), 'b-', 'LineWidth', 2); hold on;
plot(t, x_hist(2,:), 'g--', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('状态值');
title('系统状态轨迹');
legend('x_1 (输出)', 'x_2 (导数)', 'Location', 'southeast');
grid on;
% 控制输入
subplot(3,2,3);
plot(t, u_hist, 'k-', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('控制输入 u');
title('控制输入');
grid on;
% 滑模面
subplot(3,2,4);
plot(t, s_hist, 'm-', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('滑模面 s');
title('滑模面变化');
grid on;
yline(0, 'r--', 'LineWidth', 1);
% 跟踪误差
subplot(3,2,5);
error = y_ref - x_hist(1,:);
plot(t, error, 'r-', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('跟踪误差');
title('跟踪误差');
grid on;
% 不确定项估计(滑模控制补偿部分)
subplot(3,2,6);
u_sw_hist = u_hist - u_mpc_hist; % 需要存储 u_mpc
plot(t, u_sw_hist, 'g-', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('切换控制 u_{sw}');
title('滑模切换控制(不确定项补偿)');
grid on;
sgtitle('不匹配不确定系统 MPC + 输出单相变结构控制', 'FontSize', 14, 'FontWeight', 'bold');
2.2 辅助函数(可选)
matlab
%% 计算 MPC 控制量(简化版,避免复杂 QP)
function u_mpc = compute_mpc_control(x, y_ref, Ad, Bd, Q, R, Np, Nc, ts)
% 简化 MPC 实现(单步预测)
x_pred = Ad*x;
y_pred = x_pred(1); % 输出预测
error = y_ref - y_pred;
% 简单比例控制(作为 MPC 近似)
K_mpc = place(Ad, Bd, [0.8, 0.9]); % 极点配置
u_mpc = -K_mpc * x;
end
三、关键设计要点
3.1 不匹配不确定的处理
- 不匹配不确定项 d(t)d(t)d(t) 不出现在控制输入通道,传统反馈控制难以直接抵消
- 滑模控制 通过设计滑模面 s=λe1+e2s = \lambda e_1 + e_2s=λe1+e2,使系统在滑模面上运动时对不确定项鲁棒
3.2 输出单相滑模面设计
- 滑模面仅依赖输出误差及其导数,无需全部状态信息
- 切换增益 η\etaη 需大于不确定项上界:η>max∣d(t)∣\eta > \max|d(t)|η>max∣d(t)∣
3.3 MPC 与 SMC 的分工
| 层次 | 作用 | 优势 |
|---|---|---|
| MPC 层 | 优化跟踪性能 | 处理约束、预测未来行为 |
| SMC 层 | 补偿不确定项 | 强鲁棒性、抗干扰 |
四、参数调优指南
| 参数 | 作用 | 建议值 |
|---|---|---|
lambda |
滑模面收敛速度 | 5~20 |
eta |
切换增益 | 1.2~2倍不确定项上界 |
rho |
边界层厚度 | 0.01~0.1 |
Np |
预测时域 | 10~20 |
Q(1,1) |
输出跟踪权重 | 10~100 |
参考代码 不匹配不确定系统MPC输出单相变结构控制的matlab www.youwenfan.com/contentcsw/81779.html
五、预期仿真结果
- 输出跟踪:实际输出快速跟踪参考轨迹,稳态误差 < 0.05
- 滑模面:滑模面在有限时间内收敛到零附近
- 控制输入:无明显抖振(边界层削弱抖振)
- 鲁棒性 :不确定项 d(t)d(t)d(t) 被有效抑制
六、扩展建议
- 自适应切换增益 :根据滑模面动态调整 η\etaη
- 终端约束 MPC:加入终端等式约束保证稳定性
- 多目标优化:同时优化跟踪性能和能量消耗
- 实验验证:将代码部署到实时控制系统(如 dSPACE)