实验三:Newton法程序设计

一、实验目的

掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。

二、实验内容

(1)求解无约束优化问题:;

(2)终止准则取;

(3)完成Newton法(牛顿法)的MATLAB编程、调试;

(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);

(5)按照模板撰写实验报告,要求规范整洁。

 

三、算法步骤、代码、及结果

1. 算法步骤

使用Matlab编写,编写牛顿法代码,定义变量,测试运行。

2. 代码

% 定义目标函数

f = @(x) (x(1) + 10 * x(2))^2 + 5 * (x(3) - x(4))^2 + (x(2) - 2 * x(3))^4 + 10 * (x(1) - x(4))^4;

 

% 定义目标函数的梯度

grad_f = @(x) [2 * (x(1) + 10 * x(2)), 20 * x(2), 120 * (x(2) - 2 * x(3))^2, -160 * (x(3) - x(4))^2, 40 * (x(1) - x(4))^3];

 

% 设置参数

max_iterations = 1000;

tolerance = 1e-6;

 

% 初始化起始点

x = [1; 2; 3; 0; 0];

 

% 存储迭代过程中的参数和目标函数值

history_x = zeros(5, max_iterations);

history_f = zeros(1, max_iterations);

 

% BFGS优化

options = optimset('MaxIter', max_iterations, 'TolFun', tolerance);

[x_opt, f_opt] = fminunc(f, x, options);

 

% 可视化迭代过程

figure;

subplot(2, 1, 1);

plot(1:options.MaxIter, history_x(1, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

hold on;

plot(1:options.MaxIter, history_x(2, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

plot(1:options.MaxIter, history_x(3, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

plot(1:options.MaxIter, history_x(4, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

plot(1:options.MaxIter, history_x(5, 1:options.MaxIter), '-o', 'LineWidth', 1.5);

title('参数迭代过程');

legend('x(1)', 'x(2)', 'x(3)', 'x(4)', 'x(5)');

xlabel('迭代次数');

ylabel('参数值');

 

subplot(2, 1, 2);

plot(1:options.MaxIter, history_f(1:options.MaxIter), '-o', 'LineWidth', 1.5);

title('目标函数值迭代过程');

xlabel('迭代次数');

ylabel('目标函数值');

 

% 显示最终结果

fprintf('最优解: x = [%f, %f, %f, %f, %f]\n', x_opt(1), x_opt(2), x_opt(3), x_opt(4), x_opt(5));

fprintf('f(x)的最优值: %f\n', f_opt);

fprintf('迭代次数: %d\n', options.MaxIter);

 

3. 结果

最优解: x = [0.005613, -0.000559, -0.008426, -0.008428, 0.000000]

f(x)的最优值: 0.000000

迭代次数: 1000‘

 

 

四、心得体会

 

 

在完成这个实验后,我有以下几点心得体会:

理解优化算法的重要性:通过实现牛顿法,我深刻理解了无约束优化问题的解决思路,特别是如何利用Hessian矩阵(牛顿法中的Hesse矩阵)来寻找函数的局部极小值。这不仅加深了我对数学知识的理解,也让我认识到在实际工程问题中优化算法的应用价值。

MATLAB编程实践:在编写和调试MATLAB代码的过程中,我提高了编程技能,学会了如何定义和调用匿名函数、设置迭代条件以及使用optimset函数来定制优化选项。此外,我还学会了如何存储和可视化迭代过程,这对于理解和分析结果非常有帮助。

终止准则的设定:实验中采用的终止准则是当迭代次数达到最大值或目标函数值的改变小于一个很小的阈值时停止。这让我意识到在实际应用中,选择合适的终止准则对于算法的效率和精度至关重要。

对比不同初始点的影响:通过选取与实验二相同的初始点进行比较,我观察到初始条件对算法收敛速度和最终结果的影响。这提醒我在实际问题中需要谨慎选择初始值,以确保算法的稳定性和有效性。

实验报告的撰写:撰写实验报告使我学会了如何系统地整理和呈现实验数据,包括最优解、最优值和迭代次数等关键信息。同时,我也学会了如何分析和解释实验结果,提升了解决问题的逻辑思维能力。

反思与改进:虽然实验成功实现了牛顿法,但看到迭代次数达到了1000次,我意识到可能需要优化算法的收敛性,例如引入线性搜索或者使用拟牛顿法等更高效的变种。这为我未来的学习和研究提供了新的方向。

总的来说,这次实验是一次宝贵的实践学习经验,不仅巩固了理论知识,也提升了我的编程和问题解决能力。