Function std.numeric.findLocalMin
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.
Tuple!(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);
}
));
Parameters
Name | Description |
---|---|
f | Function to be analyzed |
ax | Left bound of initial range of f known to contain the minimum. |
bx | Right bound of initial range of f known to contain the minimum. |
relTolerance | Relative tolerance. |
absTolerance | Absolute 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
.
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
Example
import std .math : isClose;
auto ret = findLocalMin((double x) => (x-4)^^2, -1e7, 1e7);
assert(ret .x .isClose(4.0));
assert(ret .y .isClose(0.0, 0.0, 1e-10));
Authors
Andrei Alexandrescu, Don Clugston, Robert Jacques, Ilya Yaroshenko