采用平分法进行一维搜索

文章介绍了平分法的基本原理,即在一维连续可导函数中寻找极值点的方法。通过不断将区间缩小至给定精度,该算法求得了函数f(x)=3x^4-16x^3+30x^2-24x+8在[0,3]上的极小值点,最终收敛于2.000244140625。
摘要由CSDN通过智能技术生成

简介

平分法是一种简单有效的一维搜索方法,其优点是每一步的计算量都较小,程序实现简单,并且总能收敛于一个局部极小点,缺点是收敛的速度很慢。其基本思想是:若 f ( x ) f(x) f(x)在区间 [ a , b ] [a,b] [a,b]内连续且可导,即 f ( x ) ∈ C 1 [ a , b ] f(x) \in C^1[a,b] f(x)C1[a,b],且 f ′ ( a ) < 0 f^{'}(a)<0 f(a)<0 f ′ ( b ) > 0 f^{'}(b)>0 f(b)>0,则在a,b区间内必定存在一点 x ∗ x^{*} x,使得 f ′ ( x ∗ ) = 0 f^{'}(x^{*})=0 f(x)=0。详细的实施步骤如下:

  1. x 0 = ( a + b ) / 2 x_0=(a+b)/2 x0=(a+b)/2,若 f ′ ( x ) > 0 f^{'}(x)>0 f(x)>0,则 f ( x ) f(x) f(x) [ a , x 0 ] [a, x_0] [a,x0]上有极小点;反之,则 f ( x ) f(x) f(x) [ x 0 , b ] [x_0, b] [x0,b]上有极小点。
  2. [ a , x 0 ] [a, x_0] [a,x0] [ x 0 , b ] [x_0, b] [x0,b]取代区间 [ a , b ] [a,b] [a,b],重复步骤1,直至 ( b − a ) < δ (b-a)< \delta (ba)<δ δ \delta δ表示给定的收敛精度。

从上面的步骤不难看出,平分法其实与0.618法较为相似,不同的是平分法需要用到导数信息。

优化问题

f ( x ) = 3 x 4 − 16 x 3 + 30 x 2 − 24 x + 8 f(x)=3x^{4}-16x^{3}+30x^{2}-24x+8 f(x)=3x416x3+30x224x+8 [ 0 , 3 ] [0,3] [0,3]上的极小值点。
计算程序如下:

def bisection_f(a, b, gap):
    """
    采用平分法求解区间极小值或极大值点
    :param a: 区间左端点
    :param b: 区间右端点
    :param gap: 收敛精度
    """
    # 判断端点导数是否异号
    if derivative_cal_f(a)*derivative_cal_f(b) >= 0:
        sys.exit("a, b端点导数必须异号!")
    if derivative_cal_f(a) < derivative_cal_f(b):
        name = "极小值"
    else:
        name = "极大值"
    i = 0
    while (b-a) > gap:
        d_a = derivative_cal_f(a) # 端点a的导数
        d_b = derivative_cal_f(b)  # 端点b的导数
        x = (a+b)/2
        d_x = derivative_cal_f(x)
        if d_a < d_b:
            if d_x > 0:
                a = a
                b = x
            else:
                a = x
                b = b
        else:
            if d_x > 0:
                a = x
                b = b
            else:
                a = a
                b = x
        i += 1
        print(f"第{i}次迭代{name}点", (a+b)/2)

def derivative_cal_f(x):
    """
    导数计算函数
    """
    return 12*x**3-48*x**2+60*x-24

if __name__ == "__main__":
    bisection_f(0, 3, 1e-3)

计算结果如下所示:

1次迭代极小值点 2.252次迭代极小值点 1.8753次迭代极小值点 2.06254次迭代极小值点 1.968755次迭代极小值点 2.0156256次迭代极小值点 1.99218757次迭代极小值点 2.003906258次迭代极小值点 1.9980468759次迭代极小值点 2.000976562510次迭代极小值点 1.9995117187511次迭代极小值点 2.00024414062512次迭代极小值点 1.9998779296875

当迭代到第12次的时候得到满足收敛精度的极小值点,即2。

  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知情人士黄某

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

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

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

打赏作者

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

抵扣说明:

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

余额充值