基于梯度优化的混沌PSO算法matlab仿真以及在磁悬浮球系统方面的应用

1.软件版本

matlab2017b

2.系统概述

首先,我们需要构建磁悬浮球系统模型的控制对象模型。这里,我们通过传递函数的形式来实现磁悬浮球的表达式,具体的推导过程如下所示:

       上图中,Xo为磁悬浮球的平衡位置的间隙,x为钢球在Y方向上的偏离平衡位置的位移。Io和i分别为电磁铁线圈的偏置电流和控制电流,F为电磁铁对钢球所产生的电磁铁,mg为钢球所受重力。为了保持平衡,合理F-mg必须为0.

假设平衡状态下,电流为i0,钢球和电磁铁之间的气隙为x0,那么这个时候有如下的表达式:

 将钢球作为单质点来处理,当钢球质心在Y方向上有向上的偏移量x时,电磁铁 的吸力为

 u0——真空或空气导磁率;    

s 0——单个磁极面积;     

n——电磁铁线圈匝数;     

i0——线圈中的偏置电流;     

x0——空气气隙厚度;      

i——由x引起的控制电流分量;      

x——转子在Y方向上偏离平衡位置的位移;

当钢球仅存在平移,且无干扰力存在时,此时转子的中心运动方程可表示为:

 式中i是位移x而引起的控制电流,在平衡位置处有x=0,i=0,f0=0;

将上式在平衡位置处用泰勒公式展开,并去除二阶最小量得:

 上述公式就是最后的可以得到磁悬浮球的运动微分方程。

 其中K0和P,通过预先给定的参数,可以获得,其为两个固定的常数,这个可以根据实际的参数自己设置,我们将上述的Gs作为控制器系统的控制对象进行控制处理。

3.梯度优化的混沌PSO程序

clc;
clear;
close all;
warning off;
RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));

global yd y timef
%定义磁悬浮球传递函数
tmac = 1000;
den  =[1,32,2,1];

wmax = 0.9;
wmin = 0.1;
c1   = 0.3;
c2   = 0.3;
%Kp的范围
amin = 0;
amax = 100;
%Ki的范围
bmin = 0;
bmax = 100;
%Kd的范围
cmin = 0;
cmax = 100;
%速度的范围
vmin =-0.1;
vmax = 0.1;
%粒子数目
Pop  = 5;
BsJ  = 0;
%迭代次数
T    = 200;
%粒子初始化
for i=1:Pop
    Kpid(i,1)   = rand(1)*(amax-amin)+amin;
    a_best(i)   = Kpid(i,1);
    
    Kpid(i,2)   = rand(1)*(bmax-bmin)+bmin;
    b_best(i)   = Kpid(i,2);
    
    Kpid(i,3)   = rand(1)*(cmax-cmin)+cmin;
    c_best(i)   = Kpid(i,3);
    
    va(i)       =(vmax-vmin)*rand(1)+vmin;
    vb(i)       =(vmax-vmin)*rand(1)+vmin;
    vc(i)       =(vmax-vmin)*rand(1)+vmin;
    
    Kpidi       = Kpid(i,:);  
    [BsJ,Y]     = func_pid_controller_fitness(Kpidi,tmac,den);   
    BsJi(i)     = BsJ;
end

a            = Kpid(:,1);
b            = Kpid(:,2);
c            = Kpid(:,3);
[minJi,index]= min(BsJi);
Ta_best      = a(index);
Tb_best      = b(index);
Tc_best      = c(index); 

for t=1:T
    time(t) = t;
    w       = wmax-t*(wmax-wmin)/T;
    for i=1:Pop
        va(i)     = w*va(i)+c1*rand(1)*(a_best(i)-Kpid(i,1))+c2*rand(1)*(Ta_best-Kpid(i,1));
        Kpid(i,1) = Kpid(i,1)+va(i);
        if Kpid(i,1) >= amax
           Kpid(i,1)  = amax;
        end
        if Kpid(i,1) <= amin
           Kpid(i,1)  = amin;
        end
        
        vb(i)     = w*vb(i)+c1*rand(1)*(b_best(i)-Kpid(i,2))+c2*rand(1)*(Tb_best-Kpid(i,2));
        Kpid(i,2) = Kpid(i,2)+vb(i);
        if Kpid(i,2) >= bmax
           Kpid(i,2)  = bmax;
        end
        if Kpid(i,2) <= bmin
           Kpid(i,2)  = bmin;
        end
        
        vc(i)     = w*vc(i)+c1*rand(1)*(c_best(i)-Kpid(i,3))+c2*rand(1)*(Tc_best-Kpid(i,3));
        Kpid(i,3) = Kpid(i,3)+vc(i);
        if Kpid(i,3) >= cmax
           Kpid(i,3)  = cmax;
        end
        if Kpid(i,3) <= cmin
           Kpid(i,3)  = cmin;
        end
    
        Kpidi       = Kpid(i,:);
        [p_new,Y]   = func_pid_controller_fitness(Kpidi,tmac,den);

        if p_new < BsJi(i)
           BsJi(i)   = p_new;
           a_best(i) = Kpid(i,1);
           b_best(i) = Kpid(i,2);
           c_best(i) = Kpid(i,3);
        end
        if BsJi(i) < minJi
           minJi   = BsJi(i);
           Ta_best = Kpid(i,1);
           Tb_best = Kpid(i,2);
           Tc_best = Kpid(i,3);
        end
    end

    zbest        = minJi; 
    %对粒子群最优位置进行混沌优化
    ya(1)        =(Ta_best-amin)/(amax-amin);
    yb(1)        =(Tb_best-bmin)/(bmax-bmin);
    yc(1)        =(Tc_best-cmin)/(cmax-cmin);
%     ya(1)        = Ta_best;
%     yb(1)        = Tb_best;
%     yc(1)        = Tc_best;    
    Kpids(1,1)     = ya(1);
    Kpids(1,2)     = yb(1);
    Kpids(1,3)     = yc(1);
    Ys             = cell(Pop,1);
    [fitness(1),Ys{1}] = func_pid_controller_fitness(Kpids(1,:),tmac,den);
 
    %通过Logistic得到混沌序列
    %混沌系数
    u            = 100;
    for i=1:Pop-1 
        ya(i+1)   = u*ya(i)*(1-ya(i)); 
        yb(i+1)   = u*yb(i)*(1-yb(i)); 
        yc(i+1)   = u*yc(i)*(1-yc(i)); 
        %将混沌序列逆射到原解空间
        ya(i+1)   = amin+(amax-amin)*ya(i+1);
        yb(i+1)   = bmin+(bmax-bmin)*yb(i+1);
        yc(i+1)   = cmin+(cmax-cmin)*yc(i+1);
        if ya(i+1)  >= amax;ya(i+1)   = amax;end;
        if ya(i+1)  <= amin;ya(i+1)   = amin;end;
        if yb(i+1)  >= bmax;yb(i+1)   = bmax;end;
        if yb(i+1)  <= bmin;yb(i+1)   = bmin;end;        
        if yc(i+1)  >= cmax;yc(i+1)   = cmax;end;
        if yc(i+1)  <= cmin;yc(i+1)   = cmin;end;       
        %计算混沌变量可行解序列的适应度值
        Kpid(i+1,1)   = ya(i+1);
        Kpid(i+1,2)   = yb(i+1);
        Kpid(i+1,3)   = yc(i+1);
        [fitness(i+1),Ys{i+1}]  = func_pid_controller_fitness(Kpid(i+1,:),tmac,den);
 
    end
    [ybestfitness,ybestindex] = min(fitness);
    ybesta                    = ya(ybestindex);
    ybestb                    = yb(ybestindex);
    ybestc                    = yc(ybestindex);
    Yf                        = Ys{ybestindex};
    ran                       = 1+fix(rand()*Pop);
    
    Kpid(ran,1)               = ybesta;
    Kpid(ran,2)               = ybestb;
    Kpid(ran,3)               = ybestc;
    yy(t)                     = minJi; 
 
    Jibest(t) = minJi;
    A_best(t) = Ta_best;
    B_best(t) = Tb_best;
    C_best(t) = Tc_best;
end

figure;
plot(yy,'r','linewidth',2);
xlabel('迭代次数');
ylabel('J');
grid on

save R2.mat yy timef yd Yf

figure;
subplot(311);
plot(time,A_best,'b','linewidth',2);
xlabel('times(s)');
ylabel('Kp');
grid on
subplot(312);
plot(time,B_best,'b','linewidth',2);
xlabel('times(s)');
ylabel('Ki');
grid on
subplot(313);
plot(time,C_best,'b','linewidth',2);
xlabel('times(s)');
ylabel('Kd');
grid on

figure;
subplot(211);
plot(Jibest,'r','linewidth',2);
xlabel('迭代次数');
ylabel('J');
grid on
subplot(212);
plot(timef,yd,'r','linewidth',2);
hold on
plot(timef,y,'b','linewidth',2);
grid on
axis([0,2,0,1.2]);
xlabel('times(s)');
ylabel('position');
legend('Ideal position signal','Position signal tracking');

4.仿真结论

 

 

5.参考文献

[1]何耀耀, 周建中, 杨俊杰,等. 混沌PSO梯级优化调度算法及实现[J]. 华中科技大学学报:自然科学版, 2009, 37(3):4.A06-26

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/125365270