# [SciPy-User] bug in optimize.curve_fit ?

josef.pktd@gmai... josef.pktd@gmai...
Fri Aug 5 03:39:14 CDT 2011

```On Fri, Aug 5, 2011 at 3:29 AM, Xavier Gnata <xavier.gnata@gmail.com> wrote:
> Hi,
>
> Yes but the doc (
> http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
> ) claims that xdata can be "An N-length sequence or an (k,N)-shaped array"
>
> IRL, I would not cast a array to a list to call optimize.curve_fit.
> x = list(x) was only an easy way to write a short testcase based on the
> exemple in the doc.
>
> Xavier
>
>> Hi,
>>
>> if you did x = list(x) it becomes a simple list, which cannot be
>> multiplied by a number.
>> don't do this.
>>
>> --
>> Oleksandr Huziy
>>
>>
>> 2011/8/4 Xavier Gnata <xavier.gnata@gmail.com
>> <mailto:xavier.gnata@gmail.com>>
>>
>>     Hi,
>>
>>     def func(x, a, b, c):
>>        return a*np.exp(-b*x) + c
>>     x = np.linspace(0,4,50)
>>     y = func(x, 2.5, 1.3, 0.5)
>>     yn = y + 0.2*np.random.normal(size=len(x))
>>     popt, pcov = curve_fit(func,x, yn)
>>
>>     works vey well but if you change it to:
>>
>>     def func(x, a, b, c):
>>        return a*np.exp(-b*x) + c
>>     x = list(np.linspace(0,4,50))
>>     y = func(x, 2.5, 1.3, 0.5)
>>     yn = y + 0.2*np.random.normal(size=len(x))
>>     popt, pcov = curve_fit(func, x, yn)
>>
>>     then x is a list and we get this error:
>>     "TypeError: can't multiply sequence by non-int of type 'float'"
>>
>>     However, according to the documentation, xdata : An N-length sequence
>>     or an (k,N)-shaped array. I understand this statement as : "either a
>>     list, a tuple or an array". Should optimize.curve_fit internally cast
>>     xdata to an array? I would think so.

The docstring might be a bit misleading. x (xdata) is just handed
through curve_fit and leastsq to your function and could be anything.
The interpretation as xdata is just for the specific usecase
y=f(x)+noise, but nothing in the implementation requires directly
anything about x. (The only requirement is that f(x) returns a (N,)
array for an x.)

So, I don't think curve_fit should do any changes to x, it's an arg
for the user function that the user should take care of, and a user
can exploit it's flexibility.

Josef

>>
>>
>>
>>     Xavier
>>     _______________________________________________
>>     SciPy-User mailing list
>>     SciPy-User@scipy.org <mailto:SciPy-User@scipy.org>
>>     http://mail.scipy.org/mailman/listinfo/scipy-user
>>
>>
>>
>> _______________________________________________
>> SciPy-User mailing list
>> SciPy-User@scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
```