m基于模糊控制与遗传优化的自适应ADRC双闭环控制策略matlab仿真

发布时间 2023-05-17 00:02:16作者: 我爱C编程

1.算法仿真效果

matlab2013b仿真结果如下:

 

 

 

 

 

        遗传优化的优化迭代过程仿真图:

 

 

 

这个是我们采用的优化算法的有过过程,通过优化,可以得到超调量最小的控制器仿真参数。

 

 

 

 

 

2.算法涉及理论知识概要

       模糊控制的基本概念是由美国加州大学查德教授首先提出来的,模糊控制是以模糊语言变量、模糊集合论和模糊逻辑推理为基础的一种新型控制理论。模糊控制算法是一种非线性智能控制,它很适合于工业生产过程和大系统控制过程,并且其可以和神经网络、预测控制、遗传算法和混沌理论等新学科相结合。模糊控制器的基本原理图如图1所示。

 

 

 

       1虚线方框中的几个模块为模糊控制算法的几个主要步骤,其主要是由计算控制程序来实现的,具体操作流程如下所示:通过控制输出的反馈信息和参考信息进行做差计算,得到差作为控制算法的误差输入信号,这个误差输入信号作为模糊控制器的输入。同时,通过模糊化处理,将这个数值形态的误差信号转换为模糊语言的集合,并根据预先定义的模糊规则进行模糊聚餐,并得到模糊控制量,最后通过逆模糊化处理,将模糊控制量转换为实际的数值信息作为控制输出,并作用到控制对象上。

 

       本系统所采用的模糊神经网络系统结构如图2所示,其中输入t表示本文所设计的控制器是针对炼焦炉烘炉过程高温段进行设计的。

 

 

 

 

 

 

这里,我们最后其实主要要实现的改进结构如下所示:

 

 

 

3.MATLAB核心程序

 

 

 

 

 

w1              = zeros(MAXGEN,1);
w2              = zeros(MAXGEN,1);
w3              = zeros(MAXGEN,1);
w4              = zeros(MAXGEN,1);
w5              = zeros(MAXGEN,1);
w6              = zeros(MAXGEN,1);
w7              = zeros(MAXGEN,1);
w8              = zeros(MAXGEN,1);
w9              = zeros(MAXGEN,1);
 
Error           = zeros(MAXGEN-2,1);
fitness         = zeros(MAXGEN-2,1);
gen             = 0;
 
 
for jj=1:1:NIND 
    %初始化参数,这个和parameter参数相同
    w1_NIND(jj)         = 0.8;      
    w2_NIND(jj)         = 0.01;
    w3_NIND(jj)         = 100;
    w4_NIND(jj)         = 65;  
    w5_NIND(jj)         = 80; 
    w6_NIND(jj)         = 100;      
    w7_NIND(jj)         = 10;
    w8_NIND(jj)         = 0.75;
    w9_NIND(jj)         = 0.05;  
 
    %计算对应的目标值
    parameter;
    sim('mains1.mdl');
    tmps    = object.signals.values;
    %计算最大超调值
    [V,I]   = max(tmps);
    tmps2   = mean(tmps(length(tmps)/2:length(tmps)));
    %计算超调量
    CTL     = (V-tmps2)/tmps2;
    %计算收敛速度
    SLX     = I/10000;
    
    J(jj,1) = (CTL);
end
Objv  = J;
gen   = 0; 
Error  = [];
Error2 = [];
LEN    = 32;
while gen < MAXGEN;   
      gen
      FitnV=ranking(Objv);    
      Selch=select('sus',Chrom,FitnV);    
      Selch=recombin('xovsp', Selch,0.95);   
      Selch=mut( Selch,0.05);   
      phen1=bs2rv(Selch,FieldD);   
      for jj=1:1:NIND  
          if  gen == 1
              %初始化参数,这个和parameter参数相同
              w1_NIND(jj)        = 2;      
              w2_NIND(jj)        = 0.01;
              w3_NIND(jj)        = 100;
              w4_NIND(jj)        = 65;  
              w5_NIND(jj)        = 80; 
              w6_NIND(jj)        = 100;      
              w7_NIND(jj)        = 10;
              w8_NIND(jj)        = 0.75;
              w9_NIND(jj)        = 0.05;   
          else   
              w1_NIND(jj)         = phen1(jj,1);       
              w2_NIND(jj)         = phen1(jj,2);  
              w3_NIND(jj)         = phen1(jj,3);  
              w4_NIND(jj)         = phen1(jj,4);   
              w5_NIND(jj)         = phen1(jj,5);  
              w6_NIND(jj)         = phen1(jj,6);      
              w7_NIND(jj)         = phen1(jj,7);  
              w8_NIND(jj)         = phen1(jj,8);  
              w9_NIND(jj)         = phen1(jj,9);    
          end
 
          %计算对应的目标值
          parameter;
          sim('mains1.mdl');
          tmps    = object.signals.values;
          %计算最大超调值
          [V,I]   = max(tmps);
          tmps2   = mean(tmps(length(tmps)/2:length(tmps)));
          %计算超调量
          CTL     = (V-tmps2)/tmps2;
          %计算收敛速度
          SLX     = I/10000;
          JJ(jj,1) = (CTL);
      end 
 
      Objvsel      = JJ;    
      [Chrom,Objv] = reins(Chrom,Selch,1,1,Objv,Objvsel);   
      gen          = gen+1; 
 
      %保存参数收敛过程和误差收敛过程以及函数值拟合结论
      w1(gen)      = mean(w1_NIND);
      w2(gen)      = mean(w2_NIND);
      w3(gen)      = mean(w3_NIND);
      w4(gen)      = mean(w4_NIND);
      w5(gen)      = mean(w5_NIND);
      w6(gen)      = mean(w6_NIND);
      w7(gen)      = mean(w7_NIND);
      w8(gen)      = mean(w8_NIND);
      w9(gen)      = mean(w9_NIND);     
      Error        = [Error,mean(JJ)];
      if gen <= LEN
         Error2  = [Error2,mean(Error(1:gen))];
      else
         Error2  = [Error2,mean(Error(gen-LEN+1:gen))];
      end      
end 
 
w1_best         = w1(end)      
w2_best         = w2(end)
w3_best         = w3(end)
w4_best         = w4(end) 
w5_best         = w5(end) 
w6_best         = w6(end)      
w7_best         = w7(end)
w8_best         = w8(end)
w9_best         = w9(end)
 
figure;
plot(Error2,'b-s');
xlabel('迭代次数');
ylabel('目标优化');
 
 
save R.mat w1_best w2_best w3_best w4_best w5_best w6_best w7_best w8_best w9_best Error2