PSO优化PID,涵盖常见传递函数!改进的粒子群算法整定PID参数,并与灰狼算法进行比较,附MATLAB代码

今天的主题是:采用莱维飞行和混沌映射的粒子群算法整定各种常见传递函数的PID参数。粒子群的改进思路请看这篇文章。基于改进莱维飞行和混沌映射(10种混沌映射随意切换)的粒子群优化算法,附matlab代码

PID参数整定的方法有很多,其中包括正交试验法、极点配置法,另一类为智能优化算法,包括遗传算法、粒子群算法、神经网络算法。今天给大家带来一期,采用莱维飞行和混沌映射的粒子群算法整定各种常见传递函数的PID参数,并与上一期的灰狼算法比较整定前后的时域指标

传递函数依旧采取包含以下五种,基本上包含了所有常见的传递函数。

测试在阶跃响应下,采用改进的粒子群算法整定PID的结果图如下:

01

fd754a95690749b8d2577acdb444be34.png

取T = 50; K = 5; n = 3,(这几个参数在代码中可自行修改)

chaosLPSO优化前后结果如下:

fbbc6fd891ad488466e10eca57f92f8e.png

控制台输入结果如下:

6a98b85b0113cc0b577a4b7341cd8bfd.png

与上一期灰狼算法时域参数的比较:

参数超调量峰值时间上升时间调节时间
手动03000285.499590
chaosLPSO5.8065275133.825550
GWO5.768275134.439550

对于传递函数1来说,两种算法基本不分伯仲

02

d2c742cbcae8860b6181ced42000802f.png

取Tz = [40,20,60,100,20];  K = 6;  n = 5,(这几个参数在代码中可自行修改)

chaosLPSO优化前后结果如下:

392a4aa7e7ff9f257fa39aa46587de36.png

控制台输入结果如下:

79caea2357862827a37c8313af26a072.png

与上一期灰狼算法时域参数的比较:

参数超调量峰值时间上升时间调节时间
手动0.1100285.499590
chaosLPSO5.4788435204.234835
GWO4.8439445209.386835

对于传递函数2来说,改进粒子群算法的峰值时间和上升时间两个指标要优于GWO算法。

03

794f0e258811f47e69ff5bc180750457.png

取T = 15; K = 10; n= 5;  tt = 5; (这几个参数在代码中可自行修改)

chaosLPSO优化前后结果如下:

7ad0948fbe297eb65ba9ab6ba618cd7a.png

19e6fec290ef92dc75e7b7f8578531ea.png

与上一期灰狼算法时域参数的比较:

参数超调量峰值时间上升时间调节时间
手动13.32713543.242485
chaosLPSO3.220321092.512360
GWO3.51121090.7267365

对于传递函数3来说,改进粒子群算法的调节时间和超调量两个指标要优于GWO算法。

04

f1f45d7bff2e2cc6e1ef48161264d20a.png

取T1 = 10; K1 = 2; n1=3;  tt1 = 0.02;  T2 = 2; K2 = 0.1; n2=4;  tt2 = 0.001; (这几个参数在代码中可自行修改)

chaosLPSO优化前后结果如下:

d878f8c1e296713ac1cb2d6038360995.png

控制台输入结果如下:

fb937743fe53f124c321e280a0eb710e.png

与上一期灰狼算法时域参数的比较:

参数超调量峰值时间上升时间调节时间
手动030001332.722230
chaosLPSO4.2687533.9172135
GWO4.5197533.5024135

对于传递函数4来说,改进粒子群算法的超调量指标要优于GWO算法。

05

a435681920c3dbcb599db9ed0cc02638.png

取K = 10;T = 50; n = 4;  tt = 5; (这几个参数在代码中可自行修改)

chaosLPSO优化前后结果如下:

8112597683aaf3843cfaf3df38ccf66c.png

控制台输入结果如下:

18dca7090e0d0c69af8405074c685d6a.png

与上一期灰狼算法时域参数的比较:

参数超调量峰值时间上升时间调节时间
手动53.378355118.8331890
chaosLPSO3.7476470216.0934845
GWO3.9041470215.205845

对于传递函数5来说,改进粒子群算法的超调量要优于GWO算法。

结论:由以上改进的粒子群算法和灰狼算法比较,可以看到,在对于低阶系统PID参数的整定中,无论使用哪种智能优化算法,其最后效果应该都是相差不多的。

代码:

clear
clc
close all
%% 五种适应度函数分别 对应图片1-5
flag = 1;   %1-5分别对应图片1-5,图片中对应的参数请自行修改即可


KP0 = 0.1;  %优化前先手动给一个P , I , D指标,方便与优化后做对比,这三个参数也可以自行更改
Ti0 = 100;
Kd0 = 0.5;


if flag == 1
    T = 50; K = 5; n = 3;                           %这几个参数可以自行修改
    PI_1;                                           %PI_1-5分别对应5个传递函数。采用手动给的PID指标算响应曲线
elseif flag==2
    Tz = [40,20,60,100,20];  K = 6;  n = 5;         %这里注意,n和Tz变量的长度一致,这几个参数可以自行修改
    PI_2;                                           %采用手动给的PID指标算响应曲线
elseif flag==3
    T = 15; K = 10; n= 5;  tt = 5;                  %这几个参数可以自行修改
    PI_3;                                           %采用手动给的PID指标算响应曲线
elseif flag==4
    T1 = 10; K1 = 2; n1=3;  tt1 = 0.02;                %这几个参数可以自行修改
    T2 = 2; K2 = 0.1; n2=4;  tt2 = 0.001;  
    PI_4;                                           %采用手动给的PID指标算响应曲线
elseif flag==5
    K = 10;T = 50; n = 4;  tt = 5;                  %这几个参数可以自行修改
    PI_5;                                           %采用手动给的PID指标算响应曲线
else
    T = 50; K = 5; n = 3;                           %这几个参数可以自行修改 
    PI_1;                                           %采用手动给的PID指标算响应曲线
end


N = 50;  %粒子群种群数
iter = 100;  %迭代次数
ub = [100,200,10];%优化变量的上限
lb = [0.01,20,0];%优化变量的下限
dim = 3;


%PSO Infotmation
Vmax=ones(1,dim).*(ub-lb).*0.15;           %速度最大值
noP=N;
w=0.8;
c1=1.2;
c2=1.2;


% Initializations
vel=zeros(noP,dim);
pBestScore=zeros(noP);
pBest=zeros(noP,dim);
gBest=zeros(1,dim);
cg_curve=zeros(1,iter);


% Random initialization for agents.
numm = 2;% numm,一共10种 混沌映射类型选择,1-10分别为,tent、Logistic、Cubic、chebyshev、Piecewise、sinusoidal、Sine,ICMIC, Circle,Bernoulli
pos = repmat(lb,N,1)+chaos(numm,N,dim).* repmat((ub-lb),N,1);


for i=1:noP
    pBestScore(i)=inf;
end


% Initialize gBestScore for a minimization problem
gBestScore=inf;




for l=1:iter
    
    % Return back the particles that go beyond the boundaries of the search space
    for i=1:size(pos,1)
        Flag4ub=pos(i,:)>ub;
        Flag4lb=pos(i,:)<lb;
        pos(i,:)=(pos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
    end
    
    for i=1:size(pos,1)
           if(pBestScore(i)>fitness)
            pBestScore(i)=fitness;
            pBest(i,:)=pos(i,:);
        end
        if(gBestScore>fitness)
            gBestScore=fitness;
            gBest=pos(i,:);
        end
    end
 
    
    %Update the Velocity and Position of particles
     A = rand();
    if abs(A) < 0.5
    for i=1:size(pos,1)
            for j=1:size(pos,2)
                vel(i,j)=w*vel(i,j)+c1*rand()*(pBest(i,j)-pos(i,j))+c2*rand()*(gBest(j)-pos(i,j));
                if(vel(i,j)>Vmax(j))
                    vel(i,j)=Vmax(j);
                end
                if(vel(i,j)<-Vmax(j))
                    vel(i,j)=-Vmax(j);
                end
                pos(i,j)=pos(i,j)+vel(i,j);
            end
    end
    else
        lambda = exp(1-iter/(iter+1-l));
        C1=2*rand*(1-l/iter);
         for i=1:size(pos,1)
            %%  levy飞行程序
            beta=1.5;    % 通常取值为1.5
            sigma_u=(gamma(1+beta)*sin(pi*beta/2)/(beta*gamma((1+beta)/2)*2^((beta-1)/2)))^(1/beta);
            u = normrnd(0, sigma_u);
            v = normrnd(0, 1);
            num = 1:1:N; random_num = num(randperm(numel(num),1)); %随机选择1个个体
            levi = u/abs(v)^(1/beta)*(gBest-pos(random_num,:));
            pos(i,:)=C1*pos(i,:)+lambda*gBest +0.01*levi;
        end
        
        
    end
    cg_curve(l)=gBestScore;
end


Best_pos = gBest;


if flag==1
    [Qbg,y_chaosLPSO,u,t]=Object1(Best_pos,T,K,n);
elseif flag==2
    [Qbg,y_chaosLPSO,u,t]=Object2(Best_pos,Tz,K,n);
elseif flag==3
    [Qbg,y_chaosLPSO,u,t]=Object3(Best_pos,T,K,n,tt);
elseif flag==4
    [Qbg,y_chaosLPSO,u,t]=Object4(Best_pos,T1,K1,tt1,n1,T2,K2,tt2,n2);
elseif flag==5
    [Qbg,y_chaosLPSO,u,t]=Object5(Best_pos,T,K,tt,n);
else
    [Qbg,y_chaosLPSO,u,t]=Object1(Best_pos,T,K,n);
end




%计算优化后的时域性能指标
[Overshoot,tp,tr,ts]=performance_index(y_chaosLPSO,t);
disp(['chaosLPSO优化后的阶跃响应曲线参数:超调量:',num2str(Overshoot),',峰值时间:',num2str(tp),',上升时间:',num2str(tr),',调节时间:',num2str(ts)])
disp(['chaosLPSO优化后的PID参数为:',num2str(Best_pos)])
[Overshoot0,tp0,tr0,ts0]=performance_index(y0,t0);
disp(['chaosLPSO优化前的阶跃响应曲线参数:超调量:',num2str(Overshoot0),',峰值时间:',num2str(tp0),',上升时间:',num2str(tr0),',调节时间:',num2str(ts0)])
disp(['chaosLPSO优化前的PID参数为:',num2str([KP0,Ti0,Kd0])])


%% 作图
figure
plot(t0,y0,"Color",'b','LineWidth',1);
hold on
plot(t,y_chaosLPSO,"Color",'r','LineWidth',1);
hold on
plot(t,ones(length(t),1),'LineStyle','--',"Color",'k','LineWidth',1);
legend('优化前','chaosLPSO优化后');
xlabel('时间/s');
ylabel('输出');

代码说明:

①代码采用10种混沌映射改进粒子群算法,10种混沌映射可以自由切换。

②观察代码第5行,可以通过修改参数flag,任意切换五种传递函数,除此之外,大家可以自行将传递函数改成自己想要的任意参数。

代码注释很详细。获取完整代码方式:点击下方卡片回复关键词获取。

关键词:PSOPID

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值