实现带自适应不确定性上界估计的滑模控制,严格遵循 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 稳定性证明要点
-
Lyapunov 函数 :V=12s2+12γd~2V = \frac{1}{2}s^2 + \frac{1}{2\gamma}\tilde{d}^2V=21s2+2γ1d~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∣
-
化简 :
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∣
-
有界性 :因 ∣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);
八、工程实现注意事项
-
采样时间:必须足够小(Ts ≤ 0.001s)以抑制抖振
-
执行器饱和:限制 u 的物理范围
matlabu(k) = max(min(u(k), 10), -10); % ±10V 电压限制 -
初始值:d_hat 初始值可设为 0,自适应律会自动收敛