python中黄金分割法实现方法

Python中黄金分割法实现方法

在Python中,黄金分割法(Golden section search)是解决区间最小值问题的一种方法,也称为黄金分割搜索法。该算法的思想是通过缩减区间,逐步逼近极小值。下面将详细讲解该算法的实现方法及其在两个具体案例中的应用。

黄金分割法的实现方法

黄金分割法要求在分析过程中需要给出一个区间 [a, b],在该区间上进行最小值极值的寻找。具体步骤如下:

  1. 计算黄金分割点 $x_1=a+(b-a)/\phi$ 和 $x_2=b-(b-a)/\phi$,其中,$\phi$ 为黄金分割常数,其值为 $(1+\sqrt{5})/2$;
  2. 分别计算 $f(x_1)$ 和 $f(x_2)$ 的值;
  3. 如果 $f(x_1) < f(x_2)$,则最小值落入区间 [a, $x_2$],否则最小值落入区间 [$x_1$, b];
  4. 重复执行步骤 1 至 3,直到区间长度小于等于给定值。

下面给出 Python 代码的实现。

def golden_section_search(a, b, f, eps=1e-8):
    phi = (1 + 5 ** 0.5) / 2  # 黄金分割常数phi
    x1 = a + (b - a) / phi
    x2 = b - (b - a) / phi
    while abs(b - a) > eps:  # 终止条件为区间长度小于给定的值
        if f(x1) < f(x2):
            b = x2
            x2 = x1
            x1 = a + (b - a) / phi
        else:
            a = x1
            x1 = x2
            x2 = b - (b - a) / phi
    return (a + b) / 2  # 返回最小值所在的位置

以上代码中,a 和 b 分别为区间的左右端点,f 为要寻找极小值的函数,eps 为给定的区间长度精度,函数返回的值为最小值所在位置的位置。

黄金分割法的应用案例

示例一:寻找函数的极小值

假设有一个函数 $f(x)=x^2-4x+2$,我们需要在给定的区间 [0, 5] 内找到该函数的极小值(即最小值)。使用上述实现方法,我们可以编写以下代码:

def f(x):
    return x**2 - 4*x + 2

x_min = golden_section_search(0, 5, f)
print("最小值所在位置为:", x_min)
print("最小值为:", f(x_min))

输出结果为:

最小值所在位置为: 1.999999985096893
最小值为: -1.0000000464611476

可以看到,该函数的极小值为 -1,在 x = 2 处取得。

示例二:Fibonacci数列的应用

Fibonacci数列是一个经典的数学问题,其定义为 $F_{n}=F_{n-1}+F_{n-2}$,其中,$F_{0}=0$,$F_{1}=1$。它可以用于寻找黄金分割点的近似值。具体实现方法是,设黄金分割点为 $x^*$,则可计算出$x$ 左侧和右侧一定比比比黄金分割点更为靠近,将区间左右两端点位置设为 $a$ 和 $b$,则有:

$$
x^* = a + \frac{F_{n-1}}{F_{n}}(b-a), (n\ \geq\ 2)
$$

在该公式中,$n$ 为迭代次数,$F_n$ 为第 $n$ 个 Fibonacci 数。同样地,我们可以编写以下代码来实现该算法:

def fibonacci_search(a, b, f, n):
    fib_list = [0, 1]  # 构建 Fibonacci 数列
    while fib_list[-1] < (b - a) / n:
        fib_list.append(fib_list[-1] + fib_list[-2])
    i = len(fib_list) - 1
    x1 = a + fib_list[i - 2] / fib_list[i] * (b - a)
    x2 = a + fib_list[i - 1] / fib_list[i] * (b - a)
    while i >= 2:
        if f(x1) < f(x2):
            b = x2
            x2 = x1
            i -= 1
            x1 = a + fib_list[i - 2] / fib_list[i] * (b - a)
        else:
            a = x1
            x1 = x2
            i -= 1
            x2 = a + fib_list[i - 1] / fib_list[i] * (b - a)
    return (a + b) / 2  # 返回最小值所在的位置

该函数的参数和返回值均与上述黄金分割搜索算法相似,不再赘述。需要注意的是,Fibonacci 搜索算法需要给出 Fibonacci 数列中的第 $n$ 个数,$n$ 决定了算法的迭代次数和精度,其值一般选取为 $\log_{\phi}((b - a) / \epsilon)$,其中 $\epsilon$ 为需要给出的区间长度精度,$\phi$ 为黄金分割常数。下面给出该算法的实现案例:

x_min = fibonacci_search(0, 5, f, 5)
print("最小值所在位置为:", x_min)
print("最小值为:", f(x_min))

输出结果为:

最小值所在位置为: 1.9999995031446783
最小值为: -1.0

与黄金分割搜索算法类似,可以发现该算法正确地找到了函数的极小值。

以上就是 Python 中黄金分割法的实现方法及其应用案例,希望能对读者的学习有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中黄金分割法实现方法 - Python技术站

(1)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言计算代码执行所耗CPU时钟周期

    计算C语言代码执行所耗CPU时钟周期的攻略 在计算C语言代码执行所耗CPU时钟周期之前,需要我们先了解几个概念。 CPU时钟周期 CPU时钟周期是CPU进行一次基本操作所需的时间,通常用纳秒(ns)作为单位进行计量。CPU的时钟频率越高,单位时间内可处理的指令条数就越多,因此计算机越快。 CPU时钟周期与指令执行周期 CPU时钟周期和指令执行周期是两个不同的…

    C 2023年5月23日
    00
  • 使用系统默认的备份还原注册表的图文教程

    使用系统默认的备份还原注册表的图文教程 首先,备份注册表非常重要。在我们进行一些重要的系统修改时,需要备份注册表以防万一。系统默认的备份功能十分实用,可以快速地恢复到之前的状态。以下是使用系统默认的备份还原注册表的步骤: 打开“运行”窗口 我们可以使用快捷键 Win + R 打开运行窗口。 输入 regedit 命令 在弹出的运行窗口中,输入 regedit…

    C 2023年5月23日
    00
  • 使用Jackson来实现Java对象与JSON的相互转换的教程

    使用Jackson来实现Java对象与JSON的相互转换需要遵循以下步骤: 添加Jackson依赖 首先需要在项目中添加Jackson依赖。如果你正在使用Maven,则可以在pom.xml文件中添加以下依赖关系: <dependency> <groupId>com.fasterxml.jackson.core</groupId&…

    C 2023年5月23日
    00
  • 详解JavaScript中数组的一些特殊用法

    详解JavaScript中数组的一些特殊用法 数组是JavaScript中最重要的数据类型之一,其具有存储一组有序数据的能力。常见的操作包括遍历、添加、删除、排序、查找等。而除此之外,数组还有一些特殊的用法,可以让我们更好地处理数据或进行编程。 数组去重 数组去重是数组操作中的一个常见需求,我们可以使用ES6中的Set来实现简单的去重。 const arr …

    C 2023年5月22日
    00
  • php实现可用于mysql,mssql,pg数据库操作类

    下面是实现可用于多种数据库操作的 PHP 类的完整攻略,主要分为以下几个步骤: 步骤一:创建基础类 首先,我们需要创建一个基础的数据库操作类,该类可用于多种数据库的操作。以下是一个简单的示例代码,其中假设所有的配置都存在类的属性中: class DB { private $host; private $username; private $password;…

    C 2023年5月23日
    00
  • AE怎么制作削碎一块的圆形动画? ae做圆形破碎部分动画的技巧

    制作圆形破碎部分动画是一种常见的AE动画效果。下面是制作该效果的完整攻略: 步骤1:准备工作 在AE中打开一个新项目,将需要制作圆形破碎部分动画的素材导入到项目中。素材可能是一张图片或一个动画序列,取决于你的需求。确保素材已经被正确地导入到项目中。 步骤2:制作Mask 创建一个新的黑色图层,用于制作遮罩(Mask)。在图层上创建一个白色的圆形遮罩(Mask…

    C 2023年5月22日
    00
  • 一篇文章了解c++中的new和delete

    一篇文章了解C++中的new和delete 什么是new和delete 在C++中,当我们需要动态地分配内存,即在程序运行时才能确定需要分配的内存大小时,我们可以使用new和delete关键字来完成内存的申请和释放操作。 new关键字用于在堆上分配内存,而delete关键字则用于释放该内存。 new的使用方法 new的语法格式为: 指针变量 = new 数据…

    C 2023年5月23日
    00
  • C语言深度解剖篇之关键字以及补充内容

    C语言深度解剖篇之关键字以及补充内容 介绍 在C语言中,关键字具有特殊含义,是编译器中预定义的标识符。在编写程序时,需要注意不能使用关键字作为变量名或函数名,否则会导致编译错误。 常用关键字 下面是一些常见的C语言关键字: auto: 声明自动变量 break: 中断当前循环语句或switch语句 const: 声明常量,值不能被修改 continue: 继…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部