findLocalMin

fnTuple!(T, "x", Unqual!(ReturnType!DF), "y", T, "error") findLocalMin(T, DF)( scope DF f, const T ax, const T bx, const T relTolerance = sqrt(T.epsilon), const T absTolerance = sqrt(T.epsilon), ) if (isFloatingPoint!T && __traits(compiles, { T _ = DF.init(T.init); }))

Find a real minimum of a real function f(x) via bracketing. Given a function f and a range (ax .. bx), returns the value of x in the range which is closest to a minimum of f(x). f is never evaluted at the endpoints of ax and bx. If f(x) has more than one minimum in the range, one will be chosen arbitrarily. If f(x) returns NaN or -Infinity, (x, f(x), NaN) will be returned; otherwise, this algorithm is guaranteed to succeed.

Parameters

fFunction to be analyzed
axLeft bound of initial range of f known to contain the minimum.
bxRight bound of initial range of f known to contain the minimum.
relToleranceRelative tolerance.
absToleranceAbsolute tolerance. Preconditions: ax and bx shall be finite reals.
relTolerance shall be normal positive real.
absTolerance shall be normal positive real no less then T.epsilon*2.

Returns

A tuple consisting of x, y = f(x) and error = 3 * (absTolerance * fabs(x) + relTolerance).

The method used is a combination of golden section search and successive parabolic interpolation. Convergence is never much slower than that for a Fibonacci search.

References: "Algorithms for Minimization without Derivatives", Richard Brent, Prentice-Hall, Inc. (1973)

See Also