文章目录个人主页:欢迎访问Ali.S主页
最近更新:2022年7月11日
⛽ Java框架学习系列:Mybatis框架
⛳ Java基础学习系列:面向对象飞机大战
通信仿真学习系列:【硬件】【通信】【MATLAB】【最优化】
个人简介:通信工程本硕、Java程序员。目前只会CURD
点赞 收藏 留言 都是我最大的动力
- 一、阻尼牛顿法介绍
- 二、阻尼牛顿法原理
- 三、阻尼牛顿法步骤
- 四、阻尼牛顿法代码
- 五、阻尼牛顿法测试
- 总结
前面介绍过敛速度更快的牛顿法,进行最优化问题的求解,在牛顿法中,可能出现在某步迭代时,目标函数数值上升,并且要求函数必须可微,虽然解决了收敛速度过慢的问题,但带来了新的问题。这里对牛顿法进行修正,引入阻尼牛顿法。
二、阻尼牛顿法原理设f(x)是二次可微函数,取其在迭代点Xk处的二阶泰勒展开式:
为求其最小值点,对其求一阶导数,并令一阶导数为0,
得到搜所方向dk,:
利用前面最速下降法中的一维搜索的特点,进行一维搜索。
-
给定初始点x(0),设置允许误差ε>0,k=1
-
计算初始点的一阶导数,二阶导数
-
判断梯度范数与允许误差的大小
-
在允许的误差范围内,从初始点开始,沿着dk方向进行一维搜索
否则停止搜索,得到最优解。 -
从初始点开始,沿着dk方向进行一维搜索
令:
-
迭代次数更新:k=k+1
-
转步骤(2)继续进行后续搜索,直至得到满足精度要求的最优解
阻尼牛顿迭迭代函数:
function [k,x,val]=dampnm(fun,gfun,Hess,x0,epsilon)
%功能: 阻尼牛顿法求解无约束优化问题: min f(x)
%输入: fun, gfun, Hess分别是目标函数及其梯度和Hesse阵,
% x0是初始点, epsilon为容许误差
%输出: k是迭代次数, x, val分别是近似最优点和最优值
maxk=5000; %最大迭代次数
beta=0.5; sigma=0.4;
k=0;
while(k
梯度函数:
function gf=gfun(x)
gf=[16*x(1)*(x(1)^2-x(2))+6*(x(1)-1); -8*(x(1)^2-x(2))];
Hesse函数:
function He=Hess(x)
He=[48*x(1)^2-16*x(2)+6, -16*x(1);
-16*x(1), 8 ];
五、阻尼牛顿法测试
测试以 f=4*(x(1)^2-x(2))^2+3*(x(1)-1)^2函数为例:
%目标函数
function f=fun(x)
f=4*(x(1)^2-x(2))^2+3*(x(1)-1)^2;
经过输入测试数据:
x0=[-1.2;1.0];
[k,x,val]=dampnm(’fun’,’gfun’,’Hess’,x0,1e-5)
得到每次的迭代的结果:
总结
虽然牛顿法收敛非常快,但是另一方面,初始值的选取非常重要,而且会出现某些迭代的过程可能会出现目标函数上升的情况,阻尼牛顿法解决了该问题,进行一维搜索,在适当的情况下具有全局收敛性。



