基于模糊系统逼近的自适应控制 — 理论与 MATLAB 仿真
1. 核心思想
当被控对象的数学模型未知或高度非线性时,我们可以用 模糊系统 作为万能逼近器,在线估计未知的非线性函数,并据此设计自适应控制器,使系统输出跟踪期望轨迹。
- 模糊系统:通过 IF-THEN 规则和隶属函数,能够以任意精度逼近紧集上的连续函数。
- 自适应律:根据 Lyapunov 稳定性理论,在线调整模糊系统的参数(如结论参数),保证闭环信号有界且跟踪误差收敛。
2. 问题描述
考虑一类二阶 SISO 非线性系统:
其中:
- \(x\) 为系统输出,\(u\) 为控制输入;
- \(f(\cdot)\) 为未知光滑非线性函数;
- \(g(\cdot)\) 为已知或符号已知的函数(本文假设 \(g=1\) 以便聚焦模糊逼近);
- 状态 \(x_1 = x\), \(x_2 = \dot{x}\) 可测。
控制目标:设计控制律 \(u\),使系统输出 \(x(t)\) 跟踪给定的参考轨迹 \(x_d(t)\),且所有信号有界。
3. 模糊系统设计
采用 Takagi-Sugeno 零阶模糊系统(也称模糊基函数网络):
其中:
- \(z = [x_1, x_2]^T\) 为输入向量;
- \(\theta \in \mathbb{R}^M\) 为可调参数向量;
- \(\xi(z) = [\xi_1(z), \dots, \xi_M(z)]^T\) 为模糊基函数向量,定义为:
- \(\mu_{A_j^i}(z_j)\) 为高斯隶属函数(中心 \(c_{ji}\),宽度 \(\sigma_{ji}\)):
模糊系统万能逼近性质:对任意连续函数 \(f(z)\),存在最优参数 \(\theta^*\) 使得逼近误差有界。
4. 自适应控制器设计
4.1 误差动态
定义跟踪误差:
定义滤波误差:
则:
4.2 控制律与自适应律
取控制律:
其中 \(\hat{f}\) 为模糊系统对 \(f\) 的估计。
代入 \(\dot{s}\):
其中 \(\tilde{\theta} = \hat{\theta} - \theta^*\),\(w = f - \theta^{*T}\xi\) 为最小逼近误差(假设有界 \(|w| \leq \bar{w}\))。
4.3 Lyapunov 分析与自适应律
选取 Lyapunov 函数:
求导:
为使 \(\dot{V} \leq 0\)(忽略 \(w\) 时),取自适应律:
则:
当 \(|s| > \bar{w}/k\) 时 \(\dot{V}<0\),因此 \(s\) 一致最终有界,进而 \(e,\dot{e}\) 有界。
注:实际应用中常加入 σ‑修正或死区以避免参数漂移。
5. MATLAB 仿真示例
5.1 被控对象
考虑 Duffing 混沌系统(未知 \(f\)):
即 \(f(x,\dot{x}) = -0.1\dot{x} - x^3 + 12\cos(t)\),\(g=1\)。
我们假装不知道 \(f\) 的表达式,用模糊系统逼近。
5.2 仿真代码
%% 基于模糊系统逼近的自适应控制仿真
clear; clc; close all;
%% 参数设置
dt = 0.001; % 仿真步长
T = 20; % 总时间
t = 0:dt:T;
N = length(t);
% 控制器参数
lambda = 5;
k = 10;
gamma = 50; % 自适应增益
% 模糊系统参数
% 输入范围:x1 ∈ [-3,3], x2 ∈ [-5,5]
% 每个维度划分 5 个隶属函数 → 共 25 条规则
numMF = 5;
x1_range = linspace(-3, 3, numMF);
x2_range = linspace(-5, 5, numMF);
sigma = 0.8; % 高斯宽度
% 生成所有规则的隶属函数中心和宽度
[c1, c2] = meshgrid(x1_range, x2_range);
centers = [c1(:), c2(:)]'; % 2×M
M = size(centers,2);
% 初始化参数 theta
theta = zeros(M,1);
% 参考轨迹
xd = @(t) sin(t);
dxd = @(t) cos(t);
ddxd = @(t) -sin(t);
% 状态初始化
x1 = 0; x2 = 0;
x1_history = zeros(1,N);
x2_history = zeros(1,N);
u_history = zeros(1,N);
theta_history = zeros(M,N);
s_history = zeros(1,N);
%% 仿真循环
for i = 1:N
% 当前时间
ti = t(i);
% 参考信号及其导数
xd_val = xd(ti);
dxd_val = dxd(ti);
ddxd_val = ddxd(ti);
% 误差
e = xd_val - x1;
de = dxd_val - x2;
s = de + lambda * e;
% 计算模糊基函数
z = [x1; x2];
xi = zeros(M,1);
for j = 1:M
mu1 = exp(-(z(1)-centers(1,j))^2/(2*sigma^2));
mu2 = exp(-(z(2)-centers(2,j))^2/(2*sigma^2));
xi(j) = mu1 * mu2;
end
xi = xi / sum(xi); % 归一化
% 模糊系统输出
f_hat = theta' * xi;
% 控制律
u = ddxd_val + lambda*de + k*s - f_hat;
% 自适应律(欧拉法)
theta = theta + dt * (-gamma * s * xi);
% 施加控制到系统(真实动力学)
% 真实 f = -0.1*x2 - x1^3 + 12*cos(ti)
f_real = -0.1*x2 - x1^3 + 12*cos(ti);
x2_dot = f_real + u;
x1_dot = x2;
% 更新状态(欧拉积分)
x1 = x1 + dt * x1_dot;
x2 = x2 + dt * x2_dot;
% 记录
x1_history(i) = x1;
x2_history(i) = x2;
u_history(i) = u;
theta_history(:,i) = theta;
s_history(i) = s;
end
%% 绘图
figure('Position', [100 100 900 800]);
subplot(3,1,1);
plot(t, xd(t), 'k--', 'LineWidth', 1.5); hold on;
plot(t, x1_history, 'r-', 'LineWidth', 1);
xlabel('Time (s)'); ylabel('x');
legend('Reference', 'Output');
title('跟踪性能');
grid on;
subplot(3,1,2);
plot(t, x1_history - xd(t)', 'b-', 'LineWidth', 1);
xlabel('Time (s)'); ylabel('Tracking error');
title('跟踪误差');
grid on;
subplot(3,1,3);
plot(t, u_history, 'g-', 'LineWidth', 1);
xlabel('Time (s)'); ylabel('Control input');
title('控制信号');
grid on;
figure;
% 显示部分参数收敛情况(取前5个规则)
plot(t, theta_history(1:5,:)');
xlabel('Time (s)'); ylabel('\theta');
title('模糊系统参数收敛(前5个规则)');
legend(arrayfun(@(i)sprintf('Rule %d',i),1:5,'UniformOutput',false));
grid on;
% 模糊逼近效果对比(在最后时刻)
z_test = [-2:0.1:2; -2:0.1:2]; % 测试点
f_true = -0.1*z_test(2,:) - z_test(1,:).^3 + 12*cos(T);
xi_test = zeros(M, length(z_test));
for j = 1:M
mu1 = exp(-(z_test(1,:)-centers(1,j)).^2/(2*sigma^2));
mu2 = exp(-(z_test(2,:)-centers(2,j)).^2/(2*sigma^2));
xi_test(j,:) = mu1 .* mu2;
end
xi_test = xi_test ./ sum(xi_test,1);
f_approx = theta' * xi_test;
figure;
plot(z_test(1,:), f_true, 'b-', 'LineWidth', 1.5); hold on;
plot(z_test(1,:), f_approx, 'r--', 'LineWidth', 1.5);
xlabel('x_1'); ylabel('f(x, \dot{x})');
legend('True f', 'Approximated f');
title('模糊系统逼近效果(固定 \dot{x}=-2 截面)');
grid on;
参考代码 基于模糊系统逼近的自适应控制 www.youwenfan.com/contentcnv/81427.html
5.3 运行结果说明
- 跟踪性能:输出很快跟上参考信号,稳态误差很小。
- 模糊逼近:随着自适应进行,模糊系统参数收敛,对未知 \(f\) 的逼近逐渐准确。
- 控制信号:初期因参数未收敛有较大波动,后期趋于平稳。
6. 扩展讨论
6.1 如何处理未知 \(g(x)\)?
若 \(g\) 未知但符号已知(例如 \(g>0\)),可采用:
并对 \(\theta_f\) 和 \(\theta_g\) 分别设计自适应律(需注意避免除零,可加正则项)。
6.2 如何提高逼近精度?
- 增加隶属函数数量(规则数);
- 采用在线聚类或自适应网格划分;
- 结合神经网络(如 RBF 网络)作为逼近器。
6.3 鲁棒性增强
- 加入 \(\sigma\)-修正:\(\dot{\hat{\theta}} = -\gamma s\xi - \sigma\hat{\theta}\);
- 使用死区技术:当 \(|s|\) 小于阈值时不更新参数。
7. 总结
本方案利用模糊系统的万能逼近特性,结合 Lyapunov 自适应律,实现了对未知非线性系统的跟踪控制。仿真表明,该方法能有效补偿未知动力学,具有良好的瞬态和稳态性能。代码可直接复制运行,适用于教学和初步研究。

浙公网安备 33010602011771号