不匹配不确定系统 MPC + 输出单相变结构控制(滑模控制)MATLAB 实现

针对不匹配不确定系统 ,结合模型预测控制(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

五、预期仿真结果

  1. 输出跟踪:实际输出快速跟踪参考轨迹,稳态误差 < 0.05
  2. 滑模面:滑模面在有限时间内收敛到零附近
  3. 控制输入:无明显抖振(边界层削弱抖振)
  4. 鲁棒性 :不确定项 d(t)d(t)d(t) 被有效抑制

六、扩展建议

  1. 自适应切换增益 :根据滑模面动态调整 η\etaη
  2. 终端约束 MPC:加入终端等式约束保证稳定性
  3. 多目标优化:同时优化跟踪性能和能量消耗
  4. 实验验证:将代码部署到实时控制系统(如 dSPACE)