基于遗传算法的PID控制器参数整定报告
一、 遗传算法。
遗传算法(GAs)是基于自然界生物进化机制的搜索寻优技术。用遗传算法来整定PID参数,可以提高优化性能,对控制系统有良好的控制精度、动态性能和鲁棒性。 一般的,Gas包括三个基本要素:复制、交叉和突变。
二、PID Optimal-Tuning
PID控制:对偏差信号e(t)进行比例、积分和微分运算变换后形成的一种控制规律。
t 1d u t (1) KpetedTdetTi0dt 可调参数:比例度δ(P)、 积分时间Ti(I)、微分时间Td(D)。 通常,PID控制准则可以写成下面传递函数的形式:
G(s)Kp(1sTds) (2) TiKp、Ti和Td分别是比例放大率、积分时间常量和微分时间常量。 1) 比例控制(P):是一种最简单的控制方式。其控制器的输出与输
入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady state error),比例度减小,稳态误差减小;
2) 积分(I)控制:在积分控制中,控制器的输出与输入误差信号
的积分成正比关系。
3) 微分(D)控制:在微分控制中,控制器的输出与输入误差信号
的微分(即误差的变化率)成正比关系。
文中,性能指标是误差平方的时间加权积分,表示为:
tiJtke2dt,(k0,1,,n) (3)
0其中n是非负整数,ti是积分周期。此外,其他标准项如超调量、上升时间和稳定时间
也被一个合成性能指标选择:
Jc(1os)(crtrcsts) (4)
os、tr、ts分别代表超调量、上升时间和稳定时间。cr、cs两个系数有用户定义或决
定。预期的性能指标的最下化可以认为是小的超调量、短的上升时间和稳定时间。
三个PID参数的编码方式如下:
S:10101011 10101000 11100111
Kp Ki Kd
Kp、Ki和Kd都是八位二进制字符格式。
自适应函数的选择关系到性能指标,如: FF(J)1 (5) J10实际上,F(J)可以是任何一个能切实表达F和J关系的非线性函数。
遗传操作是模拟生物基因遗传的操作,从优化搜索的角度而言,遗传操作可使问题的解一代一代地优化,并逼近最优解,主要包括三个遗传算子:选择、交叉和变异。关于他们的具体方法这里不在赘述。
三、 计算机实现
作者编程使用的事TURBO C。程序包括两个部分:一个是仿真PID控制系统的闭环阶跃响应;另一个是实施对一代所有成员的遗传算法的仿真,这里遗传算法将一代作为一个整体。在第一代生物的二进制代码随机产生之后,这个过程重复直至迭代次数达到预选的次数。
步长、PID参数范围、性能指标、自适应函数和方法得时间延迟都是从一个文件中读取。而遗传算法的的参数,诸如世代数、交叉概率、变异概率、选择概率等通过菜单选择。 整个闭环系统仿真的完成可以用四阶龙格库塔法或直接时域计算。在程序中,复制的实现是通过轮盘赌博法的线性搜索,面积加权于上一代成员的适应值。交叉发生在每一对复制产生的成员。
交叉操作是将一个随机产生的一个在0到1之间数与交叉概率比较决定是否需要交叉。如果需要交叉,则在1到47之间随机产生一个交叉位置代码。变异,对新一代所有成员都随机产生一个0到1之间的数与变异概率比较,然后再决定是否改变代码的一位。同理,反转也是这样判定和操作的。另一需要说明的事,两个反转位置代码是在1~48之间随机选择的。同样,依据随机的预选概率,预选操作是用好的后代取代不好父代。除了这些基本操作,另一个过程叫做存储也在程序中进行,它是存储老一代适应值高的成为新一代。
程序实现过程列出如下:
(1) 将KP、Ki和Kd三个参数编码成二进制字符串; (2) 生成第一代成员编码成字符串;
(3) 将字符串解码成三个参数:KP、Ki和Kd; (4) 计算所有的传递函数;
(5) 使用四阶龙格库塔仿真闭环系统的阶跃响应; (6) 计算自适应函数;
(7) 用轮盘赌博法复制(繁殖)新一代的48位二进制字符串; (8) 交叉,对新一代中每对进行交叉操作,交叉位置随机产生; (9) 变异,依据变异概率对新一代所以成员进行变异操作; (10) 反转,依据反转概率对新一代所以成员进行反转操作; (11) 预选,依据预选概率对新一代所以成员进行反转操作; (12) 存储老一代中自适应值高的使之成为新一代; (13) 重复(3)~(12),迭代直至结果被接受。
在程序中,不同的性能指标可以选择,如误差的平方时间加权的积分。通过改变性能指标组合或增加一些系数来改变那些不完全满足要求的成员的适应值。
四、数值例子
在这里研究者共做了四个数值例子。使用了ZN和遗传两种算法,对于遗传算法每个例子分别又使用了三个性能指标函数:J0(ISE)、J()和J(-crcs1.0)。4ITSEcwhere(注:由于论文中只是指出了Jc的表达式,其他数据都是取自于其他论文。所以在后面的数值仿真中,本文只使用自适应函数为Jc来进行实现PID参数整定。)
Example 2 P2(S)e0.33S/[(10.3S)(10.44S)];
研究者的数值结果详见附录参考文献。 本人对文中第二个例子进行了仿真:样本个数为30,采用二进制编码方式,交叉概率:Pc=0.6,变异概率:Pm=0.001,种群大小M=30,终止迭代进化次数G=100。得到最佳样本Bests=[1011100011 0110111111 1101101101];
最终PID参数整定为
Ki=15.5816;Ki=0.9912;Kd=0.7136。
图1为系统阶跃响应,图2为目标函数J的优化过程。
五、结论
通过对仿真结果的对比,发现GA得到的结果总是好于ZN。GA成功的降低了不希望的超调量并且达到较少的上升和稳定时间。可以有效的解释作者提出的工作指标效果更好,在例1和例2中得到了充分的体现。
图1 带延迟的二阶系统的阶跃响应
图2 目标函数J的优化过程
MATLAB主程序:
%基于GA(Generic Algorithm)算法的PID参数整定 clear all; close all;
global rin yout timef G=100;%迭代次数 Size=30;%种群大小 CodeL=10;%编码长度/3 MinX(1)=zeros(1); MaxX(1)=20*ones(1); MinX(2)=zeros(1); MaxX(2)=1.0*ones(1); MinX(3)=zeros(1); MaxX(3)=1.0*ones(1);
E=round(rand(Size,3*CodeL)); %初始化编码 BsJ=0;
for kg=1:1:G time(kg)=kg;
for s=1:1:Size %译码 m=E(s,:); y1=0;y2=0;y3=0; m1=m(1:1:CodeL); for i=1:1:CodeL
y1=y1+m1(i)*2^(i-1); end
Kpid(s,1)=(MaxX(1)-MinX(1))*y1/1023+MinX(1); m2=m(CodeL+1:1:2*CodeL); for i=1:1:CodeL
y2=y2+m2(i)*2^(i-1); end
Kpid(s,2)=(MaxX(2)-MinX(2))*y2/1023+MinX(2); m3=m(2*CodeL+1:1:3*CodeL); for i=1:1:CodeL
y3=y3+m3(i)*2^(i-1); end
Kpid(s,3)=(MaxX(3)-MinX(3))*y3/1023+MinX(3);
%****** 第一步 1 : 评估个体 BestJ(个体编码)****** Kpidi=Kpid(s,:);
[Kpidi,BsJ]=pidzd(Kpidi,BsJ); %调用M文件 BsJi(s)=BsJ; end
[OderJi,IndexJi]=sort(BsJi); BestJ(kg)=OderJi(1);
BJ=BestJ(kg); Ji=BsJi+1e-10; fi=1./Ji; [Oderfi,Indexfi]=sort(fi); Bestfi=Oderfi(Size); BestS=Kpid(Indexfi(Size),:); Bestfi=Oderfi(Size); BestS=E(Indexfi(Size),:); kg BJ BestS;
%****** 第二步 : 选择和复制操作n****** fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size; fi_S=floor(fi_Size); kk=1;
for i=1:1:Size
for j=1:1:fi_S(i)
TempE(kk,:)=E(Indexfi(i),:); kk=kk+1; end end
%************ 第三步 :交叉操作 ************ pc=0.60;
n=ceil(20*rand); for i=1:2:(Size-1) temp=rand;
if pc>temp %交叉条件 for j=n:1:20
TempE(i,j)=E(i+1,j); TempE(i+1,j)=E(i,j); end end end
TempE(Size,:)=BestS; E=TempE;
%************ 第四步: 变异操作 ************** pm=0.001-[1:1:Size]*(0.001)/Size; for i=1:1:Size
for j=1:1:3*CodeL temp=rand;
if pm>temp %变异条件 if TempE(i,j)==0 TempE(i,j)=1;
else
TempE(i,j)=0; end end end end
TempE(Size,:)=BestS; E=TempE;
%******************************************************* end
Bestfi %最大适应值 BestS %最佳个体编码 Kpidi %参数整定结果
Best_J=BestJ(G)%迭代最后种群规模 figure(1);
plot(time,BestJ);%种群规模随时间的变化 xlabel('Times');ylabel('Best_J'); figure(2);
plot(timef,rin,'r',timef,yout,'b');
xlabel('Time(s)');ylabel('rin,yout');%单位阶跃响应
子程序:
function [Kpidi,BsJ]=pidzd (Kpidi,BsJ) global rin yout timef ts=0.001;%采样时间
sys=tf(12.5,[1,2.58,12.5]);
dsys=c2d(sys,ts,'z'); [num,den]=tfdata(dsys,'v');
rin=1.0; %输入的信号 u_1=0.0;u_2=0.0; y_1=0.0;y_2=0.0; x=[0,0,0]'; B=0;
error_1=0;
tu=1; s=0;
P=1000; for k=1:1:P
timef(k)=k*ts; r(k)=rin;
u(k)=Kpidi(1)*x(1)+Kpidi(2)*x(2)+Kpidi(3)*x(3); %控制规律 if u(k)>=10 u(k)=10; end
if u(k)<=-10 u(k)=-10; end
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; %差分方程形式 error(k)=r(k)-yout(k); %控制方案 %------------ 返回PID参数 ------------- u_2=u_1;u_1=u(k); y_2=y_1;y_1=yout(k);
x(1)=error(k); % 计算 P x(2)=(error(k)-error_1)/ts; % 计算 D 微分 x(3)=x(3)+error(k)*ts; % 计算 I 积分 error_2=error_1; error_1=error(k); if s==0
if yout(k)>0.95&yout(k)<1.05 tu=timef(k); s=1; end end end
for i=1:1:P
Ji(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;
B=B+Ji(i); if i>1
erry(i)=yout(i)-yout(i-1); if erry(i)<0
B=B+100*abs(erry(i)); end end end
BsJ=B+0.2*tu*10; plot(time,BestJ);%种群规模随时间的变化 xlabel('Times');ylabel('Best_J'); figure(2);
plot(timef,rin,'r',timef,yout,'b');
xlabel('Time(s)');ylabel('rin,yout');%单位阶跃响应
因篇幅问题不能全部显示,请点此查看更多更全内容