Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Интерполяция сплайнами...


Автор: Mal Hack 13.4.2004, 20:04
Вобщем трабл такой... Опять же для курсовика надо сделать три задачи на интерполяцию.
С методами Ньютона и Лагранжа я разобрался без проблем, но вот алгоритм работы интерполяции сплайнами не совсем понял...
Т.е. юзер вводит определенное количество иксов и соответствующих им значения функции, значение икса, которое требуется узнать. Вопрос, что дальше делать...
В итоге-то получить должны члены a[i] для многочлена и значение функции для указанного ранее икса...

Автор: achmed 13.4.2004, 20:28
получаешь набор многочленов, савокупность которых образует искомую функцию,
(т.е они образуют кусочную функцию), вычисляешь нужное значение в нужной точке,
в чем прблема то ?



Автор: Mal Hack 13.4.2004, 20:48
проблема в том, что я не совсем догоняю, как и что надо сделать и в каком порядке и интерполяции сплайнами...

Автор: podval 13.4.2004, 20:54
Рассмотрим на примере.
Предположим, ты хочешь знать значение несущей частоты радиосигнала. Известными методами (хоть БПФ даже) ты строишь график спектральной плотности мощности (СПМ) и ищешь, какой частоте соответствует максимум. Но вот беда: ограничение, связанное с реализацией метода измерений, позволяет оценить значение частоты с точностью только, скажем, до Гц. А позарез надо до 0.01 Гц, например.
Что делаем? Уточняем значение частоты!
Как? Интерполируем области между максимумом и двумя его соседями сплайном!
Математически это выглядит так, что используется несколько исходных точек - узлов интерполяции. Среди них находится и наш грубо оцененный максимум, обозначим его как точка f[0]. Далее с использованием формул интерполяционных сплайнов (специального вида полином) вычисляем значения функции (у нас - СПМ) между узлами f[-1], f[0], f[1] с выбранным шагом (0.01). Ищем в полученном большом массиве максимум. Ему соответствует уточненное значение несущей частоты, которое мы искали. Вычислить его просто. Допустим, уточненный максимум - 16-й элемент массива отсчетов СПМ между узлами f[0] и f[1]. Тогда уточненное значение частоты для нашего случая равно f[0] + 0.01*16.

Автор: Mal Hack 13.4.2004, 22:03
podval, а кодом не намекнешь простым ??
А то на alglib.manual.ru хрен поймешь. Код аж на три страницы...

Автор: df_3 14.4.2004, 10:38
в Maple могу подогнать тебе дай адрес

Автор: Akina 14.4.2004, 13:46
Mal Hack
Чего тебе код потребовался?

Смотри. Есть у тебя груда точек: x1, x2, x3, .... xN. Допустим используем интерполяцию сплайнами порядка 2 - квадратичными (в общем случае сплайны не обязаны быть полиномиальными - то есть под словом "порядок" мы будем понимаем уменьшенное на 1 количество коэффициентов в уравнении сплайна.). Возьмем первые 3 точки. Парабола, на которой они лежат - одна-единственная, и посчитать коэффициенты квадратного трехчлена (те самые твои a[i]), на графике которого лежат эти 3 точки - пара пустяков. И теперь, когда эти коэффициенты посчитаны, мы можем посчитать значение этой сплайновой функции в любой промежуточной точке, которая нам нужна (том самом твоем иксе). Чем выше порядок сплайна - тем больше точек берется для расчета коэффициентов (скажем при кубическом сплайне - 4 точки).
Фигня в том, что если искомый икс лежит между 2 и 3 точками, можно считать сплайн и интерполировать значение по точкам 1-3, а можно и по точкам 2-4... есссно получатся разные приближенные значения...

Автор: podval 14.4.2004, 21:01
Mal Hack
Действительно, там всё просто. Имеешь формулу сплайна - вперед.
Просто сейчас нет времени копаться в старых архивах smile.gif.

Цитата
А то на alglib.manual.ru хрен поймешь. Код аж на три страницы...

Ты уверен? Не обращай внимание на "лишние" участки кода. В суть смотри.

На http://algolist.manual.ru/maths/approx.php еще погляди.

Автор: Mal Hack 15.4.2004, 20:34
Вопрос такой: имеет ли значение какие сплайны я испоьзую (квадратичные или кубические) ?
Akina, вот смотри, юзер ввел три икса и три игрека. После этого мы сортируем все это дело так, чтоб самый большой икс - первый в массиве. Так ? Затем берем три точки и какие вычисления с ними проводим ? Это мы получим а[i] (3 штуки). Но как быть, если юзер ввел 5 иксов и 5 игреков. Тогда ведь нам надо пять а[i] найти...
И потом по какой формуле вычисляется значение нужной точки ?
Че-то я уже совсем запутался...

Автор: Akina 16.4.2004, 08:36
Mal Hack
чего? почему 5? если юзер ввел 5 точек, то либо один сплайн 4 порядка, либо 2 сплайна 3 порядка (для точек 1-4 и для точек 2-5), либо 3 сплайна 2 порядка... скажем если квадратичные сплайны и требуется рассчитать функцию в иксе, который между 3 и 4 точками, то мы берем точки 2-4 (или 3-5), остальные отбрасываем, считаем по 3 точкам параболу, и по ней - значение функции. Как выбрать какая из двух троек лучше? по-разному... можно даже посчитать по обоим тройкам и взять среднее biggrin.gif

Это ещепростой вариант - нет условия неразрывности производных...

Автор: Mal Hack 16.4.2004, 21:24
Akina, а мржешь прям по шагам объяснить что мне надо сделать и какие циклы, формулы, что вводить надо и т.п. А то я уже совсем запутался..

Автор: Therion 27.6.2004, 16:25
Могу дать исходники на VBA
мое мыло cool.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)