今天的主题是:采用莱维飞行和混沌映射的粒子群算法整定各种常见传递函数的PID参数。粒子群的改进思路请看这篇文章。基于改进莱维飞行和混沌映射(10种混沌映射随意切换)的粒子群优化算法,附matlab代码
PID参数整定的方法有很多,其中包括正交试验法、极点配置法,另一类为智能优化算法,包括遗传算法、粒子群算法、神经网络算法。今天给大家带来一期,采用莱维飞行和混沌映射的粒子群算法整定各种常见传递函数的PID参数,并与上一期的灰狼算法比较整定前后的时域指标。
传递函数依旧采取包含以下五种,基本上包含了所有常见的传递函数。
测试在阶跃响应下,采用改进的粒子群算法整定PID的结果图如下:
01
取T = 50; K = 5; n = 3,(这几个参数在代码中可自行修改)
chaosLPSO优化前后结果如下:
控制台输入结果如下:
与上一期灰狼算法时域参数的比较:
参数 | 超调量 | 峰值时间 | 上升时间 | 调节时间 |
手动 | 0 | 3000 | 285.499 | 590 |
chaosLPSO | 5.8065 | 275 | 133.825 | 550 |
GWO | 5.768 | 275 | 134.439 | 550 |
对于传递函数1来说,两种算法基本不分伯仲
02
取Tz = [40,20,60,100,20]; K = 6; n = 5,(这几个参数在代码中可自行修改)
chaosLPSO优化前后结果如下:
控制台输入结果如下:
与上一期灰狼算法时域参数的比较:
参数 | 超调量 | 峰值时间 | 上升时间 | 调节时间 |
手动 | 0.1 | 100 | 285.499 | 590 |
chaosLPSO | 5.4788 | 435 | 204.234 | 835 |
GWO | 4.8439 | 445 | 209.386 | 835 |
对于传递函数2来说,改进粒子群算法的峰值时间和上升时间两个指标要优于GWO算法。
03
取T = 15; K = 10; n= 5; tt = 5; (这几个参数在代码中可自行修改)
chaosLPSO优化前后结果如下:
与上一期灰狼算法时域参数的比较:
参数 | 超调量 | 峰值时间 | 上升时间 | 调节时间 |
手动 | 13.327 | 135 | 43.242 | 485 |
chaosLPSO | 3.2203 | 210 | 92.512 | 360 |
GWO | 3.511 | 210 | 90.7267 | 365 |
对于传递函数3来说,改进粒子群算法的调节时间和超调量两个指标要优于GWO算法。
04
取T1 = 10; K1 = 2; n1=3; tt1 = 0.02; T2 = 2; K2 = 0.1; n2=4; tt2 = 0.001; (这几个参数在代码中可自行修改)
chaosLPSO优化前后结果如下:
控制台输入结果如下:
与上一期灰狼算法时域参数的比较:
参数 | 超调量 | 峰值时间 | 上升时间 | 调节时间 |
手动 | 0 | 3000 | 1332.72 | 2230 |
chaosLPSO | 4.268 | 75 | 33.9172 | 135 |
GWO | 4.519 | 75 | 33.5024 | 135 |
对于传递函数4来说,改进粒子群算法的超调量指标要优于GWO算法。
05
取K = 10;T = 50; n = 4; tt = 5; (这几个参数在代码中可自行修改)
chaosLPSO优化前后结果如下:
控制台输入结果如下:
与上一期灰狼算法时域参数的比较:
参数 | 超调量 | 峰值时间 | 上升时间 | 调节时间 |
手动 | 53.378 | 355 | 118.833 | 1890 |
chaosLPSO | 3.7476 | 470 | 216.0934 | 845 |
GWO | 3.9041 | 470 | 215.205 | 845 |
对于传递函数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