工程数学3

实验三:Newton 法程序设计

 

一、实验目的

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

二、实验内容

1)求解无约束优化问题

2)终止准则取

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

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

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

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

   1. 算法步骤

     步骤1:给定初始点 x0,及精度e 令

步骤2:若梯度的范数<e ,停止,极小点为xk ,否则转【3】;

步骤3:计算负梯度,海森矩阵,令 dk=负梯度*海森矩阵的逆

步骤4:令 xk+1 = xk + dk,k=k+1,转【2】。

  1. 代码

function [x_optimization,f_optimization,k] = Multi_Newton_Method(f,x0,var_x,epsilon)

format long;

%   f:目标函数

%   x0:初始点

%   var_x:自变量

%   epsilon:精度

%   x_optimization:最优解

%   f_optimization:最优值

%%

if nargin == 3

    epsilon = 1.0e-5;

end

x0 = transpose(x0);

var_x = transpose(var_x);

gradf = jacobian(f,var_x);

grad2f = jacobian(gradf,var_x);

grad_fxk = 1;

k = 0;

xk = x0;

 

while norm(grad_fxk) > epsilon

    grad_fxk  = subs(gradf,var_x,xk);

    grad2_fxk = subs(grad2f,var_x,xk);

    pk = -inv(grad2_fxk)*transpose(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;

 

 

   3. 结果

clear;

>> syms x1 x2;

f = 100*(x1^2-x2)^2+(x1-1)^2;

[x_optimization,f_optimization,k] = Multi_Newton_Method(f,[-1.2 1],[x1 x2],0.0001);

disp(['最优解: x = ']);

最优解: x =

>> disp(x_optimization)

    1.0000

    1.0000

 

>> disp(['迭代次数: k = ']);

迭代次数: k =

>> disp(k)

 

三、心得体会

与实验二进行对比,发现通过最速下降法和牛顿法所求得的最优解相同,最优值近似相同,最速下降法的迭代次数要远远大于牛顿法,收敛速度慢。

 

posted @   与孤独对酌  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示