Mercurial > octave
changeset 25158:57f150c4fe6d stable
fzero.m: Re-architect search for bracketing endpoint b if none is given (bug #53583).
* fzero.m: Change algorithm to use an absolute search when initial guess x0 is
small, or a relative search when x0 is larger. Use a more finegrained search
at the beginning (1% of x0 rather than 10%). Expand search non-linearly to a
wider final range (1000*x0 vs. 10*x0).
author | Rik <rik@octave.org> |
---|---|
date | Sun, 08 Apr 2018 16:47:57 -0700 |
parents | fbcb1b7e3eb7 |
children | b8279dd83664 |
files | scripts/optimization/fzero.m |
diffstat | 1 files changed, 9 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/optimization/fzero.m Sun Apr 08 14:30:34 2018 -0700 +++ b/scripts/optimization/fzero.m Sun Apr 08 16:47:57 2018 -0700 @@ -149,14 +149,15 @@ fb = fun (b); nfev += 1; else - ## Try to get b. - if (a == 0) - aa = 1; - else - aa = a; - endif - for b = [0.9*aa, 1.1*aa, aa-1, aa+1, 0.5*aa 1.5*aa, -aa, 2*aa, -10*aa, 10*aa] - fb = fun (b); nfev += 1; + ## Try to find a value for b which brackets a zero-crossing + + ## For very small values, switch to absolute rather than relative search + ifelse (abs (a) < .001, aa = sign (a) * 0.1, aa = a); + ## Search in an ever-widening range around the initial point. + for srch = [-.01 +.025 -.05 +.10 -.25 +.50 -1 +2.5 -5 +10 -50 +100 -500 +1000] + b = aa + aa*srch; + fb = fun (b); + nfev += 1; if (sign (fa) * sign (fb) <= 0) break; endif