Я пытаюсь приспособить узел линейных сплайнов к набору точек. Теперь у Сципи есть метод, который подгоняет многочлен степени d (я установил его на 1 для лайнера) для набора точек, но я не могу определить желаемое количество узлов (я могу влиять на количество узлов через некоторый постоянный параметр, но я не знаю это заранее, и искать его со следом и ошибкой слишком обширные). Я нашел метод, который подгоняет кривую к набору точек, поначалу он выглядел очень многообещающе.
Я пытался установить линейный сплайн с 3 узлами, в основном идея состоит в том, чтобы определить функцию, которая получает в качестве параметра расположение узлов и параметры каждой линии из трех. к сожалению, я думаю, что это не сходится.
Я ищу новые идеи о том, как легко реализовать то, что я пытаюсь достичь.
import matplotlib.pyplot as plt
def knot3_spline_wrapper(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4):
vfunc = np.vectorize(knot3_spline)
return vfunc(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4)
def knot3_spline(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4):
if x <c1:
return x*a1+b1
if c1<=x <c2:
return x*a2+b2
if c2<=x<c3:
return x*a3+b3
if c3<=x:
return x*a4+b4
xdata = np.linspace(-2, 2, 50)
y = np.power(xdata, 2)
plt.plot(xdata, y, 'b-', label='data')
popt, pcov = curve_fit(knot3_spline_wrapper, xdata, y)
knot3_spline_wrapper(xdata, *popt)
plt.plot(xdata, knot3_spline_wrapper(xdata, *popt), 'r-')
РЕДАКТИРОВАТЬ: я хочу упомянуть, я не не знаю и не хочу указывать позиции узлов ... Я хочу найти способ найти "лучшие" позиции и лучшие линии, которые решают мою проблему
результат: