title: Exponent Curve Fitting in Python
body: <p>Hello Guys I have a problem with my curve fitting, I get weird results,
  below is my code: </p>
  
  <pre><code>x=np.array([     0.   ,    117.999,    239.843,    307.682,    478.998,
            599.465,    719.569,    839.406,    959.895,   1079.811,
           1199.307,   1319.546,   1439.448,   1560.056,   1679.475,
           1799.219,   1919.637,   2039.599,   2160.254,   2279.731,
           2399.728,   2519.749,   2639.661,   2759.891,   2879.454,
           2999.56 ,   3119.91 ,   3239.72 ,   3359.448,   3479.005,
           3599.566,   3719.498,   3839.534,   3959.571,   4079.377,
           4199.786,   4319.232,   4438.888,   4560.006,   4679.155,
           4799.745,   4919.229,   5039.53 ,   5159.228,   5279.553,
           5400.278,   5518.791,   5638.914,   5759.079,   5880.445,
           5999.498,   6119.269,   6239.705,   6359.813,   6480.192,
           6600.37 ,   6719.434,   6839.191,   6959.195,   7079.549,
           7198.495,   7318.533,   7438.822,   7559.135,   7678.648,
           7798.731,   7918.261,   8038.651,   8158.605,   8279.093,
           8398.671,   8519.004,   8638.563,   8759.005,   8878.764,
           8998.315,   9118.957,   9239.002,   9358.446,   9478.628,
           9598.738,   9719.122,   9839.224,   9958.617,  10078.85 ,
          10199.199,  10319.528,  10438.573,  10559.071,  10679.363])
  
  y=np.array([ 121.32,  129.31,  135.11,  139.71,  147.66,  156.09,  163.03,
      170.  ,  177.08,  184.77,  191.38,  198.73,  204.51,  211.83,
      219.51,  225.53,  232.54,  238.21,  245.94,  252.82,  259.15,
      266.75,  274.07,  280.93,  287.73,  294.88,  302.89,  309.8 ,
      316.32,  322.87,  331.42,  336.98,  344.63,  348.29,  354.48,
      360.99,  368.03,  372.79,  376.91,  384.85,  388.97,  394.49,
      396.82,  401.43,  408.19,  407.6 ,  415.95,  416.8 ,  416.2 ,
      424.01,  426.7 ,  428.67,  431.59,  434.18,  437.4 ,  441.59,
      437.17,  441.6 ,  445.85,  446.06,  449.68,  449.19,  449.63,
      451.75,  451.05,  453.37,  452.8 ,  457.66,  459.33,  460.5 ,
      458.22,  461.3 ,  461.22,  462.81,  461.62,  462.99,  457.83,
      462.3 ,  464.88,  466.13,  464.85,  468.6 ,  467.93,  467.19,
      468.06,  469.46,  469.82,  471.9 ,  469.01,  469.06])
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/egirT.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/egirT.png" alt="enter image description here"></a></p>
  
  <p>I am using scipy.optimize.curve_fit to do exponential fit.</p>
  
  <pre><code>def func(x, a, b, c):
          return a*np.exp(-b*x)+c
  
  
  a0 = y.ptp()
  b0 = -1/x.ptp()
  c0 = y.min()
  popt, pcov = curve_fit(func, x, y, p0=(a0, b0, c0), maxfev = 2000)
  plt.figure()
  plt.plot(x, y, 'ko', label="Original Noised Data")
  plt.plot(x, func(x, *popt), 'r-', label="Fitted Curve")
  plt.legend()
  plt.show()
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/sot0B.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/sot0B.png" alt="enter image description here"></a></p>
  
  <p>the fitting curve doesn't look nice</p>
  
  <p>edit: popt and pcov values
  edit2: I have modified values to look like my data is exponent</p>
  
  <pre><code>popt
  array([  2.23557884e+06,  -1.48238130e-08,  -2.23539443e+06])
  
  pcov
  array([[  5.35480790e+16,   3.55032838e+02,  -5.35480791e+16],
         [  3.55032838e+02,   2.35392818e-12,  -3.55032839e+02],
         [ -5.35480791e+16,  -3.55032839e+02,   5.35480792e+16]])
  </code></pre>