深圳幻海软件技术有限公司 欢迎您!

基于入门级粒子群算法的PID参数整定(MATLAB2016b-simulink)(超详细01)

2023-04-05

  PID算法作为工业或日常生活中常用的控制算法,想必大家都不陌生,依靠误差反馈来消除误差,关于PID的原理部分相比看这篇博客的同学应该都十分清楚,有不清楚的同学可以百度或知网搜索。PID算法的应用程度很广但都逃不开一个步骤,也是相对而言最最令人头痛的一个过程——调参,具体来说就

   PID算法作为工业或日常生活中常用的控制算法,想必大家都不陌生,依靠误差反馈来消除误差,关于PID的原理部分相比看这篇博客的同学应该都十分清楚,有不清楚的同学可以百度或知网搜索。PID算法的应用程度很广但都逃不开一个步骤,也是相对而言最最令人头痛的一个过程——调参,具体来说就是调Kp、Ki、Kd。

   以往的方法都是手动调试,根据调参经验,先调KP,再调KD··········,繁琐的步骤让人头晕,费

  那么PID参数的调试是否有一种相对来说简单的调试方式呢?

————————————————————分割线————————————————————

  前面废话这么多为了凑字数,看官老爷莫着急,嘿嘿!我们步入正题,跟着小李准备发车!!!

  Step1:首先你要“学”会一个入门级的智能优化算法——粒子群算法

  粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。

等等等等详细介绍我就不多说了,看官老爷可以移步至如下链接,超详细的解说。

引用于——https://cloud.tencent.com/developer/article/1424756

  好接下来我们来讲,如何将PSO与PID参数整定联系在一起。

  PSO可以用来求一个函数的最大最小值,那么我们在调参时,示波器的波形上就会明显的看出自身系统的状态运行曲线和期望到达的状态,并且你的理想曲线往往是这样的:

  没有超调量、运行平稳。

  但无论参数怎么好,都是根据反馈的误差来消除误差,那么对于任一你想调的系统,在系统达到期望状态前,都会有一个误差,显然对每个系统,在MATLAB的仿真中,最终都会得到某一时间段系统的一个误差函数,我们想要得到的期望曲线往往是往往也是较小的或者说最小的,那么这也就对应了用粒子群算法来求解函数最小值。

     即我们需要在仿真中建立一个目标函数,这个函数关系到你的控制效果。那怎么建立一个目标函数呢。一般我们采取ITAE准则,英文缩写ITAE。准则的表达式为:

                                                                  

  按此准则设计的控制系统,瞬态响应的振荡性小,且对参数具有良好的选择性。缺点是用分析法计算很困难。

采用误差积分指标作为系统整定的性能指标时,系统的整定就归结为计算控制系统中的待定参数,使上述各类积分数值最小

———————————————————分割线—————————————————————

如何在simulink中建立呢?看官老爷看下图:

  想必熟悉simulink的看官老爷看的很明白吧,仿真时将时间分为一个很多段的小段,用来模拟连续,这样就得到了近似解,而且我们知道越小,越近似。

   目标函数的仿真做好了,目标函数的.m文件怎么做?

  1. function z = ayy(kp,ki,kd)
  2. %赋值运行且返回适应度
  3. %assigni函数的第一个参数填base就行
  4. %第二、三个参数即仿真和.m文件对应即可
  5. assignin('base','kp',kp);%赋值给kp
  6. assignin('base','ki',ki);%赋值给kp
  7. assignin('base','kd',kd);%赋值给kp
  8. try %% simulink仿真异常,返回一个极大值
  9. y_out=sim('plane_pid2.slx',[0,20]); %使用命令行运行控制系统模型
  10. z=simout.data(end,1); %得到目标函数值
  11. catch
  12. z=1e6;
  13. end

目标函数ok了,下面我对一个很简单的例子的参数进行整定

 另附PSO代码

  1. close all;
  2. clear;
  3. clc;
  4. %惯性因子
  5. wmax=0.9;
  6. wmin=0.4;
  7. %自我、种群学习因子
  8. c1=0.8;
  9. c2=0.5;
  10. %迭代次数、种群大小、维度
  11. gens=20;
  12. np=20;
  13. nd=3;
  14. %范围
  15. kpmax=50;
  16. kpmin=0;
  17. kimax=10;
  18. kimin=0;
  19. kdmax=50;
  20. kdmin=0;
  21. %速度
  22. vmin=-1;
  23. vmax=1;
  24. v=ones(np,nd);
  25. %初始化种群
  26. x=ones(np,nd);
  27. xp_best=1e2*ones(np,nd);
  28. xg_best=[1e2 1e2 1e2];
  29. %种群、全局最优
  30. zp_best=1e6*ones(np,1);
  31. zg_best=1e6;
  32. zz=ones(1,gens);
  33. K_p=ones(1,gens);
  34. K_i=ones(1,gens);
  35. K_d=ones(1,gens);
  36. for i=1:np
  37. %初始化粒子位置
  38. x(i,1)=kpmin+(kpmax-kpmin)*rand;
  39. x(i,2)=kimin+(kimax-kimin)*rand;
  40. x(i,3)=kpmin+(kpmax-kpmin)*rand;
  41. %初始化粒子速度
  42. v(i,:)=vmin+(0.5*rands(1,nd)+0.5)*(vmax-vmin);
  43. z=pso_pid(x(i,1),x(i,2),x(i,3));
  44. %更新个体最优
  45. if z<zp_best(i)
  46. zp_best(i)=z;
  47. xp_best(i,:)=x(i,:);
  48. end
  49. %更新全局最优
  50. if z<zg_best
  51. zg_best=z;
  52. xg_best=x(i,:);
  53. end
  54. end
  55. %开始迭代
  56. iter=0;
  57. for k=1:gens
  58. for i=1:np
  59. v(i,:)=wmax*v(i,:)+c1*rand*(xp_best(i,:)-x(i,:))+c2*rand*(xg_best-x(i,:));
  60. %速度限幅
  61. for j=1:nd
  62. if v(i,j)>vmax
  63. v(i,j)=vmax;
  64. end
  65. if v(i,j)<vmin
  66. v(i,j)=vmin;
  67. end
  68. end
  69. x(i,:)=x(i,:)+v(i,:);
  70. %位置限幅
  71. for j=1:nd
  72. if x(i,1)>kpmax
  73. x(i,1)=kpmax;
  74. end
  75. if x(i,1)<kpmin
  76. x(i,1)=kpmin;
  77. end
  78. if x(i,2)>kimax
  79. x(i,2)=kimax;
  80. end
  81. if x(i,2)<kimin
  82. x(i,2)=kimin;
  83. end
  84. if x(i,3)>kdmax
  85. x(i,3)=kdmax;
  86. end
  87. if x(i,3)<kdmin
  88. x(i,3)=kdmin;
  89. end
  90. end
  91. z=pso_pid(x(i,1),x(i,2),x(i,3));
  92. %更新个体最优
  93. if z<zp_best(i)
  94. zp_best(i)=z;
  95. xp_best(i,:)=x(i,:);
  96. end
  97. %更新全局最优
  98. if z<zg_best
  99. zg_best=z;
  100. xg_best=x(i,:);
  101. end
  102. end
  103. iter = iter+1; % 迭代次数更新
  104. zz(1,iter) = zg_best; % 为绘图做准备
  105. K_p(1,iter) = xg_best(1,1);
  106. K_i(1,iter) = xg_best(1,2);
  107. K_d(1,iter) = xg_best(1,3);
  108. end
  109. figure % 绘制性能指标ITAE的变化曲线
  110. plot(zz,'LineWidth',2)
  111. title('最优个体适应值','fontsize',18);
  112. xlabel('迭代次数','fontsize',18);ylabel('适应值','fontsize',18);
  113. set(gca,'Fontsize',18);
  114. figure % 绘制PID控制器参数变化曲线
  115. plot(K_p)
  116. hold on
  117. plot(K_i,'k','LineWidth',3)
  118. plot(K_d,'--r')
  119. title('Kp、Ki、Kd 优化曲线','fontsize',18);
  120. xlabel('迭代次数','fontsize',18);ylabel('参数值','fontsize',18);
  121. set(gca,'Fontsize',18);
  122. legend('Kp','Ki','Kd');
  123. zg_best
  124. xg_best

得到如下结果

最终的效果,波形图:

Attention:!!!!

翻车了!!!怎么还有超调!!!

—————————————————————等一下———————————————————

  这段原因是,我粒子的种群或者迭代次数不够,或者我的初始范围取得不好。但他跑得很快,曲线还算,,一般吧,但速度真的很快,而且可能会得到全局最优解哦,全局最优解!!!

王维诗里的全局最优解!一般人工调试难以达到这种程度,所以用智能算法整定参数,不香么!!

最后声明:

            代码可直接复制使用,小白也可以!!!

            只要找到想要整定的参数,修改下你相应地仿真!!

            让电脑自己跑吧!!!

 代码和仿真文件可以加q320820676获取。

另外,这是本人的第一篇,内容不算优质,但还会更新更高级的整定方法,解放你的大脑,嘿嘿。

求大佬勿喷,如果方便的话,可以给我一个小小的订阅么,还有很多优质的,网上难以搜索到的资料分享,也可加q与本人交流。

 ————————————————————下期预告——————————————————

———————————————————————————————————————————

1、存在的细节问题,常见的情况解释

2、ADRC控制器参数整定

——————————————————————————————————————————————————————————————————————————————————————

感谢观看!!!!!

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览43103 人正在系统学习中