您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 最优化-马昌凤-第三章作业
最优化方法及其Matlab程序设计习题作业暨实验报告学院:数学与信息科学学院班级:12级信计一班姓名:李明学号:1201214049第三章最速下降法和牛顿法一、上机问题与求解过程1、用最速下降法求212221216423),(xxxxxxf的极小值。解:仿照书上编写最速下降法程序如下:function[x,val,k]=grad(fun,gfun,x0)%功能:用最速下降法求解无约束化问题:minf(x)%输入:x0是初始点,fun,gfun分别是目标函数和梯度%输出:x,val分别是近似嘴有点和最优值,k是迭代次数maxk=5000;rho=0.5;sigma=0.4;%一开始选择时选择的rho和sibma选择的数据不够合理,此处我参照书上的数据编写数据k=0;epsilon=1e-5;while(kmaxk)g=feval(gfun,x0);%计算梯度d=-g;%计算搜索方向if(norm(d)epsilon),break;endm=0;mk=0;while(m20)%Armijo搜索if(feval(fun,x0+rho^m*d)feval(fun,x0)+sigma*rho^m*g'*d)mk=m;break;%直接利用Armijo搜索公式,一开始的时候没有记住公式编写出现错误endm=m+1;endx0=x0+rho^mk*d;k=k+1;endx=x0;val=feval(fun,x0)%求得每一个的函数值然后仿照书上建立两个目标函数和梯度的M文件:functionf=fun(x)f=3*x(1)^2+2*x(2)^2-4*x(1)-6*x(2);functiong=gfun(x)g=[6*x(1)-4,4*x(2)-6]';选取初始点为']0,0[,调用函数程序,得出最小极值点为']500.1,6667.0[,极小值为8333.5,在界面框中输入的程序如下:[x,val,k]=grad('fun','gfun',x0)val=-5.8333x=0.66671.5000val=-5.8333k=10从结果可以看出迭代次数为10次,如果选取不同的初值点则迭代次数不一样,但是极小值相同。2、分别用牛顿法和阻尼牛顿法求解函数21222121484),(xxxxxxf的极小点。解:牛顿法:改编书上的阻尼牛顿法,将Armijo线性搜索公式去掉,改编为牛顿法,其中程序为:function[x,val,k]=netwn(fun,gfun,Hess,x0)%功能:用牛顿法求解无约束问题:minf(x)%输入:x0是初始点,fun,gfun,Hess分别是求%目标函数值,梯度,Hesse矩阵函数%输出:x,val分别是近似点最优解和最优质,k是迭代次数maxk=500;%因为是牛顿法,感觉不能简单直接找出最佳数值,所以需要加大迭代次数k=0;epsilon=1e-5;while(kmaxk)gk=feval(gfun,x0);%计算梯度Gk=feval(Hess,x0);%计算Hess矩阵if(norm(gk)epsilon),break;enddk=-Gk\gk;%计算搜索方向x0=x0+dk;%直接根据前面的算法框架,得出上面迭代步骤k=k+1;end%只是将阻尼牛顿法,简单的删去Armijo搜索公式x=x0;val=feval(fun,x);然后仿照书上建立两个目标函数和梯度的M文件:functionf=fun(x)f=4*x(1)^2+x(2)^2-8*x(1)-4*x(2);functiong=gfun(x)g=[8*x(1)-8,2*x(2)-4]';最后仿照书上建立Hess矩阵的M文件:functionHe=Hess(x)n=length(x);He=zeros(n,n);He=[8,0;0,2];选取初始点为']0,0[,调用函数程序,得出最小极值点为']2,1[,极小值为8,在界面框中输入的程序如下:x0=[00]';x,val,k]=netwn('fun','gfun','Hess',x0)x=12val=-8k=1从结果可以看出迭代次数为10次,如果选取不同的初值点则迭代次数不一样,但是极小值相同。下面看阻尼牛顿法:阻尼牛顿法:仿照书上编写程序并结合Armijo线性搜索步长,有算法程序如下:function[x,val,k]=znetwn(fun,gfun,Hess,x0)%功能:用牛顿法求解无约束问题:minf(x)%输入:x0是初始点,fun,gfun,Hess分别是求%目标函数值,梯度,Hesse矩阵函数%输出:x,val分别是近似点最优解和最优质,k是迭代次数maxk=100;rho=0.50;sigma=0.4;k=0;epsilon=1e-5;while(kmaxk)gk=feval(gfun,x0);%计算梯度Gk=feval(Hess,x0);%计算Hess矩阵dk=-Gk\gk;%计算搜索方向if(norm(gk)epsilon),break;end%检查终止准则m=0;mk=0;while(m20)if(feval(fun,x0+rho^m*dk)feval(fun,x0)+sigma*rho^m*gk'*dk)mk=m;break;endm=m+1;endx0=x0+rho^mk*dk;k=k+1;end%Armijo搜索公式简单的加入牛顿算法中,便得到阻尼牛顿法x=x0;val=feval(fun,x);两个目标函数、梯度的M文件和Hess矩阵的M文件与牛顿法的相同,做题时直接在源程序上进行改编。选取初始点为']6,4[,调用函数程序,得出最小极值点为']2,1[,极小值为8,在界面框中输入的程序如下:x0=[46]';[x,val,k]=netwn('fun','gfun','Hess',x0)x=12val=-8k=1从结果可以看出迭代次数为1次,如果选取不同的初值点则迭代次数不一样,但是极小值相同。3、用最速下降法程序求函数2214121)2()2()(xxxxxf的极小点,取初始点为Tx)3,0(0。解:运用上面第一题的程序,建立两个目标函数和梯度的M文件:functiong=gfun(x)g=[4*(x(1)-2)^3+2*(x(1)-2*x(2)),-2*(x(1)-2*x(2))]';functionf=fun(x)f=(x(1)-2)^4+(x(1)-2*x(2))^2;在对话框中输入语句,计算结果为]0075.1,0151.2[。输入界面语句如下:x0=[03]';[x,val,k]=grad('fun','gfun',x0)val=5.1443e-08x=2.01511.0075val=5.1443e-08k=21864、用牛顿法程序求Rosenbrock函数212212)1()(100)(xxxxf的极小点,取初始点为tx)1,2.1(0。解:利用上面一道题的牛顿法程序,两个目标函数、梯度的M文件和Hess矩阵的M文件分别为:functionf=fun(x)f=100*(x(2)-x(1)^2)^2+(x(1)-1)^2;functiong=gfun(x)g=[200*(x(2)-x(1)^2)*2*x(1)+2*(x(1)-1)*x(1),200*(x(2)-x(1)^2)]';functionHe=Hess(x)n=length(x);He=zeros(n,n);He=[-400,400*x(1);400*(1),200]选取初始点为tx)1,2.1(0,调用函数程序,得出极小极值点为']7778.77,8422.8[,极小值为4648.113,在界面框中输入的命令如下:x0=[46]';[x,val,k]=netwn('fun','gfun','Hess',x0)He=1.0e+03*-0.4000-3.52650.40000.2000x=-8.842277.7778val=113.4648k=500从结果可以看出迭代次数为500次,已经达到最大迭代次数,结果不可靠。二、实验结果与心得1、通过第一题与后面两道题比较可以得出,在寻去极小值点的时候最速下降法没有牛顿法收敛的速度快。2、通过第二题可以比较得出,牛顿法没有阻尼牛顿法收敛到最佳极小值点的速度快,迭代次数少,这与题中的线性搜索是离不开的,但是两种方法测结果形同,相差的只是时间上的区别。3、通过做第三题的时候可以得出,在做含有高次指数幂函数时候,牛顿法搜索极小值显然有些速度较慢,迭代次数明显比指数一次的时候要多。
本文标题:最优化-马昌凤-第三章作业
链接地址:https://www.777doc.com/doc-7291017 .html