Что такое сплайн интерполяция

Что такое сплайн интерполяция

Интерполяция функций сплайном третьего порядка.

Алгоритм реализован в виде программы на языке С, которую вы можете скачать в разделе программы.

Опишем сначала, что такое интерполяция и как эта задача решена в данном случае.

Пусть на некотором отрезке в точках x, x1, x2, . xN нам известны значения некоторой функции f(x), а именно y, y1, y2, . yN.

Требуется построить интерполирующую функцию F(x), такую, что она принимает в указаных точках те же значения, т.е. F(x) = y, F(x1) = y1, . F(xN) = yN.

Геометрически это значит, что нужно найти кривую y = F(x) определенного типа, проходящую через систему заданных точек. В такой общей постановке задача может иметь бесчисленное множество решений или совсем не иметь решений. В случае интерполяции сплайном кривая F(x) состоит из кусочков, а именно, на каждом из отрезков [xk-1; xk] функция F(x) является кубическим полиномом

При этом, на каждом из отрезков [xk-1; xk] коэффициенты полинома ak, bk, ck, dk разные.

Чтобы узнать эти коэффициенты, кроме условия непрерывности функции на полиномы налагают дополнительные условия, а именно непрерывности первой и второй производной функции F(x), а также равенства вторых производных функции на концах отрезка [x; xN], т.е.

Здесь введено обозначение hk = xk — xk-1, k=1,2. N

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

Вводятся прогоночные коэффициенты

Далее следует найти коэффициенты ck по формулам обратной прогонки

После нахождения ck нужно найти bk и dk по формулам

Приведем программу, где реализован этот алгоритм:

Чтобы воспользоваться этой программой, нужно запустить скомпилированный исполняемый файл. В первую очередь программа спросит, откуда ей брать данные для интерполяции. Создайте в любом текстовом редакторе (но только не в Word-е а, например в notepad-е) файл, где напишите значения xk, yk, построчно через пробел, приблизительно так:

x y
x1 y1
x2 y2
.
xN yN

Например:

1 5
2 3
3 2.5
4 2
5

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

A[k] B[k] C[k] D[k]
3.000000 -1.250000 1.125000 0.375000
2.500000 -0.125000 0.000000 -0.375000
2.000000 -1.250000 -1.125000 -0.375000
0.000000 -2.375000 0.000000 0.375000

Это и есть решение системы, т.е. набор коэффициентов ak, bk. ck, dk на четырех отрезках.

Кроме того, программа создаст файл test.txt в котором запишет подсчитанные значения интерполирующей функции в 20-точках на отрезке [x; xN]. Вы сможете убедиться, что значения интерполирующей функции плавно меняются от точки к точке, и в точках xk совпадают со значениями yk.

Коротко опишем, для чего служит такое большое количество подпрограмм в данной программе:

  • void count_num_lines() — подсчитывает количество точек, где задана функция
  • void allocmatrix() — выделяет память для массивов b, c, d, x, y, delta, lambda
  • void readmatrix() — прочитывает из файла координаты x, y точек
  • void testresult() — на основании вычисленных коэффициентов a, b, c, d вычисляет значение интерполирующей функции в 20 точках на интервале [x; xN] с равномерным шагом
  • void printresult() — распечатывает столбцы коэффициентов a, b, c, d
  • void freematrix() — освобождает память, которая была выделена ранее
  • void cls() — стирает экран в начале работы программы
  • void main() — основная функция из которой последовательно вызываются все вышеперечисленные функции, и проходит процесс вычисления коэффициентов по формулам прямой и обратной прогонки.
Читайте также:  Как переводить с яндекс деньги на киви

Использование одной интерполяционной формулы на большом числе узлов, как отмечалось в предыдущем разделе, нецелесообразно. Такой интерполяционный многочлен существенно проявляет свои колебательные свойства, и его значения между узлами могут значительно отличаться от значений интерполируемой функции. Одна из возможностей преодоления этого недостатка заключается в применении СПЛАЙН-ИНТЕРПОЛЯЦИИ. Суть сплайн-интерполяции заключается в определении интерполирующей функции по формулам одного типа для различных подмножеств и в стыковке значений функции и ее производных на границах подмножеств.

Наиболее изученным и широко применяемым является вариант, в котором между любыми двумя точками строится многочлен п-й степени

который в узлах интерполяции принимает значения интерполируемой функции и непрерывен вместе со своими (п — 1)-й производными. Такой кусочно-непрерывный интерполяционный многочлен называется СПЛАЙНОМ. Его коэффициенты находятся из следующих условий в узлах сетки: должны быть равны значения сплайна и приближаемой функции, а также п — 1 производные соответствующих многочленов, при этом подразумеваются производные, взятые на соседних интервалах.

Максимальная по всем частичным отрезкам степень многочленов называется степенью сплайна, а разница между степенью сплайна и порядком наивысшей непрерывной производной — дефектом сплайна [1] .

Одним из наиболее распространенных интерполяционных сплайнов является кубический (def =1). Для вывода уравнения кубического интерполяционного сплайна воспользуемся его интерпретацией как гибкой линейки, изогнутой таким образом, что она проходит через значения функции в узлах сетки, т. е. является упругим бруском в состоянии свободного равновесия. Так как это его состояние описывается уравнением S 14 ^) = О, где S lv (je) — четвертая производная, то между каждой парой соседних узлов интерполяционная формула записывается в виде многочлена третьей степени. Этот многочлен удобно представить как

Для построения кубического сплайна необходимо построить п многочленов третьей степени, т. е. определить 4п неизвестных aj( bt, С;, dr Эти коэффициенты ищутся из условий в узлах сетки. По определению в узлах сетки сплайн (2.21) должен принимать табличные значения функции (здесь = xt — хк _ х):

Система (2.22), (2.23) содержит 2п уравнений. Дополнительные уравнения можно получить, если потребовать непрерывности первой и второй производных функции S(x) во внутренних узлах сетки при xt _ j 2 ) вблизи границы. Поэтому вместо них можно рекомендовать условие непрерывности S ‘"(х) в двух внутренних (приграничных) узлах. Если существуют другие условия поведения функции в точках х и хп, то уравнения (2.26), (2.27) будут другими. Таким образом, система (2.22)—(2.27) для отыскания 4п неизвестных а(, b(, с(, di (i = 1, 2. п) замкнута. Ее удобно ре

шать, проведя предварительно следующие преобразования. Коэффициент at сразу получается из решения уравнения (2.22). Из

Подставляя выражения (2.28), (2.28а) в выражение (2.23) и заменяя в нем О; на _ j, получаем

Из уравнений (2.24), (2.25) имеем

Полагая в выражении (2.29) значение г = п и сравнивая с выражением (2.29а), получаем

Подставляя теперь выражения (2.29), (2.29а) в (2.296), приходим к системе уравнений относительно с,:

Матрица системы (2.30)—(2.306) — трехдиагональная, решение находится методом прогонки. Решив ее, находим затем коэффициенты fej из уравнений (2.29), (2.29а) и di — из уравнений (2.28), (2.28а).

Метод сплайн-интерполяции приводит к удовлетворительным результатам в процессе интерполяции непрерывных функций с гладкими первой и второй производными. При этом кубический интерполяционный сплайн, построенный по узлам /. = f(xt) (i = 0, л), будет обладать минимальной кривизной по

Читайте также:  Часы в машину с алиэкспресс

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

Рассмотрим сплайн второго порядка. Для него

Очевидно, что при Л. = х-к — х. _,

Условие совпадения первой производной S'(x) = 6, + 2с,(х — xt_ j) в узлах дает

Аналогично замечанию к уравнениям (2.26), (2.27) следует рекомендовать вместо условия (2.32) условие непрерывности S"(x) в одном узле. Если принять, что в начальной точке заданы fQ и /’, т. е. ctj и bv то для определения коэффициентов ajt br ct на каждом участке нужно решать систему линейных уравнений третьего порядка (2.31), (2.32). Линейный сплайн или сплайн первого порядка представляет собой ломаную линию, состоящую из отрезков прямых, соединяющих узлы.

Я использовал один из предложенных алгоритмов, но результаты очень плохие.

в Java (код ниже). x(0) является points.get(0) , y(0) является values[points.get(0)] , α является alfa а также μ является mi , Остальное такое же, как в псевдокоде вики.

В результате я получаю следующее:

но это должно быть похоже на это:

Я также пытаюсь реализовать алгоритм по-другому в соответствии с: http://www.geos.ed.ac.uk/

Сначала они показывают, как сделать линейный сплайн, и это довольно просто. Я создаю функции, которые рассчитывают A а также B коэффициенты. Затем они расширяют линейный сплайн, добавляя вторую производную. C а также D Коэффициенты тоже легко рассчитать.

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

Поэтому я реализовал только линейную интерполяцию. Результат:

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

Решение

Кубический b-сплайн был недавно описан в серии статей Unser, Thévenaz и другие., увидеть среди других

М. Унсер, А. Алдруби, М. Иден, «Быстрые B-сплайн-преобразования для непрерывного представления и интерполяции изображений», IEEE Trans. Pattern Анальный. Машина Интелл., том 13, н. 3, с. 277-285, март 1991 г.

М. Унсер, «Сплайны, идеально подходящие для обработки сигналов и изображений», IEEE Signal Proc. Магнето, с. 22- 38, ноябрь 1999 г.

П. Тевеназ, Т. Блу, М. Унсер, «Возвращение к интерполяции» IEEE Trans. по медицинской визуализации, том 19, нет. 7, с. 739-758, июль 2000 г.

Вот несколько рекомендаций.

Что такое сплайны?

Сплайны — это кусочно-полиномы, которые гладко связаны друг с другом. За сплайн степени n каждый сегмент является полиномом степени n , Части связаны так, что сплайн непрерывен до его производной степени n-1 на узлы, а именно, точки соединения частей полинома.

Как можно построить сплайны?

Сплайн нулевого порядка следующий

Все остальные сплайны могут быть построены как

где сверток взят n-1 раз.

Кубические сплайны

Самые популярные сплайны — кубические сплайны, чье выражение

Сплайн-интерполяция

Учитывая функцию f(x) выборка в дискретных целочисленных точках k , задача сплайн-интерполяции состоит в определении аппроксимации s(x) в f(x) выражается следующим образом

Читайте также:  Полироль для черного пластика от царапин

где ck это коэффициенты интерполяции и s(k) = f(k) ,

Сплайн-предварительная фильтрация

К сожалению, начиная с n=3 на,

таким образом ck это не коэффициенты интерполяции. Их можно определить, решив линейную систему уравнений, полученную путем принуждения s(k) = f(k) а именно

Такое уравнение может быть преобразовано в форму свертки и решено в преобразованном z пространство как

Такой путь всегда предпочтительнее, чем решение линейной системы уравнений, например, LU разложение.

Решение вышеприведенного уравнения можно определить, заметив, что

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

На последнем рисунке

Выходные данные фильтров могут быть выражены следующими рекурсивными уравнениями

Вышеприведенные уравнения могут быть решены путем первого определения «начальных условий» для c- а также c+ , Предполагая периодическое, зеркальные входная последовательность fk такой, что

тогда можно показать, что начальное условие для c+ может быть выражено как

в то время как начальное условие для c+ может быть выражено как

Другие решения

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

SPLINE кубики

SPLINE это не интерполяция, а приближение чтобы использовать их, вам не нужно никакого деривации. Если у вас есть десять очков: p0,p1,p2,p3,p4,p5,p6,p7,p8,p9 затем кубический сплайн начинается / заканчивается тройной точкой. Если вы создаете функцию «рисовать» СПЛАЙН Затем исправьте кубическую кривую, чтобы обеспечить непрерывность последовательности вызовов:

не забывайте, что кривая SPLINE для p0,p1,p2,p3 нарисовать только кривую «между» p1,p2 .

Безье кубики

4-точечный Безье Коэффициенты могут быть вычислены следующим образом:

интерполирование

чтобы использовать интерполяцию, вы должны использовать интерполяционные полиномы. Есть много, но я предпочитаю использовать кубики … похоже на Безье / СПЛАЙН / NURBS … так

Осталось только вычислить a0,a1,a2,a3 , У вас есть 2 уравнения ( p(t) и его вывод по t ) и 4 балла из набора данных. Вы также должны обеспечить непрерывность … Таким образом, первый вывод для точек соединения должен быть одинаковым для соседних кривых ( t=0,t=1 ). Это приводит к системе 4 линейных уравнений (использование t=0 а также t=1 ). Если вы получите его, он создаст простое уравнение, зависящее только от координат входной точки:

последовательность вызовов такая же, как для СПЛАЙН

[Заметки]

Разница между интерполяцией и аппроксимацией заключается в том, что:

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

переменные:

  • a0. p0. являются векторами (число измерений должно соответствовать входным точкам)
  • t является скалярным

рисовать кубики из коэффициентов a0. a3

просто сделайте что-то вроде этого:

Увидеть сплайн-интерполяция , хотя они дают только полезный пример 3х3. Для большего количества точек выборки, скажем, N + 1 перечислил x[0..N] со значениями y[0..N] нужно решить следующую систему для неизвестного k[0..N]

Эту проблему можно решить с помощью итерации Гаусса-Зейделя (не было ли она изобретена именно для этой системы?) Или вашего любимого космического решателя Крылова.

Ссылка на основную публикацию
Adblock detector