Halcom 发表于 2019-8-7 22:16:58

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]
查看完整版本: 6-PSO_PID--粒子群算法--适应度函数有更改(采样时间)