Matlab程序提示未定义func1?这是什么情况?

这是一本书上所给的MATLAB源代码,目的是利用标准遗传算法求函数极值,程序如下
NP = 50;
L = 20 ;
Pc = 0.8 ;
Pm = 0.1;
G = 100 ;
Xs = 10;
Xx = 0;
f = randi(NP,L);
%%%%%%%%%%%%%%%循环%%%%%%%%%%
for k = 1:G
for i = 1 : NP
U = f(i,:);
m = 0;
for j = 1:L
m = U(j)*2^(j-1)+m;
end
x(i) = Xx + m *(Xs - Xx)/(2^L - 1);
Fit(i) = func1(x(i));
end
maxFit = max(Fit);
minFit = min(Fit);
rr = find(Fit == maxFit);
fBest = f(rr(1,1),:);
xBest = x(rr(1,1));
Fit = (Fit - minFit)/(maxFit - minFit);
%%%%%%%%Copy%%%%%
sum_Fit = sum(Fit);
fitvalue = Fit./sum_Fit;
fitvalue = cumsum(fitvalue);
ms = sort(rand(NP,1));
fiti = 1;
newi = 1;
while newi <= NP
if (ms(newi)) < fitvalue(fiti)
nf(newi,:) = f(fiti,:);
newi = newi + 1;
else
fiti = fiti + 1;
end
end
%%%%%%%%%%交叉%%%%%%%
for i = 1 : 2 : NP
p = rand;
if p < Pc
q = randin(1,L);
for j = 1 : L
if q(j) == 1
temp = nf(i+1,j);
nf(i+1,j)=nf(i,j);
nf(i,j) = temp;
end
end
end
end
%%%%%%%%%变异%%%%%%
i = 1;
while i <= round(NP*Pc)
h = randi(1,1,[1,NP]);
for j = 1 : round(L*Pc)
g = randi(1,1,[1,L]);
nf(h,g) =~ nf(h,g);
end
i = i + 1;
end
f = nf;
f(1,:) = fBest;
trace(k) = maxFit;
end
xBEst;
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%%%%%%适应度函数%%%
function result = func1(x)
fit = x + 10*sin(5*x) + 7 * cos(4*x);
result = fit;
end

问题:func1并没有定义 ,为什么可以在后面直接使用
这个代码是要直接写在Command window里 还是建立.m文件写在里面,如何运行?
程序源代码就是上面这些 ,应该如何更改才能运行 ,希望大牛们能给初学者一点指导,谢谢~

qq_花开花谢_0
浏览 702回答 3
3回答

慕沐林林

这个问题我也遇到,这本书我也有,解决如下,看代码的最后部分,是一个适应度函数,这个函数需要自己定义下,采用能,报错就是这个问题,1、首先把function result =func1(x)fit=x+10*sin(5*x)+7*cos(4*x);result=fit;end这段代码写入M文件,然后放在你运行代码的工作目录中,注意名字不要改,还用func12、再运行代码全部代码,就可以了,还可能存在警告randint函数的问题,不用改成randi,randi是不能产生你需要的二进制染色体编码的。

阿晨1998

将最底下那个函数剪切到另一个.m文件中作为调用函数func1,然后运行主程序,应该就可以了

森栏

函数文件一般是在指令窗口或者脚本文件中调用,不可直接运行。 先定义t和y 再调用函数 Lorenz(t,y)
打开App,查看更多内容
随时随地看视频慕课网APP