一、实验目的
1、基本要求
掌握 Hesse 矩阵的计算方法和 Newton 法的基本思想及其迭代步骤;学会运用 MATLAB 编程实现
常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成 Newton 法(牛顿法)的 MATLAB 编程、调试;
(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优 值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
3、操作要点
(1)通过编程实现牛顿法;
(2)使用 MTALAB 调试程序,并将实验结果保存到文件中;
(3)撰写实验报告
三、算法步骤、代码、及结果
1. 算法步骤
步0:确定终止误差e=(0~1),初始点x0,=(0~1),=(0,0.5),令k=0
步1:计算gk=f(xk).若||gk||<=e,停算,输出xk作为最优解。否则,转步2
步2:计算Gk=^2f(xk),并解出方程组:Gk*dk=-gk,解得dk,其中Gk在xk处要正定
步3:求步长k=^mk,m的值从0开始
若f(xk+ ^m*dk)<=f(xk)+*^m*gk'dk
则 mk=m,步长 k=^mk,若不满足上式,则m=m+1,直到满足上述不等式为止
步4:令Xk+1=xk+ k*dk,k=k+1,转步1
2. 代码
1 1、牛顿法
2
3 function [x,val,k] =dampnm(fun,gfun,Hess,x0)
4 %功能:用阻尼牛顿法求解无约束问题minif(x)
5 %dampnm是阻尼的意思
6 %输入:fun,gfun,Hess分别是目标函数,梯度,二阶导数,x0是初始点
7 %输出:x,val分别是近似极小点和近似最优值,k是迭代次数
8 maxk=100;
9 rho=0.55;
10 sigma=0.4;
11 k=0;
12 e=1e-5;%精度要求
13 while(k<maxk)
14 gk=feval(gfun,x0);
15 if(norm(gk)<=e),break;end
16 Gk=feval(Hess,x0);
17 dk=-Gk\gk;%右除,解方程Gk*dk=-gk
18 m=0;
19 mk=0;
20 while(m<20)
21 if(feval(fun,x0+rho^m*dk)<feval(fun,x0)+sigma*rho^m*gk'*dk);
22 mk=m;
23 break;
24 end
25 m=m+1;
26 end
27 x0=x0+dk*rho^m;
28 k=k+1;
29 end
30 x=x0;
31 val=feval(fun,x0);
32 end
33
34 2.目标函数
35
36 function f= fun(x)
37 %目标函数
38 f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
39 end
40
41 3.目标函数梯度
42
43 function g=gfun(x)
44 %目标函数的梯度
45 g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';
46 end
47
48 4.目标函数的Hess阵
49
50 function f = Hess(x)
51 %n=length(x);
52 %f=zero(n,n);
53 f=[1200*x(1)^2-400*x(2)+2,-400*x(1);
54 -400*x(1), 200];
55 5.主函数
56
57 %这个问题的精确值是x=(1,1)',f(x)=0;
58 clear all
59 clc
60 x0=[-1,1]';
61 [x,val,k]=dampnm('fun','gfun','Hess',x0);
62
63 fprintf('初始点 (%g, %g)\n', x0(1), x0(2));
64 fprintf('迭代次数: %d\n', k);
65 fprintf('最优点: (%g, %g)\n', x(1), x(2));
66 disp(['最优函数值: f(x) = ',num2str(val)])