Curve_fitting data (I'm close to the params values, but curve_fit says optimal parameters not found)
<p>I'm trying to fit the data in <a href="http://www.filedropper.com/aluminio33920umaire" rel="nofollow">this file</a> with <code>curve_fit</code> from scipy in Python. The file contains data points of temperature vs time in celsius and milliseconds. I convert them to kelvin and seconds:</p>

<pre><code>thefile = open("aluminio_33920um_aire.txt", "r")
data = np.loadtxt(thefile, delimiter='\t', skiprows=1)
Temp = data[:, 0] + 273.15  #kelvin
Time = data[:, 1]*1e-3  #secs
thefile.close()
</code></pre>

<p>I define a couple of functions to be fitted:</p>

<pre><code>def newton(t, a, b, tau):
    return a + b * np.exp(-t/tau)

def dulong(t, ta, dift, f, n):
    return ta + (dift + (n-1)*t/f)**(1/(1-n))
</code></pre>

<p>newton's fitting works perfectly. But dulong does not. I have plotted several values for the parameters of duolong to see which values draw a line that more or less fits the data, and I found the values given here:</p>

<pre><code>poptd, pcovd = curve_fit(dulong, Time, Temp, p0=[295, 0.155, 6000, 1.38], sigma=[1]*len(Temp), absolute_sigma=True)
</code></pre>

<p>However, passing these values <code>p0</code> to curve_fit does not help since I get the error</p>

<pre><code>RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.
</code></pre>

<p>Don't know how to improve since the initial guess of my parameters is a really good guess. I appreciate your help.</p>

<p>Your dulong function is highly sensitive to changes in n because of its <code>n^n</code> dependancy. You might want set bounds for it or even keep it as a constant if thats good enough for you.</p>

<p>Also, if you are dealing with sufficient small timescales you could consider using a approximating function. If not, try to take the logarithm of your temp data and fit the logarithm of the dulong function. This can be useful if the algorithm takes steps too big when variating n.</p>

<p>For debugging purposes you can add a line to your function which prints the parameters passed, that way you will be able to see which parameter is varied by how much and you can work from there.
As another measure you can take a look at the minimize function from scipy.optimize, there you will be able to specify more options like solving algorithm and stepwidth to be taken and you can also pass the jacobian to further improve efficiency.</p>

python scipy curve-fitting