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