Я думаю, проблема в том, что вы передаете 'z'
в args
, который является строкой и поэтому не может использоваться в умножении.
Ниже приведен код, использующий curve_fit который использует least_squares
, но может быть немного проще в использовании:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
# your model definition
def model(z, a, b):
return a * np.exp(-b * z)
# your input data
x = np.array([20, 30, 40, 50, 60])
y = np.array([5.4, 4.0, 3.0, 2.2, 1.6])
# do the fit with some initial values
popt, pcov = curve_fit(model, x, y, p0=(5, 0.1))
# prepare some data for a plot
xx = np.linspace(20, 60, 1000)
yy = model(xx, *popt)
plt.plot(x, y, 'o', xx, yy)
plt.title('Exponential Fit')
plt.show()
Это построит
Вы можете попробоватьадаптируйте этот код для своих нужд.
Если вы хотите использовать f_scale
, вы можете использовать:
popt, pcov = curve_fit(model, x, y, p0=(5, 0.1), method='trf', f_scale=0.1)
См. документацию :
kwargs
Аргументы ключевых слов, переданные в leastsq для метода = 'lm' или less_squares в противном случае.
Если у вас есть несвязанная проблема, по умолчанию используется method='lm'
, который используетleastsq
, который не принимает f_scale
в качестве ключевого слова.Поэтому мы можем использовать method='trf'
, который затем использует least_squares
, который принимает f_scale
.