Hi,<div><br></div><div>Thanks for your responses. After some more digging and some more testing I&#39;m beginning to think that the algorithm used by curve_fit simply isn&#39;t robust enough for the data that I am trying to fit. Below is an example of some experimental radioactive decay data that I am trying to fit to an exponential decay. </div>

<div><br></div><div><div>#!/usr/bin/env python</div><div>import numpy as np</div><div>import scipy as sp</div><div>import pylab as pl</div><div>from scipy.optimize.minpack import curve_fit</div><div><br></div><div>x = [  50.,  110.,  170.,  230.,  290.,  350.,  410.,  470.,  530.,  590.]</div>

<div>y = [ 3173.,  2391.,  1726.,  1388.,  1057.,   786.,   598.,   443.,   339.,   263.]</div><div><br></div><div>smoothx = np.linspace(x[0], x[-1], 20)</div><div>guess_a, guess_b, guess_c = 4000, -0.005, 100</div><div>
guess = [guess_a, guess_b, guess_c]</div>
<div><br></div><div>f_theory1 = lambda t, a, b, c: a * np.exp(b * t) + c</div><div>f_theory2 = lambda t, a, b: np.exp(a * t) + b</div><div><br></div><div>pl.plot(x, y, &#39;b.&#39;, smoothx, f_theory1(smoothx, guess_a, guess_b, guess_c))</div>

<div>pl.show()</div><div><br></div><div>p, cov = curve_fit(f_theory1, x, y)</div><div>#p, cov = curve_fit(f_theory2, x, y)</div><div><br></div><div># the following gives:</div><div>#   ValueError: shape mismatch: objects cannot be broadcast to a single shape</div>

<div>#p, cov = curve_fit(f_theory1, x, y, p0=guess)</div><div><br></div><div>pl.clf()</div><div>f_fit1 = lambda t: p[0] * np.exp(p[1] * t) + p[2]</div><div>#f_fit2 = lambda t: np.exp(p[0] * t) + p[1]</div><div>pl.plot(x, y, &#39;b.&#39;, smoothx, f_fit1(smoothx), &#39;k-&#39;)</div>

<div>pl.show()</div><div><br></div><div>##</div><div>## EOF</div><div>##</div><div><br></div><div>As you can see, I have tried to fit using 2 or 3 parameters with no luck. Is there something that I could do to make this work? I have tried this exact thing in matlab and it worked the first time. Unfortunately, I would really like to use python as I find it in general more intuitive than matlab.</div>

<div><br></div><div>Thanks,</div><div>~Kris</div><br><div class="gmail_quote">On Wed, Oct 7, 2009 at 9:40 AM, Bruce Southey <span dir="ltr">&lt;<a href="mailto:bsouthey@gmail.com">bsouthey@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Wed, Oct 7, 2009 at 1:19 AM,  &lt;<a href="mailto:josef.pktd@gmail.com">josef.pktd@gmail.com</a>&gt; wrote:<br>


&gt; On Wed, Oct 7, 2009 at 1:36 AM, Kris Maynard &lt;<a href="mailto:maynard@bu.edu">maynard@bu.edu</a>&gt; wrote:<br>
&gt;&gt; I am having trouble with fitting data to an exponential curve. I have an x-y<br>
&gt;&gt; data series that I would like to fit to an exponential using least squares<br>
&gt;&gt; and have access to the covariance matrix of the result. I summarize my<br>
&gt;&gt; problem in the following example:<br>
&gt;&gt;<br>
&gt;&gt; import numpy as np<br>
&gt;&gt; import scipy as sp<br>
&gt;&gt; from scipy.optimize.minpack import curve_fit<br>
&gt;&gt;<br>
&gt;&gt; A, B = 5, 0.5<br>
&gt;&gt; x = np.linspace(0, 5, 10)<br>
&gt;&gt; real_f = lambda x: A * np.exp(-1.0 * B * x)<br>
&gt;&gt; y = real_f(x)<br>
&gt;&gt; ynoisy = y + 0.01 * np.random.randn(len(x))<br>
&gt;&gt;<br>
&gt;&gt; exp_f = lambda x, a, b: a * np.exp(-1.0 * b * x)<br>
&gt;&gt;<br>
&gt;&gt; # this line raises the error:<br>
&gt;&gt;<br>
&gt;&gt; #  RuntimeError: Optimal parameters not found: Both<br>
&gt;&gt;<br>
&gt;&gt; #  actual and predicted relative reductions in the sum of squares<br>
&gt;&gt;<br>
&gt;&gt; #  are at most 0.000000 and the relative error between two<br>
&gt;&gt;<br>
&gt;&gt; #  consecutive iterates is at most 0.000000<br>
&gt;&gt;<br>
&gt;&gt; params, cov = curve_fit(exp_f, x, ynoisy)<br>
&gt;<br>
<br>
</div>Could you please first plot your data?<br>
As you would see, the curve is very poorly defined with those model<br>
parameters and range. So you are asking a lot from your model and<br>
data. At least you need a wider range with those parameters or Josef<br>
says different parameter(s):<br>
<div class="im"><br>
&gt; this might be the same as  <a href="http://projects.scipy.org/scipy/ticket/984" target="_blank">http://projects.scipy.org/scipy/ticket/984</a> and<br>
&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;<br>
&gt; If I increase your noise standard deviation from 0.1 to 0.2 then I do get<br>
&gt; correct estimation results in your example.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; I have tried to use the minpack.leastsq function directly with similar<br>
&gt;&gt; results. I also tried taking the log and fitting to a line with no success.<br>
&gt;&gt; The results are the same using scipy 0.7.1 as well as 0.8.0.dev5953. Am I<br>
&gt;&gt; not using the curve_fit function correctly?<br>
&gt;<br>
&gt; With   minpack.leastsq   error code 2 should be just a warning. If you get<br>
&gt; incorrect parameter estimates with optimize.leastsq, besides the warning, could<br>
&gt; you post the example so I can have a look.<br>
&gt;<br>
&gt; It looks like if you take logs then you would have a problem that is linear in<br>
&gt; (transformed) parameters, where you could use linear least squares if you<br>
&gt; just want a fit without the standard errors of the original parameters<br>
&gt; (constant)<br>
<br>
</div>The errors will be multiplicative rather than additive.<br>
<br>
Bruce<br>
<div class="im"><br>
&gt;<br>
&gt; I hope that helps.<br>
&gt;<br>
&gt; Josef<br>
&gt;<br>
&gt;<br>
&gt;&gt; Thanks,<br>
&gt;&gt; ~Kris<br>
&gt;&gt; --<br>
&gt;&gt; Heisenberg went for a drive and got stopped by a traffic cop. The cop asked,<br>
&gt;&gt; &quot;Do you know how fast you were going?&quot; Heisenberg replied, &quot;No, but I know<br>
&gt;&gt; where I am.&quot;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; SciPy-User mailing list<br>
&gt;&gt; <a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a><br>
&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;&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>
</div>Hi,<br>
<div><div></div><div class="h5">_______________________________________________<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>


</div>