《精通MATLAB最优化算法》混合罚函数法Undefined function 'Funval' for input arguments of type 'sym'.

在运行《精通MATLAB最优化算法》第二版中做混合罚函数法例8-6,运行后出现如下错误

意思是Funval函数未定义,看了看代码整个minMixFun这个m文件代码中确实没有定义这个函数,请问这个例子怎么补充这个Funval代码,或者说希望好心人能教我怎么完成这个例子。下面是minMixFun代码:
function [x,minf] = minMixFun(f,g,h,x0,r0,c,var,eps)
gx0 = Funval(g,var,x0);
if gx0 >= 0
;
else
disp('初始点必须满足不等式约束!');
x = NaN;
minf = NaN;
return;
end

if r0 <= 0
disp('初始障碍因子必须大于0!');
x = NaN;
minf = NaN;
return;
end

if c >= 1 || c < 0
disp('缩小系数必须大于0且小于1!');
x = NaN;
minf = NaN;
return;
end

if nargin == 7
eps = 1.0e-6;
end

FE = 0;
for i=1:length(g)
FE = FE + 1/g(i);
end
FH = transpose(h)*h;

x1 = transpose(x0);
x2 = inf;

while 1
FF = r0*FE + FH/sqrt(r0);
SumF = f + FF ;
[x2,minf] = minNT(SumF,transpose(x1),var);

if norm(x2 - x1)<=eps
x = x2;
break;
else
r0 = c*r0;
x1 = x2;
end
end
minf = Funval(f,var,x);

书里之前章节可定有提到,所以这里直接引用了。具体函数
function fv = Funval(f,varvec,varval)
var = findsym(f);
varc = findsym(varvec);
s1 = length(var);
s2 = length(varc);
m =floor((s1-1)/3+1);
varv = zeros(1,m);

if s1 ~= s2
for i=0: ((s1-1)/3)
k = findstr(varc,var(3*i+1));
index = (k-1)/3;
varv(i+1) = varval(index+1);
end
fv = subs(f,var,varv);
else
fv = subs(f,varvec,varval);
end
将段程序单独存为Funval.m就可以调用了.
望采纳!
温馨提示:答案为网友推荐,仅供参考
相似回答