Есть ли простой способ вычисления «гладкой» функции со следующими характеристиками в C / C ++? - PullRequest
5 голосов
/ 17 декабря 2010

Для того, чтобы сначала указать некоторые вещи: пользователь должен иметь возможность создать график, указав от 3 до 5 точек в 2D-поле. Первая и последняя точки всегда находятся в границах этого поля (их положение может быть изменено только в направлении y, но не x). Вывод графика в этих позициях должен быть 0. Положение 3-го и последующих пунктов может быть указано свободно. График должен быть интерполирован, который проходит через все точки. Однако этот график должен быть как можно более гладким и ровным. (прошу прощения за то, что математически не правильно)

Важная вещь: мне нужно затем сэмплировать значения этого графика и применить их к дискретному сигналу. Второе: в пределах оси X значения функции не должны выходить за границы оси Y. На моих рисунках это будет 0 и 1 на оси Y. Я создал несколько фотографий, чтобы проиллюстрировать, о чем я говорю, используя 3 очка.

Некоторые мысли у меня были:

  1. Используйте (кубические?) Сплайны: их характеристики могут быть использованы для формирования таких кривых без особых проблем. Однако, насколько я знаю, они не относятся к глобальной оси X. Они указываются относительно следующей точки через параметр, обычно называемый (ы). Поэтому будет сложно выбрать значения графика, связанные с осью X. Пожалуйста, поправьте меня, когда я ошибаюсь.
  2. создайте матрицу, которая содержит точки и производные в этих точках, и решите эту матрицу, используя разложение LU или что-то эквивалентное.

Пока у меня нет глубокого понимания этих техник, поэтому я мог бы пропустить какую-то замечательную технику или алгоритм, о которых я еще не знал.

Есть еще одна вещь, которую было бы здорово сделать: способность регулировать крутизну кривой путем изменения одного или нескольких параметров. Я проиллюстрировал это, используя красный и черный график на некоторых моих рисунках. Любые идеи или советы, как решить это эффективно?

alt text alt text alt textalt text

Ответы [ 3 ]

5 голосов
/ 17 декабря 2010

Вы понимаете, как появляются сплайны?

Резюме выполнения сплайнов

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

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

Результатом является набор параметров для кусочной функции. Как правило, кусочно-непрерывная и дифференцируемая функция, потому что какой бы смысл был в противном случае.

Как вы можете использовать это в этом случае

Так что рассмотрите возможность сделать каждую внутреннюю точку центром сегмента, который будет занят функцией, подобной пику (возможно, гауссовой на линейном фоне), и используйте конечные точки в качестве ограничений.

Для n общего количества очков у вас будет D*(n-2) параметров, если каждый сегмент имеет D параметров. У вас есть четыре ограничения конечной точки f(start)=y_0, f(end)=y_n, f'(start) = f'(end) = 0) и некоторый набор ограничений на совпадение между сегментами:

f_n(between n and n+1) = f_n+1(between n and n+1)
f'_n(between n and n+1) = f'_n+1(between n and n+1)
...

плюс каждый сегмент ограничен его отношением к контрольной точке (обычно либо f(point n) = y_n или f'(point n) = 0, либо и тем, и другим (но вы можете решить).

Сколько ограничений соответствия вы можете иметь, зависит от количества степеней свободы (общее количество ограничений должно равняться общему количеству степеней свободы, верно?). Вам нужно ввести некоторые дополнительные ограничения для конечной точки в форме f''(start) = 0 ..., чтобы все было правильно.

В этот момент вы просто смотрите на множество утомительных алгебр, чтобы заработать, как перевести это в большую систему линейных уравнений, которую вы можете решить с помощью инверсии матриц.

Большинство книг по числовым методам будут охватывать этот материал.

2 голосов
/ 17 декабря 2010

Нет причин, по которым вы не можете использовать сплайны. Если у вас есть формулировка / библиотека для этого, которая имеет дело с приращениями, просто перейдите от начальной точки к конечной точке вашего графика с нужным количеством точек.

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

Степень свободы, которая позволяет расширять или сужать пики в интерполированной функции, более неоднозначна. Одна возможность состоит в том, чтобы упорядочить иным образом недоопределенный набор уравнений по его свойствам в производных более высокого порядка или по его отклонению от интерполятора первого порядка (линейного).

Удачи!

0 голосов
/ 17 декабря 2010

Почему бы не использовать известные решения вашей проблемы?Читайте о линейной регрессии и полиномиальной регрессии .Это алгоритмы, которые вы ищете.ОБНОВЛЕНИЕ: полиномиальный из ваших интересов

...