# HG changeset patch # User Rik # Date 1523231277 25200 # Node ID 57f150c4fe6dbe246643572141fa50c7e9263faa # Parent fbcb1b7e3eb7f1e83fd132b2e67eaf9eb7d74593 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). diff -r fbcb1b7e3eb7 -r 57f150c4fe6d scripts/optimization/fzero.m --- 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