梯度下降法之二

来源:互联网 发布:com域名和cn域名 编辑:程序博客网 时间:2024/05/17 23:11

我感觉这个步长的求解,有点像信赖域的求解方法:

clc;clear;syms x1 x2;f1=inline('x(1)^2+4*x(2)^2','x');%  grad=inline('[2*x(1),8*x(2)]','x');% x0=[1 1]; %x0 TolX=1e-4; %TolXTolFun=1e-9; %TolFun dist0=0.5;   MaxIter=2; %MaxIter  [xo,fo]=Opt_Steepest(f1,grad,x0,TolX,TolFun,dist0,MaxIter);%xo 

function[xo,fo]=Opt_Steepest(f,grad,x0,TolX,TolFun,dist0,MaxIter)x = x0;  fx0 = feval(f,x0);  fx = fx0; dist = dist0;  kmax1 = 25; %warning = 0;     for  k = 1: MaxIter   g = feval(grad,x);     g = g/norm(g); % dist = dist*2; %%令步长为原步长的二倍 fx1 = feval(f,x-dist*2*g);  for k1 = 1:kmax1    fx2 = fx1;      fx1 = feval(f,x-dist*g);   if fx0 > fx1+TolFun & fx1 < fx2 - TolFun %fx0 > fx1 < fx2    den = 4*fx1 - 2*fx0 - 2*fx2;    num = den - fx0 + fx2;        % 这两步的原因是什么?    dist = dist*num/den;       x = x - dist*g;     fx = feval(f,x); %      break;       else     dist = dist/2;     end  end     if k1 >= kmax1    warning = warning + 1;  else      warning = 0;   end     if warning >= 2|(norm(x - x0) < TolX&abs(fx - fx0) < TolFun)  break;    end    x0 = x;    fx0 = fx; end  xo = x;fo = fx;  if k == MaxIter    fprintf('Just best in %d iterations',MaxIter); end  


0 0
原创粉丝点击