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