Module rootfind::bracket
[−]
[src]
Bracket generation.
A bracket is a closed interval [a, b] where the signs at a and b differ. For continuous functions this guarantees the interval contains at least one root.
Brackets are used directly by bracketing root finders like bisection. They also allow for "safe" variants of iterative methods which avoid stepping outside the bracket, stay within the bracket, falling back to bisection if needed, and ensuring global convergence.
Brackets can be generated by sweeping a window over a region of interest and looking for sign changes at the window boundary.
There are several pitfalls:
- Roots which touch but don't cross the x-axis can't be detected using a sliding window.
- Windows which are "too large" may miss the root. (e.g. function dips under x axis and back up again all inside the same window bounds).
- Windows which are "too large" may capture multiple roots. Root finding algorithms operating on the bracket will only converge on one of the contained roots.
Examples
use rootfind::bracket::{BracketGenerator, Bounds}; use rootfind::wrap::RealFn; // roots at 0, pi, 2pi, ... let fin = |x: f64| x.sin(); let f = RealFn::new(&fin); // search for root-holding brackets let window_size = 0.1; let bounds = Bounds::new(-0.1, 6.3); let brackets: Vec<Bounds> = BracketGenerator::new(&f, bounds, window_size).into_iter().collect(); assert_eq!(brackets.len(), 3);
The resulting brackets can be passed to a root finding method like bisection() to locate the actual roots.
Structs
Bounds |
Bounds represents the closed finite interval [a,b]. |
BracketGenerator |
BracketGenerator is an iterator that emits root-holding brackets. |
Functions
first_bracket |
Scans interval [a, b] and emits the first bracket containing a sign change. |
is_sign_change |
Check if signs differ while properly handling floating point underflow. |