正文

Matlab优化程序设计(一)2007-06-30 14:08:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/emath/27225.html

分享到:

 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')
    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

阅读(4598) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册