[SciPy-user] Bug in optimize.newton

Martin Wiechert martin.wiechert at gmx.de
Wed Aug 4 04:01:05 CDT 2004


I've been bitten by a bug in the snippet from optimize.newton below 
(yesterday's CVS).

I think, the actual bug is in line 317, which should read

            if abs(p-p1) < tol:

instead of

            if abs(p-p0) < tol:

This will typically only cause one superfluous iteration, which is no problem.
But consider the following situation:
alter_numeric () has been called.
So, if one passes, say, a Float32 0d array as initial value, this will coerce 
all other scalars into Float32 0d arrays. So if you happen to get identical 
p's for two consecutive iterations, this will go unnoticed, because the 
ZeroDivisionError is not raised (rather the next p is nan), and line 317 
doesn't compare the right p's.

    else: # Secant method
        p0 = x0
        p1 = x0*(1+1e-4)
        q0 = apply(func,(p0,)+args)
        q1 = apply(func,(p1,)+args)
        for iter in range(maxiter):
                p = p1 - q1*(p1-p0)/(q1-q0)
            except ZeroDivisionError:
                if p1 != p0:
                    print "Tolerance of %g reached" % (p1-p0)
                return (p1+p0)/2.0
            if abs(p-p0) < tol:
                return p
            p0 = p1
            q0 = q1
            p1 = p
            q1 = apply(func,(p1,)+args)

Martin Wiechert.

More information about the SciPy-user mailing list