0.618(黄金分割)法计算单峰函数极小值 - 知乎 (zhihu.com)
import math
def fft(t):
f = math.exp(-t) + math.exp(t) #自己编辑公式,这是包含e的指数函数
return f
def hanshu(a,b,e):#区间是[a,b]
p = 0.382
t2 = a + p * (b - a)
t1 = a + b - t2
ft2 = fft(t2)
ft1 = fft(t1)
i = 0
print("第%d次迭代,区间[%.4f,%.4f],t1=%.4f,t2=%.4f,ft1=%.4f,ft2= %.4f" % (i,a, b, t1, t2, ft1, ft2))
while abs(a-b)>e:
if ft1<ft2:
i+=1
a = t2
t2 = t1
ft2 = ft1
t1 = a + b - t2
ft1 = fft(t1)
print("第%d次迭代,区间[%.4f,%.4f],t1=%.4f,t2=%.4f,ft1=%.4f,ft2= %.4f" % (i,a, b, t1, t2, ft1, ft2))
else:
i+=1
b = t1
t1 = t2
ft1 = ft2
t2 = a + p * (b - a)
ft2 = fft(t2)
print("第%d次迭代,区间[%.4f,%.4f],t1=%.4f,t2=%.4f,ft1=%.4f,ft2= %.4f" % (i,a, b, t1, t2, ft1, ft2))
print("最优解t* = %.4f,函数值= %.4f" % ((t1+t2)/2,fft((t1+t2)/2)))
print("请输入区间[a,b],收敛区间长度e")
a,b,e = map(float,input().split())
hanshu(a,b,e)