# 求助，matlab这个程序老是报错 ，而且一直弄不明白 ，请大佬帮我解答一下

function [Swarm,J]=fitness(Swarm,J)
global rin yout timef

tz=0.001;
sys=tf(0.03,[8.8825e-12,1.2920e-05,9.1404e-04,0]);
zsys=c2d(sys,tz,'z');
[num,den]=tfdata(zsys,'v');

rin=1.0;
u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
K=[0,0,0]';
error_1=0;
Tup=1;
m=0;
final=100;

for t=1:1:final
timef(t)=t*tz;
r(t)=rin;

u(t)=Swarm(1)*K(1)+Swarm(2)*K(2)+Swarm(3)*K(3);

if u(t)>=10
u(t)=10;
end
if u(t)<=-10
u(t)=-10;
end

yout(t)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;
error(t)=r(t)-yout(t);
%------------ Return of PID parameters -------------
u_3=u_2;u_2=u_1;u_1=u(t);
y_3=y_2;y_2=y_1;y_1=yout(t);

K(1)=error(t); % P
K(2)=(error(t)-error_1)/tz; % D
K(3)=K(3)+error(t)*tz; % I

error_1=error(t);
if m==0
if yout(t)>0.95&yout(t)<1.05
Tup=timef(t);
m=1;
end
end
end

for t=1:1:final
J=J+abs(error(t));
if t>1
erry(t)=yout(t)-yout(t-1);
if erry(t)<0
J=J+100*abs(erry(t));
end
end
end

%%
w=0.6;
c1=2;
c2=2;
Dim=3;
SwarmSize=30;
MaxIter=100;
MinFit=0.1;
Vmax=1;
Vmin=-1;
Ub=[300 300 300];
Lb=[0 0 0];
J=0;
%%初始化
Range=ones(SwarmSize,1)*(Ub-Lb);
Swarm=rand(SwarmSize,Dim).*Range+ones(SwarmSize,1)*Lb;%初始化
Vstep=rand(SwarmSize,Dim)*(Vmax-Vmin)+Vmin;%初始化速度
J=zeros(SwarmSize,1);
for i=1:30
J(i,:)=feval(@fitness,Swarm(i,:));%适应度计算
end
%%个体极值和群体极值
[bestJ, bestindex]=min(J);
zbest=Swarm(bestindex,:);%全局最佳
gbest=Swarm;%个体最佳
fgbest=J;%个体最佳适应度
fzbest=bestJ;%全局最佳适应度
%%迭代寻优
iter=0;
y_fitness=zeros(1,MaxIter);
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;end
if 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
%适应度
J(j,:)=feval(@fitness,Swarm(j,:));
%个体最优更新
if J(j)<fgbest(j)
gbest(j,:)=Swarm(j,:);
fgbest(j)=J(j);
end
%群体最优更新
if J(j)<fzbest
zbest=Swarm(j,:);
fzbest=J(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

J=J+abs(error(t));
...全文
42 回复 打赏 收藏 举报

3867

C/C++ 其它技术问题

2019-08-31 04:00