【最优化方法】精确一维搜索方法

0.618 法

0.618 法是一种一维线性搜索的算法,也称为黄金分割法(Golden Section Method)。它是一种迭代方法,用于确定目标函数在一个区间上的最小值。

以下是 0.618 法的基本步骤:

  1. 选取初始数据,确定初始搜索区间 [ a 0 , b 0 ] [a_0,b_0] [a0,b0] 和精度要求 δ > 0 \delta>0 δ>0. 计算最初两个试探点 λ 0 , μ 0 \lambda_0,\mu_0 λ0,μ0​,
    λ 0 = a 0 + 0.382 ( b 0 − a 0 ) , \lambda_0=a_0+0.382(b_0-a_0), λ0=a0+0.382(b0a0), μ 0 = a 0 + 0.618 ( b 0 − a 0 ) . \mu_0=a_0+0.618(b_0-a_0). μ0=a0+0.618(b0a0).

    • 计算 φ ( λ 0 ) \varphi(\lambda_0) φ(λ0) φ ( μ 0 ) \varphi(\mu_0) φ(μ0),令 k = 0. k=0. k=0.
  2. 比较目标函数值。

    • φ ( λ k ) > φ ( μ k ) \varphi(\lambda_k)>\varphi(\mu_k) φ(λk)>φ(μk),转步 3;否则转步 4.
  3. b k − λ k ⩽ δ b_k-\lambda_k\leqslant\delta bkλkδ,则停止计算,输出 μ k \mu_k μk​;否则,令
    a k + 1 : = λ k ,   b k + 1 : = b k ,   λ k + 1 : = μ k a_{k+1}:=\lambda_{k},\:b_{k+1}:=b_{k},\:\lambda_{k+1}:=\mu_{k} ak+1:=λk,bk+1:=bk,λk+1:=μk φ ( λ k + 1 ) : = φ ( μ k ) ,   μ k + 1 : = a k + 1 + 0.618 ( b k + 1 − a k + 1 ) . \varphi(\lambda_{k+1}):=\varphi(\mu_{k}),\:\mu_{k+1}:=a_{k+1}+0.618(b_{k+1}-a_{k+1}). φ(λk+1):=φ(μk),μk+1:=ak+1+0.618(bk+1ak+1).

    • 计算 φ ( μ k + 1 ) \varphi(\mu_{k+1}) φ(μk+1),转步 5.
  4. μ k − a k ⩽ δ \mu_k - a_k\leqslant\delta μkakδ,则停止计算,输出 λ k \lambda_k λk;否则,令
    a k + 1 : = a k ,   b k + 1 : = μ k ,   μ k + 1 : = λ k , a_{k+1}:=a_k,~b_{k+1}:=\mu_k,~\mu_{k+1}:=\lambda_k, ak+1:=ak, bk+1:=μk, μk+1:=λk, φ ( μ k + 1 ) : = φ ( λ k ) ,   λ k + 1 : = a k + 1 + 0.382 ( b k + 1 − a k + 1 ) . \varphi(\mu_{k+1}):=\varphi(\lambda_{k}),\:\lambda_{k+1}:=a_{k+1}+0.382(b_{k+1}-a_{k+1}). φ(μk+1):=φ(λk),λk+1:=ak+1+0.382(bk+1ak+1).

    • 计算 φ ( λ k + 1 ) \varphi(\lambda_{k+1}) φ(λk+1),转步 5.
  5. k : = k + 1 k:=k+1 k:=k+1,转步 2.

0.618 法的优点之一是,每次迭代都将搜索区间缩小为当前区间的 0.618 倍,因此可以很快地接近最小值。此方法通常适用于连续单峰函数的最小值搜索问题。

示例

0.618 法解下述函数,搜索区间宽度到 ε = 0.5 \varepsilon = 0.5 ε=0.5.
min ⁡ t ≥ 0   φ ( t ) = t 3 − 2 t + 1 \min_{t≥0}\:\varphi(t)=t^3-2t+1 t0minφ(t)=t32t+1
根据经验,选择初始搜索区间为 [ 0 , 3 ] [0, 3] [0,3](单谷区间).

计算过程:
a λ μ b φ ( λ ) φ ( μ ) 0 0 1.146 1.854 3 0.2131 3.6648 1 0 0.708 1.146 1.854 − 0.0611 0.2131 2 0 0.438 0.708 1.146 0.2082 − 0.0611 3 0.438 0.708 0.876 1.146 − 0.0611 − 0.0798 \begin{array}{|r|r|r|r|r|r|r|r|}\hline&a&\lambda&\mu&b&\varphi(\lambda)&\varphi(\mu)\\\hline0&0&1.146&1.854&3&0.2131&3.6648\\\hline1&0&0.708&1.146&1.854&-0.0611&0.2131\\\hline2&0&0.438&0.708&1.146&0.2082&-0.0611\\\hline3&0.438&0.708&0.876&1.146&-0.0611&-0.0798\\\hline\end{array} 0123a0000.438λ1.1460.7080.4380.708μ1.8541.1460.7080.876b31.8541.1461.146φ(λ)0.21310.06110.20820.0611φ(μ)3.66480.21310.06110.0798
最后输出 t = μ 3 = 0.876 t = \mu_3 = 0.876 t=μ3=0.876.

Newton 法

一维线性搜索是在优化算法中常用的一种方法,用于确定在给定搜索方向上的合适步长,使得目标函数在该方向上能够有明显的下降。Newton法(牛顿法)是一种使用二阶导数信息的优化方法,它在一维线性搜索中也可以应用。下面是一维线性搜索的 Newton 法的基本步骤:

  1. 选择初始点 x 0 x_0 x0 在搜索方向上选择一个初始点。

  2. 计算目标函数的一阶和二阶导数:

    • 计算目标函数 f ( x ) f(x) f(x) 在当前点 x k x_k xk 的一阶导数 f ′ ( x k ) f'(x_k) f(xk) 和二阶导数 f ′ ′ ( x k ) f''(x_k) f′′(xk)
  3. 计算搜索步长:

    • 计算一维搜索的步长 t k t_k tk,通常使用牛顿法的更新公式:
      t k = − f ′ ( x k ) f ′ ′ ( x k ) t_k = -\frac{f'(x_k)}{f''(x_k)} tk=f′′(xk)f(xk)
  4. 更新当前点:

    • 使用步长 t k t_k tk 更新当前点: x k + 1 = x k + t k x_{k+1} = x_k + t_k xk+1=xk+tk
  5. 重复迭代:

    • 重复步骤 2-4,直到满足停止条件,例如梯度足够小或达到最大迭代次数。

需要注意的是,上述步骤中的计算是在一维搜索方向上进行的,因此 f ′ ( x k ) f'(x_k) f(xk) f ′ ′ ( x k ) f''(x_k) f′′(xk) 分别是一维的梯度和二阶导数。在牛顿法中,使用二阶导数信息可以更准确地确定搜索步长,因此相较于一些基于一阶导数信息的方法,牛顿法可能在一维搜索中更快地收敛。

总的来说,一维线性搜索的 Newton 法是一种有效的优化方法,特别适用于目标函数具有二阶导数信息的情况。

示例

Newton 法求 min ⁡   φ ( t ) = ∫ 0 t arctan ⁡ x   d x \min\:\varphi(t)=\int_0^t \arctan x\:dx minφ(t)=0tarctanxdx 的最优解.

解:
φ ′ ( t ) = arctan ⁡ t ,   1 φ ′ ′ ( t ) = 1 + t 2 ,   t k + 1 = t k − φ ′ ( t k ) 1 φ ′ ′ ( t k ) \varphi^{\prime}(t)=\arctan t,\:\frac{1}{\varphi^{\prime\prime}(t)}=1+t^{2},\:t_{k+1}=t_{k}-\varphi^{\prime}(t_{k})\frac{1}{\varphi^{\prime\prime}(t_{k})} φ(t)=arctant,φ′′(t)1=1+t2,tk+1=tkφ(tk)φ′′(tk)1
选择 t 1 = 1 t_1=1 t1=1,开始计算,搜索精度取 ε = 0.01 \varepsilon=0.01 ε=0.01.
k t k φ ′ ( t k ) 1 / φ ′ ′ ( t k ) 1 1 0.7854 2 2 − 0.5708 − 0.5187 1.3258 3 0.1169 0.1164 1.0137 4 − 0.0011 − 0.0011 \begin{array}{|r|r|r|r|r|}\hline k&t_k&\varphi^{\prime}(t_k)&1/\varphi^{\prime\prime}(t_k)\\\hline1&1&0.7854&2\\\hline2&-0.5708&-0.5187&1.3258\\\hline3&0.1169&0.1164&1.0137\\\hline4&-0.0011&-0.0011&\\\hline\end{array} k1234tk10.57080.11690.0011φ(tk)0.78540.51870.11640.00111/φ′′(tk)21.32581.0137
最后输出 t k = − 0.0011 t_k=-0.0011 tk=0.0011.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值