Проблема должна быть с n_step
и n_mean
(которые не указаны в вопросе, как указано в настоящее время);при попытке воспроизвести проблему с каким-либо произвольно выбранным набором входных параметров оптимизация работает, как и ожидалось.Давайте попробуем.
Во-первых, давайте определим некоторые произвольно выбранные входные параметры в данном пространстве параметров как
params = [-0.1, 2.95, -1, -5, 5]
Давайте посмотрим, как это выглядит:
import matplotlib.pyplot as plt
xs = np.linspace(-30, 30, 100)
plt.plot(xs, hyperbola(xs, *params))
Исходя из этого, давайте определим некоторые довольно грубые входные данные для xdata
и ydata
с помощью
xdata = np.linspace(-30, 30, 10)
ydata = hyperbola(xs, *params)
С этими, давайтезапустите оптимизацию и посмотрите, соответствуют ли мы нашим заданным параметрам:
vars, covariance = curve_fit(f=hyperbola, xdata=xdata, ydata=ydata, p0=guess, bounds=(min_fit, max_fit))
print(vars) # [-0.1 2.95 -1. -5. 5. ]
То есть, идеально подходит, даже если наши params
довольно отличаются от наших guess
.Другими словами, если мы можем свободно выбирать n_step
и n_mean
, то метод работает, как и ожидалось.
Чтобы попытаться немного усложнить оптимизацию, мы могли бы также попытаться добавить немногошум:
np.random.seed(42)
xdata = np.linspace(-30, 30, 10)
ydata = hyperbola(xdata, *params) + np.random.normal(0, 10, size=len(xdata))
vars, covariance = curve_fit(f=hyperbola, xdata=xdata, ydata=ydata, p0=guess, bounds=(min_fit, max_fit))
print(vars) # [ -1.18173287e-01 2.84522636e+00 -1.57023215e+00 -6.90851334e-12 6.14480856e-08]
plt.plot(xdata, ydata, '.')
plt.plot(xs, hyperbola(xs, *vars))
Здесь мы отмечаем, что оптимум заканчивается тем, что он отличается от наших предоставленных params
и guess
, однаков пределах, предусмотренных min_fit
и max_fit
, и все еще при условии хорошей подгонки.