Hello Mat

 找回密码
 立即注册
查看: 3786|回复: 1

粒子群算法PSO优化的PID参数整定

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-3-5 16:42:37 | 显示全部楼层 |阅读模式
粒子群算法PSO优化的PID参数整定:
http://halcom.cn/forum.php?mod=v ... age=1&extra=#pid664
程序如下:
  1. %% 清空环境
  2. clear
  3. clc
  4. %% 参数设置
  5. w = 0.6;      % 惯性因子
  6. c1 = 2;       % 加速常数
  7. c2 = 2;       % 加速常数

  8. Dim = 3;            % 维数
  9. SwarmSize =100;    % 粒子群规模
  10. MaxIter = 100;      % 最大迭代次数  
  11. MinFit = 0.1;       % 最小适应值
  12. Vmax = 1;
  13. Vmin = -1;
  14. Ub = [100 100 100];
  15. Lb = [0 0 0];

  16. %% 粒子群初始化
  17.     Range = ones(SwarmSize,1)*(Ub-Lb);
  18.     Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb;    % 初始化粒子群
  19.     VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin;                 % 初始化速度
  20.     fSwarm = zeros(SwarmSize,1);
  21. for i=1:SwarmSize
  22.     fSwarm(i,:) = pid_pso(Swarm(i,:));                         % 粒子群的适应值
  23. end

  24. %% 个体极值和群体极值
  25. [bestf bestindex]=min(fSwarm);
  26. zbest=Swarm(bestindex,:);   % 全局最佳
  27. gbest=Swarm;                % 个体最佳
  28. fgbest=fSwarm;              % 个体最佳适应值
  29. fzbest=bestf;               % 全局最佳适应值

  30. %% 迭代寻优
  31. iter = 0;
  32. y_fitness = zeros(1,MaxIter);   % 预先产生4个空矩阵
  33. K_p = zeros(1,MaxIter);         
  34. K_i = zeros(1,MaxIter);
  35. K_d = zeros(1,MaxIter);
  36. while( (iter < MaxIter) && (fzbest > MinFit) )
  37.     for j=1:SwarmSize
  38.         % 速度更新
  39.         VStep(j,:) = w*VStep(j,:) + c1*rand*(gbest(j,:) - Swarm(j,:)) + c2*rand*(zbest - Swarm(j,:));
  40.         if VStep(j,:)>Vmax, VStep(j,:)=Vmax; end
  41.         if VStep(j,:)<Vmin, VStep(j,:)=Vmin; end
  42.         % 位置更新
  43.         Swarm(j,:)=Swarm(j,:)+VStep(j,:);
  44.         for k=1:Dim
  45.             if Swarm(j,k)>Ub(k), Swarm(j,k)=Ub(k); end
  46.             if Swarm(j,k)<Lb(k), Swarm(j,k)=Lb(k); end
  47.         end
  48.         % 适应值
  49.         fSwarm(j,:) =pid_pso(Swarm(j,:));
  50.         % 个体最优更新     
  51.         if fSwarm(j) < fgbest(j)
  52.             gbest(j,:) = Swarm(j,:);
  53.             fgbest(j) = fSwarm(j);
  54.         end
  55.         % 群体最优更新
  56.         if fSwarm(j) < fzbest
  57.             zbest = Swarm(j,:);
  58.             fzbest = fSwarm(j);
  59.         end
  60.     end
  61.     iter = iter+1;                      % 迭代次数更新
  62.     y_fitness(1,iter) = fzbest;         % 为绘图做准备
  63.     K_p(1,iter) = zbest(1);
  64.     K_i(1,iter) = zbest(2);
  65.     K_d(1,iter) = zbest(3);
  66. end
  67. %%绘图
  68. figure(1)      % 绘制性能指标ITAE的变化曲线
  69. plot(y_fitness,'LineWidth',3)
  70. title('最优个体适应值','fontsize',10);
  71. xlabel('迭代次数','fontsize',10);ylabel('适应值','fontsize',10);
  72. set(gca,'Fontsize',10);
  73. grid on

  74. figure(2)      % 绘制PID控制器参数变化曲线
  75. plot(K_p,'LineWidth',3)
  76. hold on
  77. plot(K_i,'k','LineWidth',3)
  78. plot(K_d,'--r','LineWidth',3)
  79. title('Kp、Ki、Kd 优化曲线','fontsize',10);
  80. xlabel('迭代次数','fontsize',10);ylabel('参数值','fontsize',10);
  81. set(gca,'Fontsize',10);
  82. legend('Kp','Ki','Kd',1);
  83. grid on
复制代码



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

使用道具 举报

0

主题

2

帖子

10

金钱

新手上路

Rank: 1

积分
12
发表于 2017-11-7 10:28:42 | 显示全部楼层
写的很好,给力
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 16:14 , Processed in 0.231123 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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