使用黄金分割法确定步长的牛顿法解析Word文档格式.docx
《使用黄金分割法确定步长的牛顿法解析Word文档格式.docx》由会员分享,可在线阅读,更多相关《使用黄金分割法确定步长的牛顿法解析Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
a1,a2把[a,b]分为三段。
①如果f(a1)>
f(a2),令a=a1,a1=a2,a2=a+0.618*(b-a);
②如果f(a1)<
f(a2),令b=a2,a2=a1,a1=b-0.618*(b-a);
如果|(b-a)/b|和|(y1-y2)/y2|都大于收敛精度ε重新开始循环。
因为[a,b]为单峰区间,这样每次可将搜索区间缩小0.618倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。
插入点原理图如下:
算法流程图:
图1
2.牛顿法:
设
是二次可微实函数,
,Hesse矩阵
正定。
在
附近用二次Taylor展开近似
,
为
的二次近似。
将上式右边极小化,便得:
,这就是牛顿法的迭代公式。
在这个公式里,步长因子
。
令
,则上式也可写成:
显然,牛顿法也可以看成在椭球范数
下的最速下降法。
事实上,对于
是极小化问题
的解。
该极小化问题依赖于所取的范数,当采取
范数时,
,所得方法为最速下降法。
当采用椭球范数
时,
,所得方法即为牛顿法。
【实验环境】
Windows7
Matlab7.0
二、实验内容:
【实验方案】
算例:
的极小值,
要求:
1、利用使用黄金分割法确定步长的牛顿法
编写一维搜索方法(含黄金分割法确定步长);
2、在使用共轭梯度法梯度法进行搜索时可以调用一维搜索方法。
【实验过程】
1.黄金分割法程序流程图
2.牛顿法的改进算法:
给出初始点
第k步迭代为:
(1)令
,其中:
,如果
正定
;
否则。
(2)计算
的Cholesky分解,
(3)解
得
(4)令
【实验结论】
(结果)
【实验小结】
(收获体会)
这次实验,使最优化方法这门课的一些理论知识与实践相结合,更加深刻了我对这门课的认识,巩固了我的理论知识。
我个人得到了不少的收获,一方面加深了我对课本理论的认识,另一方面也提高了个人对于实际问题的解答能力。
对于牛顿法和黄金分割法的原理与应用有个深刻认识,也将老师在课堂上的讲解真正的融会贯通,这次的实验非常有意义.
三、指导教师评语及成绩:
评语
评语等级
优
良
中
及格
不及格
1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强
2.实验方案设计合理
3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻)
4实验结论正确.
成绩:
指导教师签名:
批阅日期:
附录1:
源程序
#include<
stdlib.h>
stdio.h>
math.h>
//原函数
#definef(x1,x2)x1*x1+x2*x2-x1*x2-10*x1-4*x2+60
//梯度模
#definetdm(x1,x2)sqrt((2*x1-x2-10)*(2*x1-x2-10)+(2*x2-x1-4)*(2*x2-x1-4))
//x1的偏导数
#defineG1(x1,x2)2*x1-x2-10
//x2的偏导数
#defineG2(x1,x2)2*x2-x1-4
//一维搜索
//进退法求搜索区间
constfloateps=0.001;
//eps为计算精度;
doubleHJFC(doublex1[],doubles1[])
{
intk=1,i,j;
doublea0=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;
i<
2;
i++)
for(j=0;
j<
j++)
y[i][j]=x1[j]+a[i]*s1[j];
i++)
f[i]=f(y[i][0],y[i][1]);
if(f[0]>
f[1])
while(k)
{
b0=2*b0;
a[2]=a[1]+b0;
y[2][j]=x1[j]+a[2]*s1[j];
f[2]=f(y[2][0],y[2][1]);
if(f[2]>
{
m=a[0];
n=a[2];
k=0;
}
else
{
k=1;
a[1]=a[2];
f[1]=f[2];
}
else
while(k)
a[2]=a[0]-b0;
if(f[2]>
f[0])
m=a[2];
n=a[1];
a[0]=a[2];
f[0]=f[2];
}
//黄金分割法求最佳步长
a1=m;
b1=n;
a[0]=n-0.618*(n-m);
a[1]=m+0.618*(n-m);
for(i=0;
for(j=0;
y[i][j]=x1[j]+a[i]*s1[j];
f[i]=f(y[i][0],y[i][1]);
do
if(f[0]<
{
n=a[1];
a[1]=a[0];
f[1]=f[0];
a[0]=n-0.618*(n-m);
y[0][j]=x1[j]+a[0]*s1[j];
f[0]=f(y[0][0],y[0][1]);
}
{
m=a[0];
a[0]=a[1];
f[0]=f[1];
a[1]=m+0.618*(n-m);
j++)
y[1][j]=x1[j]+a[1]*s1[j];
f[1]=f(y[1][0],y[1][1]);
}
c=(n-m)/(b1-a1);
}while(fabs(c)>
eps);
ak2=(m+n)/2;
returnak2;
}
//共轭梯度法
voidmain()
doublex[2],s[2],g[4],bita,arph;
//x数组为函数解的转置矩阵;
s数组为搜索方向的转置矩阵;
g数组为梯度转置矩阵;
arph为最优步长;
intk=1;
//k为迭代次数;
//赋初值;
printf("
请输入初始x1、x2:
\n\n"
);
scanf("
%d%d"
&
x[0],&
x[1]);
过程如下:
g[0]=G1(x[0],x[1]);
g[1]=G2(x[0],x[1]);
while(tdm(x[0],x[1])>
eps)
//迭代终止准则;
if(k==1)
{
s[0]=-g[0];
s[1]=-g[1];
bita=0;
bita=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]);
s[0]=-g[0]+bita*s[0];
s[1]=-g[1]+bita*s[1];
arph=HJFC(x,s);
x[0]=x[0]+arph*s[0];
x[1]=x[1]+arph*s[1];
g[2]=g[0];
g[3]=g[1];
第%d次迭代:
k);
步长steplength=%f\t"
arph);
bb=%f\t\n"
bita);
x[0]=%f\tx[1]=%f\n\n\n"
x[0],x[1]);
k++;
k--;
最后结果为:
\n"
最优解为:
\nx[0]=%f\nx[1]=%f\n最小值为:
min=%f\n迭代次数为:
n=%d\n"
x[0],x[1],f(x[0],x[1]),k);
}
附录2:
实验报告填写说明
1.实验项目名称:
要求与实验教学大纲一致。
2.实验目的:
目的要明确,要抓住重点,符合实验教学大纲要求。
3.实验原理:
简要说明本实验项目所涉及的理论知识。
4.实验环境:
实验用的软、硬件环境。
5.实验方案(思路、步骤和方法等):
这是实验报告极其重要的内容。
概括整个实验过程。
对于验证性实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。
对于设计性和综合性实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。
对于创新性实验,还应注明其创新点、特色。
6.实验过程(实验中涉及的记录、数据、分析):
写明具体实验方案的具体实施步骤,包括实验过程中的记录、数据和相应的分析。
7.实验结论(结果):
根据实验过程中得到的结果,做出结论。
8.实验小结:
本次实验心得体会、思考和建议。
9.指导教师评语及成绩:
指导教师依据学生的实际报告内容,给出本次实验报告的评价。