无约束非线性优化问题——牛顿法

一、牛顿法原理

  牛顿法的原理是利用一阶导数(梯度)和二阶导数(Hess)对目标函数进行二次函数近似,把二次函数的极小值当成新的迭代点,不断重复,从而找到最优解。
  取 x k x_k xk泰勒展式的前3项:
q k ( x ) = f k + g k T ( x − x k ) + 1 2 ( x − x k ) T G k ( x − x k ) q_k(x) = f_k + g_k^{T}(x-x_k)+\frac{1}{2}(x-x_k)^TG_k(x-x_k) qk(x)=fk+gkT(xxk)+21(xxk)TGk(xxk)
  其中, f k = f ( x k ) , g k = δ f ( x k ) , G k = δ f 2 ( x k ) f_k = f(x_k),g_k = \delta f(x_k),G_k = \delta f^2(x_k) fk=f(xk),gk=δf(xk),Gk=δf2(xk)

  求二次函数 q k ( x ) q_k(x) qk(x)的稳定点,得:
g k T + G k ( x − x k ) = 0 g_k^{T} + G_k(x-x_k) = 0 gkT+Gk(xxk)=0 x k + 1 = x k − G k − 1 g k x_{k+1} = x_k - G_k^{-1}g_k xk+1=xkGk1gk

算法步骤:

1). 取初值点 x 0 x_0 x0,容许误差 0 < = e < < 1 0<=e<<1 0<=e<<1。令 k : = 0. k:=0. k:=0.
2). 计算 g k = δ f ( x k ) g_k = \delta f(x_k) gk=δf(xk) ,若 ∣ ∣ g k ∣ ∣ < = e ||g_k|| <=e ∣∣gk∣∣<=e,输出 x ∗   = x k . x_* ~= x_k. x =xk.
3). 计算 G k = δ 2 f ( x k ) G_k = \delta^2 f(x_k) Gk=δ2f(xk),并求解线性方程组
G k d k = − g k G_k d_k= -g_k Gkdk=gk d k d_k dk
4). 令 x k + 1 : = x k + d k ; k = k + 1 , x_{k+1} := x_k +d_k; k = k+1, xk+1:=xk+dk;k=k+1,转步骤1)

二、Matlab程序及仿真

1、Matlab程序

%--------------Function:Unconstrained Nonlinear Optimizatioin----
%--------------Remark: Use Newton Method ----------------------
%--------------Data:2024.10.30----------------------------------
%--------------Author:Clemence----------------------------------
%--------------Reference:<<Optimization Calculation Method and its Matlab Program Implementation>>----------------------------------


x0 = [-1.2;1.0];
[k,x,val] = dampnm('fun','gfun','Hess',x0,1e-5)
%--------------Newton Method---------------------------------------------
function [k,x,val] = dampnm(fun,gfun,Hess,x0,epsilon)
maxk = 5000;
beta = 0.5;
while(k<maxk)
    gk = feval(gfun,x0); %Calculate Gradient
    Gk = feval(Hess,x0); %Calculate Hess
    dk = -Gk\gk;    %Calculate Search Direction
    
    if(norm(gk)<epsilon)
        break;
    end
    m = 0;mk = 0;
    while(m<20)
        if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
            mk = m;
            break;
        end
        m = m+1;
    end
    x0 = x0+beta^m*dk;
    k = k+1;
end
x = x0;
val = feval(fun,x);
end

%--------------Original Function-------------------------------------------
function f = fun(x)
    f = 4*(x(1)^2-x(2))^2 + 3*(x(1)-1)^2;
end
%--------------Gradient Function-------------------------------------------
function gf = gfun(x)
    gf = [16*(x(1)^2-x(2))*x(1)+6*(x(1)-1);-8*(x(1)^2-x(2))];
end
%--------------Hess   -----------------------------------------------------
function He = Hess(x)
    He = [48*x(1)^2-16*x(2)+6,-16*x(1);
         -16*x(1),            8];
end

2、仿真结果

牛顿法的求解结果
初始点迭代次数最优解
(-1.2,1.0)81.6636e-20
(0,0)68.7342e-20
(10,10)153.4216e-16
(10,-10)154.7196e-16
(100,100)554.8197e-20

三、结果分析

  从仿真结果中可以看出,牛顿法的迭代次数约为15次,最优解的误差小于1e-16,迭代次数和误差值明显优于梯度法,初始值的选取对算法的性能影响也较小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值