%函数名:GoldFind--0.618法,搜索目标函数之极值
%参 数:confun--目标函数名 [a,b]--搜索区间(a<b) ep--精度要求
%返回值:minx--极值点 miny--极值点函数值 k--迭代次数
if a>=b
error('ERROR IN INPUTING!--a<b')
break
end
t1=a+0.382*(b-a);
t2=a+0.618*(b-a);
f1=confun(t1);
f2=confun(t2);
k=1;
while 1
if f1<=f2
if t2-a<ep
minx=t1;
break
else
b=t2;
t2=t1;
t1=b-0.618*(b-a);
f2=f1;
f1=confun(t1);
end
elseif b-t1<ep
minx=t2;
break
else
a=t1;
t1=t2;
t2=a+0.618*(b-a);
f1=f2;
f2=confun(t2);
end
k=k+1;
end
miny=confun(minx);
(2)非精确线搜索。至少选择一种搜索准则,用二次插值,或三次插值,或二次+三次插值求解。
function [minx,miny,k]=SecInsert(confun,r)
%函数名:SecInsert--二次插值,搜索目标函数之极值
%参 数:confun--目标函数名 r--搜索步长
%返回值:minx--极值点 miny--极值点函数值 k--迭代次数
f0=confun(0);
f1=confun(r);
k=1;
if f1<f0
f2=confun(2*r);
while f2<f1
f1=f2;
r=2*r;
f2=confun(r);
k=k+1;
end
minx=(4 * f1 - 3 * f0 - f2) * r / (2 * (2 * f1 - f0 - f2));
else
while 1
f2=f1;
r=r/2;
f1=confun(r);
k=k+1;
if f1>f0
break
end
end
minx=(4 * f1 - 3 * f0 - f2) * r / (2 * (2 * f1 - f0 - f2));
end
miny=confun(minx);
Edited by Guassfans 2007-06-30
评论