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

155 阅读3分钟

1.算法仿真效果

matlab2013b仿真结果如下:

1.png

2.png

3.png

4.png

5.png

 

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

 

6.png

 

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

 

7.png

8.png

9.png

 

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

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

 

63c4af23938c89ab8b0b2f3b2d0ecd31_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

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

 

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

 

 

22b168164be152da6dbb00bae40f805d_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

  25628205957ff89f4beeff050cc96e44_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

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

d349d9a1624ef4c3c0632c5902826c1c_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

3.MATLAB核心程序

1095479ce3fdea00f3f8761b14e6af4b_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

cd757ea509a1f237162ff30621a28dce_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png `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`