DerivLab jak rychle se to mění

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

Numericky: menší krok NENÍ přesnější

Analytickou derivaci má člověk zřídka. Obvykle je funkce výsledek simulace, měření nebo kusu cizího kódu — a derivace se musí spočítat z hodnot. Vzorec je zřejmý:

f′(x) ≈ (f(x+h) − f(x−h)) / 2hcentrální diference

A hned za ním je otázka: jak velké h? Intuice říká „co nejmenší, limita je přece pro h → 0“. Intuice se plete, a plete se způsobem, který vrátí věrohodné číslo místo chyby.

10⁻¹⁶10⁻¹³10⁻¹⁰10⁻⁷10⁻⁴10⁻¹10⁻¹⁶10⁻¹²10⁻⁸10⁻⁴10⁰krok hrel. chybadopředná (1. řád)centrální (2. řád)Richardson (4. řád)váš krok10⁻⁵chyba1.8·10^-11nejlepší h (centrální)6.1·10^-6
při vašem h je chyba 1.8e-11, při nejlepším 2.5e-13 — tedy 7e+1× horší
Log-log graf skutečné chyby. Vlevo dole roste chyba zaokrouhlením, vpravo nahoře useknutím — a nejlepší krok je v tom údolí. Táhni jezdcem a sleduj, co dělá váš krok.

Dvě chyby proti sobě

  • Useknutí ~ h². Zlomek není limita, a čím větší h, tím dál od ní.
  • Zaokrouhlení ~ ε/h. Odečítají se dvě skoro stejná čísla, takže se ztratí platné číslice — a čím menší h, tím hůř. Při h ≈ 10⁻¹⁷ platí x + h = x a v čitateli zůstane nula.

Součet má minimum, a to je odpověď:

h* ≈ ε^(1/3) · |x| ≈ 6·10⁻⁶ pro centrální diferencioptimální krok

A tady je nález, který stojí za pozornost: vyšší řád automaticky neznamená lepší výsledek. Richardsonova extrapolace je čtvrtého řádu, takže její optimální krok je ε^(1/5) ≈ 7·10⁻⁴ — stokrát větší než u centrální diference. Pustí-li se při kroku vyladěném pro centrální diferenci, je horší než pravidlo, které měla vylepšit. Testy v repu to chytily a mají na to vlastní případ: řád a krok se musí měnit spolu.

vzorecřádoptimální hvyhodnocení f
dopředná1ε^(1/2) ≈ 1,5·10⁻⁸2
centrální2ε^(1/3) ≈ 6·10⁻⁶2
Richardson4ε^(1/5) ≈ 7·10⁻⁴4
druhá derivace2ε^(1/4) ≈ 1,2·10⁻⁴3

Poslední řádek je ten, na kterém se pohoří nejčastěji: druhá derivace se dělí , takže zaokrouhlovací člen je ε/h² a nejlepší krok je mnohem větší. Ručně psaný Hessián s krokem 10⁻⁸ je šum — a přesně proto ho solver v téhle labce počítá s vlastním, větším krokem.

Kdy tohle všechno nepotřebujete. Když derivaci znáte analyticky, spočítejte ji analyticky — je přesná a levnější. Numerická derivace je pro případy, kdy funkci nemáte v ruce jako vzorec. A pokud máte kód, existuje třetí cesta, která má přesnost analytické a pohodlí numerické: automatické derivování. Tahle labka ho nepočítá, ale stojí za to vědět, že existuje.

Vzorce v této kapitole

h* — optimální krok pro centrální diferenci
h* ≈ ε^(1/3)·max(1,|x|) ≈ 6·10⁻⁶ [—] kap. 3
centrální — centrální diference
f′(x) ≈ (f(x+h) − f(x−h))/(2h) [—] kap. 3