实验三: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】。
- 代码
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)
三、心得体会
与实验二进行对比,发现通过最速下降法和牛顿法所求得的最优解相同,最优值近似相同,最速下降法的迭代次数要远远大于牛顿法,收敛速度慢。
标签:xk,工程,optimization,数学,fxk,var,x0,最优 From: https://www.cnblogs.com/fuchuchu/p/17472580.html