使用黄金分割法确定步长的牛顿法解读.doc

使用黄金分割法确定步长的牛顿法解读.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数学与计算科学学院 实 验 报 告 实验项目名称 使用黄金分割法确定步长的牛顿法 所属课程名称 最优化方法 实 验 类 型 算法编程 实 验 日 期 201 班 级 信 学 号 姓 名 成 绩 一、实验概述: 【实验目的】 掌握Matlab数值计算的基本方法; 掌握最速下降法; 掌握黄金分割法确定步长。 【实验原理】 黄金分割法一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。 黄金分割法是用于一元函数在给定初始区间内搜索极小点的一种方法。它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数,即只在单峰区间内才能进行一维寻优,其收敛效率较低。其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间。具体步骤是:在区间内取点: , 把分为三段。 如果,令; 如果 ,令, 如果|(b-a)/b|和|(y1-y2)/y2|都大于收敛精度ε重新开始。 因为为单峰区间,这样每次可将搜索区间缩小倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。 算法流程图: 图1 2.牛顿法: 设是二次可微实函数,,Hesse矩阵正定。在附近用二次Taylor展开近似, ,为的二次近似。将上式右边极小化,便得: , 这就是牛顿法的迭代公式。 在这个公式里,步长因子。令,则上式也可写成: 显然,牛顿法也可以看成在椭球范数下的最速下降法。 事实上,对于, 是极小化问题 的解。该极小化问题依赖于所取的范数,当采取范数时,,所得方法为最速下降法。当采用椭球范数时, ,所得方法即为牛顿法。 【实验环境】 Windows7 Matlab 7.0 二、实验内容: 【实验方案】 算例: 的极小值, 。 要求: 1、利用使用黄金分割法确定步长的牛顿法 编写一维搜索方法(含黄金分割法确定步长); 2、在使用共轭梯度法梯度法进行搜索时可以调用一维搜索方法。 【实验过程】 黄金分割法程序流程图 牛顿法的改进算法: 给出初始点。第k步迭代为: (1)令,其中: ,如果正定;否则。 (2)计算的Cholesky分解,。 (3)解得。 (4)令 【实验结论(结果)小结结论#include stdlib.h #include stdio.h #include math.h //原函数 #define f(x1,x2) x1*x1+x2*x2-x1*x2-10*x1-4*x2+60 //梯度模 #define tdm(x1,x2) sqrt((2*x1-x2-10)*(2*x1-x2-10)+(2*x2-x1-4)*(2*x2-x1-4)) //x1的偏导数 #define G1(x1,x2) 2*x1-x2-10 //x2的偏导数 #define G2(x1,x2) 2*x2-x1-4 //一维搜索 //进退法求搜索区间 const float eps=0.001; //eps为计算精度; double HJFC(double x1[],double s1[]) { int k=1,i,j; double a0=1,b0=0.5,a1,b1,a[3],f[3],y[3][2],m,n,ak2,c; //a0为初始步长,b0为初始步长增量;a1,b1为进退法确定的最终区间; a[0]=a0; a[1]=a0+b0; for(i=0;i2;i++) for(j=0;j2;j++) y[i][j]=x1[j]+a[i]*s1[j]; for(i=0;i2;i++) f[i]=f(y[i][0],y[i][1]); if(f[0]f[1]) while(k) { b0=2*b0;

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档