The Golden Section Search can be used to find the maximum or minimum of a single equation. The method starts with two initial guesses, xlow and xhigh, that bracket the minimum or maximum we are interested in. We include the maximum number of iterations, and the acceptable error. The objective equation is placed in the second nested function. At three locations in the maximization program we use f1 > f2. We can turn the greater that sign around at the three locations, f1 < f2, and create a minimization program. Suggested reading is Numerical Methods for Engineers, Fifth Edition by Chapra and Canale.
#Golden Section Search for Maximum or Substitution for Min
def Gold(xlow, xhigh, maxit, es):
#Nested function contains objective function
def f(x):
f = (450 * x / (8 * (x + 22) + 10 * x + 120)) ** 2 / x
return f
R = (5**.5 - 1) / 2
xL = xlow
xu = xhigh
iter = 1
d = R * (xu - xL)
x1 = xL + d
x2 = xu - d
f1 = f(x1)
f2 = f(x2)
if f1 > f2: #if f1 < f2: Substitution for Min
xopt = x1
fx = f1
else:
xopt = x2
fx = f2
while True:
d = R * d
if f1 > f2: #if f1 < f2: Substitution for Min
xL = x2
x2 = x1
x1 = xL + d
f2 = f1
f1 = f(x1)
else:
xu = x1
x1 = x2
x2 = xu - d
f1 = f2
f2 = f(x2)
iter = iter + 1
if f1 > f2: #if f1 < f2: Substitution for Min
xopt = x1
fx = f1
else:
xopt = x2
fx = f2
if xopt != 0:
ea = (1 - R) * abs((xu - xL) / xopt) * 100
if ea <= es or iter >= maxit:
break
print('iter=',iter)
print('xopt=',xopt)
print('f=',fx)
return xopt
#Main program calling function Gold
Gold(.1,100,100,.001)
#Output
# xopt= 16.444405588708648
# f= 9.501689189175927
# The maximum is (x,y) or (16.444,9.501)