PSO寻优PID粒子群初始化这一步报错(位置1处索引无效/索引超出数组边界)应该如何修改?

CSDN的大神们好:
我的问题是matlab跑PSO寻优PID值代码时,在粒子群初始化这一步一直报错无法进行下去,请大家帮我看看出错在哪里?(代码都是网上抄的伪代码然后修改的)
这是截至到出错位置的主程序

%% 清空环境(第一节)
clear 
clc
%% 参数设置(第二节)
ws=0.9;
we=0.4;       % 惯性因子 线性惯性权重
c1 = 2;       % 加速常数/学习因子1
c2 = 2;       % 加速常数/学习因子2
Dim = 3;                % 维数
SwarmSize = 3;          % 粒子群规模
ObjFun = @PSO_PID;      % 待优化函数句柄
MaxIter = 3;            % 最大迭代次数  
MinFit = 0.00001;       % 最小适应值 
Vmax = 1;
Vmin = -1;
Ub = [100 5000 100];
Lb = [0 0 0];
%% 粒子群初始化(第三节)
    Range = ones(SwarmSize,1)*(Ub-Lb);                               % 初始化范围
    Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb       % 初始化粒子群
    VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin                  % 初始化速度
    fSwarm = zeros(SwarmSize,1);                                     % 初始化粒子群适应值
for i=1:SwarmSize
    fSwarm(i,:) = feval(ObjFun,Swarm(i,:));                         % 定义粒子群的适应值;Swarm(i,:)为行向量
end

 下图是Objfun调用的子程序

function z=PSO_PID(x)
assignin('base','Kp',x(1)); %为指定工作区中的变量赋值;将值 x(1) 赋予 MATLAB 基础工作区中的变量 Kp
assignin('base','Ki',x(2));
assignin('base','Kd',x(3));
[~,~,y_out] = sim('DiscreteFuzzyPID',[0,1]); %使用命令行运行simulink模型
z=y_out(end,1); %返回性能指标

我是一节一节模块进行仿真的,粒子群初始化这一步报错信息如下:

位置 1 处的索引无效。数组索引必须为正整数或逻辑值。

出错 PSO_PID (line 6)
z=y_out(end,1); %返回性能指标

出错 PSO_1discrete (line 24)
    fSwarm(i,:) = feval(ObjFun,Swarm(i,:));

其中调用的simulink模型我就没有附上来了,里面还包括和AMEsim液压联合仿真的部分。

我尝试过把这条语句

z=y_out(end,1);

改成下面三种形式:

z=y_out(:,1); %第一种尝试

z=y_out(1,:); %第二种尝试

z=y_out(1,1); %第三种尝试

z=y_out; %第四种尝试

还是会报错,报错信息如下:

位置2处的索引超出数组边界; %第一种尝试

位置1处的索引超出数组边界; %第二种尝试

位置1处的索引超出数组边界; %第三种尝试

无法执行赋值,因为左侧的大小为 1×1,右侧的大小为 0×0。; %第四种尝试

出错 PSO_1discrete (line 24)
    fSwarm(i,:) = feval(ObjFun,Swarm(i,:));%四次尝试都有的一段错误代码


请大家赐教!不胜感激!

2023.10.17 22:08 第二次更新

我又想到PSO算法是寻找连续函数的最优值问题,所以之所以会报错是不是因为我调用的simulink模型是离散型PID的缘故?

simulink模型如下图:

2023.10.19 10:33 第三次更新

终于发现错误位置在哪儿了!!!

就在图中simulink模型里面缺少一个输出out,也就是适应度值ITAE,所以这个结果无法返回是空集,才造成数组总是出现错误。
希望我的错误能给各位带来一点好记性。

不要乱改人家的初始模型!!!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值