优化理论04---- 牛顿法牛顿法求根收敛速度二次收敛性修正牛顿法

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化理论04---- 牛顿法牛顿法求根收敛速度二次收敛性修正牛顿法相关的知识,希望对你有一定的参考价值。

无约束优化—牛顿法


无约束最优化问题:
( P )     min ⁡     f ( x ) s.t.     x ∈ X ⊆ R n \\begin{aligned} (P) ~ ~ ~ \\min &~ ~ ~ f(x)\\\\ \\text{s.t.} &~ ~ ~x ∈ X ⊆ R^n \\end{aligned} (P)   mins.t.   f(x)   xXRn

1牛顿法

x = x ˉ x = \\bar{x} x=xˉ时,f(x)可近似为:
f ( x ) ≈ h ( x ) = f ( x ˉ ) + ∇ f ( x ˉ ) T ( x − x ˉ ) + 1 2 ( x − x ˉ ) T H ( x ˉ ) ( x − x ˉ ) (1) f(x) \\approx h(x) = f(\\bar{x}) + ∇f(\\bar{x})^T (x − \\bar{x}) + \\frac{1}{2}(x − \\bar{x})^TH(\\bar{x})(x − \\bar{x})\\tag1 f(x)h(x)=f(xˉ)+f(xˉ)T(xxˉ)+21(xxˉ)TH(xˉ)(xxˉ)(1)
这是 f ( x ) f (x) f(x) x = x ˉ x = \\bar{x} x=xˉ处的二次泰勒展开式。其中 H ( x ˉ ) = ∇ 2 f ( x ˉ ) H(\\bar{x})= ∇^2f(\\bar{x}) H(xˉ)=2f(xˉ)

min ⁡     f ( x ) \\min ~ ~ ~ f(x) min   f(x),则 ∇ h ( x ) = 0 ∇h(x)=0 h(x)=0,有
∇ f ( x ˉ ) + H ( x ˉ ) ( x − x ˉ ) = 0 , (2) ∇f(\\bar{x}) +H(\\bar{x})(x − \\bar{x}) = 0,\\tag2 f(xˉ)+H(xˉ)(xxˉ)=0,(2)
H ( x ˉ ) H(\\bar{x}) H(xˉ)可逆, 则
x − x ˉ = − H ( x ˉ ) − 1 ∇ f ( x ˉ ) (3) x − \\bar{x}= -H(\\bar{x})^{-1} ∇f(\\bar{x})\\tag3 xxˉ=H(xˉ)1f(xˉ)(3)
− H ( x ˉ ) − 1 ∇ f ( x ˉ ) -H(\\bar{x})^{-1} ∇f(\\bar{x}) H(xˉ)1f(xˉ)称为牛顿方向,或 x = x ˉ x = \\bar{x} x=xˉ处的牛顿步长。则得牛顿法的迭代公式:
x k + 1 = x k − H ( x k ) − 1 ∇ f ( x k ) (4) x^{k+1} = x^k - H({x}^k)^{-1} ∇f({x}^k)\\tag4 xk+1=xkH(xk)1f(xk)(4)

阻 尼 牛 顿 法 \\large\\color{#70f3ff}{\\boxed{\\color{brown}{阻尼牛顿法} }}

纯牛顿法步长固定为 α = 1 α=1 α=1阻尼牛顿法( damped Newton method or guarded Newton method)的步长 α α α是不固定的。

[算法] 给定起始点 x 0 ∈ d o m   f , k = 0 x_0\\in dom \\ f,k=0 x0dom f,k=0,精度 ϵ > 0 \\epsilon >0 ϵ>0,

  1. 计算牛顿方向 d k = − H ( x ˉ k ) − 1 ∇ f ( x ˉ k ) d^k=-H(\\bar{x}^k)^{-1} ∇f(\\bar{x}^k) dk=H(xˉk)1f(xˉk)
  2. 停止条件:如果 d k = 0 , 或 者 ( d k ) 2 / 2 < ϵ d^k=0,或者(d^k)^2/2<\\epsilon dk=0,(dk)2/2<ϵ则退出。
  3. 线搜索:用精确性线搜索或者非精确性线搜索选择步长 α k α_k αk
  4. 迭代: x k + 1 = x k + α k d k , k = k + 1 x^{k+1} = x^k + α_kd^k, k = k + 1 xk+1=xk+αkdk,k=k+1. 转到步骤1。
def newton(f, start):
    fun = Function(f)
    x = array(start)
    g = fun.grad(x)
    while fun.norm(x) > epsilon:
        G = fun.hesse(x)
        d = (-dot(linalg.inv(G), g)).tolist()[0]
        alpha = wolfe(f, x, d)
        x = x + alpha * array(d)
        g = fun.grad(x)
    return x

请注意以下几点: