stringtranslate.com

Алгоритм Де Бура

В математическом подразделе численного анализа алгоритм де Бура [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 ]

Смотрите также

Внешние ссылки

Компьютерный код

Ссылки

  1. ^ ab C. de Boor [1971], "Пакет подпрограмм для вычислений с B-сплайнами", Techn.Rep. LA-4728-MS, Los Alamos Sci.Lab, Los Alamos NM; стр. 109, 121.
  2. ^ Ли, ETY (декабрь 1982 г.). «Упрощенная процедура вычисления B-сплайна». Computing . 29 (4). Springer-Verlag: 365–371. doi :10.1007/BF02246763. S2CID  2407104.
  3. ^ Ли, ETY (1986). «Комментарии к некоторым алгоритмам B-сплайна». Вычислительная техника . 36 (3). Springer-Verlag: 229–238. doi :10.1007/BF02240069. S2CID  7003455.
  4. ^ К. де Бур, стр. 90

Цитируемые работы