【python代码】黄金分割法

用黄金分割法寻找函数的极小值点

这里只记录代码,至于黄金分割法的具体内容可以查阅相关文献或者博客,或者看代码的注释。

# 定义极小值
eps = 1e-6


# ################## 黄金分割法
# 定义函数
def get_func1(a, b, c):
    def func(x):
        return a * x ** 2 + b * x + c
    return func


def search_1d(func, input_range):
    # 接受每次变化的区间
    intervals = [input_range]
    # 计算每次的区间大小,进行迭代
    dif = intervals[-1][1] - intervals[-1][0]
    # 当区间大小小于等于极小值时停止循环
    while dif > eps:
        # 用黄金分割率确定新的区间的左右端点
        left = intervals[-1][1] - dif * 0.618
        right = intervals[-1][0] + dif * 0.618
        # 计算左右端点对应的函数值
        f_l = func(left)
        f_r = func(right)
        # 将较大的函数值对应的区间端点进行更新
        # 若两者一样大,则左右端点同时进行更新
        if f_l < f_r:
            left = intervals[-1][0]
        elif f_l > f_r:
            right = intervals[-1][1]
        # 将新的区间加入列表
        intervals.append([left, right])
        # 计算新区间的区间大小
        dif = right - left
    # 计算最终的极值点
    x_star = (intervals[-1][0] + intervals[-1][1]) / 2
    return x_star


if __name__ == '__main__':
    # 输入三个数
    par = input("请输入参数a b c: ")
    # 将三个数从str格式转化为int格式
    str = par.split(',')
    par_int = [int(i) for i in str]
    # 得到函数方程
    func1 = get_func1(par_int[0], par_int[1], par_int[2])
    # 黄金分割法
    res = search_1d(func1, [-20, 50])

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值