【最优化笔记5】无约束最优化--一维搜索算法

无约束最优化考虑的问题: m i n x ∈ R n f ( x ) (1) min_{x \in R_n} f(x) \tag{1} minxRnf(x)(1)
一般把最优化算法的迭代过程分为如下四步
Step1: 选择初始点 x ( 0 ) x^{(0)} x(0)
Step2: 确定搜索(下降)方向 d k d^k dk,即按照一定规则构造函数 f f f x ( k ) x^{(k)} x(k)处的下降方向作为下次迭代的搜索方向。
Step3: 利用一维搜索方法:确定步长因子 λ k = λ \lambda_k = \lambda λk=λ { m i n    f ( x ( k ) + λ d ( k ) ) = ψ ( λ ) s . t .    λ ∈ S (2) \begin{cases} min\,\,f(x^{(k)}+\lambda d^{(k)}) = \psi(\lambda) \\ s.t.\,\,\lambda \in S \end{cases} \tag{2} {minf(x(k)+λd(k))=ψ(λ)s.t.λS(2)Step4:令 x ( k + 1 ) = x ( k ) + λ k d k x^{(k+1)} = x^{(k)}+\lambda_kd^k x(k+1)=x(k)+λkdk,若 x ( k + 1 ) x^{(k+1)} x(k+1)满足终止规则,则迭代停止,否则返回第一步继续迭代。

一维搜索一元函数求极小及线性搜索均为一维搜索。
其中通过求极小的方法确定步长的方法称为精确一维搜索,如下:
{ m i n    f ( x ( k ) + λ d ( k ) ) = ψ ( λ ) s . t .    λ ∈ S (2) \begin{cases} min\,\,f(x^{(k)}+\lambda d^{(k)}) = \psi(\lambda) \\ s.t.\,\,\lambda \in S \end{cases} \tag{2} {minf(x(k)+λd(k))=ψ(λ)s.t.λS(2)

1.前置知识

1.1 判断(局部)最优解的充分/必要条件

(1) f ( x ) f(x) f(x) x ∗ x^* x处可微,则 x ∗ x^* x为问题(1)的局部最优解必要条件是: ∇ f ( x ∗ ) = 0 \nabla f(x^*) =0 f(x)=0
(2) f ( x ) f(x) f(x) x ∗ x^* x处二次可微,则 x ∗ x^* x为问题(1)的局部最优解充分条件是: ∇ f ( x ∗ ) = 0 \nabla f(x^*) =0 f(x)=0 且Hessian矩阵正定,即 ∇ 2 f ( x ∗ ) > 0 \nabla^2 f(x^*) >0 2f(x)>0
(3) f ( x ) f(x) f(x)是定义在 R n R^n Rn可微凸函数,则 x ∗ x^* x是问题(1)全局最优解充要条件是: ∇ f ( x ∗ ) = 0 \nabla f(x^*) =0 f(x)=0

1.2 收敛速度

x ∗ x^* x为问题 m i n   f ( x ) , x ∈ R n min\,f(x),x \in R^n minf(x),xRn的最优解,由算法A产生的序列 { x n } \lbrace x_n \rbrace {xn}收敛于 x ∗ x^* x,即 lim ⁡ n → + ∞ x n = x ∗ \lim_{n \to +\infty}x_n = x^* n+limxn=x(1)线性收敛:若存在一个与 n n n无关的常数 β ∈ ( 0 , 1 ) \beta \in (0,1) β(0,1),某个正整数 n 0 n_0 n0,使得当 n > n 0 n>n_0 n>n0 ∣ ∣ x n − x ∗ ∣ ∣ ≤ β ∣ ∣ x ( n + 1 ) − x ∗ ∣ ∣ (3) ||x_n - x^*|| \leq \beta|| x_(n+1) - x^* || \tag{3} xnxβx(n+1)x(3)成立,则称 { x n } \lbrace x_n \rbrace {xn}线性收敛,也说算法A线性收敛。
(2)超线性收敛:若存在与 n n n无关的常数: 1 < α < 2 , β > 0 1<\alpha<2,\beta>0 1<α<2,β>0,使得当 n > n 0 n>n_0 n>n0 ∣ ∣ x n − x ∗ ∣ ∣ ≤ β ∣ ∣ x ( n + 1 ) − x ∗ ∣ ∣ α (4) ||x_n - x^*|| \leq \beta|| x_(n+1) - x^*||^\alpha\tag{4} xnxβx(n+1)xα(4)成立,或者(3)式中 β = 0 \beta = 0 β=0,则称 { x n } \lbrace x_n \rbrace {xn}超线性收敛,也说算法A超线性收敛。
(3)二阶收敛: 若(4)式中 α = 2 \alpha=2 α=2,则称 { x n } \lbrace x_n \rbrace {xn}二阶收敛,也说算法A二阶收敛。

2.精确一维搜索

精确一维搜索方法可以通过是否使用导数分为两类。不使用导数的方法包括:“成功-失败”法,黄金分割法(0.618法);使用导数的解析方法包括:Newton法,插值法,二分法。
使用导数的解析方法有如下一个重要性质(正交性)
🔺正交性:设函数 f ( x ) f(x) f(x)具有一阶连续偏导数 ( f ∈ C 1 ) (f \in C^1) (fC1) x ( k + 1 ) x^{(k+1)} x(k+1)由如下规则产生: { ψ ( λ k ) = m i n λ > 0    ψ ( λ ) = m i n λ > 0    f ( x ( k ) + λ d k ) x ( k + 1 ) = x ( k ) + λ k d k (5) \begin{cases} \psi(\lambda_k)=min_{\lambda >0}\,\,\psi(\lambda)=min_{\lambda >0}\,\,f(x^{(k)}+\lambda d^k) \\ x^{(k+1)}= x^{(k)}+\lambda_k d^k \end{cases} \tag{5} {ψ(λk)=minλ>0ψ(λ)=minλ>0f(x(k)+λdk)x(k+1)=x(k)+λkdk(5)则有 ∇ f ( x ( k + 1 ) ) T d k = 0 \nabla f(x^{(k+1)})^Td^k=0 f(x(k+1))Tdk=0
证明: 由于 f ( x ) f(x) f(x)具有一阶连续偏导,设 λ k \lambda_k λk ψ ( λ ) = f ( x ( k ) + λ d k ) \psi(\lambda)=f(x^{(k)}+\lambda d^k) ψ(λ)=f(x(k)+λdk)的极小值点,则 ψ ′ ( λ k ) = d k ∇ f ( x ( k ) + λ d k ) = ∇ f ( x ( k + 1 ) ) T d k = 0 \psi'(\lambda_k)=d^k\nabla f(x^{(k)}+\lambda d^k)=\nabla f(x^{(k+1)})^Td^k=0 ψ(λk)=dkf(x(k)+λdk)=f(x(k+1))Tdk=0

2.1 “成功-失败”法

F ( x ) = { f ( x ) , x ∈ S ∞ , x ∉ S (6) F(x)=\begin{cases} f(x),x \in S \\ \infty ,x \not \in S\end{cases} \tag{6} F(x)={f(x),xS,xS(6)S为初始要求区间。因此无约束最优化的搜索总可以考虑区间 R = ( − ∞ , ∞ ) R=(-\infty,\infty) R=(,)

1.使用条件

无特殊要求,具有一般适用性。

2.算法步骤

Step1:取初始点 x 0 ∈ R x_0 \in R x0R,搜索步长 h > 0 h>0 h>0(不能太小),及精度 ϵ > 0 \epsilon>0 ϵ>0
Step2:计算 x 1 = x 0 + h , f ( x 1 ) x_1 = x_0 +h,f(x_1) x1=x0+hf(x1)
Step3:若 f ( x 1 ) < f ( x 0 ) f(x_1) < f(x_0) f(x1)<f(x0),则为搜索成功,下一次搜索就加大步长: h = 2 h h=2h h=2h x 0 = x 1 x_0 = x_1 x0=x1,返回Step2:继续进行搜索,否则转Step4。
Step4:若 f ( x 1 ) ≥ f ( x 0 ) f(x_1) \geq f(x_0) f(x1)f(x0),则为搜索失败,下一次搜索就缩小步长且后退: h = − h / 4 , x 0 = x 1 h=-h/4,x_0 = x_1 h=h/4x0=x1
Step5:判断 ∣ h ∣ < ϵ |h|<\epsilon h<ϵ是否成立,若成立,则 x ∗ = x 0 x^*= x_0 x=x0,结束;否则转Step2继续迭代。

3.优缺点

缺点:效率低。
优点:可以求搜索区间 。

4.代码实现(python)

# 1.“成功-失败”法
def resovle_YON(a,b,h,f,e):
    x0 = (a+b)/2
    # a,b,h,f,e分别为区间上下限,步长,优化函数,目标精度
    k = 1 # 记录迭代次数
    # 终止条件:|h|<e
    while(abs(h) >= e):
        # step1: 计算f(x0+h)并和f(x0)作比较
        if f(x0+h) < f(x0):
            # step2:点移动且步长加倍,迭代下一次
            x0 = x0 + h
            h = 2 * h
        else:
            # step2': 反向移动,且步长减至1/4,迭代下一次
            h = -h / 4
        k = k+1
    print("‘成功-失败’法迭代次数为", k, "计算结果为:x=", x0, "y=", f(x0))

2.2 黄金分割法(0.618法)

考虑下列问题 { m i n    ψ ( λ ) s . t .    λ ∈ [ a , b ] (2) \begin{cases} min\,\,\psi(\lambda) \\ s.t.\,\,\lambda \in[a,b]\end{cases} \tag{2} {minψ(λ)s.t.λ[a,b](2)

1.使用条件

0.618法是求单峰函数极值的一种试探法。所谓的单峰函数是指只有一个峰值的函数,其严格定义如下:
在这里插入图片描述即在 x ∗ x^* x左边单减,右边则单增。也正是利用此逐步删剪区间,来寻找 x ∗ x^* x

2.算法步骤

Step1:取定 ϵ > 0 \epsilon>0 ϵ>0为最后的搜索区间长度,令 α = 0.618 , k = 1 \alpha =0.618,k=1 α=0.618k=1
Step2:判断 ∣ b − a ∣ < ϵ |b-a|<\epsilon ba<ϵ是否成立,成立则结束,输出 x ∗ = ( b − a ) / 2 x^*=(b-a)/2 x=(ba)/2,否则进行下一步。
Step3:令 λ k = a + ( 1 − α ) ( b − a ) ; μ k = a + α ( b − a ) \lambda_k=a+(1-\alpha)(b-a);\mu_k=a+\alpha(b-a) λk=a+(1α)(ba)μk=a+α(ba),并计算 ψ ( λ k ) , ψ ( μ k ) \psi(\lambda_k),\psi(\mu_k) ψ(λk)ψ(μk)。若 ψ ( λ k ) > ψ ( μ k ) \psi(\lambda_k)>\psi(\mu_k) ψ(λk)>ψ(μk),转Step4,否则转Step5。
Step4:令 a = λ k , b = b , k = k + 1 a=\lambda_k,b=b,k=k+1 a=λkb=bk=k+1(删去 λ k \lambda_k λk左侧区间),返回Step2。
Step5:令 a = a , b = μ k , k = k + 1 a=a,b=\mu_k,k=k+1 a=ab=μkk=k+1(删去 μ k \mu_k μk右侧区间),返回Step2。

3.优缺点

(和“成功-失败”法差不多,适用性方面不如“成功-失败”法)
优点:不要求函数可微,且每次迭代只需计算一个函数值,计算量小,程序简单。
缺点:收敛速度慢。

4.代码实现(python)

# 2.“0.618"法
def resovle_618(a,b,e,f):

    # step1:计算初始两个函数点
    x1 = a + (1-0.618)*(b-a)
    x2 = a + 0.618*(b-a)
    k = 1  # 用于记录迭代次数

    # step2:判断是否满足精度,若满足精度即结束迭代
    while abs(b-a) >= e:
        # step3:若左侧函数值大于右侧函数值,去掉左侧部分,否则去掉右侧部分
        if f(x1) > f(x2):
            a = x1
            x1 = x2
            x2 = a + 0.618*(b-a)
        else:
            b = x2
            x2 = x1
            x1 = a+(1-0.618)*(b-a)
        k = k+1
    print("0.618法迭代次数为", k,"最终得到的近似解为:x =", (a+b)/2,"\n对应的函数值为: y =", f((a+b)/2))

2.3.二分法

1.使用条件

要求函数 f ( x ) f(x) f(x)在搜索区间上一阶连续可微的,且当导数为0时是解(极小点)。

2.算法步骤

Step1:取定 ϵ > 0 \epsilon>0 ϵ>0为搜索精度并寻找初始区间 [ a , b ] [a,b] [a,b],满足 f ′ ( a ) f ′ ( b ) < 0 f'(a)f'(b)<0 f(a)f(b)<0,搜索方法如下:
在这里插入图片描述
Step2:判断 ∣ b − a ∣ < ϵ |b-a|<\epsilon ba<ϵ是否成立(也可以使用 ∣ f ′ ( ( b − a ) / 2 ) ∣ < ϵ |f'((b-a)/2)|<\epsilon f((ba)/2)<ϵ),成立则取 x ∗ = b − a ) / 2 x^*=b-a)/2 x=ba)/2,迭代结束,否则进行下一步。
Step3:取 x 0 = ( b − a ) / 2 x_0=(b-a)/2 x0=(ba)/2,计算 f ′ ( x 0 ) f'(x_0) f(x0),若 f ′ ( x 0 ) > 0 f'(x_0)>0 f(x0)>0转Step4,否则转Step5。
Step4 f ′ ( x 0 ) > 0 f'(x_0)>0 f(x0)>0意味着 x > x 0 x>x_0 x>x0时单增,因此去掉右侧区间,即令 a = a , b = x 0 a=a,b=x_0 a=a,b=x0,返回Step2。
Step5 f ′ ( x 0 ) ≤ 0 f'(x_0)\leq 0 f(x0)0意味着 x > x 0 x>x_0 x>x0时单减,因此去掉左侧区间,即令 a = x 0 , b = b a=x_0,b=b a=x0,b=b,返回Step2。

3.优缺点

优点:计算量较少,而且总能收敛到一个局部极小点。
缺点:收敛速度较慢

4.代码实现(python)

# 3.二分法(这是等考完之后补充,之前写错啦/_ \)
def resolve_twodiv(a,b,h,e,f):
    print("‘二分法’迭代次数为", k, "计算结果为:x=", x0, "y=", f(x0))

2.4 🔺Netwon法

1.使用条件

二阶可导,且迭代点的二阶导数函数值大于0。

2.算法思想

使用二阶泰勒(Taylor)展开代替原函数。 ψ ( x ) \psi(x) ψ(x) x 0 x_0 x0处的二阶泰勒展开为: ψ ( x ) = ψ ( x 0 ) + ψ ′ ( x 0 ) ( x − x 0 ) + ψ ′ ′ ( x 0 ) 2 ( x − x 0 ) 2 + o ( ∣ ∣ ( x − x 0 ) 2 ∣ ∣ ) \psi(x)=\psi(x_0)+\psi'(x_0)(x-x_0)+\frac{\psi''(x_0)}{2}(x-x_0)^2+o(||(x-x_0)^2||) ψ(x)=ψ(x0)+ψ(x0)(xx0)+2ψ(x0)(xx0)2+o((xx0)2)
略去高阶项得 g ( x ) = ψ ( x 0 ) + ψ ′ ( x 0 ) ( x − x 0 ) + ψ ′ ′ ( x 0 ) 2 ( x − x 0 ) 2 g(x)=\psi(x_0)+\psi'(x_0)(x-x_0)+\frac{\psi''(x_0)}{2}(x-x_0)^2 g(x)=ψ(x0)+ψ(x0)(xx0)+2ψ(x0)(xx0)2以此代替原函数,则 ψ ′ ′ ( x 0 ) > 0 \psi''(x_0)>0 ψ(x0)>0,其驻点为极小点, g ′ ( x ) = ψ ′ ( x 0 ) + ψ ′ ′ ( x 0 ) ( x − x 0 ) = 0 g'(x)=\psi'(x_0)+\psi''(x_0)(x-x_0)=0 g(x)=ψ(x0)+ψ(x0)(xx0)=0进而得到 x 1 = x 0 − ψ ′ ( x 0 ) ψ ′ ′ ( x 0 ) x_1=x_0-\frac{\psi'(x_0)}{\psi''(x_0)} x1=x0ψ(x0)ψ(x0)类似的,若已知 x k x_k xk,则有迭代公式 x k + 1 = x k − ψ ′ ( x k ) ψ ′ ′ ( x k ) x_{k+1}=x_k-\frac{\psi'(x_k)}{\psi''(x_k)} xk+1=xkψ(xk)ψ(xk)直至 ∣ ψ ′ ( x k ) ∣ < ϵ |\psi'(x_k)|<\epsilon ψ(xk)<ϵ,迭代结束。

3.算法步骤

Step1:取定初始点 x 0 x_0 x0,目标精度 ϵ > 0 \epsilon>0 ϵ>0,令 k = 1 k=1 k=1
Step2:判断 ∣ ψ ′ ( x 0 ) ∣ < ϵ |\psi'(x_0)|<\epsilon ψ(x0)<ϵ是否成立,成立则取 x ∗ = x 0 x^*=x_0 x=x0,结束,否则进行下一步。
Step3:计算 ψ ′ ( x 0 ) , ψ ′ ′ ( x 0 ) \psi'(x_0),\psi''(x_0) ψ(x0)ψ(x0),若 ψ ′ ′ ( x 0 ) ≤ 0 \psi''(x_0)\leq0 ψ(x0)0则牛顿法失败,无法求解,否则转下一步。
Step4:令 x 0 = x 0 − ψ ′ ( x 0 ) ψ ′ ′ ( x 0 ) , k = k + 1 x_0=x_0-\frac{\psi'(x_0)}{\psi''(x_0)},k=k+1 x0=x0ψ(x0)ψ(x0)k=k+1,返回Step2,进行下次迭代。

4.算法收敛性与评价

(1)收敛性陈宝林书
(2)优缺点
特点:收敛速度快,二阶收敛。
缺点:须计算二次导数,对初始点要求高、局部收敛 。

4.代码实现(python)

# 4.牛顿法
def resolve_Newton(a,b,e):
    x0 = (a+b)/2
    k = 1
    # 终止条件:一介倒数<目标精度,如果二阶导<0则寻找失败
    while(abs(df(x0)) >= e):
        # step1:计算初始点的1、2阶导数
        dy0 = df(x0)
        ddy0 = ddf(x0)

        if ddy0 <= 0:
            print("\nNetwon法寻找失败")
            break

        # step2:计算下一个点
        x0 = x0 - df(x0)/ddf(x0)
        k = k+1
    print("‘牛顿法’迭代次数为", k, "计算结果为:x=", x0, "y=", f(x0))

2.5 插值法(三点二次插值)

1.使用条件

ψ ( x ) ∈ C 1 \psi(x) \in C^1 ψ(x)C1(一阶连续可微),初始选点需满足 x 1 < x 0 < x 2 , ψ ( x 0 ) < ψ ( x 1 ) , ψ ( x 0 ) < ψ ( x 2 ) x_1<x_0<x_2,\psi(x_0)<\psi(x_1),\psi(x_0)<\psi(x_2) x1<x0<x2ψ(x0)<ψ(x1)ψ(x0)<ψ(x2),以保证 a 2 > 0 a_2>0 a2>0

2.算法思想

与Newton法相似,三点二次插值(抛物线)法使用 ψ ( x ) \psi(x) ψ(x)在三个点 x 0 , x 1 , x 2 x_0,x_1,x_2 x0,x1,x2处的函数值来构造一个二次函数 y = g ( x ) = a 0 + a 1 x + a 2 x 2 y=g(x)=a_0+a_1x+a_2x^2 y=g(x)=a0+a1x+a2x2则二次函数 g ( x ) g(x) g(x)的最小值(需要 a 2 > 0 ) a_2>0) a2>0)即为 x ‾ = − a 1 2 a 2 \overline{x}=\frac{-a_1}{2a_2} x=2a2a1且满足 y 0 = g ( x 0 ) = ψ ( x 0 ) , y 1 = g ( x 1 ) = ψ ( x 1 ) , y 2 = g ( x 2 ) = ψ ( x 2 ) y_0=g(x_0)=\psi(x_0),y_1=g(x_1)=\psi(x_1),y_2=g(x_2)=\psi(x_2) y0=g(x0)=ψ(x0)y1=g(x1)=ψ(x1)y2=g(x2)=ψ(x2)
利用这三个等式可以求得 { ( y 1 − y 0 ) / ( x 1 − x 0 ) = b 1 ( y 2 − y 1 ) / ( x 2 − x 1 ) = b 2 \begin{cases} (y_1-y_0)/(x_1-x_0) =b_1 \\ (y_2-y_1)/(x_2-x_1) =b_2 \end{cases} {(y1y0)/(x1x0)=b1(y2y1)/(x2x1)=b2 a 2 = ( b 2 − b 1 ) / ( x 2 − x 1 ) , a 1 = b 1 − a 2 ( x 1 + x 0 ) a_2=(b_2-b_1)/(x_2-x_1),a_1=b_1-a_2(x_1+x_0) a2=(b2b1)/(x2x1)a1=b1a2(x1+x0)即可求得极小点 x ‾ = − a 1 2 a 2 \overline{x}=\frac{-a_1}{2a_2} x=2a2a1

3.算法步骤

Step1:选取初始 x 0 , ϵ > 0 x_0,\epsilon>0 x0ϵ>0
Step2:并通过探索法(如“成功-失败”法)向 x 0 x_0 x0两侧寻找符合条件的 x 1 , x 2 x_1,x_2 x1x2
Step3:计算 x ‾ \overline{x} x,若 ∣ ψ ( x ‾ ) − ψ ( x 0 ) ∣ < ϵ |\psi(\overline{x})-\psi(x_0)|<\epsilon ψ(x)ψ(x0)<ϵ则取 x ∗ = x 0 x^*=x_0 x=x0,否则进行下一步。
Step4:在点 x 0 , x ‾ x_0,\overline{x} x0,x中选择使得 ψ ( x ) \psi(x) ψ(x)最小的作为新的 x 0 x_0 x0(实际上为:新的 x 0 = x ‾ ) x_0=\overline{x}) x0=x),返回Step2。

4.算法收敛性

算法的终止条件可能无法保证算法一定收敛,若算法收敛,则在一定条件下是超线性收敛的收敛阶数为1.3。

5.代码实现(python)

# 5.插值法(3点2次)
def resolve_cha(a,b,h,f,e):
    # step1:寻找初始点(两头大,中间小),这里初始步长要取小点哦~
    x0 = (a+b)/2
    x_last = x0 - 2*e
    k = 1
    # 终止条件设置为x(二次多项式的极小点)与x0相差小于目标精度
    while abs(x0-x_last) > e:
        x1 = x0 - h
        x2 = x0 + h
        while f(x1) < f(x0):
            if x1 < a:
                print("插值法寻找初值点失败!\n")
                break
            h1 = 2*h
            x1 = x1 - h1
        #print(x1,f(x1))
        while f(x2) < f(x0):
            if x2 > b:
                print("插值法寻找初值点失败!\n")
                break
            h2 = 2*h
            x2 = x2 + h2
        # step2:计算x(二次插值多项式的极小点)
        p = ((f(x2)-f(x1))/(x2-x1)-(f(x1)-f(x0))/(x1-x0))/(x2-x0)
        q = ((f(x1)-f(x0))/(x1-x0)-p*(x1+x0))
        x = -q/(2*p)
        k = k+1
        # 判断如果x满足精度(与x0相差很小)
        if abs(x0-x) < e:
            x_end = x
            break
        # 进行下次迭代
        else:
            x_last = x0
            x0 = x
    print("‘插值法’迭代次数为", k, "计算结果为:x=", x_end, "y=", f(x_end))

3.不精确一维搜索

考虑从 x ( 0 ) x^{(0)} x(0)出发,沿方向 d k d^k dk寻找新的迭代点: x ( k + 1 ) = x ( k ) + λ k x ( k ) x^{(k+1)}=x^{(k)}+\lambda_k x^{(k)} x(k+1)=x(k)+λkx(k) 要求:
(1) f ( x ( k ) + λ k d k ) < f ( x ( k ) ) f(x^{(k)}+\lambda_kd^k)<f(x^{(k)}) f(x(k)+λkdk)<f(x(k))
(2) λ k \lambda_k λk不能太小

总体希望收敛快,每一步 不要求达到精确最小,单步速度快, 虽然迭代步数增加,但整个收敛达到快速。 主要方法为:三大法则。

法则1:Goldstein法

d k d^k dk为下降方向,即 d k ∇ f ( x ( k ) ) < 0 , λ k d^k\nabla f(x^{(k)})<0,\lambda_k dkf(x(k))<0λk需要满足(以下为了方便,省略了上标):
1. f ( x + λ d ) ≤ f ( x ) + α λ ∇ T f ( x ) d 1.f (x+ λd) ≤ f (x)+\alpha \lambda \nabla^T f (x)d 1.f(x+λd)f(x)+αλTf(x)d
2. f ( x + λ d ) ≥ f ( x ) + ( 1 − α ) λ ∇ T f ( x ) d 2.f (x+ λd) ≥ f (x) +(1- \alpha) \lambda \nabla^Tf (x)d 2.f(x+λd)f(x)+(1α)λTf(x)d
其中, α ∈ ( 0 , 1 / 2 ) α∈(0,1/2) α(0,12)为取定参数 。 实际中常 α = 0.1 α=0.1 α=0.1
在这里插入图片描述
算法步骤:
Step1:输入 λ = 1 \lambda=1 λ=1或者 α \alpha α
Step2:判断条件1是否成立,成立则进行下一步,不成立则 λ = 0.5 λ \lambda=0.5\lambda λ=0.5λ再次进行Step2。
Step3:判断条件3是否成立,成立则 λ k = λ \lambda_k=\lambda λk=λ,结束,否则令 λ = 1.5 λ \lambda=1.5\lambda λ=1.5λ返回Step2。

法则2:Armijio法

类似Goldstein法,条件2稍有改变。\lambda_k$需要满足以下条件:
1. f ( x + λ d ) ≤ f ( x ) + α λ ∇ T f ( x ) d 1.f (x+ λd) ≤ f (x)+\alpha \lambda \nabla^T f (x)d 1.f(x+λd)f(x)+αλTf(x)d
2. f ( x + λ d ) ≥ f ( x ) + μ α λ ∇ T f ( x ) d 2.f (x+ λd) ≥ f (x) +\mu \alpha \lambda \nabla^T f (x)d 2.f(x+λd)f(x)+μαλTf(x)d
其中 α ∈ ( 0 , 0.5 ) , μ ∈ ( α , 1 ) \alpha \in (0,0.5),\mu \in (\alpha,1) α(0,0.5)μ(α,1)
迭代步骤同法则1。

法则3:Wolfe - Powell 法

类似Goldstein法,把条件2的要求改为对导数的要求。 λ k \lambda_k λk需要满足以下条件:
1. f ( x + λ d ) ≤ f ( x ) + α λ ∇ T f ( x ) d 1.f (x+ λd) ≤ f (x)+\alpha \lambda \nabla^T f (x)d 1.f(x+λd)f(x)+αλTf(x)d
2. ∇ T f ( x + λ d ) ≥ f ( x ) + μ ∇ T f ( x ) d 2. \nabla^Tf (x+ λd) ≥ f (x) +\mu \nabla^T f (x)d 2.Tf(x+λd)f(x)+μTf(x)d
其中 α ∈ ( 0 , 0.5 ) , μ ∈ ( α , 1 ) \alpha \in (0,0.5),\mu \in (\alpha,1) α(0,0.5)μ(α,1),实际中常取 α = 0.1 , μ = 0.7 α=0.1 , \mu =0.7 α=0.1,μ=0.7附近 。
.

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值