Я пытаюсь вписать трапецию в набор временных рядов, используя библиотеку curve_fit из scipy.optimize. Функция, которую я использую для генерации трапеции, следующая:
def trapezoid(x, a, b, c, tau1, tau2):
y = np.zeros(len(x))
c = -np.abs(c)
a = np.abs(a)
y[:int(tau1)] = a*x[:int(tau1)] + b
y[int(tau1):int(tau2)] = a*tau1 + b
y[int(tau2):] = c*(x[int(tau2):]-tau2) + (a*tau1 + b)
return y
Где a и c - наклоны, а tau1 и tau2 отмечают начало и конец плоской фазы.
А чтобы соответствовать, я просто использую:
popt, pcov = curve_fit(trapezoid, xdata, ydata, method = 'lm')
В большинстве случаев он работает просто отлично, например, в следующем:
Тем не менее, я также получаю некоторые случаи, когда он просто не вписывается в данные, где, похоже, все должно быть в порядке:
Проблема в этих случаях заключается в том, что он устанавливает tau2 (конец плоской фазы) меньше, чем tau1 (начало).
Может ли кто-нибудь предложить способ решения этой проблемы? Будь то путем наложения ограничения или каким-либо другим способом?
Пример массива, для которого не работает подгонка:
массив ([1,2, 1,21, 1,2, 1,19, 1,21, 1,22, 2,47, 2,53, 2,49, 2,39, 2,28,
2,16, 2,07, 1,99, 1,91, 1,83, 1,74, 1,65, 1,57, 1,5, 1,45, 1,41,
1,38, 1,35, 1,33, 1,29, 1,24, 1,19, 1,14, 1,11, 1,07, 1,04, 1,
0,95, 0,91, 0,87, 0,84, 0,8, 0,77, 0,74, 0,72, 0,7, 0,68, 0,66,
0,63, 0,61, 0,59, 0,57, 0,55, 0,52, 0,5, 0,48, 0,45, 0,43, 0,41,
0,39, 0,38, 0,37, 0,37, 0,36, 0,35, 0,34, 0,34, 0,33])
Что дает: тау1: 8,45, тау2: 5,99