📄 pso_pid.m
字号:
% 基于微粒子算法的PID参数整定
for N=1:1
max_iterations=40;
no_particles=20;
dimensions=3;
cmax=0.9;
cmin=0.1;
c0=0.9;
c1=2;
c2=2;
Vmax=0.5;
u=4;
KPmax=1;
KPmin=0.7;
KImax=0.5;
KImin=0.2;
KDmax=0.8;
KDmin=0.5;
Xmax=[KPmax,KImax,KDmax];
Xmin=[KPmin,KImin,KDmin];
b=0.2;
global kp ki kd;
% 进行混沌初始化
%particles=rand(no_particles,dimensions)*(Xmax-Xmin);
%particles(1:no_particles,1)=rand(no_particles,1)*(KPmax-KPmin);
%particles(1:no_particles,2)=rand(no_particles,1)*(KImax-KImin);
%particles(1:no_particles,3)=rand(no_particles,1)*(KDmax-KDmin);
z=rand(1,3);
for n=2:no_particles
z(n,:)=u.*z(n-1,:).*(1-z(n-1,:));
end
particles(1:no_particles,1)=KPmin+(KPmax-KPmin)*z(1:no_particles,1);
particles(1:no_particles,2)=KImin+(KImax-KImin)*z(1:no_particles,2);
particles(1:no_particles,3)=KDmin+(KDmax-KDmin)*z(1:no_particles,3);
velocity=rand(no_particles,dimensions);
%pbest_val(1:no_particles,1)=(particles(1:no_particles,1)-20).^2+particles(1:no_particles,2).^2;
for i=1:no_particles
pbest_val(i,1)=itae(particles(i,1),particles(i,2),particles(i,3)); %kp,ki,kd
end
pbest_postion=particles;
[gbest_val,gbest_index]=min(pbest_val);
gbest_postion=pbest_postion(gbest_index,:);
d=rand(1,dimensions);
%迭代循环
for step=1:max_iterations
%c0=cmax-step*(cmax-cmin)/max_iterations;
c0=cmax-(cmax-cmin)*(1-abs(gbest_val-mean(pbest_val))/max(gbest_val,mean(pbest_val)));
clc;
disp('循环次数');
step
for i=1:no_particles
pbest_val_new(i,1)=itae(particles(i,1),particles(i,2),particles(i,3));
%pbest_val_new(i)=(particles(i,1)-20)^2+particles(i,2)^2;
if pbest_val_new(i)<pbest_val(i)
pbest_val(i)=pbest_val_new(i);
pbest_postion(i,:)=particles(i,:);
end
%施加混沌扰动
d1=u.*d.*(1-d);
r=-b+2*b*d1;
d=d1;
particles_1(i,:)=particles(i,:)+r;
temp=itae(particles_1(i,1),particles_1(i,2),particles_1(i,3));
if temp<pbest_val(i)
particles(i,:)=particles_1(i,:);
pbest_postion(i,:)=particles(i,:);
end
end
[gbest_val,gbest_index]=min(pbest_val);
gbest_postion=pbest_postion(gbest_index,:);
for i=1:no_particles
for j=1:dimensions
velocity(i,j)=c0*velocity(i,j)+c1*rand*(pbest_postion(i,j)-particles(i,j))+c2*rand*(gbest_postion(1,j)-particles(i,j));
if velocity(i,j)>Vmax
velocity(i,j)=Vmax;
elseif velocity(i,j)<-Vmax
velocity(i,j)=-Vmax;
end
particles(i,j)=particles(i,j)+velocity(i,j);
if particles(i,j)>Xmax(j) | particles(i,j)<Xmin(j)
particles(i,j)=rand*gbest_postion(1,j);
end
end
end
end
gbest_val
gbest_postion
PID_val(N,1)=gbest_val;
PID_postion(N,:)=gbest_postion;
plot_step(2,PID_postion(N,1),PID_postion(N,2),PID_postion(N,3));
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -