title: exponential curve fitting with python
body: <p>I am trying to convert some Matlab code I have for curve fitting my data into python code but am having trouble getting similar answers. The data is:</p>
  
  <pre><code>x = array([   0.  ,   12.5 ,   24.5 ,   37.75,   54.  ,   70.25,   87.5 ,
      108.5 ,  129.5 ,  150.5 ,  171.5 ,  193.75,  233.75,  273.75])
  y = array([-8.79182857, -5.56347794, -5.45683824, -4.30737662, -1.4394612 ,
     -1.58047016, -0.93225927, -0.6719836 , -0.45977157, -0.37622436,
     -0.56115757, -0.3038559 , -0.26594558, -0.26496367])
  </code></pre>
  
  <p>The Matlab code is:</p>
  
  <pre><code>function [estimates, model] = curvefit(xdata, ydata)
  % fits data to the curve y(x)=A-B*e(-lambda*x)
  
  start_point = rand(1,3);
  
  model =@efun;
  options = optimset('Display','off','TolFun',1e-16,'TolX',1e-16);
  estimates = fminsearch(model, start_point,options);
  % expfun accepts curve parameters as inputs, and outputs sse,
  % the sum of squares error for A -B* exp(-lambda * xdata) - ydata, 
  % and the FittedCurve. 
      function [sse,FittedCurve] = efun(v)
          A=v(1);
          B=v(2);
          lambda=v(3);
          FittedCurve =A - B*exp(-lambda*xdata);
          ErrorVector=FittedCurve-ydata;
          sse = sum(ErrorVector .^2);
      end
  end
  err = Inf;
  numattempts = 100;
  for k=1:numattempts
  [intermed,model]=curvefit(x, y));
  [thiserr,thismodel]=model(intermed);
  if thiserr&lt;err
      err = thiserr;
      coeffs = intermed;
      ymodel = thismodel;
  end
  </code></pre>
  
  <p>and so far in Python I have:</p>
  
  <pre><code>import numpy as np
  from pandas import Series, DataFrame
  import pandas as pd
  import matplotlib.pyplot as plt
  from scipy import stats
  from scipy.optimize import curve_fit
  import pickle
  
  def fitFunc(A, B, k, t):
      return A - B*np.exp(-k*t)
  init_vals = np.random.rand(1,3)
  fitParams, fitCovariances = curve_fit(fitFunc, y, x], p0=init_vals)
  </code></pre>
  
  <p>I think I have to do something with running 100 attempts on the p0, but the curve only converges about 1/10 times and it converges to a straight line, way off from the value I get in Matlab. Also most questions regarding curve fitting that I have seen use B<em>np.exp(-k</em>t) + A, but the exponential formula I have above is the one I have to use for this data. Any thoughts? Thank you for your time!</p>