2.1 Bisekční algoritmus
Bisekční algoritmus je jednoduchá metoda pro hledání kořenů jednorozměrných funkcí. Cílem je najít kořen \(x_0\in\) takový, že \(f(x_0)=0\). Algoritmus začíná s velkým intervalem, o kterém je známo, že obsahuje \(x_0\), a pak postupně zmenšuje velikost intervalu, dokud nenajde kořen. Teoretickým základem algoritmu je věta o mezilehlé hodnotě, která říká, že pokud spojitá funkce \(f\) nabývá hodnot \(f(a)\) a \(f(b)\) v koncových bodech intervalu \(\), pak \(f\) musí nabývat všech hodnot mezi \(f(a)\) a \(f(b)\) někde v intervalu. Jestliže tedy \(f(a) < \gamma < f(b)\), pak existuje \(c\in\) takové, že \(f(c)=\gamma\).
Pomocí této informace můžeme představit algoritmus bisekce. Nejprve musíme ověřit, že \(\text{sign}(f(a)) \ne \text{sign}(f(b))\). V opačném případě interval neobsahuje kořen a může být nutné jej rozšířit. Pak můžeme pokračovat:
-
Nechť \(c = \frac{a + b}{2}\).
-
Jestliže \(f(c) = 0\), zastavíme a vrátíme \(c\).
-
Jestliže \(\text{znak}(f(a))\ne\text{znak}(f(c))\), pak nastavíme \(b\leftarrow c\). Jinak pokud \(\text{sign}(f(b))\ne\text{sign}(f(c))\), pak nastavte \(a\leftarrow c\).
-
Přejděte na začátek a opakujte až do konvergence (viz níže).
Po \(n\) iteracích bude velikost intervalu ohraničujícího kořen \(2^{-n}(b-a)\).
Algoritmus bisekce je užitečný, koncepčně jednoduchý a snadno se implementuje. Zejména nepotřebujete žádné zvláštní informace o funkci \(f\) kromě schopnosti vyhodnotit ji v různých bodech intervalu. Jeho nevýhodou je, že je užitečný pouze v jedné dimenzi a jeho konvergence je lineární, což je nejpomalejší rychlost konvergence algoritmů, o kterých budeme hovořit (více o tom později).
Bisekční algoritmus se může dostat do problémů v situacích, kdy se funkce \(f\) nechová dobře. Ideální situace pro bisekční algoritmus vypadá asi takto.
Ideální nastavení pro bisekční algoritmus.
Zde jsou \(f(a)\) a \(f(b)\) opačných znamének a kořen je jednoznačně mezi \(a\) a \(b\).
V následujícím případě se algoritmus nespustí, protože \(f(a)>0\) a \(f(b)>0\).
Derivát \(f\) v kořeni je \(0\).
V tomto dalším případě jsou mezi \(a\) a \(b\) dva kořeny, kromě toho, že máme \(f(a)>0\) a \(f(b)>0\). Abychom našli některý z kořenů, museli bychom zkrátit délku počátečního intervalu.
Dva kořeny v intervalu.
V níže uvedeném případě se algoritmus spustí, protože \(f(a)\) a \(f(b)\) mají opačné znaménko, ale neexistuje žádný kořen.
Interval obsahuje asymptotu, ale nemá kořen.
Konvergenci bisekčního algoritmu lze určit tak, že buď máme \(|b-a|<\varepsilon\) pro nějaké malé \(\varepsilon\), nebo máme \(|f(b)-f(a)|<\varepsilon\). Které kritérium použijete, závisí na konkrétní aplikaci a na tom, jaké tolerance jsou požadovány.
2.1.1 Příklad: Kvantily
Při kumulativní distribuční funkci \(F(x)\) a čísle \(p\v (0, 1)\) je kvantil \(F\) takové číslo \(x\), že \(F(x) = p\). Algoritmus bisekce lze použít k nalezení kvantilu \(x\) pro dané \(p\) definováním funkce \(g(x) = F(x) – p\) a řešením hodnoty \(x\), která dosahuje \(g(x) = 0\).
Jiný způsob, jak to vyjádřit, je, že invertujeme CDF k výpočtu \(x = F^{-1}(p)\). Algoritmus bisekce lze tedy v těchto situacích použít k invertování funkcí.
.