Alasdair,
Thanks for this useful code. Since this code comes from the numeric world
of C, there are a few things which might make it "play better" with Maxima:
- bzero(lambda([x],%i),-1,1,.0001) => 1.0b0
(should check that values are real)
- bzero(acos,.5,2,0.001) => error, `sign' called on an imaginary
argument:
(should handle complex values and errors more reasonably)
- bzero(lambda([x],mod(x,%pi)-1),1,4,.001) => infinite loop
(should explicitly float all values)
Compare the code at coerce-float-fun (in plot.lisp).
There are a few other perfectly reasonable assumptions that bzero makes
which should nonetheless be documented explicitly:
- That the function is continuous and bounded.
bzero(tan,1,3,.001) => error: Maximum iterations reached
- That there is no guarantee at all about the value of f(z) where
z=bzero(f,...), only that there exists a zp s.t. abs(zp-z)<tol where
f(zp) is zero. For example:
bzero(lambda([x],print(x,length(cf(x))-5)),1,%pi,0.001) => 1.001b0
(but f(1.001b0) = -3
or
bzero(lambda([x],max(-10,min(10,tan(x))),1,3,.001)
Why does it "find" a zero for bounded tan but not unbounded tan, by the way?
Hope these points are helpful.
-s