用黄金分割法寻找函数的极小值点
这里只记录代码,至于黄金分割法的具体内容可以查阅相关文献或者博客,或者看代码的注释。
# 定义极小值
eps = 1e-6
# ################## 黄金分割法
# 定义函数
def get_func1(a, b, c):
def func(x):
return a * x ** 2 + b * x + c
return func
def search_1d(func, input_range):
# 接受每次变化的区间
intervals = [input_range]
# 计算每次的区间大小,进行迭代
dif = intervals[-1][1] - intervals[-1][0]
# 当区间大小小于等于极小值时停止循环
while dif > eps:
# 用黄金分割率确定新的区间的左右端点
left = intervals[-1][1] - dif * 0.618
right = intervals[-1][0] + dif * 0.618
# 计算左右端点对应的函数值
f_l = func(left)
f_r = func(right)
# 将较大的函数值对应的区间端点进行更新
# 若两者一样大,则左右端点同时进行更新
if f_l < f_r:
left = intervals[-1][0]
elif f_l > f_r:
right = intervals[-1][1]
# 将新的区间加入列表
intervals.append([left, right])
# 计算新区间的区间大小
dif = right - left
# 计算最终的极值点
x_star = (intervals[-1][0] + intervals[-1][1]) / 2
return x_star
if __name__ == '__main__':
# 输入三个数
par = input("请输入参数a b c: ")
# 将三个数从str格式转化为int格式
str = par.split(',')
par_int = [int(i) for i in str]
# 得到函数方程
func1 = get_func1(par_int[0], par_int[1], par_int[2])
# 黄金分割法
res = search_1d(func1, [-20, 50])