[SciPy-User] curve_fit with float32 values

Georg Brandl g.brandl@gmx....
Sat Jan 12 06:54:10 CST 2013

```Hi all,

while trying to show a colleague who hadn't done any Python before
how easy it is to load and fit some data, we had the problem that
curve_fit didn't appear to do any fitting at all.

In the end (which took quite a while!) we found that the problem
was that the X data (which was directly loaded from a HDF file)
had a float32 dtype.  This seems to confuse curve_fit.  Same goes
for float16.  float128 at least raises an exception.  Integer types
seem fine given rounding, see the code/output below.

If it's a big task to make curve_fit work with float32, then at least
a warning would be appreciated if the input types won't work.

cheers,
Georg

Test code below:

from numpy import sqrt, exp, pi, random, linspace, array
from scipy.optimize import curve_fit

def gauss(x, b, a, c, w):
return b + a / sqrt(2*pi)*exp(-(x-c)**2/(2*w**2))

op    = array([1.0, 50.0, 88.0, 1.0])
print 'Original:     ', op
guess = array([0.0, 40.0, 90.0, 2.0])
print 'Guess:        ', guess

x0 = linspace(80, 100, 500)
y = gauss(x0, *op)

for dt in ['float64', 'float32', 'float16', 'int64', 'int32']:
x = x0.astype(dt)
p, c = curve_fit(gauss, x, y, guess)
print 'Fit (%-7s):' % dt, p

***** Output:

Original:      [  1.  50.  88.   1.]
Guess:         [  0.  40.  90.   2.]
Fit (float64): [  1.  50.  88.  -1.]
Fit (float32): [  2.87328455e-07   4.00000000e+01   9.00000000e+01   2.00000000e+00]
Fit (float16): [  0.  40.  90.   2.]
Fit (int64  ): [  0.99921103  48.00234957  87.50399972   1.03986117]
Fit (int32  ): [  0.99921103  48.00234957  87.50399972   1.03986117]

```