基于果蝇算法的PID整定Word格式文档下载.docx
- 文档编号:22115134
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:30
- 大小:518.44KB
基于果蝇算法的PID整定Word格式文档下载.docx
《基于果蝇算法的PID整定Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于果蝇算法的PID整定Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
二、两种方法的PID整定(这一部分为了结论更有说服力,每种方法运行三次,以排除随机性)
1、遗传算法
遗传算法是一种新型的、模拟生物进化机制的随机化搜索和优化方法,具有并行计算、全局收敛、编码操作等特点。
由于其算法结构的开放性,易于与问题结合,便于运算,已成功的应用于求解多种复杂的优化问题,遗传算法的特点使得将其运用于PID参数的优化是可行的。
两种算法所选取最优指标一样,为了获得满意的过度动态特性,采用了误差绝对值时间积分性能作为参数选择的最小目标函数,为了防止控制能量过大,在目标函数中加入了控制输入的平方项,选用下式作为参数选择的最优指标:
式中e(t)为系统误差。
u(t)为控制器输出,tu为上升时间,W1,W2,W3为权值。
PID各系数的取值范围kp<
100,ki<
1,kd<
1.
以下列传递函数作为对象:
程序见附录1。
经过MATLAB仿真得到如下曲线:
图2.1遗传算法第一组
图2.2遗传算法第二组
图2.3遗传算法第三组
由上面三个结果可知,遗传算法在整定问题上效果不够好。
遗传算法的缺点:
1、遗传算法的编程实现比较复杂,首先需要对问题进行编码,找到最优解之后还需要对问题进行解码,
2、另外三个算子的实现也有许多参数,如交叉率和变异率,并且这些参数的选择严重影响解的品质,而目前这些参数的选择大部分是依靠经验.
3、没有能够及时利用网络的反馈信息,故算法的搜索速度比较慢,要得要较精确的解需要较多的训练时间。
4、算法对初始种群的选择有一定的依赖性,能够结合一些启发算法进行改进。
5、算法的并行机制的潜在能力没有得到充分的利用,这也是当前遗传算法的一个研究热点方向。
2、果蝇算法
本例中最优指标同上:
传递函数同上:
种群大小:
30;
迭代次数:
100
同样运行三次程序(附录2)得到如下图:
图2.4果蝇算法第一组
图2.5果蝇算法第二组
图2.6果蝇算法第三组
由上图可以看到果蝇算法的曲线优于遗传算法,但是仍然不够理想。
果蝇算法的缺点在于,它容易陷入局部寻优,出现早熟现象。
三、改进FOA
由上面得到的结论可知,我们希望得到在尽量少的代数里得到最优值。
所以需要对FOA进行改进,方法为改进步长,即
其中h为搜索步长,rand为0~1之间的随机数。
通过改进的FOA仿真(程序见附录3)可得:
图3.1改进FOA第一组
图3.2改进FOA第二组
图3.3改进FOA第三组
四、总结
1、果蝇算法与遗传算法相比优点:
程序简单,时间短,容易达到要求。
2、缺点:
容易陷入局部最优,且只适用于较为简单的系统。
3、改进FOA:
用增加步长的方式进行改进,防止陷入局部最优,可实现全局最优,从曲线看,效果优于FOA及遗传算法。
附录1
遗传算法:
主程序
%GA(GenericAlgorithm)ProgramtooptimizePIDParameters
clearall;
closeall;
tic;
globalrinyouttimef%定义3个全局变量
Size=30;
%种群大小
CodeL=3;
%种群个体长度
MinX
(1)=zeros
(1);
%P最小为0
MaxX
(1)=20*ones
(1);
%P最大为20
MinX
(2)=zeros
(1);
%I最小为0
MaxX
(2)=1.0*ones
(1);
%I最大为1
MinX(3)=zeros
(1);
%D最小为0
MaxX(3)=1.0*ones
(1);
%D最大为1
Kpid(:
1)=MinX
(1)+(MaxX
(1)-MinX
(1))*rand(Size,1);
%编码
2)=MinX
(2)+(MaxX
(2)-MinX
(2))*rand(Size,1);
3)=MinX(3)+(MaxX(3)-MinX(3))*rand(Size,1);
G=100;
%迭代次数
BsJ=0;
%***************StartRunning***************
forkg=1:
1:
G
time(kg)=kg;
%******Step1:
EvaluateBestJ******
fori=1:
Size
Kpidi=Kpid(i,:
);
[Kpidi,BsJ]=pid_gaf(Kpidi,BsJ);
BsJi(i)=BsJ;
end
[OderJi,IndexJi]=sort(BsJi);
BestJ(kg)=OderJi
(1);
BJ=BestJ(kg);
Ji=BsJi+1e-10;
%Avoidingdevidingzero
fi=1./Ji;
%Cm=max(Ji);
%fi=Cm-Ji;
[Oderfi,Indexfi]=sort(fi);
%Arrangingfismalltobigger
Bestfi=Oderfi(Size);
%LetBestfi=max(fi)
BestS=Kpid(Indexfi(Size),:
%LetBestS=E(m),mistheIndexfibelongtomax(fi)
kg;
BJ;
BestS;
%******Step2:
SelectandReproductOperation******
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size);
%SelectingBiggerfivalue
r=Size-sum(fi_S);
Rest=fi_Size-fi_S;
[RestValue,Index]=sort(Rest);
fori=Size:
-1:
Size-r+1
fi_S(Index(i))=fi_S(Index(i))+1;
%AddingresttoequalSize
end
k=1;
1%SelecttheSizethandReproducefirstly
forj=1:
fi_S(i)
TempE(k,:
)=Kpid(Indexfi(i),:
%SelectandReproduce
k=k+1;
%kisusedtoreproduce
%************Step3:
CrossoverOperation************
Pc=0.90;
fori=1:
2:
(Size-1)
temp=rand;
ifPc>
temp%CrossoverCondition
alfa=rand;
TempE(i,:
)=alfa*Kpid(i+1,:
)+(1-alfa)*Kpid(i,:
TempE(i+1,:
)=alfa*Kpid(i,:
)+(1-alfa)*Kpid(i+1,:
TempE(Size,:
)=BestS;
Kpid=TempE;
%************Step4:
MutationOperation**************
Pm=0.10-[1:
Size]*(0.01)/Size;
%Biggerfi,smallerPm
Pm_rand=rand(Size,CodeL);
Mean=(MaxX+MinX)/2;
Dif=(MaxX-MinX);
CodeL
ifPm(i)>
Pm_rand(i,j)%MutationCondition
TempE(i,j)=Mean(j)+Dif(j)*(rand-0.5);
%GuaranteeTempE(Size,:
)belongtothebestindividual
Bestfi;
BestS;
Best_J=BestJ(G)
toc;
figure
(1);
plot(time,BestJ);
title('
最优指标'
)
xlabel('
Times'
ylabel('
BestJ'
figure
(2);
plot(timef,rin,'
r'
timef,yout,'
b'
阶跃响应'
Time(s)'
rin,yout'
调用程序
function[Kpidi,BsJ]=pid_gaf(Kpidi,BsJ)
globalrinyouttimef
ts=0.001;
sys=tf(400,[1,1,100]);
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=100;
fork=1:
P
timef(k)=k*ts;
r(k)=rin;
u(k)=Kpidi
(1)*x
(1)+Kpidi
(2)*x
(2)+Kpidi(3)*x(3);
ifu(k)>
=10
u(k)=10;
ifu(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);
%------------ReturnofPIDparameters-------------
u_2=u_1;
u_1=u(k);
y_2=y_1;
y_1=yout(k);
x
(1)=error(k);
%CalculatingP
x
(2)=(error(k)-error_1)/ts;
%CalculatingD
x(3)=x(3)+error(k)*ts;
%CalculatingI
error_2=error_1;
error_1=error(k);
ifs==0
ifyout(k)>
0.95&
yout(k)<
1.05
tu=timef(k);
s=1;
Ji(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;
B=B+Ji(i);
ifi>
1
erry(i)=yout(i)-yout(i-1);
iferry(i)<
B=B+100*abs(erry(i));
BsJ=B+0.2*tu*10;
附录2
普通FOA:
%function[BESTP,BESTI,BESTD]=FOA(kp,ki,kd,K,T)
%***清空运行环境
clc
clear
%tic;
%K=2;
%T=13;
kp=5;
ki=0.1;
kd=0.1;
sys=tf(400,[1,50,0]);
%***初始果蝇个体飞行距离
%***初始果蝇群体位置
X_axis=[kp,ki,kd];
maxgen=100;
sizepop=30;
%种群规模
%***果蝇寻优开始,利用嗅觉寻找食物。
forp=1:
sizepop
A(p,1)=X_axis(1,1)+(rand(1,1));
ifA(p,1)<
100&
A(p,1)>
X(p,1)=A(p,1);
A(p,2)=X_axis(1,2)+0.01*(rand(1,1));
ifA(p,2)<
1&
A(p,2)>
X(p,2)=A(p,2);
A(p,3)=X_axis(1,3)+0.1*(rand(1,1));
ifA(p,3)<
A(p,3)>
X(p,3)=A(p,3);
%***利用味道浓度判定函数求出味道浓度
x=[0,0,0];
u(k)=X(p,1)*x
(1)+X(p,2)*x
(2)+X(p,3)*x(3);
BsJ(p)=B+0.2*tu*10;
Smell(p)=BsJ(p);
[bestSmellbestindex]=min(Smell);
%***利用视觉寻找味道浓度最高的种群。
X_axis=X(bestindex,:
Smellbest=bestSmell;
%————————————————果蝇迭代寻优——————————————————
forgen=1:
maxgen
%***利用嗅觉寻找食物
%***利用视觉寻找味道浓度最大的种群
ifbestSmell<
Smellbest
%bestS=S(bestindex,:
yy(gen)=Smellbest;
Xbest(gen,:
)=X_axis;
figure
(1)
plot(yy)
disp(Xbest(gen,:
))
disp(Smellbest)
%—————程序结束——————————————
附录3
改进FOA:
number=1;
A(p,1)=X_axis(1,1)+number*(2*rand(1,1)-1);
A(p,2)=X_axis(1,2)+0.01*number*(2*rand(1,1)-1);
A(p,3)=X_axis(1,3)+0.1*number*(2*rand(1,1)-1);
e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 果蝇 算法 PID
![提示](https://static.bdocx.com/images/bang_tan.gif)