0001 function [f0, x] = mr_gstep(func0,x,htol0,varargin)
0002
0003
0004
0005
0006
0007
0008 global bayestopt_ options_
0009 persistent h1
0010
0011 gstep_ = options_.gstep;
0012 if nargin<3,
0013 htol = 1.e-6;
0014 else
0015 htol = htol0;
0016 end
0017 func = str2func(func0);
0018 f0=feval(func,x,varargin{:});
0019 n=size(x,1);
0020 h2=bayestopt_.ub-bayestopt_.lb;
0021
0022 if isempty(h1),
0023 h1=max(abs(x),sqrt(gstep_)*ones(n,1))*eps^(1/4);
0024 end
0025
0026 xh1=x;
0027 f1=zeros(size(f0,1),n);
0028 f_1=f1;
0029
0030 i=0;
0031 while i<n,
0032 i=i+1;
0033 h10=h1(i);
0034 hcheck=0;
0035 dx=[];
0036 xh1(i)=x(i)+h1(i);
0037 fx = feval(func,xh1,varargin{:});
0038 it=1;
0039 dx=(fx-f0);
0040 ic=0;
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 icount = 0;
0056 h0=h1(i);
0057 while (abs(dx(it))<0.5*htol | abs(dx(it))>(2*htol)) & icount<10 & ic==0,
0058
0059 icount=icount+1;
0060 if abs(dx(it)) ~= 0,
0061 if abs(dx(it))<0.5*htol
0062 h1(i)=min(0.3*abs(x(i)), 0.9*htol/abs(dx(it))*h1(i));
0063 xh1(i)=x(i)+h1(i);
0064
0065
0066
0067
0068
0069
0070
0071 end
0072 if abs(dx(it))>(2*htol),
0073 h1(i)= htol/abs(dx(it))*h1(i);
0074 xh1(i)=x(i)+h1(i);
0075 end
0076 fx = feval(func,xh1,varargin{:});
0077 it=it+1;
0078 dx(it)=(fx-f0);
0079 h0(it)=h1(i);
0080 if h1(i)<1.e-12*min(1,h2(i)),
0081 ic=1;
0082 hcheck=1;
0083 end
0084 else
0085 h1(i)=1;
0086 ic=1;
0087 end
0088 end
0089 f1(:,i)=fx;
0090 xh1(i)=x(i)-h1(i);
0091
0092
0093
0094
0095
0096
0097
0098
0099 fx = feval(func,xh1,varargin{:});
0100 f_1(:,i)=fx;
0101
0102
0103
0104
0105 if hcheck & htol<1,
0106 htol=min(1,max(min(abs(dx))*2,htol*10));
0107 h1(i)=h10;
0108 xh1(i)=x(i);
0109 i=i-1;
0110 else
0111 gg=zeros(size(x));
0112 hh=gg;
0113 gg(i)=(f1(i)'-f_1(i)')./(2.*h1(i));
0114 if abs(f1(i)+f_1(i)-2*f0)>1.e-12,
0115 hh(i) = abs(1/( (f1(i)+f_1(i)-2*f0)./(h1(i)*h1(i)) ));
0116 else
0117 hh(i) = 1;
0118 end
0119
0120 if gg(i)*(hh(i)*gg(i))/2 > htol,
0121 [f0 x fc retcode] = csminit(func0,x,f0,gg,0,diag(hh),varargin{:});
0122 end
0123 xh1=x;
0124 end
0125 save gstep
0126 end
0127
0128 save gstep
0129
0130
0131