Алгоритм Де Бура
В математической области анализа численного алгоритм де Бура [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):
"""Evaluates S(x).
Arguments
---------
k: Index of knot interval that contains x.
x: Position.
t: Array of knot positions, needs to be padded as described above.
c: Array of control points.
p: Degree of B-spline.
"""
d = [c[j + k - p] for j in range(0, p + 1)]
for r in range(1, p + 1):
for j in range(p, r - 1, -1):
alpha = (x - t[j + k - p]) / (t[j + 1 + k - r] - t[j + k - p])
d[j] = (1.0 - alpha) * d[j - 1] + alpha * d[j]
return d[p]
См. также
[ редактировать ]Внешние ссылки
[ редактировать ]Компьютерный код
[ редактировать ]- PPPACK : содержит множество сплайн-алгоритмов на Фортране.
- Научная библиотека GNU : C-библиотека, содержит подбиблиотеку для сплайнов, перенесенных из PPPACK.
- SciPy : библиотека Python, содержит подбиблиотеку scipy.interpolate со сплайн-функциями на основе FITPACK.
- TinySpline : C-библиотека для сплайнов с оболочкой C++ и привязками для C#, Java, Lua, PHP, Python и Ruby.
- Einspline : C-библиотека для сплайнов в 1, 2 и 3 измерениях с оболочками Фортрана.
Ссылки
[ редактировать ]- ^ Jump up to: а б К. де Бур [1971], «Пакет подпрограмм для вычислений с помощью B-сплайнов», Techn.Rep. LA-4728-MS, Лос-Аламосская научная лаборатория, Лос-Аламос, Нью-Мексико; п. 109, 121.
- ^ Ли, ETY (декабрь 1982 г.). «Упрощенная процедура расчета B-сплайна». Вычисление . 29 (4). Спрингер-Верлаг: 365–371. дои : 10.1007/BF02246763 . S2CID 2407104 .
- ^ Ли, ETY (1986). «Комментарии к некоторым алгоритмам B-сплайна». Вычисление . 36 (3). Спрингер-Верлаг: 229–238. дои : 10.1007/BF02240069 . S2CID 7003455 .
- ^ К. де Бур, с. 90
Цитируемые работы
- Карл де Бур (2003). Практическое руководство по сплайнам, переработанное издание . Спрингер-Верлаг. ISBN 0-387-95366-3 .