详细文字笔记请见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))