采用0.618法进行一维搜索

简介

0.618法(Golden Section Search)又称黄金分割法,是一种用于一维函数优化的方法。该方法基于黄金分割点的概念,通过不断缩小搜索范围来逼近函数的最优解。
具体步骤如下:

  1. 选取一个初始区间[a, b],确保函数在该区间内是凸函数。
  2. 计算两个内分点c和d,使得c = a + 0.382(b - a),d =a + 0.618(b - a)。
  3. 比较在c和d处的函数值,确定新的区间[a, b]。
  4. 不断重复步骤2和步骤3,直到满足收敛条件为止。

0.618法的优点是收敛速度比较快,且不需要函数的导数信息。然而,该方法对初始区间的选取比较敏感,可能会导致结果受到区间选择的影响。

优化问题

求解 m i n ϕ ( x ) = x 2 + 2 x min\phi(x)=x^{2}+2x minϕ(x)=x2+2x s . t . − 3 ≤ x ≤ 5 s.t. -3\le x\le 5 s.t.3x5,明显 ϕ ( x ) \phi(x) ϕ(x)在可行域区间上是凸函数,因此,设置收敛精度 δ = 1 e − 3 \delta=1e^{-3} δ=1e3。计算程序如下:

# 采用0.618法求解凸函数的极小值
def golden_section_method(a, b, gap):
    """
    采用黄金分分割法求解f(x)=x**2+2*x,在区间[-3,5]上的最小值
    :param a: 区间左端点
    :param b: 区间右端点
    :param gap: 收敛精度
    """
    i = 0
    while (b-a) > gap:
        x1 = a+0.382*(b-a)
        x2 = a+0.618*(b-a)
        f_x1 = cal_fun_value(x1)
        f_x2 = cal_fun_value(x2)
        if f_x1 < f_x2:
            a = a
            b = x2
        else:
            a = x1
            b = b
        i += 1
        print(f"第{i}次迭代最小值", (a+b)/2)

# 计算函数值
def cal_fun_value(x):
    return x**2+2*x

if __name__ == "__main__":
    golden_section_method(-3, 5, 1e-3)

结果输出如下:

1次迭代最小值 -0.5282次迭代最小值 -1.4723043次迭代最小值 -0.88872412800000014次迭代最小值 -1.24937648889600025次迭代最小值 -1.0264933298622726次迭代最小值 -0.88875153757942837次迭代最小值 -0.97387596521022588次迭代最小值 -1.02648286148605869次迭代最小值 -0.993971799587593910次迭代最小值 -1.01406363584084511次迭代最小值 -1.00164688103633612次迭代最小值 -0.993973326567149113次迭代最小值 -0.998715583229106614次迭代最小值 -1.001646297846196215次迭代最小值 -0.999835116212834816次迭代最小值 -1.000954426462252317次迭代最小值 -1.000262692728112418次迭代最小值 -0.999835201280413819次迭代最小值 -1.0000993909950915

可知当计算到第19次时已经满足收敛精度了得到极小值点为-1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知情人士黄某

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

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

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

打赏作者

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

抵扣说明:

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

余额充值