Oops.<br><br>Right you both are. I suppose the answer to my general confusion is that jimmying the initial fit parameters in the right way will make curve_fit work. Thanks!<br><br>~Kris<br><br><div class="gmail_quote">On Thu, Oct 22, 2009 at 4:12 PM, Warren Weckesser <span dir="ltr">&lt;<a href="mailto:warren.weckesser@enthought.com">warren.weckesser@enthought.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Kris,<br>
<br>
Your script worked for me if I explicitly converted everything to numpy<br>
arrays.  Here&#39;s my edited version:<br>
<br>
----------<br>
<div class="im">#!/usr/bin/env python<br>
import numpy as np<br>
import scipy as sp<br>
import pylab as pl<br>
from scipy.optimize.minpack import curve_fit<br>
<br>
</div>x = np.array([  50.,  110.,  170.,  230.,  290.,  350.,  410.,  470.,<br>
530.,  590.])<br>
y = np.array([ 3173.,  2391.,  1726.,  1388.,  1057.,   786.,   598.,<br>
<div class="im">443.,   339.,   263.])<br>
<br>
smoothx = np.linspace(x[0], x[-1], 20)<br>
guess_a, guess_b, guess_c = 4000, -0.005, 100<br>
guess = [guess_a, guess_b, guess_c]<br>
<br>
f_theory1 = lambda t, a, b, c: a * np.exp(b * t) + c<br>
<br>
</div>p, cov = curve_fit(f_theory1, x, y, p0=np.array(guess))<br>
<div class="im"><br>
pl.clf()<br>
f_fit1 = lambda t: p[0] * np.exp(p[1] * t) + p[2]<br>
</div># pl.plot(x, y, &#39;b.&#39;, smoothx, f_theory1(smoothx, guess_a, guess_b,<br>
guess_c))<br>
pl.plot(x, y, &#39;b.&#39;, smoothx, f_fit1(smoothx), &#39;r-&#39;)<br>
pl.show()<br>
<br>
##<br>
## EOF<br>
##<br>
<br>
----------<br>
<br>
Warren<br>
<div><div></div><div class="h5"><br>
<br>
Kris Maynard wrote:<br>
&gt; Hi,<br>
&gt;<br>
&gt; Thanks for your responses. After some more digging and some more<br>
&gt; testing I&#39;m beginning to think that the algorithm used by curve_fit<br>
&gt; simply isn&#39;t robust enough for the data that I am trying to fit. Below<br>
&gt; is an example of some experimental radioactive decay data that I am<br>
&gt; trying to fit to an exponential decay.<br>
&gt;<br>
&gt; #!/usr/bin/env python<br>
&gt; import numpy as np<br>
&gt; import scipy as sp<br>
&gt; import pylab as pl<br>
&gt; from scipy.optimize.minpack import curve_fit<br>
&gt;<br>
&gt; x = [  50.,  110.,  170.,  230.,  290.,  350.,  410.,  470.,  530.,  590.]<br>
&gt; y = [ 3173.,  2391.,  1726.,  1388.,  1057.,   786.,   598.,   443.,<br>
&gt; 339.,   263.]<br>
&gt;<br>
&gt; smoothx = np.linspace(x[0], x[-1], 20)<br>
&gt; guess_a, guess_b, guess_c = 4000, -0.005, 100<br>
&gt; guess = [guess_a, guess_b, guess_c]<br>
&gt;<br>
&gt; f_theory1 = lambda t, a, b, c: a * np.exp(b * t) + c<br>
&gt; f_theory2 = lambda t, a, b: np.exp(a * t) + b<br>
&gt;<br>
&gt; pl.plot(x, y, &#39;b.&#39;, smoothx, f_theory1(smoothx, guess_a, guess_b,<br>
&gt; guess_c))<br>
&gt; pl.show()<br>
&gt;<br>
&gt; p, cov = curve_fit(f_theory1, x, y)<br>
&gt; #p, cov = curve_fit(f_theory2, x, y)<br>
&gt;<br>
&gt; # the following gives:<br>
&gt; #   ValueError: shape mismatch: objects cannot be broadcast to a<br>
&gt; single shape<br>
&gt; #p, cov = curve_fit(f_theory1, x, y, p0=guess)<br>
&gt;<br>
&gt; pl.clf()<br>
&gt; f_fit1 = lambda t: p[0] * np.exp(p[1] * t) + p[2]<br>
&gt; #f_fit2 = lambda t: np.exp(p[0] * t) + p[1]<br>
&gt; pl.plot(x, y, &#39;b.&#39;, smoothx, f_fit1(smoothx), &#39;k-&#39;)<br>
&gt; pl.show()<br>
&gt;<br>
&gt; ##<br>
&gt; ## EOF<br>
&gt; ##<br>
&gt;<br>
&gt; As you can see, I have tried to fit using 2 or 3 parameters with no<br>
&gt; luck. Is there something that I could do to make this work? I have<br>
&gt; tried this exact thing in matlab and it worked the first time.<br>
&gt; Unfortunately, I would really like to use python as I find it in<br>
&gt; general more intuitive than matlab.<br>
&gt;<br>
&gt; Thanks,<br>
&gt; ~Kris<br>
&gt;<br>
&gt; On Wed, Oct 7, 2009 at 9:40 AM, Bruce Southey &lt;<a href="mailto:bsouthey@gmail.com">bsouthey@gmail.com</a><br>
</div></div><div class="im">&gt; &lt;mailto:<a href="mailto:bsouthey@gmail.com">bsouthey@gmail.com</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;     On Wed, Oct 7, 2009 at 1:19 AM,  &lt;<a href="mailto:josef.pktd@gmail.com">josef.pktd@gmail.com</a><br>
</div><div class="im">&gt;     &lt;mailto:<a href="mailto:josef.pktd@gmail.com">josef.pktd@gmail.com</a>&gt;&gt; wrote:<br>
&gt;     &gt; On Wed, Oct 7, 2009 at 1:36 AM, Kris Maynard &lt;<a href="mailto:maynard@bu.edu">maynard@bu.edu</a><br>
</div><div><div></div><div class="h5">&gt;     &lt;mailto:<a href="mailto:maynard@bu.edu">maynard@bu.edu</a>&gt;&gt; wrote:<br>
&gt;     &gt;&gt; I am having trouble with fitting data to an exponential curve.<br>
&gt;     I have an x-y<br>
&gt;     &gt;&gt; data series that I would like to fit to an exponential using<br>
&gt;     least squares<br>
&gt;     &gt;&gt; and have access to the covariance matrix of the result. I<br>
&gt;     summarize my<br>
&gt;     &gt;&gt; problem in the following example:<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; import numpy as np<br>
&gt;     &gt;&gt; import scipy as sp<br>
&gt;     &gt;&gt; from scipy.optimize.minpack import curve_fit<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; A, B = 5, 0.5<br>
&gt;     &gt;&gt; x = np.linspace(0, 5, 10)<br>
&gt;     &gt;&gt; real_f = lambda x: A * np.exp(-1.0 * B * x)<br>
&gt;     &gt;&gt; y = real_f(x)<br>
&gt;     &gt;&gt; ynoisy = y + 0.01 * np.random.randn(len(x))<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; exp_f = lambda x, a, b: a * np.exp(-1.0 * b * x)<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; # this line raises the error:<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; #  RuntimeError: Optimal parameters not found: Both<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; #  actual and predicted relative reductions in the sum of squares<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; #  are at most 0.000000 and the relative error between two<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; #  consecutive iterates is at most 0.000000<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; params, cov = curve_fit(exp_f, x, ynoisy)<br>
&gt;     &gt;<br>
&gt;<br>
&gt;     Could you please first plot your data?<br>
&gt;     As you would see, the curve is very poorly defined with those model<br>
&gt;     parameters and range. So you are asking a lot from your model and<br>
&gt;     data. At least you need a wider range with those parameters or Josef<br>
&gt;     says different parameter(s):<br>
&gt;<br>
&gt;     &gt; this might be the same as<br>
&gt;      <a href="http://projects.scipy.org/scipy/ticket/984" target="_blank">http://projects.scipy.org/scipy/ticket/984</a> and<br>
&gt;     &gt; <a href="http://mail.scipy.org/pipermail/scipy-user/2009-August/022090.html" target="_blank">http://mail.scipy.org/pipermail/scipy-user/2009-August/022090.html</a><br>
&gt;     &gt;<br>
&gt;     &gt; If I increase your noise standard deviation from 0.1 to 0.2 then<br>
&gt;     I do get<br>
&gt;     &gt; correct estimation results in your example.<br>
&gt;     &gt;<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; I have tried to use the minpack.leastsq function directly with<br>
&gt;     similar<br>
&gt;     &gt;&gt; results. I also tried taking the log and fitting to a line with<br>
&gt;     no success.<br>
&gt;     &gt;&gt; The results are the same using scipy 0.7.1 as well as<br>
&gt;     0.8.0.dev5953. Am I<br>
&gt;     &gt;&gt; not using the curve_fit function correctly?<br>
&gt;     &gt;<br>
&gt;     &gt; With   minpack.leastsq   error code 2 should be just a warning.<br>
&gt;     If you get<br>
&gt;     &gt; incorrect parameter estimates with optimize.leastsq, besides the<br>
&gt;     warning, could<br>
&gt;     &gt; you post the example so I can have a look.<br>
&gt;     &gt;<br>
&gt;     &gt; It looks like if you take logs then you would have a problem<br>
&gt;     that is linear in<br>
&gt;     &gt; (transformed) parameters, where you could use linear least<br>
&gt;     squares if you<br>
&gt;     &gt; just want a fit without the standard errors of the original<br>
&gt;     parameters<br>
&gt;     &gt; (constant)<br>
&gt;<br>
&gt;     The errors will be multiplicative rather than additive.<br>
&gt;<br>
&gt;     Bruce<br>
&gt;<br>
&gt;     &gt;<br>
&gt;     &gt; I hope that helps.<br>
&gt;     &gt;<br>
&gt;     &gt; Josef<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;&gt; Thanks,<br>
&gt;     &gt;&gt; ~Kris<br>
&gt;     &gt;&gt; --<br>
&gt;     &gt;&gt; Heisenberg went for a drive and got stopped by a traffic cop.<br>
&gt;     The cop asked,<br>
&gt;     &gt;&gt; &quot;Do you know how fast you were going?&quot; Heisenberg replied, &quot;No,<br>
&gt;     but I know<br>
&gt;     &gt;&gt; where I am.&quot;<br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt; _______________________________________________<br>
&gt;     &gt;&gt; SciPy-User mailing list<br>
</div></div>&gt;     &gt;&gt; <a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a> &lt;mailto:<a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a>&gt;<br>
<div class="im">&gt;     &gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/scipy-user" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-user</a><br>
&gt;     &gt;&gt;<br>
&gt;     &gt;&gt;<br>
&gt;     &gt; _______________________________________________<br>
&gt;     &gt; SciPy-User mailing list<br>
</div>&gt;     &gt; <a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a> &lt;mailto:<a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a>&gt;<br>
<div class="im">&gt;     &gt; <a href="http://mail.scipy.org/mailman/listinfo/scipy-user" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-user</a><br>
&gt;     &gt;<br>
&gt;<br>
&gt;     Hi,<br>
&gt;     _______________________________________________<br>
&gt;     SciPy-User mailing list<br>
</div>&gt;     <a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a> &lt;mailto:<a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a>&gt;<br>
<div class="im">&gt;     <a href="http://mail.scipy.org/mailman/listinfo/scipy-user" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-user</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Heisenberg went for a drive and got stopped by a traffic cop. The cop<br>
&gt; asked, &quot;Do you know how fast you were going?&quot; Heisenberg replied, &quot;No,<br>
&gt; but I know where I am.&quot;<br>
</div>&gt; ------------------------------------------------------------------------<br>
<div><div></div><div class="h5">&gt;<br>
&gt; _______________________________________________<br>
&gt; SciPy-User mailing list<br>
&gt; <a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a><br>
&gt; <a href="http://mail.scipy.org/mailman/listinfo/scipy-user" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-user</a><br>
&gt;<br>
<br>
_______________________________________________<br>
SciPy-User mailing list<br>
<a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/scipy-user" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-user</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Heisenberg went for a drive and got stopped by a traffic cop. The cop asked, &quot;Do you know how fast you were going?&quot; Heisenberg replied, &quot;No, but I know where I am.&quot;<br>