- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最优化数值实验报告一
实验目的:
1,掌握对无约束最优化问题的各种解法,主要有最速下降法,牛顿法,共轭梯度法,变尺度法(DFP和BFGS法),非线性最小二乘法。
2,用MATLAB变成求解问题,并对各种方法的计算过程和结果进行分析。
实验原理:(略)
实验内容:
(结合了《最优化练习题017》中的第2题进行分析。)
求解下面的方程组
问题分析:
对于上述问题,可以用两大类的方法求解。其一是将上述方程组转化为无约束的最小二乘问题,并非别用最速下降法,牛顿法,共轭梯度法,变尺度法,非线性最小二乘法求解。其二是将上述方程组转化为有约束的问题,并用惩罚函数法和广义乘子法进行求解。下面我们将上述问题转化为无约束的问题进行求解。
将上述问题转化为最小二乘问题即是对上述问题进行转化,而变成平方和的形式,我们可以将原问题转为求的无约束优化问题,其中如下,
下面我们借助MATLAB用不同的优化方法进行分析求解。
另外,在下面的的搜索算法中,当需要做一维搜索时,都是用进退法和黄金分割法来实现的,其中进退法确定一个单峰区间,而黄金分割法则进行精确的一维搜索。(分别对应程序中的jintuifa.m和gold.m,具体程序见附录)。值得指出的是,为了保证能够使黄金分割法正常工作,进退法中步长选取显得很是重要,因为黄金分割法主要是针对单峰区间来进行搜索的。步长选择的太大,难以确定单峰区间;步长选择的太小,计算量就比较大,迭代的较慢。下面实验中选择的步长为0.0125。
1,最速下降法
最速下降法,通俗点来说,就是选取一个目标函数值下降最快的方法,以利于尽快地达到极小点。最速下降法的关键就是最速下降方向的选取,实际上我们知道负梯度方向为最速下降方向。然后我们进行一维搜索,直到满足精度要求,则停止计算。
实验中,我们一律取初始点为(0,0,0),当搜索方向d满足时,停止搜索,其中= 。
程序:
syms x1 x2 x3 r;
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2;
df=(jacobian(f,[x1 x2 x3])).;%对f求导
x0=[0 0 0];error=1e-6; %取初始点为(0,0,0);允许误差为1e-6
g=subs(df,[x1 x2 x3],x0.);
g=double(g);k=0;
while(norm(g)error)
d=-g; %确定最优搜索方向
z=subs(f,[x1 x2 x3],(x0+r*d).);
result=jintuifa(z,r); %进退法确定搜索区间
result2=gold(z,r,result); %黄金分割法确定最优步长
step=result2(1);
x0=x0+step*d;
g=subs(df,{x1 x2 x3},{x0(1,1),x0(2,1),x0(3,1)});
g=double(g);
k=k+1;
end;
k
x0
min=subs(f,[x1 x2 x3],x0)
结果:
由最速下降法求得的最优解为(0.4996,-0.0900,-0.5259),并且迭代次数为2129,最优值2.4829e-014,显然迭代的次数太多,花费的时间太多,所以效率并不高。
究其原因,应该是锯齿现象的影响。也就是说,虽然从局部看,最速下降算法是函数值下降最快的方向,但从全局看,由于锯齿现象,使得向极点移动的过程中要总弯路,因此收敛速度变慢。
2,牛顿法
牛顿法是通过x(k)和在这一点的目标函数的梯度和HESSE矩阵的逆来得到后续点x(k+1),在适当的条件下,这个序列x(k)将收敛。
同样,在实验中我们取初始点(0,0,0),当,停止寻优,其中= 。
程序:
syms x1 x2 x3;
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2;
x=[x1 x2 x3];
x0=[0 0 0];error=1e-6;t=1;m=0;
while (norm(t)error)
a=subs(diff(f,x1),x,x0);b=subs(diff(f,x2),x,x0);c=subs(diff
文档评论(0)