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

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


1. 核心思想

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


2. 问题描述

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

其中:

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


3. 模糊系统设计

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

其中:

模糊系统万能逼近性质:对任意连续函数 ,存在最优参数 使得逼近误差有界。


4. 自适应控制器设计

4.1 误差动态

定义跟踪误差:

定义滤波误差:

则:

4.2 控制律与自适应律

取控制律:

其中 为模糊系统对 的估计。

代入

其中 为最小逼近误差(假设有界 )。

4.3 Lyapunov 分析与自适应律

选取 Lyapunov 函数:

求导:

为使 (忽略 时),取自适应律:

则:

,因此 一致最终有界,进而 有界。

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


5. MATLAB 仿真示例

5.1 被控对象

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


我们假装不知道 的表达式,用模糊系统逼近。

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 运行结果说明


6. 扩展讨论

6.1 如何处理未知

未知但符号已知(例如 ),可采用:

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

6.2 如何提高逼近精度?

6.3 鲁棒性增强


7. 总结

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

专注于matlab/simulink,电子电路,编程