Párový součet - Pairwise summation

V numerické analýze je párový součet , nazývaný také kaskádový součet , technika k součtu posloupnosti čísel s plovoucí desetinnou čárkou s konečnou přesností, která podstatně snižuje akumulovanou chybu zaokrouhlování ve srovnání s naivní akumulací součtu v sekvenci. Ačkoli existují i ​​jiné techniky, jako je Kahanův součet, které mají obvykle ještě menší chyby zaokrouhlování, párový součet je 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ých operací) jako naivní součet.

Zejména párový součet sekvence n čísel x n funguje tak, že rekurzivně rozdělí sekvenci na dvě poloviny, sčítá každou polovinu a přidá dvě součty: algoritmus rozděl a panuj . Jeho nejhorší případy zaokrouhlovací chyby rostou asymptoticky jako nanejvýš O (ε log  n ), kde ε je přesnost stroje (za předpokladu čísla pevné podmínky , jak je popsáno níže). Ve srovnání má naivní technika hromadění součtu v pořadí (přidávání každého x i jeden po druhém pro i  = 1, ...,  n ) chyby zaokrouhlování, které rostou v nejhorším případě jako O n ). Kahanova sumace nejhorší chybu zhruba O (ε), nezávislou na n , ale vyžaduje několikrát více aritmetických operací. Pokud jsou chyby zaokrouhlení náhodné a zejména mají náhodné znaky, tvoří náhodnou procházku a nárůst chyb se sníží na průměrnou hodnotu pro párový součet.

Velmi podobná rekurzivní struktura součtu se nachází v mnoha algoritmech rychlé Fourierovy transformace (FFT) a je zodpovědná za stejnou pomalou akumulaci těchto FFT.

Algoritmus

V pseudokódu lze zapsat algoritmus párového součtu pro pole x délky n > 0:

s = pairwise(x[1…n])
      if nN     base case: naive summation for a sufficiently small array
          s = x[1]
          for i = 2 to n
              s = s + x[i]
      else         divide and conquer: recursively sum two halves of the array
          m = floor(n / 2)
          s = pairwise(x[1…m]) + pairwise(x[m+1…n])
      end if

U nějakého dostatečně malého N se tento algoritmus přepne na naivní smyčkový součet jako základní případ , jehož chyba je O (Nε). Celá suma má nejhorší chybu, která roste asymptoticky jako O (ε log  n ) pro velké n , pro dané číslo podmínky (viz níže).

V algoritmu tohoto druhu ( obecně pro algoritmy dělení a dobývání ) je žádoucí použít větší základní případ, aby se amortizovala režie rekurze. V případě N  = 1, pak je zde zhruba rekurzivní volání podprogramu pro každý vstup, ale obecně je tam jeden rekurzivní volání pro (zhruba) každý N / 2 vstupy v případě, že rekurze se zastaví v přesně  n  =  N . Tím, že N dostatečně velký, může být režie rekurze 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).

Bez ohledu na N se provádí celkem přesně n −1 sčítání, 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.

Variací této myšlenky je rozdělit součet na b bloky v každé rekurzivní fázi, rekurzivně sčítat každý blok a poté sečíst výsledky, které jeho navrhovatelé nazvali algoritmem „superbloku“. Výše uvedené párové algoritmus odpovídá b  = 2, pro každou fázi, s výjimkou posledního stupně, který je  b  =  N .

Přesnost

Předpokládejme, že se sečte n hodnot x i , 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 je chyba ohraničena výše:

kde ε je strojová přesnost použité aritmetiky (např. ε ≈ 10 −16 pro standardní plovoucí desetinnou čárku s dvojitou přesností ). Obvykle je množství zájmu relativní chybou , která je proto výše omezena:

Ve výrazu pro relativní vázanou chybu je zlomek (Σ | x i | / | Σ x i |) číslem podmínky úlohy součtu. Číslo podmínky v podstatě představuje vnitřní citlivost součtového problému na chyby, bez ohledu na to, jak je vypočítán. Relativní chyba vázaná na každou ( zpětně stabilní ) metodu sčítání pevným algoritmem s pevnou přesností (tj. Ne těmi, které používají aritmetiku s libovolnou přesností , ani algoritmy, jejichž požadavky na paměť a čas se na základě dat mění), je úměrná tomuto počtu podmínek . Špatně podmíněné součet Problém je ten, ve kterém je tento poměr je velký, a v tomto případě i po dvou sčítání může mít velkou relativní chybu. Například pokud jsou summandy x i nekorelovaná náhodná čísla s nulovým průměrem, je součet náhodným procházením 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 1, protože je mnohem menší než 1, dokud se n nestane řádem 2 1 / ε , což je zhruba 10 10 15 s dvojitou přesností.

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 vynásobením číslem podmínky. 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 relativní chybu s odmocninou, která roste, a párová sumace má chybu, která roste jako průměr.

Softwarové implementace

Pairwise summation is the default summation algorithm in NumPy and the Julia technical-computing language , where in both cases it was found to have compared speed to naive summation (thanks to the use of a large base case).

Jiné implementace softwaru patří HPCsharp knihovnu pro C Sharp jazyka a standardní knihovny sčítání v D .

Reference