线搜索:黄金分割算法与Amijo Rule 算法

详细文字笔记请见https://zhuanlan.zhihu.com/p/620217866?utm_id=0

视频介绍请见 中科大-凸优化_哔哩哔哩_bilibili

黄金分割法 Python

#黄金分割方法是一维线搜索方法,通常用于单峰函数,用于求解迭代算法的步长
import matplotlib.pyplot as plt
import numpy as np
# 多项式函数:要求求解区间为单峰凸函数

def f(x):
    return -x*(350-2*x)*(260 -2*x)

#假设X^(k)=0,  X^(k)+a*d^(k) = a 方向为1  
# 黄金分割法求极值
def GoldenSection(a_min,a_max,e):
    while abs(a_max-a_min)>e:  #不满足精度即继续计算
        a1 = a_max-0.618*(a_max-a_min)
        a2 = a_min+0.618*(a_max-a_min)
        f1,f2 = f(a1),f(a2)
        if f1<f2:  #舍弃大的一侧
            a_max = a2
        else:   #舍弃小的一侧
            a_min = a1
    a_result = (a_min+a_max)/2
    print("黄金切割法下的极值点为a* = {:.4f}".format(a_result))
    return a_result

if __name__ == '__main__':
    print("**************输入参数**************")
    a_min,a_max = map(float,input("请输入区间:").split(' '))
    e = eval(input("请输入精度:"))
    print("极值f(a*) = {:.4f}".format(f(GoldenSection(a_min,a_max,e))))
    print("************************************")
   

Amijo Rule 算法 Python

#Amijo_Rule是一种模糊步长搜索方法
gamma_c = 0.5  ##可调节精度
beta_c = 0.9
def f(x):
    return -x*(350-2*x)*(260 -2*x)

def first_order_f(x): #一阶导
    return -(350-2*x)*(260 -2*x)+(-x)*(-2)*(260 -2*x)+(-x)*(350-2*x)*(-2)

def Amijo_Rule(a_min,a_max): #假设a_min!=0
    while f(a_max)>f(a_min)+ gamma_c*(a_max-a_min)*first_order_f(a_min)*1:
        a_max=a_min+(a_max-a_min)*beta_c
        print(a_max)
    return a_max

if __name__ == '__main__':
    a_min,a_max = 0,100  #初始区间的选择非常重要 
    print(Amijo_Rule(a_min,a_max))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值