Проблема
Мой ввод - это 1D функция y = f(x)
, и я хочу найти способ аппроксимировать эту функцию полилинией с небольшим количеством точек на некотором заданном интервале <x1, x2>
:
![enter image description here](https://i.stack.imgur.com/Ocfro.png)
Что я пробовал:
Я решил эту проблему, создав ломаную линию с многими точками (1000+) и затем уничтожив этоломаная линия, используя алгоритм Рамера – Дугласа – Пекера .
![enter image description here](https://i.stack.imgur.com/ZNJ2X.png)
Так что в (псевдо) Python это будет что-то вроде:
def fn_to_low_poly(f, x1, x2):
xs = numpy.linspace(x1, x2, 1000)
ys = f(xs)
return ramer_douglas_peucker_decimate(xs, ys, epsilon=0.001)
Это работает, но слишком сложно и медленно, и я почти уверен, что должен быть лучший способ.
Я делаю это сейчас в python / numpy / scipy, но явозможно, придется переписать его на C или Rust или что-то еще, так что мне не слишком важен конкретный способ решения этой проблемы в python, я бы предпочел общий алгоритм, хотя я буду благодарен за любую помощь.
Вопрос:
Существует ли алгоритм прямого преобразования 1d-функции (float -> float
) в полилинию снизкое количество баллов?