Another extra.gfn candidate?
                                
                                
                                
                                    
                                        by Riccardo (Jack) Lucchetti
                                    
                                
                                
                                        
Sorry for the bombardment: I just realised that, much to my surprise, not 
only we don't have a numerical root-finding function in hansl; it seems we 
don't have one in libgretl either!
So I put together a quick hansl prototype for the crudest algorithm there 
is (the bisection method). It's reportd below, with a few examples. The 
question is very much similar to the one in the other thread: shall we put 
this into extra.gfn, or add this (hopefully, in a refined form) to 
libgretl and eventually expose a user-level function?
<hansl>
set verbose off
function scalar bisection_solve(string f, scalar a[0], scalar b[NA])
     if ok(b)
         # initialisation via a bracket
         top = xmax(a,b)
         bot = xmin(a,b)
         x = (top+bot)/2
     else
         # initialisation via a guess
         x = a
         w = abs(x) .* 1.1 + 1
         bot = x - w
         top = x + w
     endif
     scalar iter = 0
     scalar MAXITER = 100
     scalar conv = 0
     scalar eps = 1.0e-13
     loop while !conv && iter<MAXITER --quiet
         x0 = x
         scalar y = feval(f, x)
         printf "Iter %4d: [%8.3f,%8.3f] f(%g) = %g\n",
 		iter++, bot, top, x, y
         if y * feval(f, top) < 0
             bot = x
         else
             top = x
         endif
         x = (top+bot)/2
         conv = abs(x - x0) < eps
     endloop
     return x
end function
### example with default initial guess
function scalar f(scalar x)
     return 3 * x^3 - 1
end function
x = bisection_solve("f")
printf "\nf(%14.11f) = %g (exact = %14.11f)\n\n\n", x, f(x), 3^(-1/3)
### example with given initial guess
function scalar f(scalar x)
     return log(x) + x
end function
x = bisection_solve("f", 0.5)
printf "\nf(%14.11f) = %g (exact = %14.11f)\n\n\n", x, f(x), \
   0.56714329040978387299996866221 # so-called "omega" constant
### example with given bracket
function scalar f(scalar x)
     return sin(x) - 1/abs(1+cos(x))
end function
x = bisection_solve("f", -1, 1)
printf "\nf(%14.11f) = %g\n\n\n", x, f(x)
</hansl>
-------------------------------------------------------
   Riccardo (Jack) Lucchetti
   Dipartimento di Scienze Economiche e Sociali (DiSES)
   Università Politecnica delle Marche
   (formerly known as Università di Ancona)
   r.lucchetti(a)univpm.it
   http://www2.econ.univpm.it/servizi/hpp/lucchetti
-------------------------------------------------------