6-PSO_PID--粒子群算法--适应度函数有更改(采样时间)
6-PSO_PID--粒子群算法--适应度函数有更改(采样时间)百度网盘链接:https://pan.baidu.com/s/134vHa0M2gPMENML-t-AvnA 提取码:5hlg
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
程序如下:
%% 清空环境
clc,clear,close all
warning off
format longG
addpath(genpath('./PID_funtion'))
%% PSO参数设置
w = 0.6; % 惯性因子
c1 = 2; % 加速常数
c2 = 2; % 加速常数
Dim = 3; % 维数,未知量个数nvar, N_VAR, N_PAR
SwarmSize = 30; % 粒子群规模
MaxIter = 50; % 最大迭代次数
Vmax = 1;
Vmin = -1;
Ub = ;% 上限
Lb = ;% 下限
%% 适应度函数
fun = @(x)PID_controller(x);
%% 粒子群初始化
Range = ones(SwarmSize,1)*(Ub-Lb);
pop = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb; % 初始化粒子群
V = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin; % 初始化速度
fitness = zeros(SwarmSize,1);
for i=1:SwarmSize
fitness(i,:) = fun(pop(i,:)); % 粒子群的适应值
end
%% 个体极值和群体极值
=min(fitness);
zbest=pop(bestindex,:); % 全局最佳
gbest=pop; % 个体最佳
fitnessgbest=fitness; % 个体最佳适应值
fitnesszbest=bestf; % 全局最佳适应值
%% 迭代寻优
iter = 0;
y_fitness = zeros(1,MaxIter); % 预先产生4个空矩阵
K_p = zeros(1,MaxIter);
K_i = zeros(1,MaxIter);
K_d = zeros(1,MaxIter);
while( (iter < MaxIter) )
disp(['当前迭代次数:',num2str(iter)]) % 迭代次数
for j=1:SwarmSize
% 速度更新
V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
for k=1:Dim
if V(j,k)>Vmax,
V(j,k)=Vmax;
end
if V(j,k)<Vmin,
V(j,k)=Vmin;
end
end
% 位置更新
pop(j,:)=pop(j,:)+0.5*V(j,:);
for k=1:Dim
if pop(j,k)>Ub(k),
pop(j,k)=Ub(k);
end
if pop(j,k)<Lb(k),
pop(j,k)=Lb(k);
end
end
% 适应值
fitness(j,:) =fun(pop(j,:));
% 个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
% 群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
iter = iter+1; % 迭代次数更新
y_fitness(1,iter) = fitnesszbest; % 为绘图做准备
K_p(1,iter) = zbest(1);
K_i(1,iter) = zbest(2);
K_d(1,iter) = zbest(3);
end
%% 绘图
disp(['PSO最优解', num2str(zbest)])
disp(['PSO最优解对应的目标值', num2str(fitnesszbest)])
fprintf('\n')
figure(1) % 绘制性能指标ITAE的变化曲线
plot(y_fitness,'LineWidth',3)
title('最优个体适应值','fontsize',10);
xlabel('迭代次数','fontsize',10);ylabel('适应值','fontsize',10);
set(gca,'Fontsize',10);
grid on
figure(2) % 绘制PID控制器参数变化曲线
plot(K_p,'b-','LineWidth',2); hold on
plot(K_i,'k-.','LineWidth',2)
plot(K_d,'r--','LineWidth',2)
title('Kp、Ki、Kd 优化曲线','fontsize',10);
xlabel('迭代次数','fontsize',10); ylabel('参数值','fontsize',10);
set(gca,'Fontsize',10);
legend('Kp','Ki','Kd',1);
grid on;hold off;
% PID响应
=PID_controller_response(zbest);
figure('color',)
plot(rint,'b-','linewidth',2);hold on;
plot(yout,'r.-','linewidth',2);
axis tight;grid on;
hold off;
title('阶跃响应曲线')
save PSO_result.mat
rmpath(genpath('./PID_funtion'))PID控制系统如下(细节、细节、细节):function BsJ=PID_controller(Kpidi)
% PID控制误差--适应度函数
% 输入:
% Kpidi---包含Kp、Ki、Kd三个控制参数
% 输出:
% BsJ---控制累计误差
%% 二阶控制系统
ts=1; % 采样周期
% sys=tf([-2,1],);
% dsys=c2d(sys,ts,'z');
% =tfdata(dsys,'v'); % z变换后的分子分母系数
% 减小计算时间
num = ;
den = ;
%常规PID
u_11=0;u_21=0;u_31=0;u_41=0;u_51=0;
y_11=0;y_21=0;y_31=0;
error_21=0;
error_11=0;
ei1=0;
ei=0;
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
error_2=0;
error_1=0;
kp1=Kpidi(1);
ki1=Kpidi(2);
kd1=Kpidi(3);
for k=1:1:200
time(k)=k*ts;
%rin(k)=bb(k);
rin(k)=1;
yout1(k)=-den(2)*y_11-den(3)*y_21+num(2)*u_11+num(3)*u_21;
error1(k)=(rin(k)-yout1(k))*0.05;
ei1=ei1+error1(k)*ts;
u1(k)= u_11+kp1*error1(k)+ kd1*(error1(k)-error_11)/ts+ki1*ei1;
if u1(k)>=10 % Restricting the output of controller
u1(k)=10;
end
if u1(k)<=-10
u1(k)=-10;
end
u_51=u_41;u_41=u_31;u_31=u_21;
u_21=u_11;u_11=u1(k);
y_31=y_21;
y_21=y_11;y_11=yout1(k);
error_21=error_11;
error_11=error1(k);
end
BsJ = sum(abs(error1));
页:
[1]