基于理论的自适应滑模变结构控制(ASMC)例程

实现带自适应不确定性上界估计的滑模控制,严格遵循 Lyapunov 稳定性理论,适用于参数摄动+外部扰动的二阶非线性系统。


一、被控对象与问题定义

1.1 被控对象

x¨=f(x,x˙)+g(x,x˙)u+d(t) \ddot{x} = f(x,\dot{x}) + g(x,\dot{x})u + d(t) x¨=f(x,x˙)+g(x,x˙)u+d(t)

其中:

  • fff:已知标称模型(非线性/线性均可)
  • ggg:控制增益(已知)
  • d(t)d(t)d(t):集总不确定性(参数摄动+外部扰动+未建模动态)

1.2 控制目标

设计自适应滑模控制器 uuu,使得系统状态 x→xdx \to x_dx→xd,且无需已知扰动上界


二、Lyapunov 稳定性设计

2.1 滑模面设计

s=e˙+λe,e=x−xd s = \dot{e} + \lambda e, \quad e = x - x_d s=e˙+λe,e=x−xd

其中 λ>0\lambda > 0λ>0 为收敛速率系数。

2.2 自适应律设计

假设不确定性上界 ∣Δ∣≤dˉ|\Delta| \le \bar{d}∣Δ∣≤dˉ,但 dˉ\bar{d}dˉ 未知。

定义自适应估计量 dˉ^\hat{\bar{d}}dˉ^,设计更新律:

dˉ^˙=γ∣s∣,γ>0 \dot{\hat{\bar{d}}} = \gamma |s|, \quad \gamma > 0 dˉ^˙=γ∣s∣,γ>0

2.3 Lyapunov 函数与稳定性证明

取 V=12s2+12γd~2V = \frac{1}{2}s^2 + \frac{1}{2\gamma}\tilde{d}^2V=21s2+2γ1d~2,其中 d~=dˉ−dˉ^\tilde{d} = \bar{d} - \hat{\bar{d}}d~=dˉ−dˉ^。

求导可得 V˙=−(η−d~)∣s∣≤0\dot{V} = -(\eta - \tilde{d})|s| \le 0V˙=−(η−d~)∣s∣≤0,保证系统稳定。


三、MATLAB 代码

3.1 主脚本 adaptive_smc_main.m

matlab 复制代码
%% 自适应滑模变结构控制(ASMC)例程
clear; clc; close all;

%% ===== 1. 仿真参数 =====
Ts = 0.001;          % 采样时间
Tsim = 5;           % 仿真时长
N = Tsim/Ts;        % 步数
t = (0:N-1)*Ts;

%% ===== 2. 参考轨迹 =====
xd = 0.5 * sin(2*t);     % 期望位置
dxd = 0.5 * 2 * cos(2*t); % 期望速度

%% ===== 3. 初始化 =====
x = zeros(1,N); x(1) = 0;     % 实际位置
dx = zeros(1,N); dx(1) = 0;   % 实际速度

% 控制器参数
lambda = 10;      % 滑模面系数
eta = 5;          % 切换增益基值
gamma = 0.5;      % 自适应增益

% 自适应参数
d_hat = zeros(1,N); d_hat(1) = 1;  % 不确定性上界估计

% 控制输入
u = zeros(1,N);

%% ===== 4. 主循环 =====
for k = 2:N
    %% --- 4.1 误差计算 ---
    e = x(k-1) - xd(k-1);
    de = dx(k-1) - dxd(k-1);
    s = de + lambda * e;  % 滑模面
    
    %% --- 4.2 标称模型(已知部分)---
    % 示例:f = -2*dx - 3*x, g = 2
    f_nominal = -2*dx(k-1) - 3*x(k-1);
    g_nominal = 2;
    
    %% --- 4.3 自适应律更新 ---
    d_hat(k) = d_hat(k-1) + gamma * Ts * abs(s);
    
    %% --- 4.4 控制律设计 ---
    % 等效控制(等效部分)
    u_eq = ( -f_nominal + dxd(k-1) - lambda*de ) / g_nominal;
    
    % 切换控制(自适应切换部分)
    u_sw = (eta + d_hat(k)) * sign(s);
    
    % 总控制
    u(k) = u_eq + u_sw;
    
    %% --- 4.5 系统更新(被控对象)---
    % 实际系统中,不确定性 d(t) = 2*sin(5t) + 0.5*x
    d_real = 2*sin(5*t(k)) + 0.5*x(k-1);
    
    % 二阶系统动力学
    ddx = f_nominal + g_nominal*u(k) + d_real;
    dx(k) = dx(k-1) + Ts * ddx;
    x(k) = x(k-1) + Ts * dx(k-1);
end

%% ===== 5. 结果可视化 =====
figure('Color','w','Position',[100 100 1200 800]);

% 轨迹跟踪
subplot(3,2,1);
plot(t, xd, 'r--', 'LineWidth',2); hold on;
plot(t, x, 'b-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('位置');
title('轨迹跟踪性能');
legend('期望轨迹', '实际轨迹', 'Location','northwest');
grid on;

% 跟踪误差
subplot(3,2,2);
plot(t, xd-x, 'k-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('跟踪误差');
title('跟踪误差');
grid on;

% 控制输入
subplot(3,2,3);
plot(t, u, 'g-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('控制输入');
title('控制输入');
grid on;

% 滑模面
subplot(3,2,4);
plot(t, [xd(1)-x(1), diff(xd-x)/Ts + lambda*(xd(1:N-1)-x(1:N-1))], 'm-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('滑模面 s');
title('滑模面演化');
grid on;

% 自适应估计
subplot(3,2,5);
plot(t, d_hat, 'b-', 'LineWidth',1.5); hold on;
% 真实不确定性上界(示意)
d_true_upper = 3 + 0.5*abs(x);
plot(t, d_true_upper, 'r--', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('不确定性上界');
title('自适应估计 vs 真实上界');
legend('估计值 \hat{d}', '真实上界', 'Location','northwest');
grid on;

% 相平面图
subplot(3,2,6);
plot(xd-x, dxd-dx, 'k.', 'MarkerSize',1);
xlabel('位置误差'); ylabel('速度误差');
title('误差相平面图');
grid on;

sgtitle('自适应滑模变结构控制(ASMC)仿真结果', 'FontSize',14, 'FontWeight','bold');

四、关键参数调优指南

参数 作用 建议值 现象
lambda 滑模面收敛速度 5~20 太小收敛慢,太大抖振强
eta 切换增益基值 1~10 太小抗扰弱,太大抖振强
gamma 自适应增益 0.1~2 太小估计慢,太大估计震荡

五、抖振抑制改进

5.1 饱和函数替代符号函数

matlab 复制代码
% 替换 u_sw = (eta + d_hat(k)) * sign(s);
phi = 0.05;  % 边界层厚度
sat_s = s / (abs(s) + phi);  % 饱和函数
u_sw = (eta + d_hat(k)) * sat_s;

5.2 指数趋近律

matlab 复制代码
% 替换 u_sw
u_sw = (eta + d_hat(k)) * sign(s) + 0.5*s;

参考代码 基于理论的自适应滑模变结构控制控制例程 www.youwenfan.com/contentcsw/82063.html

六、理论验证

6.1 稳定性证明要点

  1. Lyapunov 函数 :V=12s2+12γd~2V = \frac{1}{2}s^2 + \frac{1}{2\gamma}\tilde{d}^2V=21s2+2γ1d~2

  2. 求导

    V˙=ss˙−d~d^˙=s(−ηsign(s)−dˉ^sign(s)+d)−d~γ∣s∣ \dot{V} = s\dot{s} - \tilde{d}\dot{\hat{d}} = s(-\eta\text{sign}(s) - \hat{\bar{d}}\text{sign}(s) + d) - \tilde{d}\gamma|s| V˙=ss˙−d~d^˙=s(−ηsign(s)−dˉ^sign(s)+d)−d~γ∣s∣

  3. 化简

    V˙=−η∣s∣−d~∣s∣+sd−d~γ∣s∣=−η∣s∣+(d−dˉ)∣s∣ \dot{V} = -\eta|s| - \tilde{d}|s| + sd - \tilde{d}\gamma|s| = -\eta|s| + (d - \bar{d})|s| V˙=−η∣s∣−d~∣s∣+sd−d~γ∣s∣=−η∣s∣+(d−dˉ)∣s∣

  4. 有界性 :因 ∣d∣≤dˉ|d| \le \bar{d}∣d∣≤dˉ,故 V˙≤−η∣s∣≤0\dot{V} \le -\eta|s| \le 0V˙≤−η∣s∣≤0

6.2 收敛时间估计

tr≤∣s(0)∣η t_r \le \frac{|s(0)|}{\eta} tr≤η∣s(0)∣


七、扩展应用

7.1 多输入多输出(MIMO)系统

matlab 复制代码
% 滑模面向量 s = [s1; s2; ...; sm]
% 自适应律:d_hat_i = gamma_i * ||s_i||

7.2 与观测器结合

matlab 复制代码
% 设计扩张状态观测器(ESO)估计 dx
dx_hat = eso(x, u);
s = dx_hat - dxd + lambda*(x - xd);

7.3 鲁棒性测试

matlab 复制代码
% 加入脉冲扰动
d_real = d_real + 10*randn(size(t)) .* (t>2.5 & t<2.6);

八、工程实现注意事项

  1. 采样时间:必须足够小(Ts ≤ 0.001s)以抑制抖振

  2. 执行器饱和:限制 u 的物理范围

    matlab 复制代码
    u(k) = max(min(u(k), 10), -10);  % ±10V 电压限制
  3. 初始值:d_hat 初始值可设为 0,自适应律会自动收敛