【模糊神经网络】基于simulink的模糊神经网络控制器设计

这篇具有很好参考价值的文章主要介绍了【模糊神经网络】基于simulink的模糊神经网络控制器设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.软件版本

MATLAB2010b

2.模糊神经网络理论概述

        由于模糊控制是建立在专家经验的基础之上的,但这有很大的局限性,而人工神经网络可以充分逼近任意复杂的时变非线性系统,采用并行分布处理方法,可学习和自适应不确定系统。利用神经网络可以帮助模糊控制器进行学习,模糊逻辑可以帮助神经网络初始化及加快学习过程。通常神经网络的基本构架如下所示:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

      整个神经网络结构为五层,其中第一层为“输入层“,第二层为“模糊化层”,第三层为“模糊推理层”,第四层为“归一化层”,第五层为“解模糊输出层”。 

      第一层为输入层,其主要包括两个节点,所以第一层神经网络的输入输出可以用如下的式子表示:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

【模糊神经网络】基于simulink的模糊神经网络控制器设计

        第二层为输入变量的语言变量值,通常是模糊集中的n个变量,它的作用是计算各输入分量属于各语言变量值模糊集合的隶属度。用来确定输入在不同的模糊语言值对应的隶属度,以便进行模糊推理,如果隶属函数为高斯函数,那么其表达式为:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

其中变量的具体含义和第一层节点的变量含义相同。

第三层是比较关键的一层,即模糊推理层,这一层的每个节点代表一条模糊规则,其每个节点的输出值表示每条模糊规则的激励强度。该节点的表达式可用如下的式子表示:

 【模糊神经网络】基于simulink的模糊神经网络控制器设计

第四层为归一化层,其输出是采用了Madmdani模糊规则,该层的表达式为: 

【模糊神经网络】基于simulink的模糊神经网络控制器设计

第五层是模糊神经网络的解模糊层,即模糊神经网络的清晰化. 

3.算法的simulink建模

        为了对比加入FNN控制器后的性能变化,我们同时要对有FNN控制器的模型以及没有FNN控制器的模型进行仿真,仿真结果如下所示:

        非FNN控制器的结构:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

其仿真结果如下所示:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

FNN控制器的结构:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

    其仿真结果如下所示:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

前面的是训练阶段,后面的为实际的输出,为了能够体现最后的性能,我们将两个模型的最后输出进行对比,得到的对比结果所示:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

   从上面的仿真结果可知,PID的输出值范围降低了很多,性能得到了进一步提升。

调速TS模型,该模型最后的仿真结果如下所示:

【模糊神经网络】基于simulink的模糊神经网络控制器设计

    从上面的仿真结果可知,采用FNN控制器后,其PID的输出在一个非常小的范围之内进行晃动,整个系统的性能提高了80%。这说明采用模糊神经网络后的系统具有更高的性能和稳定性。

4.部分程序

Mamdani模糊控制器的S函数

function [out,Xt,str,ts] = Sfunc_fnn_Mamdani(t,Xt,u,flag,Learn_rate,coff,lamda,Number_signal_in,Number_Fuzzy_rules,x0,T_samples)

%输入定义

% t,Xt,u,flag        :S函数固定的几个输入脚

% Learn_rate         :学习度
% coff               :用于神经网络第一层的参数调整
% lamda              :神经网络的学习遗忘因子
% Number_signal_in   :输入的信号的个数 
% Number_Fuzzy_rules :模糊控制规则数
% T_samples          :模块采样率

%输入信号的个数 
Number_inport = Number_signal_in;
%整个系统的输入x,误差输入e,以及训练指令的数组的长度
ninps         = Number_inport+1+1;   
NumRules      = Number_Fuzzy_rules;
Num_out1      = 3*Number_signal_in*Number_Fuzzy_rules  + ((Number_signal_in+1)*NumRules)^2 + (Number_signal_in+1)*NumRules;
Num_out2      = 3*Number_signal_in*Number_Fuzzy_rules + (Number_signal_in+1)*NumRules;

%S函数第一步,参数的初始化
if flag == 0
out = [0,Num_out1+Num_out2,1+Num_out1+Num_out2,ninps,0,1,1];  
str = [];                                                         
ts  = T_samples;                                                         
Xt  = x0;



%S函数的第二步,状态的计算
elseif flag == 2
%外部模块的输出三个参数变量输入x,误差输入e,以及训练指令的数组的长度
x        = u(1:Number_inport);%输入x
e        = u(Number_inport+1:Number_inport+1);%误差输入e
learning = u(Number_inport+1+1);%训练指令的数组的长度

%1的时候为正常工作状态
if learning == 1 
Feedfor_phase2;  

%下面定义在正常的工作状态中,各个网络层的工作
%层1:
In1     = x*ones(1,Number_Fuzzy_rules);
Out1    = 1./(1 + (abs((In1-mean1)./sigma1)).^(2*b1));
%层2:
precond = Out1'; 
Out2    = prod(Out1)';
S_2     = sum(Out2);
%层3:
if S_2~=0
   Out3 = Out2'./S_2;
else
   Out3 = zeros(1,NumRules);
end 
%层4:
Aux1 = [x; 1]*Out3;
%训练数据
a = reshape(Aux1,(Number_signal_in+1)*NumRules,1);  
 
%参数学习
P           = (1./lamda).*(P - P*a*a'*P./(lamda+a'*P*a));
ThetaL4     = ThetaL4 + P*a.*e;
ThetaL4_mat = reshape(ThetaL4,Number_signal_in+1,NumRules);

%错误反馈
e3          = [x' 1]*ThetaL4_mat.*e;
denom       = S_2*S_2;

%下面自适应产生10个规则的模糊控制器
Theta32     = zeros(NumRules,NumRules);
if denom~=0
   for k1=1:NumRules
        for k2=1:NumRules
             if k1==k2 
                Theta32(k1,k2) = ((S_2-Out2(k2))./denom).*e3(k2);
             else
                Theta32(k1,k2) = -(Out2(k2)./denom).*e3(k2);
             end
        end
   end
end

e2 = sum(Theta32,2);

%层一
Q = zeros(Number_signal_in,Number_Fuzzy_rules,NumRules);  
for i=1:Number_signal_in
   for j=1:Number_Fuzzy_rules
     for k=1:NumRules  
      	if Out1(i,j)== precond(k,i) && Out1(i,j)~=0
      			Q(i,j,k) = (Out2(k)./Out1(i,j)).*e2(k);
            else
        		Q(i,j,k) = 0;
        end
     end 
   end 
 end

Theta21 = sum(Q,3);
 
%自适应参数调整 
if isempty(find(In1==mean1))
    
deltamean1   =  Theta21.*(2*b1./(In1-mean1)).*Out1.*(1-Out1);
deltab1      =  Theta21.*(-2).*log(abs((In1-mean1)./sigma1)).*Out1.*(1-Out1);
deltasigma1  =  Theta21.*(2*b1./sigma1).*Out1.*(1-Out1);                
dmean1       = Learn_rate*deltamean1 + coff*dmean1;
mean1        = mean1 + dmean1;
dsigma1      = Learn_rate*deltasigma1 + coff*dsigma1;
sigma1       = sigma1 + dsigma1;
db1          = Learn_rate*deltab1 + coff*db1;
b1           = b1 + db1;
               
for i=1:Number_Fuzzy_rules-1
    if ~isempty(find(mean1(:,i)>mean1(:,i+1)))
        for i=1:Number_signal_in
            [mean1(i,:) index1] = sort(mean1(i,:));
            sigma1(i,:)         = sigma1(i,index1);
            b1(i,:)             = b1(i,index1);
        end
    end
end

end

%完成参数学习过程
%并保存参数学习结果
Xt = [reshape(mean1,Number_signal_in*Number_Fuzzy_rules,1);reshape(sigma1,Number_signal_in*Number_Fuzzy_rules,1);reshape(b1,Number_signal_in*Number_Fuzzy_rules,1);reshape(P,((Number_signal_in+1)*NumRules)^2,1);ThetaL4;reshape(dmean1,Number_signal_in*Number_Fuzzy_rules,1);reshape(dsigma1,Number_signal_in*Number_Fuzzy_rules,1);reshape(db1,Number_signal_in*Number_Fuzzy_rules,1);dThetaL4;];
end

out=Xt;

%S函数的第三步,定义各个网络层的数据转换
elseif flag == 3
Feedfor_phase;
%定义整个模糊神经网络的各个层的数据状态
%第一层
x       = u(1:Number_inport);
In1     = x*ones(1,Number_Fuzzy_rules);%第一层的输入
Out1    = 1./(1 + (abs((In1-mean1)./sigma1)).^(2*b1));%第一层的输出,这里,这个神经网络的输入输出函数可以修改
%第一层
precond = Out1'; 
Out2    = prod(Out1)';
S_2     = sum(Out2);%计算和
%第三层
if S_2~=0
   Out3 = Out2'./S_2;
else
   Out3 = zeros(1,NumRules);%为了在模糊控制的时候方便系统的运算,需要对系统进行归一化处理
end
%第四层
Aux1    = [x; 1]*Out3;
a       = reshape(Aux1,(Number_signal_in+1)*NumRules,1);%控制输出
%第五层,最后结果输出
outact  = a'*ThetaL4;
%最后的出处结果
out     = [outact;Xt];             
else
out     = [];
end

TS模糊控制器的S函数

function [out,Xt,str,ts] = Sfunc_fnn_TS(t,Xt,u,flag,Learn_rate,coffa,lamda,r,vigilance,coffb,arate,Number_signal_in,Number_Fuzzy_rules,x0,Xmins,Data_range,T_samples)


%输入定义

% t,Xt,u,flag        :S函数固定的几个输入脚

% Learn_rate         :学习度
% coffb               :用于神经网络第一层的参数调整
% lamda              :神经网络的学习遗忘因子
% Number_signal_in   :输入的信号的个数 
% Number_Fuzzy_rules :模糊控制规则数
% T_samples          :模块采样率 
    
Data_in_numbers       = Number_signal_in;
Data_out_numbers      = 1;
%整个系统的输入x,误差输入e,以及训练指令的数组的长度
ninps                 = Data_in_numbers+Data_out_numbers+1;   
Number_Fuzzy_rules2   = Number_Fuzzy_rules;
Num_out1              = 2*Number_signal_in*Number_Fuzzy_rules + ((Number_signal_in+1)*Number_Fuzzy_rules2)^2 + (Number_signal_in+1)*Number_Fuzzy_rules2 + 1;
Num_out2              = 2*Number_signal_in*Number_Fuzzy_rules +  (Number_signal_in+1)*Number_Fuzzy_rules2;

%S函数第一步,参数的初始化
if flag == 0
out = [0,Num_out1+Num_out2,1+Num_out1+Num_out2,ninps,0,1,1];  
str = [];                                                        
ts  = T_samples;                                                 
Xt  = x0;


%S函数的第二步,状态的计算
elseif flag == 2
x1       = (u(1:Data_in_numbers) - Xmins)./Data_range;
x        = [ x1; ones(Data_in_numbers,1) -  x1]; 
e        = u(Data_in_numbers+1:Data_in_numbers+Data_out_numbers);
learning = u(Data_in_numbers+Data_out_numbers+1);

%1的时候为正常工作状态
if learning == 1 
   
NumRules   = Xt(1);
NumInTerms = NumRules;
Feedfor_phase;  
%最佳参数搜索
New_nodess = 0;
reass      = 0;
Rst_nodes  = [];                   
rdy_nodes  = [];

while reass == 0 && NumInTerms<Number_Fuzzy_rules 
      %搜索最佳点
      N          = size(w_a,2);
      node_tmp   = x * ones(1,N);                                                                   
      A_AND_w    = min(node_tmp,w_a);  
      Sa         = sum(abs(A_AND_w)); 
      Ta         = Sa ./ (coffb + sum(abs(w_a)));  

      %节点归零
      Ta(Rst_nodes) = zeros(1,length(Rst_nodes));
      Ta(rdy_nodes) = zeros(1,length(rdy_nodes));    
      [Tamax,J]     = max(Ta);  
      w_J           = w_a(:,J);              
      xa            = min(x,w_J);

      %最佳节点测试
      if sum(abs(xa))./Number_signal_in >= vigilance,
         reass    = 1;   
         w_a(:,J) = arate*xa + (1-arate)*w_a(:,J);

      elseif sum(abs(xa))/Number_signal_in < vigilance,
             reass = 0;     
             Rst_nodes = [Rst_nodes  J ];
      end  

      if  length(Rst_nodes)== N || length(rdy_nodes)== N
          w_a        = [w_a x];
          New_nodess = 1;    
          reass      = 0;   
      end

end;      
                          
%节点更新
u2          = w_a(1:Number_signal_in,:);
v2          = 1 - w_a(Number_signal_in+1:2*Number_signal_in,:);
NumInTerms  = size(u2,2);
NumRules    = NumInTerms;

if New_nodess == 1
    ThetaL5  = [ThetaL5; zeros(Number_signal_in+1,1)];
    dThetaL5 = [dThetaL5; zeros(Number_signal_in+1,1)];
    P        =  [  P                                                           zeros((Number_signal_in+1)*(NumRules-1),Number_signal_in+1);
                  zeros(Number_signal_in+1,(Number_signal_in+1)*(NumRules-1))  1e6*eye(Number_signal_in+1); ];
    du2      = [du2  zeros(Number_signal_in,1);];      
    dv2     = [dv2  zeros(Number_signal_in,1);];
end

 
%层2:
x1_tmp  = x1;
x1_tmp2 = x1_tmp*ones(1,NumInTerms);
Out2    = 1 - check(x1_tmp2-v2,r) - check(u2-x1_tmp2,r);
%层3: 
Out3    = prod(Out2);  
S_3     = sum(Out3);
%层4:
if S_3~=0
   Out4 = Out3/S_3;
else 
   Out4 = zeros(1,NumRules); 
end

Aux1    = [x1_tmp; 1]*Out4;
a       = reshape(Aux1,(Number_signal_in+1)*NumRules,1);

%层五
P           = (1./lamda).*(P - P*a*a'*P./(lamda+a'*P*a));
ThetaL5     = ThetaL5 + P*a.*e;
ThetaL5_tmp = reshape(ThetaL5,Number_signal_in+1,NumRules);

%错误反馈
%层4:
e4          = [x1_tmp' 1]*ThetaL5_tmp.*e;
denom       = S_3*S_3;
%层3:
Theta43 = zeros(NumRules,NumRules);
if denom~=0
    for k1=1:NumRules
        for k2=1:NumRules
            if k1==k2
                Theta43(k1,k2) = ((S_3-Out3(k2))./denom).*e4(k2);
            else
                Theta43(k1,k2) = -(Out3(k2)./denom).*e4(k2);
            end
        end
    end
end

e3 = sum(Theta43,2);

%层2
Q = zeros(Number_signal_in,NumInTerms,NumRules);  
for i=1:Number_signal_in
    for j=1:NumInTerms
        for k=1:NumRules  
            if j==k && Out2(i,j)~=0
      		     Q(i,j,k) = (Out3(k)./Out2(i,j)).*e3(k);
            else
        		 Q(i,j,k) = 0;
            end
         end 
   	 end 
 end

Thetass  = sum(Q,3);
Thetavv  = zeros(Number_signal_in,NumInTerms);
Thetauu  = zeros(Number_signal_in,NumInTerms);

for i=1:Number_signal_in
    for j=1:NumInTerms
       if ((Out2(i)-v2(i,j))*r>=0) && ((Out2(i)-v2(i,j))*r<=1)
          Thetavv(i,j) = r;
       end
       if ((u2(i,j)-Out2(i))*r>=0) && ((u2(i,j)-Out2(i))*r<=1)
          Thetauu(i,j) = -r;
       end
   end
end
  
%根据学习结果辨识参数计算
e3_tmp = (e3*ones(1,Number_signal_in))';
du2    = Learn_rate*Thetavv.*e3_tmp.*Thetass + coffa*du2;
dv2    = Learn_rate*Thetauu.*e3_tmp.*Thetass + coffa*dv2;
v2     = v2 + du2;
u2     = u2 + dv2;

 
if ~isempty(find(u2>v2))
   for i=1:Number_signal_in
     for j=1:NumInTerms
        if u2(i,j) > v2(i,j)
            temp = v2(i,j);
            v2(i,j) = u2(i,j);
            u2(i,j) = temp;
        end
     end
   end
end

if ~isempty(find(u2<0)) || ~isempty(find(v2>1))
   for i=1:Number_signal_in
      for j=1:NumInTerms
        if u2(i,j) < 0
           u2(i,j) = 0;
        end
        if v2(i,j) > 1
           v2(i,j) = 1;
        end
      end
   end
end

%WA由学习结果更新
w_a = [u2; 1-v2];

%上面的结果完成学习过程

Xt1 = [NumRules;reshape(w_a,2*Number_signal_in*NumInTerms,1);reshape(P,((Number_signal_in+1)*NumRules)^2,1); ThetaL5;reshape(du2,Number_signal_in*NumInTerms,1);reshape(dv2,Number_signal_in*NumInTerms,1);dThetaL5;];
ns1 = size(Xt1,1);
Xt  = [Xt1; zeros(Num_out1+Num_out2-ns1,1);];       
end 

out=Xt;




%S函数的第三步,定义各个网络层的数据转换
elseif flag == 3
NumRules   = Xt(1);
NumInTerms = NumRules;
Feedfor_phase;  
u2         = w_a(1:Number_signal_in,:);
v2         = 1 - w_a(Number_signal_in+1:2*Number_signal_in,:);

%层1输出
x1      = (u(1:Data_in_numbers) - Xmins)./Data_range; 
%层2输出
x1_tmp  = x1; 
x1_tmp2 = x1_tmp*ones(1,NumInTerms); 
Out2    = 1 - check(x1_tmp2-v2,r) - check(u2-x1_tmp2,r);
%层3输出
Out3    = prod(Out2); 
S_3     = sum(Out3);
%层4输出.
if S_3~=0
   Out4 = Out3/S_3;
else 
   Out4 = zeros(1,NumRules); 
end

%层5输出
Aux1   = [x1_tmp; 1]*Out4;
a      = reshape(Aux1,(Number_signal_in+1)*NumRules,1);
outact = a'*ThetaL5;
out    = [outact;Xt];              
else
out    = [];
end

function y = check(s,r);

rows = size(s,1);
columns = size(s,2);
y = zeros(rows,columns);
for i=1:rows
   for j=1:columns
        if s(i,j).*r>1
            y(i,j) = 1;
        elseif 0 <= s(i,j).*r && s(i,j).*r <= 1
            y(i,j) = s(i,j).*r;
        elseif s(i,j).*r<0
            y(i,j) = 0;
        end
    end
end

return 


A05-04文章来源地址https://www.toymoban.com/news/detail-404837.html

到了这里,关于【模糊神经网络】基于simulink的模糊神经网络控制器设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【一级倒立摆】基于simulink的一级倒立摆控制器系统仿真

    MATLAB2021a     D237

    2024年02月15日
    浏览(42)
  • 第三十四课.模糊神经网络

    在本篇内容中,我们将了解模糊神经网络(Fuzzy Neural Network),在此之前,先了解模糊理论。现实世界总是充满不确定性。因此,在建模系统的时候,我们需要考虑这种不确定性。我们之前其实已经在概率论中接触过这种不确定的建模形式。类似于概率论,Zadeh开发了一种不同

    2023年04月23日
    浏览(43)
  • 常规PID、模糊PID和神经网络PID

    常规PID、模糊PID和神经网络PID是三种常见的PID控制器变种,它们在控制算法和性能方面有所不同。 常规PID控制器是最常用的PID控制器,它根据系统的误差、误差变化率和误差积分值计算控制器输出,并使用比例、积分和微分系数来调整控制器的响应速度和稳定性。 模糊PID控

    2024年02月13日
    浏览(46)
  • 基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出虚拟现实动画

    目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1四旋翼无人机的动力学模型 4.2 PID控制器设计 4.3 姿态控制实现 4.4 VR虚拟现实动画展示 5.完整工程文件        基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出vr虚拟现实动画,输出PID控制器

    2024年04月09日
    浏览(62)
  • 模糊神经网络(FNN)的实现(Python,附源码及数据集)

    模糊神经网络(Fuzzy Neural Network,简称FNN)本质上是一种将模糊理论与人工前向神经网络相结合的多层前向神经网络,在处理信息时,该网络能够具有更大的处理范围以及更快的信息处理速度,因此该网络的自学习能力与映射也相对较高。与反向传播神经网络(BPNN)相似,其

    2023年04月08日
    浏览(35)
  • 非线性质量弹簧阻尼器的神经网络仿真研究(Matlab代码&Simulink仿真实现)

      目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、Simulink仿真实现 非线性质量弹簧阻尼器(Nonlinear Mass-Spring-Damper,NMSD)是一种常见的振动控制装置,广泛应用于工程结构的减震和振动控制中。为了进行NMSD的神经网络仿真研究,以下步骤进行: 1. 数据收集:收集

    2024年02月16日
    浏览(37)
  • 神经网络自适应PID控制及其应用

    总结来自重庆大学宋永瑞教授2022暑期校园行学术会议   目前人工智能的发展为很多领域里的研究提供了可延展性,提供了新的研究问题的思路,无人系统和人工智能正走向深度融合,无人系统里具有核心驱动作用的智能控制算法的研究成为了热点问题。 人工智能的理论深

    2024年01月21日
    浏览(47)
  • 【Simulink】仿真_PID控制器调谐/调参/整定

    如何使用PID调谐器自动调优PID控制器块? 模型下载: 转速闭环 PID调谐器提供了一种快速和广泛适用的 single-loop PID通过Simulink控制块的整定方法。通过这种方法,可以调优PID控制器参数,以实现具有所需响应时间(response time)的鲁棒(robust)设计。 PID调谐器的典型设计工作流程包括

    2024年02月05日
    浏览(54)
  • 模糊PID控制器的实现

    本文讨论有关模糊PID相关的问题。模糊PID是一种将PID控制和模糊算法结合起来的控制算法,其实质上是将模糊算法用在了PID的参数整定上,以此来满足需要动态调整PID参数的系统的要求。 (1)传统的控制方法有时无法满足控制精度的要求,而且抗干扰的能力较弱,模糊控制可以

    2023年04月16日
    浏览(45)
  • AI 与控制:神经网络模型用于模型预测控制(Model Predictive Control)

    最优控制理论处理的问题通常是找到一个满足容许控制的 u*,把它作用于系统(被控对象)ẋ(t)=f(x(t),u(t),t) 从而可以得到系统的状态轨迹 x(t),使得目标函数最优。对于轨迹跟踪问题,那目标函数就是使得这个轨迹在一定的时间范围[t0tf]内与我们期望的轨迹(目标)x*(t) 越近

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包