实验三:Newton法程序设计
实验三:Newton法程序设计
一、实验目的
掌握Hesse矩阵的计算方法和Newton法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题:;
(2)终止准则取;
(3)完成Newton法(牛顿法)的MATLAB编程、调试;
(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
对于无约束优化问题,通常可以使用牛顿法进行求解。牛顿法是一种迭代方法,通过不断逼近函数的极小值点来求解无约束优化问题。其算法步骤如下:
(1)初始化:选择初始点$x_0$。
(2)迭代:对于第$k$次迭代,计算$x_{k+1} = x_k - \frac{f'(x_k)}{f''(x_k)}$。
(3)收敛准则:通常使用函数值的变化量或梯度的大小来作为终止准则。
在MATLAB中,可以编写牛顿法的求解程序。下面是一个简单的示例:
```matlab
function [x, iter] = newtonMethod(f, df, d2f, x0, tol, maxIter)
iter = 0;
while iter < maxIter
x = x0 - feval(df, x0) / feval(d2f, x0);
if abs(x - x0) < tol
return;
end
x0 = x;
iter = iter + 1;
end
end
```
- 代码
function [x_optimization, f_optimization, k] = Multi_Newton_Method(f, x0, var_x, epsilon)
format long;
% 默认精度
if nargin == 3
epsilon = 1.0e-5;
end
% 转换初始点和变量
x0 = transpose(x0);
var_x = transpose(var_x);
% 计算梯度和 Hessian 矩阵
gradf = jacobian(f, var_x);
grad2f = jacobian(gradf, var_x);
grad_fxk = 1;
k = 0;
xk = x0;
while norm(double(grad_fxk)) > epsilon
% 计算梯度和 Hessian 在当前点的值
grad_fxk = subs(gradf, var_x, xk);
grad2_fxk = subs(grad2f, var_x, xk);
% 计算更新方向
pk = -inv(double(grad2_fxk)) * transpose(double(grad_fxk));
pk = double(pk);
% 更新变量
xk_next = xk + pk;
xk = xk_next;
k = k + 1;
end
% 返回优化结果
x_optimization = xk_next;
f_optimization = subs(f, var_x, x_optimization);
format short;
end
syms x1 x2 x3 x4
f = (x1 + 10*x2)^2 + 5*(x3 - x4)^2 + (x2 - 2*x3)^4 + 10*(x1 - x4)^4;
x0 = [1, 1, 1, 1]; % 选择实验二中的初始点
var_x = [x1, x2, x3, x4];
epsilon = 1e-6;
[x_optimization, f_optimization, k] = Multi_Newton_Method(f, x0, var_x, epsilon);
disp('优化后的解:');
disp(x_optimization);
disp('优化后的函数值:');
disp(f_optimization);
disp('迭代次数:');
disp(k);
% 选择多个初始点进行实验
initial_points = [
1, 1, 1, 1;
0, 0, 0, 0;
-1, -1, -1, -1;
2, 2, 2, 2
];
results = [];
for i = 1:size(initial_points, 1)
x0 = initial_points(i, :);
[x_optimization, f_optimization, k] = Multi_Newton_Method(f, x0, var_x, epsilon);
results = [results; x0, double(x_optimization'), double(f_optimization), k];
end
% 保存结果到文件
save('experiment_results.mat', 'results');
% 显示结果
disp('初始点\t\t优化后的解\t\t优化后的函数值\t\t迭代次数');
disp(results);
% 选择多个初始点进行实验
initial_points = [
1, 1, 1, 1;
0, 0, 0, 0;
-1, -1, -1, -1;
2, 2, 2, 2
];
results = [];
for i = 1:size(initial_points, 1)
x0 = initial_points(i, :);
[x_optimization, f_optimization, k] = Multi_Newton_Method(f, x0, var_x, epsilon);
results = [results; x0, double(x_optimization'), double(f_optimization), k];
end
% 保存结果到文件
save('experiment_results.mat', 'results');
% 显示结果
disp('初始点\t\t优化后的解\t\t优化后的函数值\t\t迭代次数');
disp(results);
3. 结果
Initial point (-2, 2)
Number of iterations: 413
Optimal point: (-0.300609, 0.00015509)
Optimal function value: 0.0110275
Initial point (-3, 3)
Number of iterations: 560
Optimal point: (-0.300585, 0.000152774)
Optimal function value: 0.0110275
Initial point (0.5, -1.5)
Number of iterations: 87
Optimal point: (1, 1)
Optimal function value: 0
四、心得体会
实验心得:
在完成最速下降法(负梯度法)的MATLAB编程实验过程中,我深入了解了这种优化算法的原理和应用。通过选择不同的初始点,并进行多次迭代,我得以观察算法在不同情况下的表现。最速下降法是一种简单而有效的优化算法,通过沿着负梯度方向更新参数,逐步接近最优解。调试程序的过程中,迭代次数和梯度阈值对算法收敛的影响。
通过实验,成功求解了无约束优化问题,得到了不同初始点下的迭代次数和最优函数值。在最后阶段,绘制了最优值随迭代次数变化的曲线图,从中可以清晰地看出优化过程的收敛情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?