最优化

function [ x0,f0 ] = opt_golden( f,a,b,tolx,tolfun,k)
%f为函数
%a为区间起点,b为区间终点
%tolx为最优值点检的误差阀值
%tolfun为函数的误差阀值
%k为最大迭代次数
%x0为最优化点值,f0为函数f在x0处的函数值
r=(sqrt(5)-1)/2;%黄金分割点
h=b-a;%区间长度
rh=r*h;
c=b-rh;
d=a+rh;
fc=feval(f,c);
fd=feval(f,d);
 %FEVAL(F,x1,...,xn) evaluates the function specified by a function handle or function name, F,
        %at the given arguments, x1,...,xn.
        %For example, if F = @foo, FEVAL(F,9.64) is the same as foo(9.64).
if k<=0|(abs(h)<tolx&abs(fc-fd)<tolfun)%判断迭代是否终止
   if fc<=fd
      x0=c;
      f0=fc;
   else
       x0=d;
       f0=fd;
   end
   if k==0
       disp('最好设置迭代次数大于0');
   end
else
    if fc<fd
        [ x0,f0 ] = opt_golden( f,a,d,tolx,tolfun,k-1);%将d赋给b,并跳到步骤2,每迭代了一次,k减1
    else 
      [ x0,f0 ] = opt_golden( f,c,d,tolx,tolfun,k-1);%将c赋给a,并跳到步骤2,每迭代了一次,k减1
    end   
end

function [ x0,f0 ] = opt_quadratic( f,x,tolx,tolfun,k)
%f为函数
%x为搜索区间
%tolx为最优值点检的误差阀值
%tolfun为函数的误差阀值
%k为最大迭代次数
%x0为最优化点值,f0为函数f在x0处的函数值
if length(x)~=3
    disp('x的长度必须是3');
    return;
else
    xdata=x(1:3);
    fdata=f(xdata);
    x0=xdata(1);
    x1=xdata(2);
    x2=xdata(3);
    f0=fdata(1);
    f1=fdata(2);
    f2=fdata(3);
end
nd=[f0-f2,f1-f2,f2-f1]*[x1^2,x2^2,x0^2;x1,x2,x0]';%nd是一行两列向量
x3=nd(1)/nd(2);
f3=feval(f,x3);%求二次插值多项式的最小值x3和对应的函数值f3
if k<=0|(abs(x3-x1)<tolx&abs(f3-f1)<tolfun)%判断迭代是否终止
    x0=x3;
    f0=f3;
else
    if x3<x1
        if f3<f1
            xdata=[x0,x3,x1];
            fdata=[f0,f3,f1];
        else
            xdata=[x3,x1,x2];
            fdata=[f3,f1,f2];
        end
       
    else
        if f3<f1
            xdata=[x1,x3,x2];
            fdata=[f1,f3,f2];
        else
            xdata=[x0,x1,x3];
            fdata=[f0,f1,f3];
        end
    end
end
[ x0,f0 ] = opt_quadratic( f,x,tolx,tolfun,k-1);
end

 

posted on 2012-12-24 22:11  旭日-东升  阅读(163)  评论(0)    收藏  举报