Я некоторое время копался в stackoverflow и не могу найти ни одного примера для подбора нескольких кусочных кривых. Я хочу преобразовать квадратичную функцию c в множественную цепочку (я не знаю ее точного названия, но мне нужен каждый хвост, соединенный с головкой следующей кусочно-простой, просто «соединенной») кусочно-функциональной функции. Пока это мой код, использующий scipy.optimize
для преобразования квадратичного c в 2 кусочно-линейных функции.
import scipy.optimize as opt
import numpy as np
import copy
def func_2piecewise(x, m_0, x_1, y_1, m_1):
y = np.piecewise(x, [x <= x_1, x > x_1],
[lambda x:m_0*(x-x_1) + y_1, lambda x:m_1*(x-x_1) + y_1])
return y
xmin=0
xmax=100
a=0.1
a0=1
a00=10
piece_number=2
sigma=np.ones(numberOfStep)
if piece_number==2:
lower_bounds=[-np.inf,xmin,-np.inf,-np.inf]
upper_bounds=[np.inf,xmax,np.inf,np.inf]
w, _ = opt.curve_fit(func_2piecewise, x_sample, y_sample,bounds=(lower_bounds,upper_bounds),sigma=sigma)
x_0=copy.deepcopy(xmin)
y_0=func_2piecewise(x_0, *w).tolist()
[m_0, x_1, y_1, m_1]=w
result=[x_0,y_0,m_0,x_1,y_1,m_1]
Проблема в том, что я не могу реализовать один и тот же подход для трех кусочно (я не знаю, как сделать x_2> x_1):
def func_gradients(x_list,y_list):
len_x_list=len(x_list)
if len_x_list==1:
m_list=y_list/x_list
return m_list
m_list=[]
for idx in range(len_x_list-1):
m_list.append((y_list[idx+1]-y_list[idx])/(x_list[idx+1]-x_list[idx]))
return m_list
def func_3piecewise(x, m_0, x_1, y_1, x_2, y_2, m_2):
y = np.piecewise(x, [x <= x_1, (x > x_1) & (x <= x_2), x > x_2],
[lambda x:m_0*(x-x_1) + y_1, lambda x:y_1+(y_2-y_1)*(x-x_1)/(x_2-x_1), lambda x:m_2*(x-x_2) + y_2])
return y
if piece_number==3:
lower_bounds=[-np.inf,xmin,-np.inf,xmin,-np.inf,-np.inf]
upper_bounds=[np.inf,xmax,np.inf,xmax,np.inf,np.inf]
w, _ = opt.curve_fit(func_3piecewise, x_sample, y_sample,bounds=(lower_bounds,upper_bounds),sigma=sigma)
x_0=copy.deepcopy(xmin)
y_0=func_3piecewise(x_0, *w).tolist()
[m_0, x_1, y_1, x_2, y_2, m_2]=w
m_1=func_gradients(x_2-x_1,y_2-y_1)
result=[x_0,y_0,m_0,x_1,y_1,m_1, x_2, y_2, m_2]
Полный код можно увидеть в pastebin
Итак, вопрос такой: Как сделать цепочку (каждый хвост кусочной функции, соединенной с головкой следующего куска, или просто «соединенной») подобной функцией в python для общих n-кусочков? Допустим другой алгоритм или решатель.
Редактировать: пока что я добавляю свой результат для двух частей.
Обновление: я обнаружил, что мой код (для трех частей) не работает из-за маленькой опечатки (извините, просто скажите мне, если я должен удалить этот вопрос). Теперь это работает, и я обновляю корзину для вставки. Но если у вас есть общая функция (гибкая, не нужно писать функцию для каждого варианта числа), которая может генерировать n чисел, я с радостью приму ответ.