请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册
查看: 5247|回复: 0

6-PSO_PID--粒子群算法--适应度函数有更改(采样时间)

[复制链接]

1278

主题

1504

帖子

90

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22549
发表于 2019-8-7 22:16:58 | 显示全部楼层 |阅读模式
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
程序如下:
  1. %% 清空环境
  2. clc,clear,close all
  3. warning off
  4. format longG
  5. addpath(genpath('./PID_funtion'))
  6. %% PSO参数设置
  7. w = 0.6;      % 惯性因子
  8. c1 = 2;       % 加速常数
  9. c2 = 2;       % 加速常数
  10. Dim = 3;            % 维数,未知量个数nvar, N_VAR, N_PAR
  11. SwarmSize = 30;     % 粒子群规模
  12. MaxIter = 50;       % 最大迭代次数
  13. Vmax = 1;
  14. Vmin = -1;
  15. Ub = [15 10 5];  % 上限
  16. Lb = [0.5 0 0];  % 下限

  17. %% 适应度函数
  18. fun = @(x)PID_controller(x);

  19. %% 粒子群初始化
  20. Range = ones(SwarmSize,1)*(Ub-Lb);
  21. pop = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb;    % 初始化粒子群
  22. V = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin;               % 初始化速度
  23. fitness = zeros(SwarmSize,1);
  24. for i=1:SwarmSize
  25.     fitness(i,:) = fun(pop(i,:));                         % 粒子群的适应值
  26. end

  27. %% 个体极值和群体极值
  28. [bestf, bestindex]=min(fitness);
  29. zbest=pop(bestindex,:);   % 全局最佳
  30. gbest=pop;                % 个体最佳
  31. fitnessgbest=fitness;              % 个体最佳适应值
  32. fitnesszbest=bestf;               % 全局最佳适应值

  33. %% 迭代寻优
  34. iter = 0;
  35. y_fitness = zeros(1,MaxIter);   % 预先产生4个空矩阵
  36. K_p = zeros(1,MaxIter);
  37. K_i = zeros(1,MaxIter);
  38. K_d = zeros(1,MaxIter);
  39. while( (iter < MaxIter) )
  40.     disp(['当前迭代次数:',num2str(iter)]) % 迭代次数
  41.     for j=1:SwarmSize
  42.         % 速度更新
  43.         V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
  44.         for k=1:Dim
  45.             if V(j,k)>Vmax,
  46.                 V(j,k)=Vmax;
  47.             end
  48.             if V(j,k)<Vmin,
  49.                 V(j,k)=Vmin;
  50.             end
  51.         end
  52.         % 位置更新
  53.         pop(j,:)=pop(j,:)+0.5*V(j,:);
  54.         for k=1:Dim
  55.             if pop(j,k)>Ub(k),
  56.                 pop(j,k)=Ub(k);
  57.             end
  58.             if pop(j,k)<Lb(k),
  59.                 pop(j,k)=Lb(k);
  60.             end
  61.         end
  62.         % 适应值
  63.         fitness(j,:) =fun(pop(j,:));
  64.         % 个体最优更新
  65.         if fitness(j) < fitnessgbest(j)
  66.             gbest(j,:) = pop(j,:);
  67.             fitnessgbest(j) = fitness(j);
  68.         end
  69.         % 群体最优更新
  70.         if fitness(j) < fitnesszbest
  71.             zbest = pop(j,:);
  72.             fitnesszbest = fitness(j);
  73.         end
  74.     end
  75.     iter = iter+1;                      % 迭代次数更新
  76.     y_fitness(1,iter) = fitnesszbest;         % 为绘图做准备
  77.     K_p(1,iter) = zbest(1);
  78.     K_i(1,iter) = zbest(2);
  79.     K_d(1,iter) = zbest(3);
  80. end
  81. %% 绘图
  82. disp(['PSO最优解', num2str(zbest)])
  83. disp(['PSO最优解对应的目标值', num2str(fitnesszbest)])
  84. fprintf('\n')

  85. figure(1)      % 绘制性能指标ITAE的变化曲线
  86. plot(y_fitness,'LineWidth',3)
  87. title('最优个体适应值','fontsize',10);
  88. xlabel('迭代次数','fontsize',10);ylabel('适应值','fontsize',10);
  89. set(gca,'Fontsize',10);
  90. grid on

  91. figure(2)      % 绘制PID控制器参数变化曲线
  92. plot(K_p,'b-','LineWidth',2); hold on
  93. plot(K_i,'k-.','LineWidth',2)
  94. plot(K_d,'r--','LineWidth',2)
  95. title('Kp、Ki、Kd 优化曲线','fontsize',10);
  96. xlabel('迭代次数','fontsize',10);   ylabel('参数值','fontsize',10);
  97. set(gca,'Fontsize',10);
  98. legend('Kp','Ki','Kd',1);
  99. grid on;hold off;

  100. % PID响应
  101. [BSJ, rint, yout]=PID_controller_response(zbest);

  102. figure('color',[1,1,1])
  103. plot(rint,'b-','linewidth',2);hold on;
  104. plot(yout,'r.-','linewidth',2);
  105. axis tight;grid on;
  106. hold off;
  107. title('阶跃响应曲线')

  108. save PSO_result.mat
  109. rmpath(genpath('./PID_funtion'))
复制代码
PID控制系统如下(细节、细节、细节):
  1. function BsJ=PID_controller(Kpidi)
  2. % PID控制误差--适应度函数
  3. % 输入:
  4. %       Kpidi---包含Kp、Ki、Kd三个控制参数
  5. % 输出:
  6. %       BsJ---控制累计误差
  7. %% 二阶控制系统
  8. ts=1;                   % 采样周期
  9. % sys=tf([-2,1],[0.2 1.2 1.0]);
  10. % dsys=c2d(sys,ts,'z');
  11. % [num,den]=tfdata(dsys,'v'); % z变换后的分子分母系数
  12. % 减小计算时间
  13. num = [0,-0.361018550145424,0.988879914151562];
  14. den = [1,-0.374617388170528,0.00247875217666640];

  15. %常规PID
  16. u_11=0;u_21=0;u_31=0;u_41=0;u_51=0;
  17. y_11=0;y_21=0;y_31=0;
  18. error_21=0;
  19. error_11=0;
  20. ei1=0;
  21. ei=0;

  22. u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
  23. y_1=0;y_2=0;y_3=0;
  24. error_2=0;
  25. error_1=0;

  26.     kp1=Kpidi(1);
  27.     ki1=Kpidi(2);
  28.     kd1=Kpidi(3);
  29.    
  30. for k=1:1:200
  31.     time(k)=k*ts;
  32.    
  33.     %  rin(k)=bb(k);
  34.     rin(k)=1;
  35.     yout1(k)=-den(2)*y_11-den(3)*y_21+num(2)*u_11+num(3)*u_21;
  36.     error1(k)=(rin(k)-yout1(k))*0.05;
  37.     ei1=ei1+error1(k)*ts;

  38.     u1(k)= u_11+kp1*error1(k)+ kd1*(error1(k)-error_11)/ts+ki1*ei1;
  39.     if u1(k)>=10       % Restricting the output of controller
  40.         u1(k)=10;
  41.     end
  42.     if u1(k)<=-10
  43.         u1(k)=-10;
  44.     end
  45.     u_51=u_41;u_41=u_31;u_31=u_21;
  46.     u_21=u_11;u_11=u1(k);
  47.     y_31=y_21;
  48.     y_21=y_11;y_11=yout1(k);
  49.     error_21=error_11;
  50.     error_11=error1(k);

  51. end

  52. BsJ = sum(abs(error1));
复制代码




算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-3-28 19:44 , Processed in 0.215173 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表