# [SciPy-user] Bug in optimize.newton

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

```Hi,

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:

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):
try:
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)

Regards,
Martin Wiechert.

```