实验三: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

```

 

 

 

 

  1. 代码

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编程实验过程中,我深入了解了这种优化算法的原理和应用。通过选择不同的初始点,并进行多次迭代,我得以观察算法在不同情况下的表现。最速下降法是一种简单而有效的优化算法,通过沿着负梯度方向更新参数,逐步接近最优解。调试程序的过程中,迭代次数和梯度阈值对算法收敛的影响。

通过实验,成功求解了无约束优化问题,得到了不同初始点下的迭代次数和最优函数值。在最后阶段,绘制了最优值随迭代次数变化的曲线图,从中可以清晰地看出优化过程的收敛情况。

 

posted @     阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示