проблема со скучной интерполяцией - PullRequest
0 голосов
/ 08 января 2019

У меня возникли проблемы с использованием методов интерполяции scipy, чтобы получить хорошую плавную кривую из заданных точек данных. Я попытался использовать стандартную 1D-интерполяцию, RBF-интерполяцию со всеми параметрами (кубическая, гауссова, многоквадратичная и т. Д.)

на предоставленном изображении, синяя линия - исходные данные, и я собираюсь сначала сгладить острые края, а затем иметь динамически редактируемые точки, из которых можно пересчитать кривую. Каждый раз, когда редактируется отдельная точка, она должна автоматически вычислять новый сплайн некоторого вида для плавного перехода между каждой точкой. Это работает, когда точки находятся в определенном диапазоне друг от друга, как показано ниже.

good example of a good result

Но если точки оказываются слишком далеко друг от друга или слишком близко друг к другу, я сталкиваюсь с такими проблемами, как следующие.

good example of a bad result

Ключевые моменты:

  1. Кривая ДОЛЖНА быть плоской между первыми двумя точками
  2. Кривая НЕ должна опускаться ниже точки 1 или 2 (т.е. производная не может быть отрицательной)
  3. ~ 15 точек (не показаны) между точками 2 и 3 также доступны для редактирования, и линия между ними не обязательно является линейной. Полный контроль над каждой из этих точек является обязательным, так как кривая проходит через каждую из них.

Я рад разбить его на более мелкие кривые, которые я затем соединяю / сворачиваю, но мне просто нужно обеспечить градиент> 0.

пример данных:

x=[0, 37, 50, 105, 115,120]
y=[0.00965, 0.00965, 0.047850827205882, 0.35600416666667, 0.38074375,  0.38074375]

В качестве примера попробуйте переместить точку 2 (x=37) в крайнее значение, скажем, 10 (оставьте у прежним). Просто убедитесь, что все точки от x=0 до x=10 (или любого другого варианта) имеют одинаковые значения y 0.00965.

любая помощь очень ценится.

UPDATE Попытка pchip метода предложена в комментариях с результатами ниже:

метод Пчипа, все лучше и хуже ...

1 Ответ

0 голосов
/ 23 января 2019

Решено!

Хотя я не уверен, что это действительно так, похоже, что сплайн-инструменты для создания кривых Безье обрабатывают контрольные точки как точки вычисленной кривой должны пройти - что не так в моем случае. Я не мог понять, как отключить эту функцию, поэтому я нашел кубическую формулу для кривой Безье (кубик - то, что мне нужно) и вычислил свои собственные точки. Я только тогда должен был сделать небольшую корректировку, чтобы точки соответствовали требуемым значениям целого числа x - в моем случае, достаточно близко, достаточно хорошо. В противном случае я бы потребовал линейной интерполяции между двумя точками по обе стороны от желаемого значения x и определения точного значения.

Для тех, кто заинтересован, для кубического нужно 4 очка - начало, конец и 2 контрольных точки. Правило:

B(t) = (1-t)^3 P0 + 3(1-t)^2 tP1 + 3(1-t)t^2 P2 + t^3 P3

Рассчитать для x и y отдельно, используя список значений для t. Если вам нужно сопоставить градиент, просто убедитесь, что контрольные точки для P1 и P2 перемещаются только вдоль того же градиента, что и в предыдущих / последующих разделах.

Идеальный результат

...