-
Notifications
You must be signed in to change notification settings - Fork 12
/
gss.go
46 lines (42 loc) · 897 Bytes
/
gss.go
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
package numerical
import "math"
const DefaultGSSIters = 64
// GSS performs golden section search to find the minimum
// of a unimodal function, given correct bounds on the
// minimum.
//
// If iters is 0, DefaultGSSIters is used.
func GSS(min, max float64, iters int, f func(float64) float64) float64 {
if iters == 0 {
iters = DefaultGSSIters
}
phi := (math.Sqrt(5) + 1) / 2
mid1 := max - (max-min)/phi
mid2 := min + (max-min)/phi
val1 := f(mid1)
val2 := f(mid2)
for i := 0; i < iters; i++ {
if mid1 <= min || mid2 <= mid1 || max <= mid2 {
// Numerical precision has been exhausted.
break
}
if val2 > val1 {
max = mid2
mid2 = mid1
val2 = val1
mid1 = max - (max-min)/phi
val1 = f(mid1)
} else {
min = mid1
mid1 = mid2
val1 = val2
mid2 = min + (max-min)/phi
val2 = f(mid2)
}
}
if val1 < val2 {
return mid1
} else {
return mid2
}
}