| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Интерполяция сплайнами... |
| Автор: 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 Действительно, там всё просто. Имеешь формулу сплайна - вперед. Просто сейчас нет времени копаться в старых архивах
Ты уверен? Не обращай внимание на "лишние" участки кода. В суть смотри. На 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 точкам параболу, и по ней - значение функции. Как выбрать какая из двух троек лучше? по-разному... можно даже посчитать по обоим тройкам и взять среднее Это ещепростой вариант - нет условия неразрывности производных... |
| Автор: Mal Hack 16.4.2004, 21:24 |
| Akina, а мржешь прям по шагам объяснить что мне надо сделать и какие циклы, формулы, что вводить надо и т.п. А то я уже совсем запутался.. |
| Автор: Therion 27.6.2004, 16:25 |
| Могу дать исходники на VBA мое мыло |