首页 > 其他分享 >【最优化】简单线搜索(黄金分割法,斐波那契法......)

【最优化】简单线搜索(黄金分割法,斐波那契法......)

时间:2022-10-09 16:00:59浏览次数:56  
标签:Fib right 契法 lam ...... 斐波 mu print left

黄金分割法(Golden Section Method)和斐波那契法(Fibonacci Method)极为相似,唯一的区别就是试探点的公式不一样而已。相比较,斐波那契法更为灵活更为强大。斐波那契法介于二分搜索和黄金分割法之间。

Fibonacci数列:1,1,2,3,5,8,13,21,34,55,89,144......

可见,相邻两项的比值从0.5渐渐变为0.618并趋近于0.618。

黄金分割法的算法如下:

斐波那契法算法如下:

 

Python程序:

所用函数如下:

f(x)=min{x/2, 2-(x-3)^2, 2-x/2}

 

# -*- coding: utf-8 -*-
# @Author : ZhaoKe
# @Time : 2022-10-09 15:29
import numpy as np

def fun(x):
    f1 = x / 2
    f2 = 2-(x-3)**2
    f3 = 2-x/2
    f = np.vstack((f1, f2, f3))
    # print(f)
    return -np.min(f, axis=0)
def golden_section(f, left, right, eps):
    print("===========Golden Section Search==========")
    lam = left + 0.382*(right-left)
    mu = left + 0.618*(right-left)
    k = 1
    tol = right - left
    flam, fmu = 0, 0
    while tol > eps and k < 100000:
        flam = f(lam)
        fmu = f(mu)
        if flam > fmu:
            left = lam
            lam = mu
            mu = left + 0.618*(right-left)
        else:
            right = mu
            mu = lam
            lam = left + 0.382*(right-left)
        k = k + 1
        tol = np.abs(right-left)
    if k == 100000:
        print("找不到最小值")
        x = None
        minf = None
        return
    x = (left + right) / 2
    min_f = f(x)
    print("极值点:", x, ",函数值: ", min_f)


def fibonacci_search(f, left, right, eps):
    print("===========Fibonacci Search==========")
    N = (right-left) / eps
    n = 1
    Fib = [1, 1]
    c = Fib[1] - N
    flam, fmu = 0, 0
    while c < 0:
        n += 1
        Fib.append(Fib[n-1] + Fib[n-2])
        c = Fib[n] - N
    print(Fib[0:12])
    lam = left + Fib[n-2]/Fib[n] * (right - left)
    mu = left + Fib[n-1]/Fib[n] * (right - left)
    k = 1
    while k < n-3:
        flam = fun(lam)
        fmu = fun(mu)
        if flam > fmu:
            left = lam
            lam = mu
            mu = left + Fib[n-1-k]/Fib[n-k] * (right-left)
        else:
            right = mu
            mu = lam
            lam = left + Fib[n-2-k]/Fib[n-k] * (right-left)
        k += 1
    x = (left + right) / 2
    min_f = f(x)
    print("极值点:", x, ",函数值: ", min_f)


if __name__ == '__main__':
    golden_section(fun, 0, 8, 0.05)
    fibonacci_search(fun, 0, 8, 0.03)

计算结果:

===========Golden Section Search==========
极值点: 2.013992448832476 ,函数值:  [-0.99300378]
===========Fibonacci Search==========
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
极值点: 2.0053050397877983 ,函数值:  [-0.99734748]

显然两个算法所得结果都与真实值极为相近(见上图。)

标签:Fib,right,契法,lam,......,斐波,mu,print,left
From: https://www.cnblogs.com/zhaoke271828/p/16772439.html

相关文章

  • 斐波拉契数列
    斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...这个数列从第3项开始,每一项都等于前两项之和。这个数列从第3项开始,每一项都等于前两项之和。a1=1,a2=1,an=an-1+an-2......
  • 斐波那契数
    LeetCode75学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level1和Level2学习计划是为初级用户和中级用户......
  • 斐波那契数列
    1.斐波那契数列斐波那契数列是如下的数列:1,1,2,3,5,8,13...其中,该数列的前两项是1,从第三项(包括第三项)开始第n项为第(n-1)项与第(n-2)项的和。2.斐波那契数列递推......
  • 斐波那契数列
    fibnacci数列定义斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这......
  • 1.11 高级语法_模块 模块的安装与导入。以主程序的形式执行 if __name__ ==‘__main
    #模块  #一个.py结尾的文件就是一个模块函数、类和模块之前的关系如何使用别人写好的模块    安装模块    pipinstall模块名称  #导入模块......
  • 斐波那契数列
    什么是斐波那契数列斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2......
  • LeetCode 斐波那契数算法题解 All In One
    LeetCode斐波那契数算法题解AllInOneFibonacciNumber斐波那契数最佳实践性能优化"usestrict";/****@authorxgqfrms*@licenseMIT*@cop......
  • 年仅24岁的数控编程师傅猝死!原因竟然是......
    以前经常能听人说,要想长寿,不抽烟,不喝酒。今后,恐怕还要加一条:不过度加班!苏州一24岁的男子就因为加班引发了悲剧!日前,苏州科技城医院急诊室,送来一名呼吸心跳骤停的男青年。据接......
  • 一个日本人眼里的中国工厂......
    中国离真正意义上的世界工厂还有相当大的距离,在以后很长一段时间内,中国只能是一个初级产品加工基地,难以达到世界工厂的标准。我是一个典型的被称为“经济动物”的日本商人,到......
  • LeetCode剑指 Offer II 093 最长斐波那契数列
    LeetCode剑指OfferII093最长斐波那契数列classSolution:deflenLongestFibSubseq(self,arr:List[int])->int:n,loc,ans=len(arr),{},0......