diff --git a/optimize/neldermead.go b/optimize/neldermead.go index e0ba6c80..c1d7ce29 100644 --- a/optimize/neldermead.go +++ b/optimize/neldermead.go @@ -127,14 +127,23 @@ func (n *NelderMead) Init(loc *Location) (Operation, error) { n.expansion = n.Expansion if n.expansion == 0 { n.expansion = 1 + 2/float64(dim) + if dim == 1 { + n.expansion = 2 + } } n.contraction = n.Contraction if n.contraction == 0 { n.contraction = 0.75 - 1/(2*float64(dim)) + if dim == 1 { + n.contraction = 0.5 + } } n.shrink = n.Shrink if n.shrink == 0 { n.shrink = 1 - 1/float64(dim) + if dim == 1 { + n.shrink = 0.5 + } } if n.InitialVertices != nil { diff --git a/optimize/unconstrained_test.go b/optimize/unconstrained_test.go index c22efd64..84e428ac 100644 --- a/optimize/unconstrained_test.go +++ b/optimize/unconstrained_test.go @@ -1307,3 +1307,31 @@ func TestIssue76(t *testing.T) { t.Error("Issue https://github.com/gonum/optimize/issues/76 not fixed") } } + +func TestNelderMeadOneD(t *testing.T) { + p := Problem{ + Func: func(x []float64) float64 { return x[0] * x[0] }, + } + x := []float64{10} + m := &NelderMead{} + s := DefaultSettings() + result, err := Local(p, x, s, m) + if err != nil { + t.Errorf(err.Error()) + } + if !floats.EqualApprox(result.X, []float64{0}, 1e-10) { + t.Errorf("Minimum not found") + } + if m.reflection != 1 { + t.Errorf("Wrong value of reflection") + } + if m.expansion != 2 { + t.Errorf("Wrong value of expansion") + } + if m.contraction != 0.5 { + t.Errorf("Wrong value of contraction") + } + if m.shrink != 0.5 { + t.Errorf("Wrong value of shrink") + } +}