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
findRoot, std
Example
import std .math .operations : 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