Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

## module goldSearch 

''' a,b = bracket(f,xStart,h) 

Finds the brackets (a,b) of a minimum point of the 

user-supplied scalar function f(x). 

The search starts downhill from xStart with a step 

length h. 

 

x,fMin = search(f,a,b,tol=1.0e-6) 

Golden section method for determining x that minimizes 

the user-supplied scalar function f(x). 

The minimum must be bracketed in (a,b). 

''' 

from math import log, ceil 

 

def bracket(f, x1, h): 

c = 1.618033989 

f1 = f(x1) 

x2 = x1 + h; f2 = f(x2) 

# Determine downhill direction and change sign of h if needed 

if f2 > f1: 

h = -h 

x2 = x1 + h; f2 = f(x2) 

# Check if minimum between x1 - h and x1 + h 

if f2 > f1: return x2,x1 - h 

# Search loop 

for i in range (100): 

h = c*h 

x3 = x2 + h; f3 = f(x3) 

if f3 > f2: return x1,x3 

x1 = x2; x2 = x3 

f1 = f2; f2 = f3 

print( "Bracket did not find a mimimum" ) 

 

def search_max(f, a, b, tol=1.0e-9): 

def fminus(x): 

return -f(x) 

xval, fval = search(fminus, a, b, tol=tol) 

return xval, -fval 

 

def search(f, a, b, tol=1.0e-9): 

nIter = ceil(-2.078087*log(tol/abs(b-a))) # Eq. (10.4) 

nIter = int( 1 + nIter ) 

R = 0.618033989 

C = 1.0 - R 

# First telescoping 

x1 = R*a + C*b; x2 = C*a + R*b 

f1 = f(x1); f2 = f(x2) 

# Main loop 

for i in range(nIter): 

if f1 > f2: 

a = x1 

x1 = x2; f1 = f2 

x2 = C*a + R*b; f2 = f(x2) 

else: 

b = x2 

x2 = x1; f2 = f1 

x1 = R*a + C*b; f1 = f(x1) 

if f1 < f2: return x1,f1 

else: return x2,f2 

 

if __name__ == "__main__": 

 

def myfunc( x ): 

return (3.123-x)**2 

 

print( 'answer should be 3.123' ) 

print( search(myfunc,0.0,5.0,tol=1.0e-9) )