python0.618方法 精确寻找凹函数的最小值
当时在班上还是挺多人网上找的,拿出来分享一下。
上代码!
def function(x):
return (x-60.1234535678)*(x-60.1234535678)
def six18(f, a, b):
e = 0.000001
r = 0.618
b1 = a + r*(b-a)
a1 = b - r*(b-a)
if b - a < e:
print((a+b)/2)
elif a1 < b1:
print((a+b1)/2)
six18(function, a, b1)
elif a1 > b1:
print((a1+b)/2)
six18(function, a1, b)
else:
print((a1+b1)/2) # 最低点在两值中间
if __name__ == "__main__":
six18(function, 31, 90)
过了几天发现了一个小问题,这里把改完的放在下面。
把它写成标准的函数返回值的调用方式
def function(x):
return (x-60.1234535678)*(x-60.1234535678)
def six18(f, a, b):
e = 0.000001
r = 0.618
b1 = a + r*(b-a)
a1 = b - r*(b-a)
if b - a < e:
return (a+b)/2
elif f(a1) < f(b1):
print((a+b1)/2)
return six18(function, a, b1)
elif f(a1) > f(b1):
print((a1+b)/2)
return six18(function, a1, b)
else:
return (a1+b1)/2 # 最低点在两值中间
# print(six18(function, 3, 90))