Метод оценки сплайновых кривых
В математическом подразделе численного анализа алгоритм де Бура [1] является полиномиальным по времени и численно устойчивым алгоритмом для оценки сплайновых кривых в форме B-сплайна . Он является обобщением алгоритма де Кастельжау для кривых Безье . Алгоритм был разработан немецко-американским математиком Карлом Р. де Буром . Были созданы упрощенные, потенциально более быстрые варианты алгоритма де Бура, но они страдают от сравнительно меньшей стабильности. [2] [3]
Введение
Общее введение в B-сплайны дано в основной статье . Здесь мы обсуждаем алгоритм де Бура, эффективную и численно устойчивую схему для оценки сплайновой кривой в позиции . Кривая строится из суммы функций B-сплайна , умноженных на потенциально векторные константы , называемые контрольными точками,
B-сплайны порядка связаны кусочно-полиномиальными функциями степени, определенной по сетке узлов (в дальнейшем мы всегда используем индексы, отсчитываемые от нуля). Алгоритм де Бура использует операции O (p 2 ) + O (p) для оценки сплайновой кривой. Примечание: основная статья о B-сплайнах и классические публикации [1] используют другую нотацию: B-сплайн индексируется как с .
Местная поддержка
B-сплайны имеют локальную поддержку, что означает, что полиномы положительны только в конечной области и равны нулю в других местах. Формула рекурсии Кокса-де Бура [4] показывает это:
Пусть индекс определяет интервал узла, содержащий позицию, . Мы можем видеть в формуле рекурсии, что только B-сплайны с являются ненулевыми для этого интервала узла. Таким образом, сумма уменьшается до:
Из этого следует , что . Аналогично, мы видим в рекурсии, что наивысшее запрошенное местоположение узла находится в индексе . Это означает, что любой интервал узла , который фактически используется, должен иметь по крайней мере дополнительные узлы до и после. В компьютерной программе это обычно достигается путем повторения первого и последнего использованного времени местоположения узла. Например, для и реальных местоположений узла можно было бы дополнить вектор узла до .
Алгоритм
С этими определениями мы теперь можем описать алгоритм де Бура. Алгоритм не вычисляет функции B-сплайна напрямую. Вместо этого он оценивает через эквивалентную рекурсивную формулу.
Пусть будут новыми контрольными точками с для . Для применяется следующая рекурсия:
После завершения итераций мы имеем , что означает желаемый результат.
Алгоритм де Бура более эффективен, чем явное вычисление B-сплайнов с помощью рекурсивной формулы Кокса-де Бура, поскольку он не вычисляет члены, которые гарантированно умножаются на ноль.
Оптимизации
Алгоритм выше не оптимизирован для реализации на компьютере. Он требует памяти для временных контрольных точек . Каждая временная контрольная точка записывается ровно один раз и считывается дважды. Обратив итерацию (отсчет вниз вместо вверх), мы можем запустить алгоритм с памятью только для временных контрольных точек, разрешив повторно использовать память для . Аналогично, на каждом шаге используется только одно значение , поэтому мы также можем повторно использовать память.
Кроме того, для временных контрольных точек удобнее использовать индекс, начинающийся с нуля . Отношение к предыдущему индексу равно . Таким образом, получаем улучшенный алгоритм:
Пусть для . Итерация для :
Обратите внимание, что j должен отсчитываться в обратном порядке. После завершения итераций результат будет .
Пример реализации
Следующий код на языке программирования Python представляет собой наивную реализацию оптимизированного алгоритма.
def deBoor ( k : int , x : int , t , c , p : int ): """Оценивает S(x). Аргументы --------- k: Индекс интервала узла, содержащего x. х: Позиция. t: Массив позиций узлов, необходимо дополнить, как описано выше. c: Массив контрольных точек. p: Степень B-сплайна. """ d = [ c [ j + k - p ] для j в диапазоне ( 0 , p + 1 )] для r в диапазоне ( 1 , p + 1 ): для j в диапазоне ( p , r - 1 , - 1 ): альфа = ( х - т [ j + к - р ]) / ( т [ j + 1 + к - р ] - т [ j + к - р ]) d [ j ] = ( 1,0 - альфа ) * d [ j - 1 ] + альфа * d [ j ] возврат d [ p ]
Смотрите также
Внешние ссылки
- Алгоритм Де Бура
- Расчет Дебура-Кокса
Компьютерный код
- PPPACK: содержит множество сплайн-алгоритмов на Фортране
- GNU Scientific Library: C-библиотека, содержит подбиблиотеку для сплайнов, перенесенную из PPPACK
- SciPy: библиотека Python, содержит подбиблиотеку scipy.interpolate со сплайн-функциями на основе FITPACK
- TinySpline: C-библиотека для сплайнов с оболочкой C++ и привязками для C#, Java, Lua, PHP, Python и Ruby
- Einspline: C-библиотека для сплайнов в 1, 2 и 3 измерениях с оболочками Fortran
Ссылки
- ^ ab C. de Boor [1971], "Пакет подпрограмм для вычислений с B-сплайнами", Techn.Rep. LA-4728-MS, Los Alamos Sci.Lab, Los Alamos NM; стр. 109, 121.
- ^ Ли, ETY (декабрь 1982 г.). «Упрощенная процедура вычисления B-сплайна». Computing . 29 (4). Springer-Verlag: 365–371. doi :10.1007/BF02246763. S2CID 2407104.
- ^ Ли, ETY (1986). «Комментарии к некоторым алгоритмам B-сплайна». Вычислительная техника . 36 (3). Springer-Verlag: 229–238. doi :10.1007/BF02240069. S2CID 7003455.
- ^ К. де Бур, стр. 90
Цитируемые работы
- Карл де Бур (2003). Практическое руководство по сплайнам, пересмотренное издание . Springer-Verlag. ISBN 0-387-95366-3.