基于模糊控制的统一混沌控制器Matlab编程代码及运行的仿真结果图

基于模糊控制的统一混沌控制器Matlab编程的全部代码 模糊控制器的程序设计 及其运行后的仿真结果图

以下是一个简单的基于模糊控制的统一混沌控制器的 Matlab 代码,供参考:

clear all;
close all;
clc;

% 设计混沌电路时常用的参数值
a=7.8e-5;
b=1.25e-4;
c=0.85e-5;
d=2.75e-5;
x0=0.3; y0=0.6; z0=0.9; % 初值

% 设计混沌系统的微分方程
f=@(t,x)[(-b*x(1)-y(1)-z(1));
         (a*x(2)+y(2));
         (-c*x(3)+d*z(3)+(x(1)-z(1))*y(3))];

[t,y]=ode45(f,[0,20000],[x0,y0,z0]); % 数值求解微分方程得出混沌数据

figure(1)
subplot(311);plot(t,y(:,1));title('混沌吸引子变量X(t)');
subplot(312);plot(t,y(:,2));title('混沌吸引子变量Y(t)');
subplot(313);plot(t,y(:,3));title('混沌吸引子变量Z(t)');

% 设计模糊控制器
mffun=@(x)[1./(1+exp(-15*(x-1/3))),(1./(1+exp(-15*(x-1/2)))),(1./(1+exp(-15*(x-2/3))))]; % 设计模糊隶属函数
mfpar=[0,1/2,1]; % 模糊控制器的参数
deltaT=0.01; % 采样周期
err=zeros(100000,1); % 控制误差
ctrlout=zeros(100000,1); % 控制器输出

for k=3:length(t)
    e=y(k-1,1)-y(k-2,1); % 计算控制误差
    
    if abs(e)<=mfpar(1)/2 % 判断是否处于模糊集1中心
        fuzout=[1,0,0];
    elseif abs(e)>mfpar(1)/2 && abs(e)<=mfpar(2) % 判断是否处于模糊集2中心
        fuzout=mffun((abs(e)-mfpar(1)/2)/(mfpar(2)-mfpar(1)/2));
    elseif abs(e)>mfpar(2) && abs(e)<=(mfpar(2)+mfpar(3))/2 % 判断是否处于模糊集3中心
        fuzout=mffun((abs(e)-(mfpar(2)+mfpar(1)))/((mfpar(2)+mfpar(3))/2-(mfpar(2)+mfpar(1))));
    else % 处于模糊集4中心
        fuzout=[0,0,1];
    end
    
    dctrl=fuzout*mfpar'*e; % 根据隶属度计算模糊控制器输出量
    
    ctrlout(k)=ctrlout(k-1)+dctrl*deltaT; % 叠加历史控制器输出量
    err(k)=e; % 保存历史控制误差
end

% 绘图
figure(2);
plot(t,err);
title('混沌系统的控制误差变化');
xlabel('时间 (s)');ylabel('控制误差');
grid on;

figure(3);
plot(t,ctrlout);
title('混沌系统的控制器输出量变化');
xlabel('时间 (s)');ylabel('控制器输出量');
grid on;

这段代码中,首先定义了一个三维的 Lorenz 混沌系统微分方程,并用 ode


.....................................................................
a=addrule(a,rulelist); 
a=setfis(a,'DefuzzMethod','mom'); 
writefis(a,'fuzzpid'); 
a=readfis('fuzzpid'); 
%显示规则
showrule(a) 
 
%%
%控制对象的设置
%采样时间
ts        = 0.002;
%产生连续形式的传递函数
Gp        = tf([16],[10,1.2,6]);
%产生离散形式的传递函数
Gpz       = c2d(Gp,ts,'z');
%将传递函数转换为差分式子
[num,den] = tfdata(Gpz,'v');
 
%%
%控制算法初始参数
L         = 100;
fai       = 0.1;
F         = 50;
%此变量分别保存误差,误差积分以及误差导数
Err       = [0,0,0]';
%延迟变量
y_1       = 0;
y_2       = 0;
u_1       = 0;
u_2       = 0;
e_1       = 0; 
ei        = 0;
ed        = 0;
%%
%迭代过程
Time      = 1001; 
u         = zeros(1,Time);      
Pk        = L*ones(1,Time);   
Ik        = fai*ones(1,Time);   
Dk        = F*ones(1,Time);   
M         = 8;
Ed        = 0.0; 
Ecd       = 0.0; 
 
for i=0:1:M
    for k=1:1:Time
        %产生时间变量
        time(k) = (k-1)*ts;
        %给定轨迹输入
        yd(k)   = 8*sin(6*2*pi*k*ts);
        
        %根据模糊规则,进行PID参数的更新
        k_pid   = evalfis([Ed,Ecd],a); 
        Pk(k)   = L  + k_pid(1); 
        Ik(k)   = fai+ k_pid(2); 
        Dk(k)   = F  + k_pid(3); 
 
        %控制对象模型的输出
.......................................................................
        %使用延迟程序起到存储器的功能
        u2(k)   = u(k);
        e_1     = e(k);
        y_2     = y_1;
        y_1     = y(k);
        u_2     = u_1;
        u_1     = u2(k);
        Ed      = e(k);
        Ecd     = e(k)-e_1;
    end    
    i=i+1;
end 
 
figure;
subplot(311);
plot(time,yd,'b','linewidth',2);
xlabel('time(s)');
ylabel('yd');
legend('给定位移曲线');
axis([0,2,-12,12]);
 
subplot(312);
plot(time,y,'b','linewidth',2);
xlabel('time(s)');
ylabel('y');
legend('跟踪位移曲线');
axis([0,2,-12,12]);
 
subplot(313);
plot(time,yd-y,'r','linewidth',2);
xlabel('time(s)');
ylabel('error'); 
legend('误差曲线');
axis([0,2,-1,1]);
 
figure;
subplot(311);
plot(time,Pk,'b','linewidth',1);
xlabel('time(s)');
ylabel('L');
legend('参数L的模糊PID方式下的自适应变化');
 
 
subplot(312);
plot(time,Ik,'b','linewidth',1);
xlabel('time(s)');
ylabel('fai');
legend('参数fai的模糊PID方式下的自适应变化');
 
 
subplot(313);
plot(time,Dk,'b','linewidth',1);
xlabel('time(s)');
ylabel('F'); 
legend('参数F的模糊PID方式下的自适应变化');
 
figure;
subplot(321);plotmf(a,'input',1);  title('E隶属函数变化');
subplot(322);plotmf(a,'input',2);  title('Ec隶属函数变化');
subplot(323);plotmf(a,'output',1); title('L隶属函数变化');
subplot(324);plotmf(a,'output',2); title('fai隶属函数变化');
subplot(325);plotmf(a,'output',3); title('F隶属函数变化');
figure;
plotfis(a); 
08_027_m

提供参考实例:https://blog.csdn.net/hlayumi1234567/article/details/128540062


以下是基于模糊控制的统一混沌控制器Matlab编程的全部代码,包括模糊控制器的程序设计部分:
 % 基于模糊控制的统一混沌控制器Matlab编程
 % 定义混沌系统
function dx = chaotic_system(t, x, u)
    % 系统参数
    a = 10;
    b = 8/3;
    c = 28;
    % 系统方程
    dx = [a * (x(2) - x(1)); x(1) * (c - x(3)) - x(2); x(1) * x(2) - b * x(3)] + u;
end
 % 定义模糊控制器
function u = fuzzy_controller(x, e, de, E, DE)
    % 模糊控制器参数
    P = [-1.5 -1 -0.5 0 0.5 1 1.5];
    Q = [-1.5 -1 -0.5 0 0.5 1 1.5];
    R = [-1 -0.5 0 0.5 1];
    S = [-1 -0.5 0 0.5 1];
    % 模糊控制器输入
    p = findmf(P, e, E);
    q = findmf(Q, de, DE);
    % 模糊控制器输出
    r = zeros(size(R));
    s = zeros(size(S));
    for i = 1:length(R)
        r(i) = gaussmf(R(i), [0.5 0]);
    end
    for i = 1:length(S)
        s(i) = gaussmf(S(i), [0.5 0]);
    end
    % 模糊推理
    rule = zeros(length(R), length(S));
    for i = 1:length(R)
        for j = 1:length(S)
            rule(i, j) = min(r(i), s(j));
        end
    end
    % 模糊输出
    u = zeros(size(x));
    for i = 1:length(x)
        u(i) = defuzz(R, S, rule, p, q, i);
    end
end
 % 定义模糊控制器辅助函数
function mf = gaussmf(x, params)
    mf = exp(-(x - params(1))^2 / (2 * params(2)^2));
end
 function index = findmf(MF, x, E)
    index = 1;
    for i = 1:length(MF)
        if x >= MF(i)
            index = i;
        end
    end
    if x <= MF(1) || x >= MF(end)
        index = 1;
    end
    if abs(x - E) < abs(MF(index) - E)
        index = index - 1;
    end
end
 function u = defuzz(R, S, rule, p, q, i)
    w = zeros(length(R) * length(S), 1);
    v = zeros(length(R) * length(S), 1);
    k = 1;
    for r = 1:length(R)
        for s = 1:length(S)
            w(k) = rule(r, s);
            v(k) = R(r) + S(s);
            k = k + 1;
        end
    end
    u = sum(w .* v) / sum(w);
    if isnan(u)
        u = 0;
    end
    if u < -1
        u = -1;
    end
    if u > 1
        u = 1;
    end
end
 % 主程序
% 初始化混沌系统和模糊控制器
x0 = [1; 0; 0];
tspan = [0 100];
u0 = [0; 0; 0];
[t, x] = ode45(@(t, x) chaotic_system(t, x, u0), tspan, x0);
e0 = 0;
de0 = 0;
E0 = 0;
DE0 = 0;
% 模拟控制过程
for i = 1:length(t)
    % 计算误差和误差变化率
    e = x(i, 1) - x(i, 2);
    de = e - e0;
    % 计算控制量
    u = fuzzy_controller(x(i, :)', e, de, E0, DE0);
    % 更新控制量和误差
    u0 = u;
    e0 = e;
    de0 = de;
    E0 = e;
    DE0 = de;
    % 更新混沌系统
    [t, x1] = ode45(@(t, x) chaotic_system(t, x, u), [t(i) t(i+1)], x(i, :));
    x(i+1, :) = x1(end, :);
end
 % 绘制混沌系统输出和控制量
figure;
plot(t, x(:, 1), 'b', t, x(:, 2), 'r');
xlabel('Time');
ylabel('Output');
legend('x_1', 'x_2');
figure;
plot(t, u(:, 1), 'b', t, u(:, 2), 'r', t, u(:, 3), 'g');
xlabel('Time');
ylabel('Control');
legend('u_1', 'u_2', 'u_3');

% 定义输入变量
x1 = linspace(-10, 10, 100);
x2 = linspace(-10, 10, 100);

% 定义输出变量
y = linspace(-10, 10, 100);

% 定义模糊控制器
fis = newfis('fis', 'mamdani', 'min', 'max', 'min', 'max', 'centroid');

% 定义输入变量及其隶属度函数
fis = addvar(fis, 'input', 'x1', [-10, 10]);
fis = addmf(fis, 'input', 1, 'NB', 'trimf', [-10, -10, -5]);
fis = addmf(fis, 'input', 1, 'NM', 'trimf', [-10, -5, 0]);
fis = addmf(fis, 'input', 1, 'NS', 'trimf', [-5, 0, 5]);
fis = addmf(fis, 'input', 1, 'ZO', 'trimf', [0, 5, 10]);
fis = addmf(fis, 'input', 1, 'PS', 'trimf', [5, 10, 15]);
fis = addmf(fis, 'input', 1, 'PM', 'trimf', [10, 15, 20]);
fis = addmf(fis, 'input', 1, 'PB', 'trimf', [15, 20, 20]);

fis = addvar(fis, 'input', 'x2', [-10, 10]);
fis = addmf(fis, 'input', 2, 'NB', 'trimf', [-10, -10, -5]);
fis = addmf(fis, 'input', 2, 'NM', 'trimf', [-10, -5, 0]);
fis = addmf(fis, 'input', 2, 'NS', 'trimf', [-5, 0, 5]);
fis = addmf(fis, 'input', 2, 'ZO', 'trimf', [0, 5, 10]);
fis = addmf(fis, 'input', 2, 'PS', 'trimf', [5, 10, 15]);
fis = addmf(fis, 'input', 2, 'PM', 'trimf', [10, 15, 20]);
fis = addmf(fis, 'input', 2, 'PB', 'trimf', [15, 20, 20]);

% 定义输出变量及其隶属度函数
fis = addvar(fis, 'output', 'y', [-10, 10]);
fis = addmf(fis, 'output', 1, 'NB', 'trimf', [-10, -10, -5]);
fis = addmf(fis, 'output', 1, 'NM', 'trimf', [-10, -5, 0]);
fis = addmf(fis, 'output', 1, 'NS', 'trimf', [-5, 0, 5]);
fis = addmf(fis, 'output', 1, 'ZO', 'trimf', [0, 5, 10]);
fis = addmf(fis, 'output', 1, 'PS', 'trimf', [5, 10, 15]);
fis = addmf(fis, 'output', 1, 'PM', 'trimf', [10, 15, 20]);
fis = addmf(fis, 'output', 1, 'PB', 'trimf', [15, 20, 20]);

基于模糊控制的统一混沌控制器Matlab编程代码


..............................................................................
fuzzyrules=[-1  -1   -1   -1  -1    -1  -0.8 -0.6 -0.4 -0.2  0;
        -1  -1   -1   -1  -1   -0.8 -0.6 -0.4 -0.2   0  0.2;
        -1  -1   -1   -1  -0.8 -0.6 -0.4 -0.2   0   0.2 0.4;
        -1  -1   -1  -0.8 -0.6 -0.4 -0.2   0   0.2  0.4 0.6;
        -1  -1  -0.8 -0.6 -0.4 -0.2   0   0.2  0.4  0.6 0.8;
        -1 -0.8 -0.6 -0.4 -0.2   0   0.2  0.4  0.6  0.8  1;
      -0.8 -0.6 -0.4 -0.2   0   0.2  0.4  0.6  0.8   1   1;
      -0.6 -0.4 -0.2   0   0.2  0.4  0.6  0.8   1    1   1;
      -0.4 -0.2   0   0.2  0.4  0.6  0.8   1    1    1   1;
      -0.2  0    0.2  0.4  0.6  0.8   1    1    1    1   1;
       0   0.2   0.4  0.6  0.8   1    1    1    1    1   1]*gu*gf;
 
% Next, we define some parameters for the fuzzy inverse model
 
gye=1/2;,gyc=1/2;
 
gp=0.2;
 
numye=11;     % Number of input membership functions for the ye
            % universe of discourse
numyc=11;     % Number of input membership functions for the yc
            % universe of discourse
 
wye=0.2*(1/gye);    % Sets the width of the membership functions for
                    % ye from center to extremes
wyc=0.2*(1/gyc);    % Sets the width of the membership functions for
                    % yc from center to extremes
invbase=0.4*gp; % Sets the base of the output membership functions
 
cye=[-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1]*(1/gye);
 
% For change in error input for learning mechanism
cyc=[-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1]*(1/gyc);
 
........................................................................
 
ym(index)=(1/(2+a_r*step))*((2-a_r*step)*ymold+...
                                    k_r*step*(r(index)+rold));
 
ymold=ym(index);
rold=r(index);
 
 
c_count=0;,e_count=0;   % These are used to count the number of
                        % non-zero mf certainitie of e and c
e=r(index)-y(index);
            % Calculates the error input for the fuzzy controller
c=(e-eold)/step;
    % Calculates the change in error input for the fuzzy controller
eold=e;
 
 
    if e<=ce(1)        % Takes care of saturation of the left-most
                    % membership function
         mfe=[1 0 0 0 0 0 0 0 0 0 0]; % i.e., the only one on is the
                                       %left-most one
     e_count=e_count+1;,e_int=1;       %  One mf on, it is the
                                       %left-most one.
    elseif e>=ce(nume)                  % Takes care ofsaturation
                                      %of the right-most mf
     mfe=[0 0 0 0 0 0 0 0 0 0 1];
     e_count=e_count+1;,e_int=nume; % One mf on, it is the
                                     %right-most one
    else      % In this case the input is on the middle part of the
 
       for i=1:nume
         if e<=ce(i)
          mfe(i)=max([0 1+(e-ce(i))/we]);
 
            if mfe(i)~=0
 
             e_count=e_count+1;
             e_int=i;    % This term holds the index last entry
                         % with a non-zero term
            end
         else
          mfe(i)=max([0,1+(ce(i)-e)/we]);
                                  % In thiscase the input is to the
                                  % right ofthe center ce(i)
            if mfe(i)~=0
             e_count=e_count+1;
             e_int=i;  % This term holds the index of the
                        % last entry with a non-zero term
            end
         end
        end
    end
 
 
meme_count=[e_count meme_count(1:9)];
meme_int=[e_int meme_int(1:9)];
 
 
...............................................................................
........................................................................
A179

下面是Matlab代码:

% 设置混沌系统初始值
x0 = [0.5, 0.5, 0.5];

% 定义混沌系统
[t, x] = ode45(@chaotic_system, [0, 10], x0);

% 画出混沌系统的吸引子
plot3(x(:, 1), x(:, 2), x(:, 3), 'LineWidth', 2);
title('混沌系统的吸引子');

% 设置控制器的初始权值
w0 = [0.5, 0.5, 0.5];

% 定义模糊控制器
[t, w] = ode45(@fuzzy_controller, [0, 10], w0);

% 绘制控制器输出
plot(t, w, 'LineWidth', 2);
title('模糊控制器输出');

% 定义混沌控制系统
function dx = chaos_controller_system(t, x, w)
  dx = zeros(3, 1);
  
  % 模糊控制器的参数
  a = 1;
  b = 1;
  c = 1;
  
  % 输入变量
  u = a * w(1) + b * w(2) + c * w(3);
  
  % 控制系统方程
  dx(1) = 10 * (x(2) - x(1)) - u;
  dx(2) = 28 * x(1) - x(2) - x(1) * x(3);
  dx(3) = x(1) * x(2) - 8/3 * x(3);
end

% 定义混沌系统方程
function dx = chaotic_system(t, x)
  dx = zeros(3, 1);
  dx(1) = 10 * (x(2) - x(1));
  dx(2) = 28 * x(1) - x(2) - x(1) * x(3);
  dx(3) = x(1) * x(2) - 8/3 * x(3);
end

% 定义模糊控制器方程
function dw = fuzzy_controller(t, w)
  dw = zeros(3, 1);
  
  % 定义模糊控制器规则
  rule1 = @(x) (1 - x(1)) * (1 - x(2)) * (1 - x(3));
  rule2 = @(x) (1 - x(1)) * x(2) * (1 - x(3));
  rule3 = @(x) (1 - x(1)) * x(2) * x(3);
  rule4 = @(x) x(1) * x(2) * x(3);
  
  % 模糊控制器的输入
  e = 0;
  for i = 1:3
    e = e + w(i)^2;
  end
  e = sqrt(e);

  % 模糊控制器的输出
  dw(1) = -e / 2;
  dw(2) = -e / 2;
  dw(3) = -e / 2;
  
  % 根据控制规则变化权值
  if w(1) > w(2) && w(2) > w(3)
    dw(1) = dw(1) + rule1(w);
    dw(2) = dw(2) + rule2(w);
    dw(3) = dw(3) + rule3(w);
  elseif w(1) > w(3) && w(3) > w(2)
    dw(1) = dw(1) + rule1(w);
    dw(2) = dw(2) + rule3(w);
    dw(3) = dw(3) + rule2(w);
  elseif w(2) > w(1) && w(1) > w(3)
    dw(1) = dw(1) + rule2(w);
    dw(2) = dw(2) + rule1(w);
    dw(3) = dw(3) + rule3(w);
  elseif w(2) > w(3) && w(3) > w(1)
    dw(1) = dw(1) + rule2(w);
    dw(2) = dw(2) + rule3(w);
    dw(3) = dw(3) + rule1(w);
  elseif w(3) > w(1) && w(1) > w(2)
    dw(1) = dw(1) + rule3(w);
    dw(2) = dw(2) + rule1(w);
    dw(3) = dw(3) + rule2(w);
  elseif w(3) > w(2) && w(2) > w(1)
    dw(1) = dw(1) + rule3(w);
    dw(2) = dw(2) + rule2(w);
    dw(3) = dw(3) + rule1(w);
  end
end

基于new bing的编写参考:

% 模糊控制器设计
fis = readfis('fuzzy_controller.fis');
% 读取模糊控制器文件,其中包括输入、输出变量及规则库

% 初始化混沌系统参数
x0 = [0.5, 0.5, 0.5]; % 初始状态向量
tspan = [0 500]; % 时间区间
% 其他混沌系统参数,如混沌参数等

% 模拟混沌系统并实现控制
[t,x] = ode45(@(t,x)chaos_system(t,x,param1,param2...),tspan,x0);
for i=1:length(t)
    % 对每个状态变量进行模糊化处理
    input1 = x(i,1); % 输入1模糊化处理
    input2 = x(i,2); % 输入2模糊化处理
    % ...

    % 基于模糊推理引擎的输出,计算出模糊输出变量的置信度,并使用加权平均或加权最大值操作来确定模糊输出变量的最终值
    output = evalfis([input1,input2,...], fis);

    % 将模糊输出变量转换成实际控制信号,并应用于混沌系统中
    control_signal = output; % 控制信号转换处理
    % ...

    % 更新混沌系统状态向量
    x(i+1,:) = chaos_system(t(i),x(i,:),param1,param2...,control_signal);
end

% 可视化混沌系统状态变化
plot3(x(:,1),x(:,2),x(:,3));


需要注意的是,这只是一个非常简单的示例,实际应用中可能需要更复杂的模糊控制器设计和调试。同时,基于模糊控制的统一混沌控制器在应用中也有其局限性和缺陷,需要综合考虑应用场景和实际需求。

1,可以参考一下这个:解决方案