我利用二次差值来求一个目标函数的最优解。求解的程序没有什么问题,但就是最后输出地时候会多输出出一个ans:,请大家帮我看看是什么原因。多谢了。
下面是定义的目标函数:
function y=fun01(x)
y = x^4 - 5*x^3 - 4*x^2 - 6*x + 60 ;
下面是差值的主程序:
%以为搜索中的二次插值法
%x1,x2,x3,h,p分别是函数y=f(x)单谷区间中的变量,并且有 x1 < x2 < x3 , 且 f(x1) > f(x2) < f(x3)。
%h 是搜索的步长,p 是差值的精度。
%所有函数在极值处都可以用二次函数来近似。
%利用此函数来求极值时需要在外面自行定义目标函数,并且是一函数文件的形式定义。
function [x0,y0]=eccz( fun , x1 , x2 , x3 , h , p )
y1 = feval( fun , x1 ); y2 = feval( fun , x2 ); y3 = feval( fun , x3 );
c1 = ( y3 - y1 )/( x3 - x1 ); c2 = ( ( y2 - y1 )/( x2 - x1 ) - c1 )/( x2 - x3);
xp = 0.5 * ( x1 + x3 - c1 / c2 ); yp = feval( fun , xp );
while abs(( y2 - yp )/y2) > p
if ( xp - x2 ) * h > 0
if y2 >= yp
x1 = x2; y1 = y2; x2 = xp; y2 = yp;
else
x3 = xp; y3 = yp;
end
else
if y2 >= yp
x3 = x2; y3 = y2; x2 = xp; y2 = yp;
else
x1 = xp; y1 = yp;
end
c1 = ( y3 - y1 )/( x3 - x1 ); c2 = ( ( y2 - y1 )/( x2 - x1 ) - c1 )/( x2 - x3);
xp = 0.5 * ( x1 + x3 - c1 / c2 ); yp = feval( fun , xp );
end
end
if y2 < yp
x0 = x2; y0 = y2;
else
x0 = xp; y0 = yp;
end
disp(['最优值的坐标是:' num2str(x0) ])
disp(['最优解是:' num2str(y0) ])
下面是在matlab里的输出结果:
>> eccz('fun02',4,4.5,5,0.01,0.001)
最优值的坐标是:4.7111
最优解是:-1
ans =
4.7111
最后面为什么会出现一个ans啊?在我的程序里我没有找到会出现它的地方(所有语句后面都打了分号的),但是就算出现了为什么只输出了x0而没有输出y0呢?请高手指点迷津。我是matlab7,会不会是版本的问题呢?