关于(微粒群)pso优化pid
小女子我在做毕业设计时,遇到了个大难题,是关于pso优化pid的,有哪位高手可以指点下么? 万分感谢...
具体题目:
利用标准PSO算法(带惯性权重的PSO算法)、带收缩因子的PSO算_\带交叉因子的改进PSO算法 分别实现PID控制器的控制参数的优
化与计算机仿真
[ 本帖最后由 hunan 于 2007-5-19 18:22 编辑 ] 有什么具体问题? 就是要个matlab的程序 优化一个pid的函数 你qq多少类 ..加下我吧 39383685 clear;
x0=;%x=
c1=1.495;c2=1.495;n=3;group=50;Dmax=100;
% Vmm=;
Vmm=[-2.5 2.5;-2.5 2.5;-2.5 2.5];%可以为负吗
Xmm=;
X=zeros(n,group);V=zeros(n,group);
% omega=zeros(1,group);
% e=0.001;
X(1,:)=x0(1)+5*rand(1,group);V(1,:)=Vmm(1,1)+5*rand(1,group);
X(2,:)=x0(2)+5*rand(1,group);V(2,:)=Vmm(2,1)+5*rand(1,group);
X(3,:)=x0(3)+5*rand(1,group);V(3,:)=Vmm(3,1)+5*rand(1,group);
P_p=X;globe=zeros(n,Dmax);
%%%评价每个粒子适应值,寻找出 P_globle
for j=1:group
xx=X(:,j)';
% fz(j)=J_ITAE(xx);
fz(j)=J_ITAE_discrete(xx);
end
=min(fz);%P_g1*1 ?
globe(:,1)=X(:,I);
for itrtn=1:Dmax
omega=0.739;
r1=rand(1);r2=rand(1);
for i=1:group
V(:,i)=omega*V(:,i)+c1*r1*(P_p(:,i)-X(:,i))+c2*r2*(globe(itrtn)-X(:,i));
end
X=X+V;%先虑出位置,如果先是速度虑出,则位置虑出的受速度影响。
for i=1:group
%compare each dimension of V
for row=1:n
if X(row,i)>Xmm(row,2)
X(row,i)=Xmm(row,2);
elseif X(row,i)<Xmm(row,1)
X(row,i)=Xmm(row,1);
else
end
end
end
for i=1:group
%compare each dimension of V
for row=1:n
if V(row,i)>Vmm(row,2)
V(row,i)=Vmm(row,2);
elseif V(row,i)<Vmm(row,1)
V(row,i)=Vmm(row,1);
else
end
end
end
for k=1:group
xx=X(:,j)';
% fz1(k)=J_ITAE(xx);
fz1(j)=J_ITAE_discrete(xx);
if fz1(k)<fz(k)
P_p(:,k)=X(:,k);
fz(k)=fz1(k);
end
if fz(k)<P_g
P_g=fz(k);
end
end
=min(fz);
Ess(itrtn)=P_g1;
% globe=P_p(:,I);
globe(:,itrtn+1)=X(:,I)
% if P_g1<e
% break;
% end
end
kp=globe(1,100);ti=globe(2,100)/globe(1,100);td=globe(3,100)/globe(2,100);T=0.5;
globe_0=;
kp_0=globe_0(1);ti_0=globe_0(2)/globe_0(1);td_0=globe_0(3)/globe_0(2);
numpid=;denpid=;G_pid=tf(numpid,denpid);
numpid_0=;denpid_0=;G_pid_0=tf(numpid_0,denpid_0);
=pade(T,4);G_exp=tf(numz,denz);
numd=();dend=();G_d=tf(numd,dend);
G_c=feedback(G_d*G_pid,G_exp);step(G_c,'b');hold on
G_c_0=feedback(G_d*G_pid_0,G_exp);step(G_c_0,'r') ;
functionq=J_ITAE(x)%(x,ht)
% axis();
Kp=x(1);Ki=x(2);Kd=x(3);
Ti=Kp/Ki;Td=Kd/Kp;
T=0.5
numpid=;denpid=;
=pade(T,4);
numd=();dend=();
% num=conv(conv(numpid,numd),denz);xyj
% num=conv(conv(numpid,numd),numz); jsx1
num=conv(conv(numpid,numd),denz);%jsx2
den1=conv(conv(denpid,dend),denz);
den2=conv(conv(numpid,numd),numz);
den=den1+den2;
% t=0:0.1:50;xyj
t=0:0.1:100;
% ii=find(t>=T);
% =step(num,den,t);
% y=;
% y(1:length(t)-ii(1)+1)];
% if (ht==1) plot(t,y,'-');
% end
% if (ht==2) plot(t,y,'--');
% end
q=0;tt=0;
for j=1:501
q=q+abs(1-y(j))*tt*0.1;
tt=tt+0.1;
end
end 原帖由 hunan 于 2007-5-29 21:29 发表 http://www.chinavib.com/forum/images/common/back.gif
你qq多少类 ..加下我吧 39383685
不好意思,我的QQ纯用于闲聊
另,今后matlab问题请到matlab讨论区去问 我做的毕业设计也是粒子群优化PID参数的,我找了一个粒子群的源程序,结合了PID程序,但是不能运行,请大侠帮忙给我改改,万分感谢
程序如下:
size=30;
code=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);
c1=1.4962; %学习因子1
c2=1.4962; %学习因子2
w=0.7298; %惯性权重
MaxDT=200; %最大迭代次数
D=3; %搜索空间维数(未知数个数)
N=40; %初始化群数个体数目
eps=10; %设置精度
%――――初始化种群的个体(可以在这里设置位置和速度的范围)―――
fori=1:N
for j=1:D
X(i,j)=randn; %随机初始化位置
V(i,j)=randn; %随机初始化速度
end
end
%―――先计算各个粒子的适应度,并初始化pi和pg―――
for i=1:N
p(i)=pid_gaf(x(i,:));
y(i,:)=x(i,:);
end
pg=x(1,:); %pg为全局最优
fori=2:N
ifpid_gaf(x(I,:),D)<pid_gaf(pg,D)
pg=x(i,:);
end
end
%―――进入主要循环,按照公式依次迭代,直到满足精度要求―――
fort=1:maxDT
fori=1:N
v(i,:)=w*v(i,:)+c1*rand(y(i,:)-x(i,:)) +c2*rand*(pg-x(i,: ));
x(i,: )=x(i,:)+v(i,:);
if pid_gaf(x(i,:),D)<p(i)
p(i)=pid_gaf(x(i,:),D);
y(i,: )=x(i,:);
end
if p(i)<fitness(pg,D)
pg=y(i,:);
end
pbest(t)=fitness(pg,D);
end
%最后给出计算结果。
Figure(1);
Xlabel('time');
Ylabel('best j');
Figure(2);
Polt(timef,rin,'r',timef,yout,'b');
Xlabel('Time(s)');
Ylabel('rin,yout');
%子程序
function=pid_gaf(x(i,:))
global rin yout timef
ts=0.001; %采样时间
sys=tf(400,); %传递函数
dsys=c2d(sys,ls,'z'); %将传递函数进行Z变换
=tfdata(dsys,'v');
rin=1.0;
u_1=0.0;u_2=0.0;
y_1=0.0;y_2=0.0;
x=;
b=0;
error_1=0;
tu=1;
s=0;
p=100;
for k=1:1:p
timef(k)=k*ts;
r(k)=rin;
u(k)=kpidi(i)*x(1)+kpidi(2)*x(2)+kpid(3)*x(3);
ifu(k)>=10
u(k)=10;
end
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);
%-----return of PID parameters--------
u_2=u_1;u_1=u(k);
y_2=y_1;y_1=yout(k);
x(1)=error(k); %calculating p
x(2)=(error(k)-error(k)_1)/ts; %calculating D
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;
end
end
end
for i=1:1:P
ji(i)=abs(error(i))
b=b+ji(i);
ifi>1
error(i)=yout(i)-yout(i-1);
if erry(i)<0
b=b+100*abs(erry(i));
end
end
end 你给出的这个程序错误无数,根本没办法修改,没有什么参考价值
回复 8楼 风花雪月 的帖子
可是你给的程序肯定无法运行。。。。
页:
[1]