Dona1Kio 2023-03-27 11:23 采纳率: 100%
浏览 71
已结题

使用模拟退火粒子群算法时,适应函数无法执行赋值,因为左侧的索引与右侧的大小不兼容

之前也写过一个相对简单点的适应函数,能成功被优化算法调用,但这次写的出现了“无法执行赋值,因为左侧的索引与右侧的大小不兼容”的报错,看了半天也没发现哪里出问题了,求大家解答,急,有偿~

适应函数如下,有很长一部分的调用数据,有些数据在另外的文件里,就不做展示,赋值部分应该没问题。出错的可能在循环部分,里面有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

结果就是如标题一样的报错,报错的图如下:

img

优化的适应函数中参数有6个,最后调用语句也是设置的D=6进行参数个数的设置,可能问题出在适应函数里面,但我确实不太清楚问题在哪,求大手子帮助~

  • 写回答

4条回答 默认 最新

  • Huouayi 2023-03-27 11:35
    关注

    1、检查赋值操作 2、检查变量大小

    然后有几个小错误

    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
    
    
    

    在就是你用了索引“i:1”,会导致大小不匹配

    for i=1:1001
        P_c(i)=3*U_d_in(i).*i_d_in(i)/2;
        Q_c(i)=3*U_d_in(i).*i_q_in(i)/2;
        e_p(i)=(P_m(i)-P_c(i))^2/1001;
        e_q(i)=(Q_m(i)-Q_c(i))^2/1001;
        ep=ep+e_p(i);
        eq=eq+e_q(i);
    end
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。
  • ¥20 CST怎么把天线放在座椅环境中并仿真