之前也写过一个相对简单点的适应函数,能成功被优化算法调用,但这次写的出现了“无法执行赋值,因为左侧的索引与右侧的大小不兼容”的报错,看了半天也没发现哪里出问题了,求大家解答,急,有偿~
适应函数如下,有很长一部分的调用数据,有些数据在另外的文件里,就不做展示,赋值部分应该没问题。出错的可能在循环部分,里面有6个从优化算法里调用的参数,分别为x(1)到x(6):
function F=fitness(x)
%% 赋值部分
dt=0.001;
R0=3.7454e-4;
L0=9.9351e-5;
Ee1=0;Ee2=0;
ep=0;eq=0;
dUdc=zeros(1000,1);
i_d_ref=zeros(1000,1);
di_d=zeros(1000,1);
U_d_ref=zeros(1000,1);
P_c=zeros(1001,1);
Q_c=zeros(1001,1);
e_p=zeros(1001,1);
e_q=zeros(1001,1);
Udc_in= evalin('base' , 'Udc' );
Udc_ref_in= evalin('base' , 'Udc_ref' );
U_d_in= evalin('base' , 'U_d' );
i_d_in= evalin('base' , 'i_d' );
i_q_in= evalin('base' , 'i_q' );
dUt_in= evalin('base' , 'dUt' );
Ut_ref_in= evalin('base' , 'Ut_ref' );
w0_in= evalin('base' , 'w0' );
P_m= evalin('base' , 'Pt' );
Q_m= evalin('base' , 'Qa' );
%% 循环部分
for i=1:1000
if dUt_in(i,1)< 0.1*Ut_ref_in
i_q_in(i+1,1)=0;
else
i_q_in(i+1,1)= x(5)*dUt_in(i,1);
end
dUdc(i,1) = Udc_ref_in - Udc_in(i,1);
i_d_ref(i,1)= x(1)*dUdc(i,1)+ x(2)*Ee1;
Ee1=Ee1+dUdc(i,1);
di_d(i,1)=i_d_ref(i,1)-i_d_in(i,1);
U_d_ref(i,1)= x(3)*di_d(i,1)+ x(4)*Ee2;
Ee2=Ee2+di_d(i,1);
i_d_in(i+1,1)=i_d_in(i,1)+dt*(U_d_ref(i,1)-U_d_in(i,1)+L0*w0_in(i,1).*i_q_in(i,1)-R0*i_d_in(i,1))/L0;
Udc_in(i+1,1)=Udc_in(i,1)+dt*(566.53-3*U_d_in(i,1).*i_d_in(i,1)/2/Udc_in(i,1))/x(6);
end
for i=1:1001
P_c(i:1)=3*U_d_in(i:1).*i_d_in(i:1)/2;
Q_c(i:1)=3*U_d_in(i:1).*i_q_in(i:1)/2;
e_p(i:1)=(P_m(i:1)-P_c(i:1))^2/1001;
e_q(i:1)=(Q_m(i:1)-Q_c(i:1))^2/1001;
ep=ep+e_p(i:1);
eq=eq+e_q(i:1);
end
%% 优化目标
F=ep+eq;
end
模拟退火粒子群算法是从书上找到的,程序应该没问题,如下:
function [xm,fv]=SimuAPSO(fitness,N,c1,c2,lamda,M,D)
%待优化的目标函数:fitness
%粒子数目:N
%学习因子1:c1
%学习因子2:c2
%退火常数:lamda
%最大迭代次数:M
%自变量的个数:D
%目标函数取最小值时的自变量值:xm
%目标函数的最小值:fv
format long;
for i=1:N
for j=1:D
x(i,j)=randn;
v(i,j)=randn; %随机初始化位置
end
end
for i=1:N
p(i)=fitness(x(i,:)); %**报错的位置 **
y(i,:)=x(i,:);
end
pg=x(N,:); %Pg为全局最优
for i=1:(N-1)
if fitness(x(i,:))<fitness(pg)
pg=x(i,:);
end
end
T=fitness(pg)/log(5); %初始温度
for t=1:M
groupFit=fitness(pg);
for i=1:N %当前温度下各个Pi的适应值
Tfit(i)=exp(-(p(i)-groupFit)/T);
end
SumTfit=sum(Tfit);
Tfit=Tfit/SumTfit;
pBet=rand();
for i=1:N %用轮盘赌策略确定全局最优的某个替代值
ComFit(i)=sum(Tfit(1:i));
if pBet<=ComFit(i)
pg_plus=x(i,:);
break
end
end
C=c1+c2;
ksi=2/abs(2-C-sqrt(C^2-4*C)); %速度压缩因子
for i=1:N
v(i,:)=ksi*(v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg_plus-x(i,:)));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:))<p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
T=T*lamda; %退温操作
end
xm=pg';
fv=fitness(pg);
最后通过下面语句进行目标优化:
[xm,fv]=SimuAPSO(@fitness,100,2.05,2.05,0.5,1000,6);
%[xm,fv]=SimuAPSO(@fitness, N, c1, c2, lamda, M, D)
%待优化的目标函数:fitness
%粒子数目:N
%学习因子1:c1
%学习因子2:c2
%退火常数:lamda
%最大迭代次数:M
%自变量的个数:D
%目标函数取最小值时的自变量值:xm
%目标函数的最小值:fv
结果就是如标题一样的报错,报错的图如下:
优化的适应函数中参数有6个,最后调用语句也是设置的D=6进行参数个数的设置,可能问题出在适应函数里面,但我确实不太清楚问题在哪,求大手子帮助~