《MATLAB智能算法30个案例》:第14章 基于粒子群算法的PID控制器优化设计
1. 前言
《MATLAB智能算法30个案例分析》是2011年7月1日由北京航空航天大学出版社出版的图书,作者是郁磊、史峰、王辉、胡斐。本书案例是各位作者多年从事算法研究的经验总结。书中所有案例均因国内各大MATLAB技术论坛网友的切身需求而精心设计,其中不少案例所涉及的内容和求解方法在国内现已出版的MATLAB书籍中鲜有介绍。《MATLAB智能算法30个案例分析》采用案例形式,以智能算法为主线,讲解了遗传算法、免疫算法、退火算法、粒子群算法、鱼群算法、蚁群算法和神经网络算法等最常用的智能算法的MATLAB实现。
本书共给出30个案例,每个案例都是一个使用智能算法解决问题的具体实例,所有案例均由理论讲解、案例背景、MATLAB程序实现和扩展阅读四个部分组成,并配有完整的原创程序,使读者在掌握算法的同时更能快速提高使用算法求解实际问题的能力。《MATLAB智能算法30个案例分析》可作为本科毕业设计、研究生项目设计、博士低年级课题设计参考书籍,同时对广大科研人员也有很高的参考价值。
《MATLAB智能算法30个案例分析》与《MATLAB 神经网络43个案例分析》一样,都是由北京航空航天大学出版社出版,其中的智能算法应该是属于神经网络兴起之前的智能预测分类算法的热门领域,在数字信号处理,如图像和语音相关方面应用较为广泛。本系列文章结合MATLAB与实际案例进行仿真复现,有不少自己在研究生期间与工作后的学习中有过相关学习应用,这次复现仿真示例进行学习,希望可以温故知新,加强并提升自己在智能算法方面的理解与实践。下面开始进行仿真示例,主要以介绍各章节中源码应用示例为主,本文主要基于MATLAB2015b(32位)平台仿真实现,这是本书第十四章基于粒子群算法的PID控制器优化设计实例,话不多说,开始!
2. MATLAB 仿真示例
打开MATLAB,点击“主页”,点击“打开”,找到示例文件
选中PSO.m,点击“打开”
PSO.m源码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能:基于粒子群算法的PID控制器优化设计示例
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-07-07
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 清空环境
clc
clear all
close all
tic
%% 参数设置
w = 0.6; % 惯性因子
c1 = 2; % 加速常数
c2 = 2; % 加速常数
Dim = 3; % 维数
SwarmSize = 100; % 粒子群规模
ObjFun = @PSO_PID; % 待优化函数句柄
MaxIter = 100; % 最大迭代次数
MinFit = 0.1; % 最小适应值
Vmax = 1;
Vmin = -1;
Ub = [300 300 300];
Lb = [0 0 0];
%% 粒子群初始化
Range = ones(SwarmSize,1)*(Ub-Lb);
Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb % 初始化粒子群
VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin % 初始化速度
fSwarm = zeros(SwarmSize,1);
for i=1:SwarmSize
fSwarm(i,:) = feval(ObjFun,Swarm(i,:)); % 粒子群的适应值
end
%% 个体极值和群体极值
[bestf bestindex]=min(fSwarm);
zbest=Swarm(bestindex,:); % 全局最佳
gbest=Swarm; % 个体最佳
fgbest=fSwarm; % 个体最佳适应值
fzbest=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) && (fzbest > MinFit) )
for j=1:SwarmSize
% 速度更新
VStep(j,:) = w*VStep(j,:) + c1*rand*(gbest(j,:) - Swarm(j,:)) + c2*rand*(zbest - Swarm(j,:));
if VStep(j,:)>Vmax, VStep(j,:)=Vmax; end
if VStep(j,:)<Vmin, VStep(j,:)=Vmin; end
% 位置更新
Swarm(j,:)=Swarm(j,:)+VStep(j,:);
for k=1:Dim
if Swarm(j,k)>Ub(k), Swarm(j,k)=Ub(k); end
if Swarm(j,k)<Lb(k), Swarm(j,k)=Lb(k); end
end
% 适应值
fSwarm(j,:) = feval(ObjFun,Swarm(j,:));
% 个体最优更新
if fSwarm(j) < fgbest(j)
gbest(j,:) = Swarm(j,:);
fgbest(j) = fSwarm(j);
end
% 群体最优更新
if fSwarm(j) < fzbest
zbest = Swarm(j,:);
fzbest = fSwarm(j);
end
end
iter = iter+1; % 迭代次数更新
y_fitness(1,iter) = fzbest; % 为绘图做准备
K_p(1,iter) = zbest(1);
K_i(1,iter) = zbest(2);
K_d(1,iter) = zbest(3);
end
%% 绘图输出
figure(1) % 绘制性能指标ITAE的变化曲线
plot(y_fitness,'LineWidth',2)
title('最优个体适应值','fontsize',18);
xlabel('迭代次数','fontsize',18);ylabel('适应值','fontsize',18);
set(gca,'Fontsize',18);
figure(2) % 绘制PID控制器参数变化曲线
plot(K_p)
hold on
plot(K_i,'k','LineWidth',3)
plot(K_d,'--r')
title('Kp、Ki、Kd 优化曲线','fontsize',18);
xlabel('迭代次数','fontsize',18);ylabel('参数值','fontsize',18);
set(gca,'Fontsize',18);
legend('Kp','Ki','Kd',1);
toc
添加完毕,点击“运行”,开始仿真,输出仿真结果如下:
Swarm =
195.8055 47.2160 202.0895
133.7286 69.2696 182.7919
61.4011 116.2212 197.4790
120.4879 293.4625 19.2929
186.0716 113.9308 268.7536
195.5438 133.3364 101.8596
223.4571 17.7419 234.3860
70.7970 282.2028 95.3370
142.2455 268.7433 184.5191
194.3038 121.4159 49.9367
281.0894 131.9804 123.4967
92.7850 217.1828 156.3636
255.2413 183.9846 168.2143
281.1990 87.8607 144.8740
203.3779 157.0430 118.8032
235.8481 173.2425 96.3721
239.0444 179.0324 14.7789
212.6310 73.5301 98.7241
216.7190 256.8300 191.0523
47.3461 17.1588 219.0706
130.6574 126.7095 231.1595
218.2005 165.3805 35.2635
123.6335 296.4213 170.9616
0.2546 103.0906 126.6415
235.4638 80.0270 293.0413
172.2398 151.8103 84.4837
261.2008 236.6645 117.7225
168.9683 48.8731 58.5119
196.8015 106.9075 19.4771
194.2095 29.2800 113.8576
81.2208 119.3498 78.8253
183.9898 67.8250 25.5394
3.5516 267.6877 18.8853
284.8483 40.3834 206.6355
8.8218 299.7030 228.1685
279.5116 109.1474 47.6189
169.2404 197.3704 133.6233
204.7378 105.4926 57.9108
282.3742 209.8994 83.3171
277.7195 7.7905 107.7900
158.1039 256.8412 85.3742
242.4092 3.9475 113.2864
140.3985 259.4808 9.6336
249.6606 70.6802 174.7448
35.0645 142.3381 125.3878
24.9141 69.8677 171.5339
32.0467 165.8119 111.3328
272.5369 251.8322 119.8119
19.6268 114.4845 67.9131
248.5006 32.1626 125.1273
252.3495 272.8553 15.2949
276.5482 284.9411 63.1297
240.6753 45.9196 40.3757
152.9938 261.9488 163.1968
108.5670 107.6863 6.1402
289.4687 277.3247 4.8510
126.1186 26.8265 183.5973
165.9966 36.2078 266.0314
115.7643 244.9043 225.4437
23.8809 30.2015 240.1302
191.2970 129.2116 250.1982
249.1109 278.9291 48.5851
126.4114 278.0775 212.0028
175.6077 40.3950 111.5218
34.1414 126.5238 249.4187
130.1615 6.8186 190.1207
6.6841 216.3770 196.6588
232.4927 259.5831 101.0894
163.1903 127.7858 87.4738
289.5108 253.9604 239.2742
220.5208 183.1585 132.6336
226.0616 247.9741 148.2276
104.5903 173.4390 3.2099
153.3659 291.6642 194.0195
233.6001 158.6017 122.4647
40.3612 134.4716 108.4265
171.6724 80.1669 288.6640
221.2258 15.4849 13.4902
98.5121 237.1910 13.6267
216.8067 261.5788 116.2652
190.7016 242.3703 294.0177
93.4157 121.2044 68.8571
233.6387 288.4046 114.8184
52.3069 156.4721 259.3962
86.2665 77.4500 148.5548
34.9214 74.7299 276.2062
176.7013 61.8904 240.4013
207.7431 35.9820 185.1071
157.2673 15.7305 137.8125
141.8705 164.9720 279.6028
133.7144 53.6298 215.8449
282.2310 226.1214 146.3943
155.8064 34.4975 245.5115
238.2745 246.6531 245.8652
106.9104 38.2902 165.8477
276.6543 13.9251 133.0425
299.4028 116.7209 280.8942
63.7530 189.1818 193.9213
268.7681 147.8719 148.6455
123.8940 60.3817 65.0004
VStep =
0.5970 0.6817 0.5447
-0.4338 -0.4083 -0.7676
-0.1886 0.7342 -0.1523
0.5134 0.4724 0.2554
0.2737 -0.3152 0.8075
0.1797 -0.2368 -0.3872
0.0237 -0.3494 0.3785
0.0913 -0.4057 0.4843
-0.2993 0.8354 -0.8436
0.4500 0.6992 -0.4529
0.4360 0.1476 0.2202
-0.8593 -0.1862 0.8812
-0.9236 -0.7563 0.4879
0.4916 0.2968 0.1128
0.3847 0.9017 -0.7080
-0.0835 -0.1841 0.9742
0.3043 0.5814 0.7296
0.0387 0.0961 0.3315
-0.6261 -0.4404 -0.9318
0.9565 0.6208 0.8209
0.3207 0.2523 0.1545
0.8297 -0.8748 -0.9392
-0.3462 -0.3901 -0.7898
0.2426 0.9196 0.6032
0.8990 -0.4152 -0.6366
0.2425 0.7750 -0.8268
0.8278 0.6164 -0.7168
0.1254 -0.0904 0.0622
0.2583 0.5696 0.6866
0.7463 0.3485 -0.8229
-0.3801 0.8642 0.4206
0.2988 -0.8517 -0.0742
0.0513 0.7938 -0.7791
0.9475 0.0893 -0.8662
-0.7955 0.3722 -0.7637
0.0993 0.8034 0.2225
-0.6274 -0.7580 0.0780
-0.4589 -0.3719 0.2007
-0.5602 0.6288 -0.0263
-0.7362 -0.5764 -0.2601
-0.7662 0.8168 0.4689
-0.5520 -0.0768 -0.5117
0.1304 -0.8741 0.5438
-0.8606 -0.5922 -0.2132
0.4188 -0.9981 0.0581
0.4951 -0.7395 0.1305
-0.9864 -0.7673 -0.4927
0.2863 -0.6100 0.1154
-0.5172 -0.3693 0.7656
0.5058 0.2444 -0.3679
-0.1777 0.5459 0.6939
0.0431 0.4694 -0.9859
0.4696 -0.5109 0.2262
0.6810 -0.7207 -0.5385
0.0544 -0.8348 0.2172
-0.3772 0.0767 0.9883
0.3503 0.1305 -0.9639
-0.6349 0.8810 0.1246
-0.7760 -0.7621 0.1201
-0.4043 -0.0641 0.3949
0.1179 0.1078 -0.2038
-0.3816 -0.7123 0.3870
-0.8251 0.5763 -0.9769
-0.2106 0.0781 -0.4258
0.3188 -0.8920 -0.2183
0.9781 0.2174 0.8648
0.8793 0.6451 -0.0677
-0.7016 -0.1212 -0.5102
-0.1392 0.1123 0.9495
-0.3065 0.3888 0.7073
0.2868 -0.3206 -0.7552
-0.5007 -0.4859 -0.4443
-0.4060 -0.6077 0.0797
-0.9919 0.7447 0.9545
0.6079 0.8736 0.3121
0.0705 -0.1840 0.5668
0.2884 -0.9727 0.3286
-0.9008 0.7708 -0.2041
0.2913 -0.0757 -0.4229
-0.8333 -0.5589 -0.4093
0.9871 -0.0559 -0.6868
-0.3858 -0.5118 0.1914
0.6119 0.1464 0.2641
-0.0364 0.0766 0.7031
0.4223 0.7366 -0.4125
-0.6667 -0.6561 0.9600
0.7681 -0.1603 0.4505
-0.6375 0.1930 0.3545
0.2995 0.4617 -0.7669
-0.5628 0.9533 0.3223
0.0053 -0.0260 -0.9367
-0.2315 -0.9176 -0.8115
-0.0990 -0.0996 0.1647
-0.5811 -0.0932 0.9262
0.4018 -0.0923 0.3350
-0.0671 0.4472 0.7353
0.5870 0.7893 0.5864
0.4093 -0.7251 0.3725
-0.7187 0.9627 -0.2712
-0.8882 -0.9151 0.7634
警告: PID_Model.mdl, line 18: Unknown character encoding 'ibm-1386_P100-2002' specified for model
'PID_Model'.
> In PSO_PID (line 5)
In PSO (line 37)
时间已过 860.062825 秒。
3. 小结
PID控制器由于算法很简单、鲁棒性高,可靠性能好,被人们广泛应用于工业控制的各个过程中,在实际的生产过程中往往有线性、以及通常说的时变不确定性,很难建立精确的数学模型,常规DE PID控制器通常不能达到理想的控制效果。针对这些问题,长期以来人们一直在寻求PID控制器参数的自整定的技术,以适应复杂和高指标的控制要求。
由于PID控制器存在着各种各样的优点但是又有着许多令人头疼的缺点,例如存在着参数的鲁棒性整定较为困难的问题,许多专家开始寻求一些优化算法来进行PID参数的寻优,例如,自适应智能控制技术方法、神经网络方法以及遗传算法等。传统的遗传算法在理论上已形成了一套较为完善的算法体系并在许多问题中都有了成功的应用,本文采用粒子群算法进行PID参数的整定和优化。对本章内容感兴趣或者想充分学习了解的,建议去研习书中第十四章节的内容。后期会对其中一些知识点在自己理解的基础上进行补充,欢迎大家一起学习交流。