5.4

题目:

上机实验三:Newton法程序设计

1、基本要求

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

2、主要内容

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

(2)终止准则取;

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

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

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

3、操作要点

(1)通过编程实现牛顿法;

(2)使用MTALAB调试程序,并将实验结果保存到文件中;

(3)撰写实验报告。

4、主要仪器设备

微机及Matlab软件

 

 代码:

1. 算法步骤

1.     定义目标函数:

给定一个多元函数 f(x),其中 x 是一个向量,包含多个变量(在这个例子中,x 有四个分量)。

2.     定义目标函数的梯度:

计算目标函数在每个点的梯度向量 grad_f(x),它包含了函数在每个变量方向上的偏导数。

3.     定义目标函数的海森矩阵:

海森矩阵 hess_f(x) 是一个二阶偏导数的矩阵,用于描述函数的局部曲率。在这个例子中,它是一个 4x4 的矩阵。

4.     选择初始点:

选择一个初始点 x0 作为算法的起始位置。

5.     设定停止准则:

设定一个容差 tol,当梯度的范数小于这个容差时,算法停止迭代。

6.     牛顿法迭代:

a. 初始化迭代计数器 iter 为 0,设置当前点为 x = x0。

b. 计算当前点的梯度 gradient = grad_f(x)。

c. 检查停止准则:如果 norm(gradient) <= tol,则输出最优解和最优值,并结束算法。

d. 否则,计算当前点的海森矩阵 hess。

e. 使用海森矩阵求解线性方程组,得到搜索方向 d = -hess\gradient(在MATLAB中,\ 表示左除,即求解线性方程组)。

f. 更新当前点 x = x + d。

g. 迭代计数器 iter 自增 1。

h. 回到步骤 b,继续迭代。

7.     输出最优解和最优值:

当算法停止时,输出得到的最优解 x(最优的 x 值向量),最优值 f(x)(在最优解处的函数值),以及迭代次数 iter。

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(1) + 10*x(2)) + 4*(x(2) - 2*x(3))^3;...

               10*(x(3) - x(4)) - 8*(x(2) - 2*x(3))^3; -10*(x(1) - x(4))^4 - 5*(x(3) - x(4))];

 

% ¶¨ÒåÄ¿±êº¯Êýº£É­¾ØÕó

hess_f = @(x) [2, 20, 0, -40*(x(1) - x(4))^3;

               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;

               -40*(x(1) - x(4))^3, 0, -10, 10];

 

% ³õʼµã

x0 = [1; 1; 1; 1];

 

% É趨ֹͣ׼Ôò

tol = 1e-6;

 

% Å£¶Ù·¨

x = x0;

iter = 0;

gradient = grad_f(x);

while norm(gradient) > tol

    hess = hess_f(x);

    d = -hess\gradient;

    x = x + d;

    gradient = grad_f(x);

    iter = iter + 1;

end

 

% Êä³ö×îÓŽâºÍ×îÓÅÖµ

disp('×îÓŽâΪ£º');

disp(x');

disp(['×îÓÅֵΪ£º', num2str(f(x))]);

disp(['µü´ú´ÎÊý£º', num2str(iter)]);

 

3. 结果

newtonMethod

最优解为:

     0     0     0     0

 

最优值为:0

迭代次数:0

>> newtonMethod

警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND =  1.041602e-18。

> In newtonMethod (line 26)

 

最优解为:

   -0.0104    0.0010    0.0040    0.0040

 

最优值为:4.2704e-07

迭代次数:69

>> newtonMethod

警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND =  1.041602e-18。

> In newtonMethod (line 26)

 

最优解为:

   -0.0100    0.0010    0.0038    0.0038

 

最优值为:3.6836e-07

迭代次数:80

>> newtonMethod

警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND =  7.004046e-19。

> In newtonMethod (line 26)

 

最优解为:

   -0.0105    0.0011    0.0041    0.0041

 

最优值为:4.5519e-07

迭代次数:91

>> newtonMethod

警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND =  7.004046e-19。

> In newtonMethod (line 26)

 

最优解为:

   -0.0103    0.0010    0.0040    0.0040

 

最优值为:4.1945e-07

迭代次数:4662

posted @ 2024-06-19 18:21  孙锺鸣  阅读(1)  评论(0编辑  收藏  举报