实验三:Newton 法程序设计

实验三: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 + dkk=k+1转【2】。

 

2. 代码

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)

     6

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

posted @   STDU_DREAM  阅读(281)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示