Алгоритм приведения 1D-функции к полилинии с небольшим количеством точек - PullRequest
0 голосов
/ 05 ноября 2019

Проблема

Мой ввод - это 1D функция y = f(x), и я хочу найти способ аппроксимировать эту функцию полилинией с небольшим количеством точек на некотором заданном интервале <x1, x2>:

enter image description here

Что я пробовал:

Я решил эту проблему, создав ломаную линию с многими точками (1000+) и затем уничтожив этоломаная линия, используя алгоритм Рамера – Дугласа – Пекера .

enter image description here

Так что в (псевдо) 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) в полилинию снизкое количество баллов?

...