2024.6.4

实验三:Newton法程序设计
一、实验目的
掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成Newton法(牛顿法)的MATLAB编程、调试;
(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
1. 定义目标函数:给定目标函数 ( f(x) )。
2. 初始化:选择初始点 ( x^{(0)} )。
3. 计算梯度和Hesse矩阵:计算目标函数在当前点的梯度 和Hesse矩阵 ( H(x) )。
4. 更新步骤:根据Newton法的迭代公式更新当前点 ( x ): [ x^{(k+1)} = x^{(k)} - [H(x^{(k)})]^{-1} \nabla f(x^{(k)}) ]
5. 终止条件:检查迭代是否收敛,如果 ( ||\nabla f(x)|| < \epsilon ),其中 ( \epsilon ) 是终止准则,停止迭代;否则返回步骤3。

2. 代码
% 定义目标函数及其梯度和海森矩阵
f = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
grad_f = @(x) [400*x(1)^3-400*x(1)*x(2)+2*x(1)-2;
200*(x(2)-x(1)^2)];
hes_f = @(x) [1200*x(1)^2-400*x(2)+2, -400*x(1);
-400*x(1), 200];

% 初始值和终止准则
x0_list = [-2, 2; -3, 3; 0.5, -1.5]; % 多个不同的初始点
tol = 1e-5;

for i = 1:length(x0_list)
x0 = x0_list(i,:);
x = x0';
iter = 0;
grad_norm = inf; % 初始化为正无穷
while grad_norm > tol
iter = iter + 1;
grad = grad_f(x);
hes = hes_f(x);
d = -hes \ grad;
x_new = x + d;
grad_norm = norm(grad);
x = x_new;
end
fprintf('Initial point (%g, %g)\n', x0(1), x0(2));
fprintf('Number of iterations: %d\n', iter);
fprintf('Optimal point: (%g, %g)\n', x(1), x(2));
fprintf('Optimal function value: %g\n', f(x));
fprintf('\n');
end

3. 结果

四、心得体会
在本次实验中,我深入学习了Hesse矩阵的计算方法以及Newton法的基本思想和迭代步骤。通过MATLAB编程实现了牛顿法,并对实验数据进行了正确处理和分析。
1.掌握Hesse矩阵和Newton法:
了解Hesse矩阵的计算方法是理解Newton法的关键,它提供了关于函数曲率和梯度的重要信息。Newton法基于二阶泰勒展开,通过使用Hesse矩阵来近似目标函数,并通过迭代逼近最优解。掌握了这些理论知识后,我更容易理解和实现Newton法。
2.MATLAB编程实现:
通过MATLAB编程实现Newton法,我深入了解了算法的具体步骤。在编程过程中,我注意到了一些细节问题,比如数值计算的精度、迭代终止条件的设置等。通过不断调试和修改程序,我逐步完善了实现,并确保程序能够正确运行和收敛到最优解。
3.实验数据处理和结果分析:
在实验中,我使用了与实验二相同的初始点,并通过Newton法求解无约束优化问题。我将不同初始点得到的最优解、最优值以及收敛速度进行了比较和分析。通过对比实验结果,我发现初始点的选择对于最终结果和收敛速度有着重要影响。同时,我也学会了如何正确保存实验结果到文件中,并对结果进行可视化展示和进一步分析。
总的来说,本次实验让我更加深入地了解了优化算法中的Newton法,并通过实际编程实现了相关算法。同时,通过对实验结果的分析和总结,我也提高了问题解决能力和数据分析能力。这些经验对我的学习和研究都具有重要意义。

 

posted @ 2024-06-13 15:55  liuxuechao  阅读(3)  评论(0编辑  收藏  举报