Я пытаюсь подогнать кривую к набору точек данных, но хотел бы сохранить определенные характеристики.
Как и на этом графике, у меня есть кривые, которые почти оказываются линейными, а некоторые из них - нет.Мне нужна функциональная форма для интерполяции между данными точками данных или после последней заданной точки.
Кривые были созданы с использованием простой регрессии
def func(x, d, b, c):
return c + b * np.sqrt(x) + d * x
Мой вопрос сейчас заключается в том, каков наилучший подход для обеспеченияположительный наклон мимо последней точки данных ???В моем приложении снижение затрат при увеличении объема не имеет смысла, даже если данные говорят об этом.
Я бы хотел сохранить порядок как можно более низким, возможно, 3 евро будет в порядке.
Данные, использованные для создания кривой с отрицательным наклоном, равны
x_data = [ 100, 560, 791, 1117, 1576, 2225,
3141, 4434, 6258, 8834, 12470, 17603,
24848, 35075, 49511, 69889, 98654, 139258,
196573, 277479, 391684, 552893, 780453, 1101672,
1555099, 2195148, 3098628, 4373963, 6174201, 8715381,
12302462, 17365915]
y_data = [ 7, 8, 9, 10, 11, 12, 14, 16, 21, 27, 32, 30, 31,
38, 49, 65, 86, 108, 130, 156, 183, 211, 240, 272, 307, 346,
389, 436, 490, 549, 473, 536]
А для положительного
x_data = [ 100, 653, 950, 1383, 2013, 2930,
4265, 6207, 9034, 13148, 19136, 27851,
40535, 58996, 85865, 124969, 181884, 264718,
385277, 560741, 816117, 1187796, 1728748, 2516062,
3661939, 5329675, 7756940, 11289641, 16431220, 23914400,
34805603, 50656927]
y_data = [ 6, 6, 7, 7, 8, 8, 9, 10, 11, 12, 14, 16, 18,
21, 25, 29, 35, 42, 50, 60, 72, 87, 105, 128, 156, 190,
232, 284, 347, 426, 522, 640]
Подгонка кривой выполняется простым использованием
popt, pcov = curve_fit(func, x_data, y_data)
Для сюжета
plt.plot(xdata, func(xdata, *popt), 'g--', label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.plot(x_data, y_data, 'ro')
plt.xlabel('Volume')
plt.ylabel('Costs')
plt.show()