采用成功-失败法进行一维搜索

简介

假设优化问题为 f ( x ) f(x) f(x) ( − ∞ , + ∞ ) (-\infty,+\infty) (,+)的极小值,即 min ⁡ x ∈ R f ( x ) \min_{x\in \reals}f(x) xRminf(x),则可以采用“成功-失败法”来求解,具体步骤如下:

  1. 给定初始点 x 0 ∈ R x_0\in \reals x0R,搜索步长 h > 0 h>0 h>0,精度 ε > 0 \varepsilon>0 ε>0
  2. 判断 h h h是否大于 ε \varepsilon ε,若是,计算 x 1 = x 0 + h x_1=x_0+h x1=x0+h f ( x 1 ) f(x_1) f(x1);反之,终止程序,输出此时的 x 0 x_0 x0
  3. f ( x 1 ) < f ( x 0 ) f(x_1)<f(x_0) f(x1)<f(x0),表示搜索成功,下一次搜索大步前进,用 x 1 x_1 x1替换 x 0 x_0 x0 2 h 2h 2h代替 h h h,继续进行搜索;反之,表示搜索失败,下次搜索小步后退,用 h = − h / 4 h=-h/4 h=h/4,返回第二步,继续搜索。

优化问题

优化问题同三次插值法,求 f ( x ) = x 4 − 4 x 3 − 6 x 2 − 16 x + 4 f(x)=x^{4}-4x^{3}-6x^{2}-16x+4 f(x)=x44x36x216x+4的极小值点。设置初始点 x 0 = 6 x_0=6 x0=6,初始计算步长 h = 1 h=1 h=1,收敛精度 ε = 1 e − 3 \varepsilon=1e-3 ε=1e3,计算程序如下:

def cal_fun_f(x):
    """
    函数值计算函数
    """
    return x**4-4*x**3-6*x**2-16*x+4

def success_failure_f(x0, h, gap):
    """
    采用成功失败法进行一维搜索
    :param h: 初始搜索步长
    :param x0: 初始点
    :param gap: 收敛精度
    """
    i = 0
    x = x0  # 初始点
    while abs(h) > gap:
        f_x0 = cal_fun_f(x)
        f_x1 = cal_fun_f(x+h)
        if f_x1 < f_x0:
            x = x+h
            h = 2*h
        else:
            h = -h/4
        i += 1
        print(f"第{i}次迭代极小值点", x)


if __name__ == "__main__":
    success_failure_f(6, 1, 1e-3)

计算结果如下:

1次迭代极小值点 62次迭代极小值点 5.753次迭代极小值点 5.254次迭代极小值点 4.255次迭代极小值点 4.256次迭代极小值点 4.257次迭代极小值点 4.1258次迭代极小值点 3.8759次迭代极小值点 3.87510次迭代极小值点 4.011次迭代极小值点 4.012次迭代极小值点 4.013次迭代极小值点 4.014次迭代极小值点 4.0
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知情人士黄某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值