opt_steepest-梯度下降法的matlab程序.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
理论 考虑到函数f(x)在点x^((k) )处沿着方向d的方向导数f_d (x^((k) ) )=?f(x^((k) ) )^T d, 其意义为:f(x)在点x^((k) )处沿着方向d的变化率。当f连续可微时,方向导数为负,说明函数值沿着该方向下降;方向导数越小,表明下降越快。因此确定搜索方向d^((k) )的一个想法,就是以f(x)在点x^((k) )点方向导数最小的方向作为搜索方向,即令 d^((k) )=-?f(x^((k) ) ) 因此,把这方法定名为最速下降法。 求解问题〖min〗┬(x∈R^n )?f(x),f∈C^1。 最速下降法的具体步骤为 (1)选定初始点x^((1) ),和给定精度要求ε0,令k=1; (2)若∥?f(x^((k) ) )∥ε,则停,x^*=x^((k) ),否则令d^((k) )=-?f(x^((k) ) ); (3)在x^((k) )处沿方向d^((k) )作线性搜索得x^((k+1) )=x^((k) )+α_k d^((k) ),k=k+1,回2。 若在第三步中,不用近似方法做线搜索,而是用精确线搜索,即 α_k=argmin f (x^((k) )+αd^((k) ) ) “argmin f (x)”,表示f(x)的极小点。 最速下降法,就是求梯度。 例如:求f=(x-y)/(x^2+y^2+2)在(-3,-2)处的梯度。 clc;clear x=-3;y=-2 f=(x-y)/(x^2+y^2+2) fx=diff(f,x)%对x求偏导数 fy=diff(f,y)%对y求偏导数 g=[fx fy]%梯度 g=subs(g)%把符号变量转为数值 function [xo,fo] = Opt_Steepest(f,grad,x0,TolX,TolFun,dist0,MaxIter) % 用最速下降法求最优化解 %输入:f为函数名 grad为梯度函数 %x0为解的初值 TolX,TolFun分别为变量和函数的误差阈值 %dist0为初始步长 MaxIter为最大迭代次数 %输出: xo为取最小值的点 fo为最小的函数值 % f0 = f(x(0)) %%%%%%判断输入的变量数,设定一些变量为默认值 if nargin 7 ? ?MaxIter = 100; %最大迭代次数默认为100 end if nargin 6 ? ?dist0 = 10; %初始步长默认为10 end if nargin 5 ? ?TolFun = 1e-8; %函数值误差为1e-8 end if nargin 4 ? ?TolX = 1e-6; %自变量距离误差 end %%%%%第一步,求解的初值的函数值 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); %求在x处的梯度方向 ? ?%%线性搜索方法确定步长 ? ?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) TolXabs(fx - fx0) TolFun) ? ? ? ?break; ? ?end ? ?x0 = x; ? ?fx0 = fx; end xo = x; fo = fx; if k

文档评论(0)

pengyou2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档