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

Hello Mat

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

PID simulink优化仿真(参数传递)

[复制链接]

1277

主题

1500

帖子

85

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22528
发表于 2019-8-19 22:24:13 | 显示全部楼层 |阅读模式
PID simulink优化仿真
适应度函数:
  1. function BsJ = IPID_Fun_6(kp, ki, kd)
  2. global kp ki kd yout
  3. sim('pid_sim.slx');
  4. error = yout-1;
  5. B=0;
  6. for i=1:length(yout)
  7.     if i>1
  8.         erry=yout(i)-yout(i-1);
  9.         if erry<0
  10.             B=B+100*abs(erry);
  11.         end
  12.     end
  13. end
  14. BsJ = (sum(abs(error)) + B )/length(error);
复制代码
响应函数:
  1. function [timef, r, yout]=PID_Fun_6_response(Kpidi)
  2. global kp ki kd yout
  3. sim('pid_sim.slx');
  4. r = ones(size(yout));
  5. % error = yout-r;
  6. timef = [0:10/(length(yout)-1):10]';
复制代码
主函数:
  1. %% 清空环境
  2. clc,clear,close all
  3. warning off
  4. format longG
  5. addpath(genpath('./PID_funtion'))
  6. global kp ki kd yout
  7. %% 参数设置
  8. w = 0.6;      % 惯性因子
  9. c1 = 2;       % 加速常数
  10. c2 = 2;       % 加速常数
  11. Dim = 3;            % 维数
  12. sizepop = 20;       % 粒子群规模
  13. maxiter  = 30;      % 最大迭代次数
  14. MinFit = 1e-9;      % 最小适应值
  15. Vmax = 1;           % 速度最大值
  16. Vmin = -1;          % 速度最小值
  17. %       P  I  D
  18. Ub = [100 500 100];     % PID取值 最大值
  19. Lb = [0.00 0.00 0.00];   % PID取值 最小值
  20. %% 适应度函数
  21. choosed = 6;
  22. if choosed==1
  23.     fun = @(x)PID_Fun_1(x);
  24. elseif(choosed==2)
  25.     fun = @(x)PID_Fun_2(x);
  26. elseif(choosed==3)
  27.     fun = @(x)PID_Fun_3(x);
  28. elseif(choosed==4)
  29.     fun = @(x)PID_Fun_4(x);
  30. elseif(choosed==5)
  31.     fun = @(x)IPID_Fun_5(x);
  32. elseif(choosed==6)
  33.     fun = @(x)IPID_Fun_6(x);
  34. end
  35. %% 粒子群初始化
  36. Range = ones(sizepop,1)*(Ub-Lb);
  37. pop = rand(sizepop,Dim).*Range + ones(sizepop,1)*Lb;    % 初始化粒子群
  38. V = rand(sizepop,Dim)*(Vmax-Vmin) + Vmin;                 % 初始化速度
  39. fitness = zeros(sizepop,1);
  40. for i=1:sizepop
  41.     kp = pop(i,1);
  42.     ki = pop(i,2);
  43.     kd = pop(i,3);
  44.     fitness(i,:) = fun(pop(i,:));                         % 粒子群的适应值
  45. end
  46. %% 个体极值和群体极值
  47. [bestf, bestindex]=min(fitness);
  48. zbest=pop(bestindex,:);   % 全局最佳
  49. gbest=pop;                % 个体最佳
  50. fitnessgbest=fitness;              % 个体最佳适应值
  51. fitnesszbest=bestf;               % 全局最佳适应值

  52. %% 迭代寻优
  53. iter = 0;
  54. y_fitness = zeros(1,maxiter );   % 预先产生4个空矩阵
  55. K_p = zeros(1,maxiter );
  56. K_i = zeros(1,maxiter );
  57. K_d = zeros(1,maxiter );
  58. while( (iter < maxiter ) && (fitnesszbest > MinFit) )
  59.     disp(['当前迭代次数: ', num2str(iter) ])
  60.     for j=1:sizepop
  61.         % 速度更新
  62.         V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
  63.         if V(j,:)>Vmax,
  64.             V(j,:)=Vmax;
  65.         end
  66.         if V(j,:)<Vmin,
  67.             V(j,:)=Vmin;
  68.         end
  69.         % 位置更新
  70.         pop(j,:)=pop(j,:)+w*V(j,:);
  71.         pop(j,:) = lb_ub(pop(j,:),Lb,Ub);
  72.         
  73.         % 适应值
  74.         kp = pop(j,1);
  75.         ki = pop(j,2);
  76.         kd = pop(j,3);
  77.         fitness(j,:) =fun(pop(j,:));
  78.         
  79.         % 个体最优更新
  80.         if fitness(j) < fitnessgbest(j)
  81.             gbest(j,:) = pop(j,:);
  82.             fitnessgbest(j) = fitness(j);
  83.         end
  84.         % 群体最优更新
  85.         if fitness(j) < fitnesszbest
  86.             zbest = pop(j,:);
  87.             fitnesszbest = fitness(j);
  88.         end
  89.     end
  90.     iter = iter+1;                      % 迭代次数更新
  91.     y_fitness(1,iter) = fitnesszbest;         % 为绘图做准备
  92.     K_p(1,iter) = zbest(1);
  93.     K_i(1,iter) = zbest(2);
  94.     K_d(1,iter) = zbest(3);
  95. end
  96. %% 绘图
  97. kp = zbest(1);
  98. ki = zbest(2);
  99. kd = zbest(3);
  100. disp(['PSO最优解', num2str(zbest)])
  101. disp(['PSO最优解对应的目标值', num2str(fitnesszbest)])
  102. fprintf('\n')

  103. figure(1)      % 绘制性能指标ITAE的变化曲线
  104. plot(y_fitness,'LineWidth',3)
  105. title('最优个体适应值','fontsize',10);
  106. xlabel('迭代次数','fontsize',10);ylabel('适应值','fontsize',10);
  107. set(gca,'Fontsize',10);
  108. grid on

  109. figure(2)      % 绘制PID控制器参数变化曲线
  110. plot(K_p,'b-','LineWidth',2); hold on
  111. plot(K_i,'k-.','LineWidth',2)
  112. plot(K_d,'r--','LineWidth',2)
  113. title('Kp、Ki、Kd 优化曲线','fontsize',10);
  114. xlabel('迭代次数','fontsize',10);   ylabel('参数值','fontsize',10);
  115. set(gca,'Fontsize',10);
  116. legend('Kp','Ki','Kd',1);
  117. grid on;hold off;

  118. % PID响应
  119. if choosed==1
  120.     [rint, yout]=PID_Fun_1_response(zbest);
  121. elseif(choosed==2)
  122.     [rint, yout]=PID_Fun_2_response(zbest);
  123. elseif(choosed==3)
  124.     [rint, yout]=PID_Fun_3_response(zbest);
  125. elseif(choosed==4)
  126.     [rint, yout]=PID_Fun_4_response(zbest);
  127. elseif(choosed==5)
  128.     [timef, rint, yout]=PID_Fun_5_response(zbest);
  129. elseif(choosed==6)
  130.     [timef, rint, yout]=PID_Fun_6_response(zbest);
  131. end
  132. figure('color',[1,1,1])
  133. plot(timef, rint,'b-','linewidth',2);hold on;
  134. plot(timef, yout,'r.-','linewidth',2);
  135. axis tight;grid on;
  136. hold off;

  137. err = rint-yout;
  138. figure,
  139. plot(timef, err,'r.-','linewidth',2);
  140. axis tight;grid on;
  141. title('PSO误差值')
  142. xlabel('迭代次数','fontsize',10);   ylabel('误差值','fontsize',10);
  143. hold off;

  144. save PSO.mat
  145. rmpath(genpath('./PID_funtion'))
  146. % rmpath(genpath('./test_function'))
复制代码
simulink模型如下:
参考:

【1】PID simulink优化仿真
【2】如何在simulink中利用优化工具箱(遗传算法)对PID参数优化
【3】百度网盘完整代码 下载链接:https://pan.baidu.com/s/18clJnM64yXIC4llYs8ljvw 提取码:dvub




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-5 02:09 , Processed in 0.246140 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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