一.所花时间
0.5h
二.代码量
30行
三.博客量
1篇
四.了解到的知识点
实验三:Newton法程序设计
一、实验目的
掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成Newton法(牛顿法)的MATLAB编程、调试;
(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
(1)给定初始点 x0,及精度e
(2)若梯度的范数<e ,停止,极小点为xk ,否则转(3);
(3)计算负梯度,海森矩阵,令 dk=负梯度*海森矩阵的逆
(4)令 xk+1 = xk + dk,k=k+1,转(2)。
2. 代码
% 定义目标函数及其梯度和海森矩阵
%新建fun.m脚本文件
function f=fun(x)
f= (x(1)+10*x(2))^2+5*(x(3)-x(4))^2+(x(2)-2*x(3))^4+10*(x(1)-x(4))^4;
%新建gfun.m脚本文件
function gf=gfun(x)
gf = [2*(x(1)+10*x(2))+40*(x(1)-x(4))^3; 20*(10*x(2)+x(1))+4*(x(2)-2*x(3))^3; 10*(x(3)-x(4))-8*(x(2)-2*x(3))^3; -10*(x(3)-x(4))-40*(x(1)-x(4))^3];
%新建Hess.m脚本文件
function He = Hess(x)
He = [2+120*(x(1)-x(4))^2, 20, 0, -120*(x(1)-x(4))^2;
20, 200+12*(x(2)-2*x(3))^2, -24*(x(2)-2*x(3))^2, 0;
0, -24*(x(2)-2*x(3))^2, 10+48*(x(2)-2*x(3))^2, -10;
120*(x(1)-x(4))^2, 0, -10, 10+120*(x(1)-x(4))^2];
%新建dampnm.m脚本文件
function [k,x,val] = dampnm(fun,gfun,Hess,x0_list,epsilon)
maxk = 10000;
for i = 1:length(x0_list)-1
x0 = x0_list(:,i);
beta=0.5; sigma=0.4; k=0;
fprintf('初始点 (%g; %g; %g; %g)\n', x0(1), x0(2), x0(3), x0(4));
while (k<maxk)
gk=feval(gfun,x0); %计算梯度
Gk=feval(Hess,x0);%计算Hess
dk=-Gk\gk;
if(norm(gk)<epsilon), break; end
m=0; mk=0;
%用Amrijo搜索技术确定步长
while(m<20) %最大迭代次数
if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
mk=m; break;
end
m=m+1;
end
x0=x0+beta^mk*dk; k=k+1;
end
x=x0;
val=feval(fun,x);
fprintf('迭代次数: %d\n', k);
fprintf('最优点: (%g; %g; %g; %g)\n', x(1), x(2), x(3), x(4));
fprintf('最优函数值: %g\n', val);
fprintf('\n');
end
% 命令行输入
% x0=[-1,-2,3; 1,7,10; 3,-4,5; 3,6,4];
% dampnm('fun','gfun','Hess',x0,1e-6);
3.结果

浙公网安备 33010602011771号