基于粒子群算法的PID参数优化.docx
《基于粒子群算法的PID参数优化.docx》由会员分享,可在线阅读,更多相关《基于粒子群算法的PID参数优化.docx(16页珍藏版)》请在冰豆网上搜索。
基于粒子群算法的PID参数优化
计算机控制理论与
设计作业
姓名:
学号:
基于粒子群算法的PID参数优化
徐鹏翔1501086控制理论与控制工程3班
摘要:
粒子群算法是计算智能领域,除蚁群算法、鱼群算法之外的一种群体智能优化算法,
本文利用粒子群算法优化PID参数。
选用常用的误差性能指标ITAE作为目标函数,在
MATLAB环境下设计粒子群优化算法,搭建simulink仿真,实现了PID控制器的自动参数
整定。
仿真结果说明,该优化方法得到PID控制器的综合性能优于常规方法得到的PID。
关键词:
粒子群算法;PID;控制;优化;仿真
1引言
在控制工程中,PID控制是最早开展起来的得到广泛应用的控制策略之一,是指将偏差
的比例、积分和微分通过线性组合构成控制量,对被控对象进行控制,具有结构简单、易于
实现、鲁棒性好等特点。
PID控制设计的核心问题就是根据被控对象的不同特性来确定P、
I、D等3个参数的大小。
传统的PID控制参数主要通过人工经验来调整,显然这种方法主
观性太强,移植性差,也不能保证控制最优。
早期用来优化PID控制器参数的方法主要有
Ziegler—Nichols动态特性法、Cohen—Coon响应曲线法、ISE积分平方准那么整定法。
近些年随着智能控制算法的兴起,出现了专家智能型PID参数自整定技术、基于Fuzzy算法的PID
参数自整定技术、基于GA的PID参数自整定技术、基于蚁群算法的PID参数自整定技术
等,与传统方法相比,这些方法都取得了更好的控制效果,但也存在算法复杂、适用性不强等缺乏。
动物群体中信息的社会共享有利于群体在演化中获得优势,以此可以作为开发粒子群算
法的根底。
粒子群算法是一种基于群体的具有全局寻优能力的优化工具,但它没有遗传算法
中用的交叉以及变异等复杂的遗传操作,其简单、易于实现,同时又有深刻的智能背景,既
适合科学研究,又特别适合工程应用。
从粒子群算法的根本原理出发,将其运用到PID控
制器参数优化当中,得到很好的效果。
2PID控制器
2.1PID控制器根本原理
PID控制器通过对反应误差信号进行比例、积分和微分运算,以运算结果的加权和来构
成系统的控制信号,其传递函数描述可写为:
1
G(s)二Kp(1TdS)
TiS
实际中常将控制器中的纯微分环节进行滤波处理,这样
G(s)=KpKi
Z+n
〔1〕
PID控制器的传递函数成为:
〔2〕
其中Kp是比例常数、Ki和Kd分别是积分和微分时间常数,N为一个较大的正数〔文
中取N=50〕。
PID控制器的优化设计,就是寻找适宜的Kp、Kj和Kd在控制系统的快速性
和稳定性之间进行平衡,尽量减小超调量和稳态误差,提高动态响应速度。
2.2PID控制器参数对控制性能的影响
在系统稳定的前提下,加大Kp可以减少稳态误差,但不能消除稳态误差。
因此Kp的整
定主要依据系统的动态性能。
Kp加大,将使系统响应速度加快,Kp偏大时,系统振荡次数
增多,调节时间加长,Kp太小又会使系统的响应速度缓慢。
Kp的选择以输出响应产生4:
1衰
减过程为宜。
积分控制通常和比例控制或比例微分控制联合作用,构成PI控制或PID控制。
积分控制
有助于消除系统稳态误差,提高系统的控制精度,但假设TI太大,积分作用太弱,那么不能减少
余差。
积分控制通常影响系统的稳定性。
TI太小,系统可能不稳定,且振荡次数较多;TI
太大,对系统的影响将削弱;当TI较适合时,系统的过渡过程特性比拟理想。
微分控制通常和比例控制或比例积分控制联合作用,构成PD控制或PID控制。
微分环节
的参加,可以在误差出现或变化瞬间,按偏差变化的趋向进行控制。
它引进一个早期的修正
作用,有助于增加系统的稳定性。
微分时间TD的增加即微分作用的增加可以改善系统的动
态特性,如减少超调量,缩短调节时间等。
适当加大比例控制,可以减少稳态误差,提高控制精度。
但TD值偏大或偏小都会适得其反。
另外微分作用有可能放大系统的噪声,降低系统的抗干扰能力。
3粒子群算法
粒子群算法是Kennedy和Eberhart等受鸟群在寻觅食物时的行为启示,于1995年提出的一
种优化算法。
该算法通过群体之间的信息共享和个体对自身经验的总结来修正个体的行动策略,进而求得优化问题的解。
标准的粒子群算法初始化为一群随机粒子,然后通过迭代找到最优解。
在每一次迭代中,
粒子通过跟踪两个极值〞来更新粒子在空间中的飞行速度和位置。
第一个极值就是当前第i
个粒子本身所找到的最优解,称为个体极值,记为p:
est二pi,p2,…,z。
另一个极值是当前整个种群找到的最优解,称为全局极pgbesthlpi,pi,「P;。
假设将第i个粒子的速度记为
v'=,v2,「v,T,表示一次迭代计算引起的粒子位置变化量。
而每个粒子的位置记为
X’=X:
x2,…,x,。
代表一个优化问题的潜在解。
那么每一次迭代计算中,第i个粒子的速度
和位置由下式来更新:
Vi(t1)=WVi(t)C^PibestQ-XTt))"(pgbesQ-XTt))(3)
(4)
Xi(t1)=Xi(t)Vi(t1)
其中i表示粒子序号,t是迭代次数,n为解空间的维数。
w是一个小于1的常数,称为惯性权重表示过去速度对当前速度的影响,一般在优化初期取值较大,后期逐渐变小;cl和c2是正常数,
称为加速因子,分别用于表示粒子自身的认知(cognitive)和群体中粒子间的信息共享(social),
用于解决全局和局部搜索能力之间的矛盾丁1和r2是[0,1]之间满足正态分布的随机数。
近年
来,Clerc等对标准的粒子群算法进行了改良,提出带收缩因子的粒子群算法。
研究说明,在标准粒子群算法中引入收缩因子,可以提高粒子群算法算法的收敛速度。
带收缩因子的粒子群算
法的速度更新算式写为:
Vi(t1)=(wv'(t)GrdPlbesQ-XYt))C2r2(pgbest(t)-xi(t)))(5)
其中称为收缩因子,典型的收缩因子计算式为:
(6)
2k
|2€=打2_4.|
其中=c1c2,4,k=1。
带收缩因子粒子群算法的位置更新算式与式⑷相同。
PID控制器的优化设计可视为一个多目标的优化问题。
PID的参数整定,就是在控制系统
的快速性与稳定性之间进行折衷。
常规的PID参数整定方法很难同时兼顾多项性能指标,得到
的PID控制器参数通常不是最优的。
而采用粒子群算法来对PID参数进行优化设计,利用粒子
群算法的全局搜索和多目标优化能力,可以克服常规PID参数整定方法的缺点,获得具有满意
性能的PID控制器。
PID参数整定的粒子群算法算法的实现实现步骤具体如下:
步骤1:
初始化。
t=0时,初始化随机地产生由n个粒子组成的种群
P(0)-{P1(0),P2(0)^,Pn(0)},其中
P(°)=[Kp(°),K/(0),心(0)]表示第j个粒子在解空间的坐标量也就是pid控制器的三个待优化的参数。
为使初始的PID参数不至于偏离最优解太远,将每个初始化的PID参数取为Ziegler-Nichols法整定的PID参数值附近的随机数,初始速度V(0)=2(0),V2©M}。
步骤2:
粒子性能评估。
为优化PID参数,本文选取常用的误差性能指标ITAE作为目标函数即:
Qj二.t|e(t)|dt(7)
对每组参数链接simulink仿真并计算目标函数值,评价参数值的优劣。
对于种群中的每个粒子,设个体的最正确位置为Plbest(适应度最小),那么在初始种群中Plbest(0)=P'(0),
j"2找出适应度最小的个体p(°),种群中的最正确位置Pgbe即为Pgbest(0^pk(0^[kp(0),kik(0),k(k(0)]
步骤3:
更新速度和位置。
根据式(5)和式(4)更新当前代中每个粒子的速度和位置。
步骤4:
计算对应的适应度。
根据当前代中每个粒子的位置计算对应的适应度Qj(t),如果Q'(t)2(-1)那么更新
个体的最正确位置Plbest⑴二P(t)。
否那么P|best(t)二p"t-1),j=1,2,,n。
步骤5:
更新当前全局最优解。
寻找当前种群中具有最小
k
Q的粒子,设为第k个粒子。
假设Q(t)Qgbest(t1),那么更新
PgbestO)二Pgbest(t一1)假设终止条件满足(文中设为迭代
全局最正确位置
Pgbest(t)=Pit)
,否那么
次数到达最大值),那么算法结束,否那么t=t+1,转到步骤3。
4被控对象建模
以不稳定系统
H(s)
s+2
s4'8s34s2
(8)
在Matlab的Simulink环境中建立模型如图1所示,文件保存为。
图1中,输出
端口1即为式(7)所示的ITAE指标,通过将时间及误差绝对值的乘积进行积分后得到。
图1系统仿真图
5仿真
取粒子个数100,迭代次数100,惯性权重由到线性递减,加速因子,
C2=2,收缩因子取,为了加快最优解的求取,对经验调试结果进行优化,搜索区
间选取经验包含经验值在内的区间:
scope=[30,40,-0.1,0.1;0.1,0.3,-0.01,0.01;30,50,-0.1,0.1],
依次表示PID各维系数的搜索区间和搜索速度,在Matlab环境中运行相关程序后,得到系
统性能指标ITAE即目标函数的变化曲线如图2,系统单位阶跃响应曲线如图3。
图2目标函数变化曲线
图3系统单位阶跃响应曲线
由图3可见,大约在迭代50次后,控制器参数及性能指标趋于稳定,分别为,
,Kd=33.398,。
在粒子群算法算法过程中,性能指标ITAE不断减小,
粒子群算法不断寻找更优的控制参数以逼近理想最优解,对于不稳定的控制对象,由粒子群
算法设计出的PID控制器使得Kp,Ki和Kd配置合理,很好地控制了对象,到达了预期的效果。
6讨论与结论
本次作业利用粒子群算法优化PID参数,实现了PID参数的自动整定。
在做作业的工
程中也遇到了不少问题,比方matlab程序调试,算法代码实现等等。
在解决这些问题过程
中学到了很多知识,同时也提高了自己研究问题,解决问题的能力。
由于作者水平有限,算
法在实现寻优过程中仍表现的不尽如人意,没有到达理想的效果,有待以后继续深入研究。
尽管如此,粒子群算法在优化PID参数上仍不失为一个很好的工具,简单易行,比拟容易
掌握,使系统具有较好的动态性能。
参考文献
[1]智能优化方法/汪定伟等编著•-北京:
高等教育出版社,
[2]肖理庆,邵晓根,石天明等.利用改良粒子群算法整定PID参数[J].计算机应用,2021,
30(6):
1547-1549
[3]杨智,陈志堂,范正平.基于改良粒子群优化算法的PID控制器整定]J].控制理论与
应用,2021,27(10):
1345-1352
[4]关守平.计算机控制理论与设计[M].沈阳:
东北大学出版社,2021,49:
55
⑸薛定宇?
基于MATLABSimulink的系统仿真技术与应用?
清华大学出版社,2002
附录:
仿真程序
初始化粒子群InitSwarm程序
function[ParSwarm,OptSwarm]=lnitSwarm(SwarmSize,ParticleSize,ParticleScope)
%功能描述:
初始化粒子群,限定粒子群的位置以及速度在指定的范围内
%[ParSwarm,OptSwarm,BadSwarm]=lnitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)
%输入参数:
SwarmSize:
种群大小的个数
%输入参数:
ParticleSize:
一个粒子的维数
%输入参数:
ParticleScope:
一个粒子在运算中各维的范围;
%输岀:
ParSwarm初始化的粒子群,位置速度适应值
%输岀:
OptSwarm粒子群当前最优解与全局最优解
%用法
[ParSwarm,OptSwarm,BadSwarm]=lnitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);
%异常:
首先保证该文件在Matlab的搜索路径中,然后查看相关的提示信息。
%容错控制
formatlong;
%初始化粒子群矩阵
%初始化粒子群矩阵,全部设为[0-1]随机数
ParSwarm=rand(SwarmSize,2*ParticleSize+1);
%对粒子群中位置,速度的范围进行调节
fork=1:
ParticleSize
ParSwarm(:
k)=ParSwarm(:
k)*(ParticleScope(k,2)-ParticleScope(k,1))+ParticleScope(k,1);
%调节速度,使速度与位置的范围一致
ParSwarm(:
ParticleSize+k)=ParSwarm(:
ParticleSize+k)*(ParticleScope(k,4)-ParticleScope(k,3))+ParticleScope(k,3);
end
%对每一个粒子计算其适应度函数的值fangzhen!
!
!
fork=1:
SwarmSize
Kp=ParSwarm(k,1);
Ki=ParSwarm(k,2);
Kd=ParSwarm(k,3);
%启动Simulink
set_param('pidsim2/Gain','Gain',num2str(Kp));
set_param('pidsim2/Gain1','Gain',num2str(Ki));
set_param('pidsim2/Gain2','Gain',num2str(Kd));
[t,x,y1,y2]=sim('pidsim2',0:
100);
ParSwarm(k,2*ParticleSize+1)=y1(end);
end
%初始化粒子群最优解矩阵
OptSwarm=zeros(SwarmSize+1,ParticleSize+1);%粒子群最优解矩阵全部设为零
[minValue,row]=min(ParSwarm(:
2*ParticleSize+1));%寻找适应度函数值最小的解在矩阵中的位置
(行数)
OptSwarm(1:
SwarmSize,1:
ParticleSize+1)
=[ParSwarm(1:
SwarmSize,1:
ParticleSize),ParSwarm(:
2*ParticleSize+1)];
OptSwarm(SwarmSize+1,:
)=[ParSwarm(row,1:
ParticleSize),minValue];
根本的粒子群算法的单步更新位置,速度的算法
function
[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,MaxW,MinW,LoopCount,C
urCount)
%功能描述:
全局版本:
根本的粒子群算法的单步更新位置,速度的算法
%
%[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,MaxW,MinW,
LoopCount,CurCount)
%
%输入参数:
ParSwarm:
粒子群矩阵,包含粒子的位置,速度与当前的适值
%输入参数:
OptSwarm:
包含粒子群个体最优解与全局最优解的矩阵
%输入参数:
ParticleScope:
一个粒子在运算中各维的范围;
%输入参数:
AdaptFunc:
适应度函数
%输入参数:
LoopCount:
迭代的总次数
%输入参数:
CurCount:
当前迭代的次数
%返回值:
含意同输入的同名参数
%
%用法:
[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,MaxW,MinW,L
oopCount,CurCount)
%
%异常:
首先保证该文件在Matlab的搜索路径中,然后查看相关的提示信息。
%
%开始单步更新的操作
(%*********************************************
%*****更改下面的代码,可以更改惯性因子的变化*****
%
%线形递减策略
w=MaxW-CurCount*((MaxW-MinW)/LoopCount);
%
%得到粒子群群体大小以及一个粒子维数的信息
[ParRow,ParCol]=size(ParSwarm);
%得到粒子的维数
ParCol=(ParCol-1)/2;
SubTract仁OptSwarm(1:
ParRow,1:
ParCol)-ParSwarm(:
1:
ParCol);%?
?
get
(%*********************************************
%*****更改下面的代码,可以更改c1,c2的变化*****
c1=2;
c2=2;
%con=1;
%c1=4-exp(-con*abs(mean(ParSwarm(:
2*ParCol+1))-AdaptFunc(OptSwarm(ParRow+1,:
))));%c2=4-c1;
%*****更改上面的代码,可以更改c1,c2的变化*****
(%*********************************************
forrow=1:
ParRow
SubTract2=OptSwarm(ParRow+1,1:
ParCol)-ParSwarm(row,1:
ParCol);
TempV=w.*ParSwarm(row,ParCol+1:
2*ParCol)+2*unifrnd(0,1).*SubTract1(row,:
)+2*unifrnd(0,1).*SubTract2;
%限制速度的代码
forh=1:
ParCol
ifTempV(:
h)>ParticleScope(h,4)
TempV(:
h)=ParticleScope(h,4);
end
ifTempV(:
h)TempV(:
h)=ParticleScope(h,3);
end
end
%更新速度
ParSwarm(row,ParCol+1:
2*ParCol)=TempV;
%*****更改下面的代码,可以更改约束因子的变化*****
%
a=1;
%
%a=0.729;
%*****更改上面的代码,可以更改约束因子的变化*****
°%*********************************************
%限制位置的范围
TempPos=ParSwarm(row,1:
ParCol)+a*TempV;
forh=1:
ParCol
ifTempPos(:
h)>ParticleScope(h,2)
TempPos(:
h)=ParticleScope(h,2);
end
ifTempPos(:
h)<=ParticleScope(h,1)
TempPos(:
h)=ParticleScope(h,1);
end
end
%更新位置
ParSwarm(row,1:
ParCol)=TempPos;
%计算每个粒子的新的适应度值
Kp=ParSwarm(row,1);
Ki=ParSwarm(row,2);
Kd=ParSwarm(row,3);
%启动Simulink
set_param('pidsim2/Gain','Gain',num2str(Kp));
set_param('pidsim2/Gain1','Gain',num2str(Ki));
set_param('pidsim2/Gain2','Gain',num2str(Kd));
[t,x,y1,y2]=sim('pidsim2',0:
100);
ParSwarm(row,2*ParCol+1)=y1(end);
ifParSwarm(row,2*ParCol+1)OptSwarm(row,1:
ParCol)=ParSwarm(row,1:
ParCol);
end
end
%for循环结束
%寻找适应度函数值最小的解在矩阵中的位置(行数),进行全局最优的改变
[minValue,row]=min(ParSwarm(:
2*ParCol+1));
ifOptSwarm(ParRow+1,ParCol+1)>minValue
OptSwarm(ParRow+1,:
)=[ParSwarm(row,1:
ParCol),minValue];
End
一个循环n次的粒子群算法算法完整过程
function
[Result]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,lnitFunc,StepFindFunc,LoopCount)
%功能描述:
一个循环n次的粒子群算法算法完整过程,返回这次运行的最优解
%[Result]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,LoopCount)
%输入参数:
SwarmSize:
种群大小的个数
%输入参数:
ParticleSize:
一个粒子的维数
%输入参数:
ParticleScope:
—个粒子在运算中各维的范围;
%输入参数:
InitFunc:
初始化粒子群函数
%输入参数:
StepFindFunc:
单步更新速度,位置函数
%输入参数:
LoopCount:
迭代的次数
%返回值:
Result为经过迭代后得到的最优解
%异常:
首先保证该文件在Matlab的搜索路径中,然后查看相关的提示信息。
%初始化种群
[ParSwarm,OptSwarm]=lnitFunc(SwarmSize,ParticleSize,ParticleScope);
Result=zeros(LoopCount,ParticleSize+1);
%开始更新算法的调用
fork=1:
LoopCount
%显示迭代的次数:
disp('')
TempStr=sprintf(第%g此迭代',k);
disp(TempStr);
disp('')
%调用一步迭代的算法
[ParSwarm,OptSwarm]=StepFindFunc(ParSwarm,OptSwarm,ParticleScope,O.95,O.45,LoopCount,k);
Result(k,:
)=OptSwarm(SwarmSi