De Boorsův algoritmus - De Boors algorithm - Wikipedia
V matematický podpole z numerická analýza de Boorův algoritmus[1] je polynomiální čas a numericky stabilní algoritmus pro hodnocení křivky spline v B-spline formulář. Jedná se o zobecnění de Casteljauův algoritmus pro Bézierovy křivky. Algoritmus vymyslel Carl R. de Boor. Byly vytvořeny zjednodušené, potenciálně rychlejší varianty de Boorova algoritmu, ale trpí relativně nižší stabilitou.[2][3]
Úvod
Obecný úvod do B-splajnů je uveden v Hlavní článek. Zde diskutujeme de Boorův algoritmus, efektivní a numericky stabilní schéma pro vyhodnocení spline křivky v poloze . Křivka je sestavena ze součtu funkcí B-spline vynásobeno konstantami s potenciálně vektorovou hodnotou , nazývané kontrolní body,
B-splines řádu jsou spojeny po částech polynomiální funkce stupně definovaný přes mřížku uzlů (v následujícím textu vždy používáme indexy založené na nule). Algoritmus De Boora používá Ó (str2) + Ó (p) operace k vyhodnocení křivky spline. Poznámka: hlavní článek o B-splines a klasické publikace[1] použijte jinou notaci: B-spline je indexováno jako s .
Místní podpora
B-splajny mají lokální podporu, což znamená, že polynomy jsou pozitivní pouze v konečné doméně a nula jinde. Cox-de Boorův rekurzní vzorec[4] ukazuje toto:
Nechte index definovat interval uzlu, který obsahuje pozici, . Můžeme vidět ve vzorci rekurze, s nímž pouze B-splines jsou nenulové pro tento interval uzlů. Součet se tedy snižuje na:
Vyplývá to z že . Podobně vidíme v rekurzi, že nejvyšší dotazované umístění uzlu je na indexu . To znamená, že jakýkoli interval uzlů který se skutečně používá, musí mít alespoň další uzly před a po. V počítačovém programu se toho obvykle dosahuje opakováním prvního a posledního použitého umístění uzlu krát. Například pro a umístění skutečných uzlů , jeden by vložil vektor uzlu .
Algoritmus
S těmito definicemi nyní můžeme popsat de Boorův algoritmus. Algoritmus nevypočítává funkce B-spline přímo. Místo toho to hodnotí prostřednictvím ekvivalentního rekurzního vzorce.
Nechat být novými kontrolními body s pro . Pro použije se následující rekurze:
Jakmile jsou iterace kompletní, máme , znamenající, že je požadovaný výsledek.
Algoritmus De Boora je efektivnější než explicitní výpočet B-splajnů s Cox-de Boorovým rekurzním vzorcem, protože nevypočítává výrazy, u nichž je zaručeno, že budou vynásobeny nulou.
Optimalizace
Algoritmus výše není optimalizován pro implementaci v počítači. Vyžaduje paměť pro dočasné kontrolní body . Každý dočasný kontrolní bod je zapsán přesně jednou a přečten dvakrát. Obrácením iterace (odpočítávání namísto nahoru), můžeme spustit algoritmus pouze s pamětí dočasné kontrolní body tím, že znovu použít paměť pro . Podobně existuje pouze jedna hodnota použité v každém kroku, takže můžeme také znovu použít paměť.
Dále je vhodnější použít index založený na nule pro dočasné kontrolní body. Vztah k předchozímu indexu je . Takto získáme vylepšený algoritmus:
Nechat pro . Iterovat pro :
- ( musí být odpočítáváno)
Po dokončení iterací je výsledek .
Příklad implementace
Následující kód v Programovací jazyk Python je naivní implementace optimalizovaného algoritmu.
def deBoor(k: int, X: int, t, C, p: int): "" "Vyhodnocuje S (x). Argumenty --------- k: Index intervalu uzlů, který obsahuje x. x: Poloha. t: Pole poloh uzlů, musí být polstrované, jak je popsáno výše. c: Pole kontrolních bodů. p: Stupeň B-spline. """ d = [C[j + k - p] pro j v rozsah(0, p + 1)] pro r v rozsah(1, p + 1): pro j v rozsah(p, r - 1, -1): alfa = (X - t[j + k - p]) / (t[j + 1 + k - r] - t[j + k - p]) d[j] = (1.0 - alfa) * d[j - 1] + alfa * d[j] vrátit se d[p]
Viz také
externí odkazy
Počítačový kód
- PPPACK: obsahuje mnoho spline algoritmů v Fortran
- Vědecká knihovna GNU: C-knihovna, obsahuje dílčí knihovnu pro splajny přenesené z PPPACK
- SciPy: Pythonova knihovna, obsahuje dílčí knihovnu scipy.interpolate s funkcemi spline založenými na FITPACK
- TinySpline: C-knihovna pro spline s obálkou C ++ a vazbami pro C #, Java, Lua, PHP, Python a Ruby
- Einspline: C-knihovna pro splajny v 1, 2 a 3 rozměrech s obaly Fortran
Reference
- ^ A b C. de Boor [1971], „Balík podprogramů pro výpočet pomocí B-splajnů“, Techn.Rep. LA-4728-MS, Los Alamos Sci.Lab, Los Alamos NM; str. 109, 121.
- ^ Lee, E. T. Y. (prosinec 1982). "Zjednodušený postup výpočtu B-Spline". Výpočetní. Springer-Verlag. 29 (4): 365–371. doi:10.1007 / BF02246763.
- ^ Lee, E. T. Y. (1986). Msgstr "Komentáře k některým algoritmům B-spline". Výpočetní. Springer-Verlag. 36 (3): 229–238. doi:10.1007 / BF02240069.
- ^ C. de Boor, str. 90
Citované práce
- Carl de Boor (2003). Praktický průvodce Splines, revidované vydání. Springer-Verlag. ISBN 0-387-95366-3.