Párový součet - Pairwise summation
v numerická analýza, párový součet, také zvaný kaskádový součet, je technika pro součet posloupnosti konečnýchpřesnost plovoucí bod čísla, která podstatně snižují nahromaděné chyba zaokrouhlení ve srovnání s naivním hromaděním součtu postupně.[1] I když existují i jiné techniky, jako je Kahanův součet které mají obvykle ještě menší chyby zaokrouhlování, je párový součet téměř stejně dobrý (liší se pouze logaritmickým faktorem) a má mnohem nižší výpočetní náklady - lze jej implementovat tak, aby měl téměř stejné náklady (a přesně stejný počet aritmetické operace) jako naivní součet.
Zejména párový součet posloupnosti n čísla Xn díla od rekurzivně rozdělení sekvence na dvě poloviny, sečtení každé poloviny a přidání dvou součtů: a algoritmus rozděl a panuj. Jeho nejhorší případy zaokrouhlovací chyby rostou asymptoticky jako nanejvýš Ó(ε logn), kde ε je přesnost stroje (za předpokladu pevné číslo podmínky, jak je uvedeno níže).[1] Ve srovnání je naivní technika hromadění součtu v pořadí (přidání každého Xi jeden po druhém pro i = 1, ..., n) má chyby zaokrouhlení, které rostou v nejhorším případě jako Ó(εn).[1] Kahanův součet má nejhorší chyba zhruba Ó(ε), nezávisle na n, ale vyžaduje několikrát více aritmetických operací.[1] Pokud jsou chyby zaokrouhlování náhodné a zejména mají náhodné znaky, tvoří a náhodná procházka a růst chyb se sníží na průměrnou hodnotu pro párový součet.[2]
Velmi podobná rekurzivní struktura součtu se nachází v mnoha rychlá Fourierova transformace (FFT) a je zodpovědný za stejné pomalé zaokrouhlování těchto FFT.[2][3]
Algoritmus
v pseudo kód, algoritmus párového součtu pro pole X délky n > 0 lze napsat:
s = po párech(X[1…n]) -li n ≤ N základní případ: naivní součet pro dostatečně malé pole s = X[1] pro i = 2 až n s = s + X[i] jiný rozděl a panuj: rekurzivně sečte dvě poloviny pole m = podlaha (n / 2) s = po párech(X[1…m]) + po párech(X[m+1…n]) skončit, pokud
Nerekurzivní verze algoritmu používá a zásobník hromadit dílčí částky:
partials = nový Zásobníkpro i = 1 až n partials.push (X[i]) j = i zatímco is_even (j) j = podlaha (j / 2) p = částečné. pop () q = částečné. pop () částečné. tlačit (p + q) celkem = 0,0zatímco partials.size> 0 celkem = celkem + partials.pop ()vrátit se celkový
Pro některé dostatečně malé N, tento algoritmus přepne na naivní smyčkový součet jako a základní případ, jehož chyba je vázána na O (Nε).[4] Celá částka má chybu v nejhorším případě, která roste asymptoticky jako Ó(ε logn) pro velké n, pro dané číslo podmínky (viz níže).
V algoritmu tohoto druhu (jako pro algoritmy rozděl a panuj obecně[5]), je žádoucí použít větší základní případ, aby amortizovat režie rekurze. Li N = 1, pak existuje zhruba jedno rekurzivní volání podprogramu pro každý vstup, ale obecněji existuje jedno rekurzivní volání pro (zhruba) každý N/ 2 vstupy, pokud se rekurze zastaví přesněn = N. Děláním N dostatečně velká, režie rekurze může být zanedbatelná (právě tato technika velkého základního případu pro rekurzivní součet je využívána vysoce výkonnými implementacemi FFT[3]).
Bez ohledu na N, přesně n−1 sčítání se provádí celkem, stejně jako u naivního součtu, takže pokud je režie rekurze zanedbatelná, pak má párový součet v zásadě stejné výpočetní náklady jako u naivního součtu.
Varianta této myšlenky je rozdělit součet na b bloky v každé rekurzivní fázi, rekurzivní sčítání každého bloku a následné sčítání výsledků, které jeho navrhovatelé nazvali „superblokovým“ algoritmem.[6] Výše uvedený párový algoritmus odpovídá b = 2 pro každou fázi s výjimkou poslední fáze, která jeb = N.
Přesnost
Předpokládejme, že jeden sčítá n hodnoty Xi, pro i = 1, ..., n. Přesná částka je:
(počítáno s nekonečnou přesností).
S párovým součtem pro základní případ N = 1, místo toho získá jeden , kde došlo k chybě je omezen výše:[1]
kde ε je přesnost stroje použité aritmetiky (např. ε ≈ 10−16 pro standard dvojnásobná přesnost plovoucí bod). Obvykle je množství zájmu relativní chyba , který je tedy výše omezen:
Ve výrazu pro relativní vázanou chybu zlomek (Σ |Xi| / | ΣXi|) je číslo podmínky součtové úlohy. Číslo podmínky v zásadě představuje vnitřní citlivost součtového problému na chyby, bez ohledu na to, jak je vypočítán.[7] Relativní chyba vázaná na každý (dozadu stabilní ) metoda součtu pevným algoritmem s pevnou přesností (tj. ne těmi, které používají.) aritmetika s libovolnou přesností, ani algoritmy, jejichž požadavky na paměť a čas se mění na základě dat), jsou úměrné tomuto počtu podmínek.[1] An špatně podmíněný součtový problém je takový, ve kterém je tento poměr velký, a v tomto případě může mít i párová sumace velkou relativní chybu. Například pokud sčítá Xi jsou nekorelovaná náhodná čísla s nulovým průměrem, součet je a náhodná procházka a počet podmínek bude úměrný . Na druhou stranu pro náhodné vstupy s nenulovou hodnotou znamená počet podmínek asymptoty na konečnou konstantu jako . Pokud jsou všechny vstupy nezáporné, pak je číslo podmínky 1.
Všimněte si, že jmenovatel je v praxi prakticky 1, protože je mnohem menší než 1 do n stane se řádu 21 / ε, což je zhruba 101015 ve dvojité přesnosti.
Ve srovnání relativní chyba vázaná na naivní součet (jednoduché přidávání čísel v pořadí, zaokrouhlování v každém kroku) roste, jak vynásobeno číslem podmínky.[1] V praxi je mnohem pravděpodobnější, že chyby zaokrouhlování mají náhodné znaménko s nulovým průměrem, takže tvoří náhodnou procházku; v tomto případě má naivní součet a střední kvadratická relativní chyba, která roste jako a párový součet má chybu, která roste jako v průměru.[2]
Softwarové implementace
Pairwise summation is the default summation algorithm in NumPy[8] a Julia technicko-výpočetní jazyk,[9] kde v obou případech bylo zjištěno, že má srovnatelnou rychlost s naivním sčítáním (díky použití velkého základního případu).
Mezi další softwarové implementace patří knihovna HPCsharp[10] pro Cis Jazyk.
Reference
- ^ A b C d E F G Higham, Nicholas J. (1993), „Přesnost sčítání s plovoucí desetinnou čárkou“, SIAM Journal on Scientific Computing, 14 (4): 783–799, CiteSeerX 10.1.1.43.3535, doi:10.1137/0914050
- ^ A b C Manfred Tasche a Hansmartin Zeuner Příručka analyticko-výpočetních metod v aplikované matematice Boca Raton, FL: CRC Press, 2000).
- ^ A b S. G. Johnson a M. Frigo, “Implementace FFT v praxi, v Rychlé Fourierovy transformace, editoval C. Sidney Burrus (2008).
- ^ Higham, Nicholas (2002). Přesnost a stabilita numerických algoritmů (2. vydání). SIAM. 81–82.
- ^ Radu Rugina a Martin Rinard, “Odvíjení rekurze pro programy rozdělení a dobývání," v Jazyky a překladače pro paralelní výpočty, kapitola 3, str. 34–48. Přednášky z informatiky sv. 2017 (Berlin: Springer, 2001).
- ^ Anthony M. Castaldo, R. Clint Whaley a Anthony T. Chronopoulos, „Redukce chyby s plovoucí desetinnou čárkou v produktu bodu pomocí superblokové rodiny algoritmů,“ SIAM J. Sci. Comput., sv. 32, s. 1156–1174 (2008).
- ^ L. N. Trefethen a D. Bau, Numerická lineární algebra (SIAM: Philadelphia, 1997).
- ^ ENH: implementace párového součtu, github.com/numpy/numpy požadavek na vytažení # 3685 (září 2013).
- ^ RFC: použijte párový součet pro součet, cumsum a cumprod, github.com/JuliaLang/julia pull request # 4039 (srpen 2013).
- ^ https://github.com/DragonSpit/HPCsharp Balíček HPCsharp nuget vysoce výkonných C # algoritmů