黄金分割法(Python)

黄金分割法:(Golden Section Method):又叫做0.618法,是用于单峰函数区间上求极小值的一种方法。
基本思想:通过去试探点和进行函数值比较,使包含极小点的探索区间不断减小,当区间达到一定的程度时,就得到了函数极小点的近似值。
取点法则:
1.对称取点
2. 等区间收缩率
3. 留点可用
步骤:

1.设置初始探索区间[a,b],并设置精度e,并计算左右试探点
                      a1 = a+0.382(b-a)
   ​                   a2 = a+0.618(b-a)```
   以及相应的函数值
   ​                          f1 = f(a1)
   ​                          f2 = f(a2)
2. 比较 b-a 是大于等于 e
3. 满足2的话就比较f1与f2的大小,有一下可能
   ​    1)若f1>f2,极小点一定在[a1,b]内,消去区间[a,a1],令a = a1,产生新的区间[a,b],至此区间内收缩一次
   ​      注意:新的区间a,与原区间点a2,有可能重合,可令a1 = a2,f1 = f2,这样可以少算一次新节点和节省一次函数运算.
   ​                    a2 = a+0.618(b-a)2)若f1<=f2,极小点一定在[a,a2]内,消去区间[a2,b]令b = a2,产生新的区间[a,b],至此区间收缩一次呢
   ​      注意:(同上)
​                       a1 = a-0,618(b-a)4.当新的区间长度缩小到某一精度e,就是b-a<e时,取a*为近似极小值
​                       a* = f((b-a)/2)

计算框图:
黄金分割法(Python)_第1张图片

示例代码(Python):

# 多项式函数
def f(x):
    return -x*(350-2*x)*(260 -2*x)
# 黄金分割法求极值
def G(a,b,e):
    a1 = b-0.618*(b-a)
    a2 = a+0.618*(b-a)
    f1,f2 = f(a1),f(a2)
    while abs(b-a)>e:
        if f1<f2:
            b,a2,f2= a2,a1,f1
            a1 = b-0.618*(b-a)
            f1 = f(a1)
        else:
            a,a1,f1=a1,a2,f2
            a2 = a+0.618*(b-a)
            f2 = f(a2)
    a = (a+b)/2
    print("黄金切割法下的极值点为a* = {:.4f}".format(a))
    return a
if __name__ == '__main__':
    print("**************输入参数**************")
    a,b = map(float,input("请输入区间:").split(' '))
    e = eval(input("请输入精度:"))
    print("极值f(a*) = {:.4f}".format(f(G(a,b,e))))
    print("************************************")

黄金分割法(Python)_第2张图片

你可能感兴趣的:(机器学习,算法,python,机器学习)