Skip to content Skip to sidebar Skip to footer

Exponential Curve Fit Will Not Fit

When attempting to plot an exponential curve to a set of data: import matplotlib import matplotlib.pyplot as plt from matplotlib import style from matplotlib import pylab import nu

Solution 1:

From your data it is obvious that you need a positive exponent, therefore, b needs to be negative as you use a*np.exp(-b*x) + c as the underlying model. However, you start with a positive initial value for b which most likely causes the issues.

If you change

popt, pcov = curve_fit(exponenial_func, x, y, p0=(1, 1e-6, 1))

to

popt, pcov = curve_fit(exponenial_func, x, y, p0=(1, -1e-6, 1))

it works fine and gives the expected outcome.

enter image description here

Alternatively, you could also change your equation to

return a*np.exp(b*x) + c

and start with the same initial values as you had.

Here is the entire code:

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit


defexponenial_func(x, a, b, c):
    return a*np.exp(b*x)+c


x = np.array([20, 30, 40, 50, 60])
y = np.array([0.015162344, 0.027679854, 0.055639098, 0.114814815, 0.240740741])


popt, pcov = curve_fit(exponenial_func, x, y, p0=(1, 1e-6, 1))

xx = np.linspace(20, 60, 1000)
yy = exponenial_func(xx, *popt)

# please check whether that is correct
r2 = 1. - sum((exponenial_func(x, *popt) - y) ** 2) / sum((y - np.mean(y)) ** 2)

plt.plot(x, y, 'o', xx, yy)
plt.title('Exponential Fit')
plt.xlabel(r'Temperature, C')
plt.ylabel(r'1/Time, $s^-$$^1$')
plt.text(30, 0.15, "equation:\n{:.4f} exp({:.4f} x) + {:.4f}".format(*popt))
plt.text(30, 0.1, "R^2:\n {}".format(r2))

plt.show()

Post a Comment for "Exponential Curve Fit Will Not Fit"