基于模糊系统逼近的自适应控制 — 理论与 MATLAB 仿真

1. 核心思想

当被控对象的数学模型未知或高度非线性时,我们可以用 模糊系统 作为万能逼近器,在线估计未知的非线性函数,并据此设计自适应控制器,使系统输出跟踪期望轨迹。

  • 模糊系统:通过 IF-THEN 规则和隶属函数,能够以任意精度逼近紧集上的连续函数。
  • 自适应律:根据 Lyapunov 稳定性理论,在线调整模糊系统的参数(如结论参数),保证闭环信号有界且跟踪误差收敛。

2. 问题描述

考虑一类二阶 SISO 非线性系统:

\[\ddot{x} = f(x,\dot{x}) + g(x,\dot{x})\,u \]

其中:

  • \(x\) 为系统输出,\(u\) 为控制输入;
  • \(f(\cdot)\) 为未知光滑非线性函数;
  • \(g(\cdot)\) 为已知或符号已知的函数(本文假设 \(g=1\) 以便聚焦模糊逼近);
  • 状态 \(x_1 = x\), \(x_2 = \dot{x}\) 可测。

控制目标:设计控制律 \(u\),使系统输出 \(x(t)\) 跟踪给定的参考轨迹 \(x_d(t)\),且所有信号有界。


3. 模糊系统设计

采用 Takagi-Sugeno 零阶模糊系统(也称模糊基函数网络):

\[\hat{f}(z|\theta) = \theta^T \xi(z) \]

其中:

  • \(z = [x_1, x_2]^T\) 为输入向量;
  • \(\theta \in \mathbb{R}^M\) 为可调参数向量;
  • \(\xi(z) = [\xi_1(z), \dots, \xi_M(z)]^T\) 为模糊基函数向量,定义为:

\[\xi_i(z) = \frac{\prod_{j=1}^2 \mu_{A_j^i}(z_j)}{\sum_{k=1}^M \prod_{j=1}^2 \mu_{A_j^k}(z_j)} \]

  • \(\mu_{A_j^i}(z_j)\) 为高斯隶属函数(中心 \(c_{ji}\),宽度 \(\sigma_{ji}\)):

\[\mu_{A_j^i}(z_j) = \exp\left(-\frac{(z_j - c_{ji})^2}{2\sigma_{ji}^2}\right) \]

模糊系统万能逼近性质:对任意连续函数 \(f(z)\),存在最优参数 \(\theta^*\) 使得逼近误差有界。


4. 自适应控制器设计

4.1 误差动态

定义跟踪误差:

\[e = x_d - x, \quad \dot{e} = \dot{x}_d - \dot{x} \]

定义滤波误差:

\[s = \dot{e} + \lambda e, \quad \lambda > 0 \]

则:

\[\dot{s} = \ddot{x}_d - \ddot{x} + \lambda \dot{e} = \ddot{x}_d - f - u + \lambda \dot{e} \]

4.2 控制律与自适应律

取控制律:

\[u = \ddot{x}_d + \lambda \dot{e} + k s - \hat{f}(z|\theta), \quad k > 0 \]

其中 \(\hat{f}\) 为模糊系统对 \(f\) 的估计。

代入 \(\dot{s}\)

\[\dot{s} = -k s + (\hat{f} - f) = -k s + \tilde{\theta}^T \xi(z) - w \]

其中 \(\tilde{\theta} = \hat{\theta} - \theta^*\)\(w = f - \theta^{*T}\xi\) 为最小逼近误差(假设有界 \(|w| \leq \bar{w}\))。

4.3 Lyapunov 分析与自适应律

选取 Lyapunov 函数:

\[V = \frac{1}{2}s^2 + \frac{1}{2\gamma}\tilde{\theta}^T\tilde{\theta}, \quad \gamma > 0 \]

求导:

\[\dot{V} = s\dot{s} + \frac{1}{\gamma}\tilde{\theta}^T \dot{\hat{\theta}} = s(-k s + \tilde{\theta}^T\xi - w) + \frac{1}{\gamma}\tilde{\theta}^T \dot{\hat{\theta}} = -k s^2 - s w + \tilde{\theta}^T\left(s\xi + \frac{1}{\gamma}\dot{\hat{\theta}}\right)\]

为使 \(\dot{V} \leq 0\)(忽略 \(w\) 时),取自适应律:

\[\dot{\hat{\theta}} = -\gamma s \xi(z) \]

则:

\[\dot{V} = -k s^2 - s w \leq -k s^2 + |s|\bar{w} \]

\(|s| > \bar{w}/k\)\(\dot{V}<0\),因此 \(s\) 一致最终有界,进而 \(e,\dot{e}\) 有界。

:实际应用中常加入 σ‑修正或死区以避免参数漂移。


5. MATLAB 仿真示例

5.1 被控对象

考虑 Duffing 混沌系统(未知 \(f\)):

\[\ddot{x} = -0.1\dot{x} - x^3 + 12\cos(t) + u \]

\(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\)),可采用:

\[u = \frac{1}{\hat{g}(z|\theta_g)}\left( \ddot{x}_d + \lambda\dot{e} + k s - \hat{f}(z|\theta_f) \right) \]

并对 \(\theta_f\)\(\theta_g\) 分别设计自适应律(需注意避免除零,可加正则项)。

6.2 如何提高逼近精度?

  • 增加隶属函数数量(规则数);
  • 采用在线聚类或自适应网格划分;
  • 结合神经网络(如 RBF 网络)作为逼近器。

6.3 鲁棒性增强

  • 加入 \(\sigma\)-修正:\(\dot{\hat{\theta}} = -\gamma s\xi - \sigma\hat{\theta}\)
  • 使用死区技术:当 \(|s|\) 小于阈值时不更新参数。

7. 总结

本方案利用模糊系统的万能逼近特性,结合 Lyapunov 自适应律,实现了对未知非线性系统的跟踪控制。仿真表明,该方法能有效补偿未知动力学,具有良好的瞬态和稳态性能。代码可直接复制运行,适用于教学和初步研究。

posted @ 2026-06-18 09:35  lingxingqi  阅读(13)  评论(0)    收藏  举报