1.编写线性搜索子程序 (1)精确线搜索, 用0.618方法或其它。 function [minx,miny,k]=GoldFind(confun,a,b,ep)%函数名:GoldFind--0.618法,搜索目标函数之极值%参 数:confun--目标函数名 [a,b]--搜索区间(a<b) ep--精度要求%返回值:minx--极值点 miny--极值点函数值 k--迭代次数 if a>=b error('ERROR IN INPUTING!--a<b') breakendt1=a+0.382*(b-a);t2=a+0.618*(b-a);f1=confun(t1);f2=confun(t2);k=1;while 1if 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); endelseif 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 endend minx=(4 * f1 - 3 * f0 - f2) * r / (2 * (2 * f1 - f0 - f2));end miny=confun(minx); Edited by Guassfans 2007-06-30

评论