Nelder-Mead downhill simplex

class PyAstronomy.funcFit.NelderMead(abg=(1.0, 0.5, 2.0), isw=0.05, critlim=1e-08)

Downhill-Simplex algorithm for minimization.

This implementation is based on the publication: Nelder and Mead, The Computer Journal 7, 308-313, 1965 (NM 1965)

Halting criterion

The default stop criterion is the one used by NM 1965. In particular, the value

\[\sqrt{\sum (\bar{y}-y_i) / n}\]

is calculated. If it falls below the limit defined by the attribute nmCritLim, the iteration stops.

abgtuple of three floats, optional

Values for alpha, beta, and gamma.

iswfloat, optional

Initial step width for simplex.

critlimfloat, optional

Critical limit for stopping criterion.

alpha, beta, gammafloat

The reflection-, expansion-, and contraction-coefficients. The default values (after NM 1965) are 1.0, 0.5, and 2.0. These coefficients control the modification of the simplex.


This factor determines how the initial simplex is calculated. The first simplex point is the starting value, the others are constructed by adding a fraction defined by this factor to the starting value. The default is 0.05.


Critical value for the NM 1965 stopping criterion. The default is 1e-8.


fit(m, ds[, objf, initDelta, maxIter, ...])

Carry out the model fit.

_initSimplex(m, initDelta)

Define the initial simplex.

mInstance of OneDFit

The model.


Maps parameter name to the initial step width for the simplex.


Proceed one step of the simplex algorithm.


Apply the NM 1965 stopping criterion.


True, if the stopping criterion has been reached.

fit(m, ds, objf='chisqr', initDelta=None, maxIter=10000.0, callback=None, nmCritLim=None)

Carry out the model fit.

After the iteration, the iterCount attribute contains the number of iterations. The maxIterReached attribute flag is False, if the maximum number of iterations has not been reached and True otherwise.

mInstance of OneDFit

The model to be fitted.

dsInstance of FufDS

The data.


The objective function to be used. Possible choices are “chisqr” (default), “sqrdiff”, and “cash79”.

initDeltadictionary, optional

A dictionary mapping parameter names to the initial step width. This can be very useful, if the starting values are zero or very small. The here defined step will be added to the starting value to construct the simplex.

maxIterint, optional

The maximum number of iterations. The default is 10000.

nmCritLimfloat, optional

Critical value for stopping criterion. The default is 1e-8.

callbackcallable, optional

If not None, “callback” will be called with the three parameters: number of iteration (int), current best parameter set (array), and current simplex (array).

Best-fit valuesdictionary

Maps parameter name to the best-fit value.

Example: Application of the NelderMead class

from PyAstronomy import funcFit as fuf
import numpy as np

# Construct the fitter
nm = fuf.NelderMead()

# Get a GaussFit object ...
gf = fuf.GaussFit1d()
gf.thaw(["A", "mu"])
# ... and define some initial values.
gf["A"] = 5.0
gf["mu"] = 2.0
gf["sig"] = 1.0

# Construct some "data" ...
x = np.arange(100)/20.
y = gf.evaluate(x) + np.random.normal(0.0, 0.08, len(x))
yerr = np.ones(len(x)) * 0.08
# ... and define a "data set" object
ds = fuf.FufDS(x, y, yerr=yerr)

# On purpose, we vail our knowledge about the correct
# parameters
gf["A"] = 1.0
gf["mu"] = 1.0

# We carry out the fit. In particular, the squared
# distance between the model and the data is minimized
# (sqrdiff).
bfpars =, ds, objf="sqrdiff", maxIter=100)
# Have a look at the result
print "Best-fit parameters: ", bfpars
# Have a look at the entire fit object

# Again, we change the starting parameters. Note that ...
gf["A"] = 1.0
# ... mu has been set to zero.
gf["mu"] = 0.0

# To allow the construction of an appropriate start simplex,
# we need to provide an "initDelta" for mu, which should
# reflect the typical scale of the problem.
bfpars =, ds, objf="chisqr", initDelta={"mu": 0.1})
print "Second fit, best-fit parameters: ", bfpars