查看: 131|回复: 5|关注: 0

[已解决] MATLAB 为什么报错“数组索引必须为正整数或逻辑值。”?

[复制链接]

新手

7 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
下面是源代码
function y=f(x)%%%%%%待优化函数% %%%%%%%

y=(1+(x(1)+x(2)+1).^2.*(19-14*x(1)+3*x(1).^2-14*x(2)+6*x(1).*x(2)+3*x(2).^2))...

.*(30+(2*x(1)-3*x(2)).^2.*(18-32*x(1)+12*x(1).^2+48*x(2)-36*x(1).*x(2)+27*x(2).^2));

end

function bas()%

clear all;

close all

%%%初始化%%%

eta=0.95;%步长衰减因子;

c=5;%天牛步长step和两须距离d0之间的比;

step=1;%步长;

n=150;%迭代数;

record=zeros(n,1);%记录每次迭代得到的最优值fbest;

k=2;%维度;

thresh=[-2,2;-2,2];%变量取值区间;

for i=1:k

x(i)=thresh(i,1)+(thresh(i,2)-thresh(i,1))*rand;

end

xbest=x;%将最初位置初始化为最佳位置;

fbest=f(xbest);

display(['0:','xbest=[',num2str(xbest),'],fbest=',num2str(fbest)])

%%%%%%%迭代部分%%%%%%%

for i=1:n

%%%%%核心代码%%%%%%%

d0=step/c;%d0天牛两须之间的距离;

dir=rand(1,k);%天牛右须指向左须的向量的朝向;

dir=dir/(eps+norm(dir));

xleft=x+dir*d0;

xright=x-dir*d0;

fleft=f(xleft);

fright=f(xright);

x=x-step*dir*sign(fleft-fright);%下一步的位置

%%%%%%%%%%%%

f=f(x);

if f<fbest

xbest=x;

fbest=f;

end

display([num2str(i),':xbest=[',num2str(xbest),'],fbest=',num2str(fbest)])

step=step*eta;%步长衰减

record(i)=fbest;

end

%%%%%%%数据显示部分%%%%%%%

figure(1),

clf(1),

plot(record,'b--.','linewidth',2);

xlabel('iteration');

ylabel('minimum value')




matlab中错误

matlab中错误

论坛优秀回答者

0

主题

503

帖子

97

最佳答案
  • 关注者: 19
发表于 4 天前 | 显示全部楼层 |此回复为最佳答案
在matlab2019b版本只报错
Error: File: army.m Line: 57 Column: 1
Declaring a variable with the same name as the local function "f" is not supported in scripts.


if f<fbest

xbest=x;

fbest=f;
改为
if fs<fbest

xbest=x;

fbest=fs;
即可出结果
微信图片_20200114184638.png

论坛优秀回答者

0

主题

503

帖子

97

最佳答案
  • 关注者: 19
发表于 4 天前 | 显示全部楼层
完整程序
clear all;

close all

%%%初始化%%%

eta=0.95;%步长衰减因子;

c=5;%天牛步长step和两须距离d0之间的比;

step=1;%步长;

n=150;%迭代数;

record=zeros(n,1);%记录每次迭代得到的最优值fbest;

k=2;%维度;

thresh=[-2,2;-2,2];%变量取值区间;

for i=1:k

x(i)=thresh(i,1)+(thresh(i,2)-thresh(i,1))*rand;

end

xbest=x;%将最初位置初始化为最佳位置;

fbest=f(xbest);

display(['0:','xbest=[',num2str(xbest),'],fbest=',num2str(fbest)])

%%%%%%%迭代部分%%%%%%%

for i=1:n

%%%%%核心代码%%%%%%%

d0=step/c;%d0天牛两须之间的距离;

dir=rand(1,k);%天牛右须指向左须的向量的朝向;

dir=dir/(eps+norm(dir));

xleft=x+dir*d0;

xright=x-dir*d0;

fleft=f(xleft);

fright=f(xright);

x=x-step*dir*sign(fleft-fright);%下一步的位置

%%%%%%%%%%%%

fs=f(x);

if fs<fbest

xbest=x;

fbest=fs;

end

display([num2str(i),':xbest=[',num2str(xbest),'],fbest=',num2str(fbest)])

step=step*eta;%步长衰减

record(i)=fbest;

end

%%%%%%%数据显示部分%%%%%%%

figure(1),

clf(1),

plot(record,'b--.','linewidth',2);

xlabel('iteration');

ylabel('minimum value')
function y=f(x)%%%%%%待优化函数% %%%%%%%

y=(1+(x(1)+x(2)+1).^2.*(19-14*x(1)+3*x(1).^2-14*x(2)+6*x(1).*x(2)+3*x(2).^2))...
.*(30+(2*x(1)-3*x(2)).^2.*(18-32*x(1)+12*x(1).^2+48*x(2)-36*x(1).*x(2)+27*x(2).^2));

end

新手

7 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
 楼主| 发表于 4 天前 | 显示全部楼层
20141303 发表于 2020-1-14 18:48
完整程序
clear all;

好的,谢谢,我用实时脚本运行出的错误,用您改过的在命令窗口运行可以了,您能用实时脚本运行下看看有问题吗?

论坛优秀回答者

0

主题

503

帖子

97

最佳答案
  • 关注者: 19
发表于 4 天前 | 显示全部楼层
和正常脚本文件一样,同一个错误,方法如上
微信图片_20200114215401.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

快速回复 返回顶部 返回列表