Я думаю, что проблема заключается в функции модели. Если вы измените эту функцию на такую, как:
def func(x, a, b, c, d):
return a * (np.exp(d*(x + b))) + c
, тогда она найдет подходящее соответствие:
Я изменил несколько вещей в коде:
def func(x, a, b, c, d):
return a * (np.exp(d*(x + b))) + c
X = [0.0, 9.0, 18.0, 27.0, 36.0, 45.0, 54.0]
Y = [0.090316199, -0.078157925, -0.350137315, -0.695193468, -1.106773689, -1.60467115, -2.196169408]
# plot Y against X
fig = plt.figure(num=None, figsize=(9, 7), facecolor='w', edgecolor='k')
ax = fig.add_subplot(111)
ax.scatter(X, Y)
# fit using curve_fit
popt, pcov = curve_fit(func, X, Y, maxfev=10000)
# compute Y_estiamted using fitted parameters
x = np.linspace(min(X), max(X), 100)
Y_estimated = func(x, *popt)
# plot Y_estiamted against X
ax.plot(x, Y_estimated, c='r')