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,所以这个结果无法返回是空集,才造成数组总是出现错误。
希望我的错误能给各位带来一点好记性。
不要乱改人家的初始模型!!!