7.2 Metoda půlení intervalu a řešení rovnice $f(x) = 0$

Spojitost funkce na uzavřeném intervalu má závažné důsledky pro řešení rovnic. Následující věta dává postačující podmínku pro existenci řešení rovnice $f(x) = 0$ a dokonce i nabízí algoritmus jak toto řešení nalézt. Mimo to ji ještě dále s výhodou využijeme.

Povšimněte si, že není žádným omezením mít na pravé straně rovnice číslo $0$. Pokud bychom měli řešit rovnici $h(x) = g(x)$ pro neznámou $x$, vždy můžeme tento problém přeformulovat do tvaru $f(x) \ceq g(x) - h(x) = 0$.

Věta 7.4 (Metoda půlení intervalu / bisection method)

Nechť funkce $f$ je spojitá na uzavřeném intervalu $\langle a,b \rangle$ a nechť $f(a) \cdot f(b) < 0$. Potom existuje bod $c\in (a,b)$ takový, že $f(c) = 0$.

Poznámka 7.3

Podmínka $f(a) \cdot f(b) < 0$ v předchozí větě kompaktně popisuje dvě vzájemně se vylučující se možnosti:

  • $f(a) < 0$ a $f(b) > 0$, nebo

  • $f(a) > 0$ a $f(b) < 0$.

Zobrazit důkaz

Položme $a_1 \ceq a$ a $b_1 \ceq b$. Protože znaménka $f(a_1)$ a $f(b_1)$ jsou různá, nastane právě jedna ze tří možností

  1. $f\left(\frac{a_1+b_1}{2}\right) = 0$,

  2. znaménka $f(a_1)$ a $f\left( \frac{a_1 + b_1}{2} \right)$ jsou různá,

  3. znaménka $f\left( \frac{a_1+b_1}{2}\right)$ a $f(b_1)$ jsou různá.

Dále postupujeme podle toho, která z těchto možností nastala:

  1. Hledaným bodem $c$ je $\frac{a_1+b_1}{2}$ a věta je dokázána.

  2. Položme $a_2 \ceq a_1$ a $b_2 \ceq \frac{a_1 + b_1}{2}$.

  3. Položme $a_2 \ceq \frac{a_1 + b_1}{2}$ a $b_2 = b_1$.

Pokud nenastala první možnost, proveďme stejnou úvahu s $a_2$ a $b_2$ místo $a_1$ a $b_1$. Tímto způsobem postupně konstruujeme další $a_3$, $b_3$, atd. Pokud v některém z kroků nastane první možnost (tj. existuje $n$ tak, že $f\left(\frac{a_n+b_n}{2}\right) = 0$), pak je věta dokázána.

V opačném případě jsme zkonstruovali dvě posloupnosti $(a_n)_{n=1}^\infty$ a $(b_n)_{n=1}^\infty$ splňující

\begin{equation*} a_n,b_n \in \langle a,b \rangle, \quad a \leq a_n \leq a_{n+1} < b_{n+1} \leq b_n \leq b, \quad b_n - a_n = \frac{b-a}{2^{n-1}}, \end{equation*}

pro každé $n\in\mathbb{N}$. Obě posloupnosti jsou monotónní a omezené, tudíž existují jejich konečné limity, $a_n \to \alpha$ a $b_n \to \beta$ při $n\to\infty$. Navíc

\begin{equation*} \beta - \alpha = \lim_{n\to\infty} (b_n - a_n) = \lim_{n\to\infty} \frac{b-a}{2^{n-1}} = 0. \end{equation*}

Obě posloupnosti tedy mají stejnou limitu, označme ji $c \ceq \alpha = \beta \in \langle a,b \rangle$. Ze spojitosti funkce $f$ v bodě $c$ a Heineho věty nyní plyne

\begin{equation*} \lim_{n\to\infty} f(a_n) = \lim_{n\to\infty} f(b_n) = f(c). \end{equation*}

Ale protože všechny $f(a_n)$ mají různé znaménko od $f(b_n)$, můžou poslední rovnosti nastat pouze v případě, že $f(c) = 0$. Tím je důkaz věty dokončen.

$\square$

Důkaz předcházející věty je konstruktivní. Tvrzení věty, existenci čísla $c$, jsme dokázali jeho konstrukcí. Algoritmus použitý v důkazu se nazývá metoda půlení intervalu a lze ho prakticky použít k hledání řešení rovnice $f(x) = 0$. Jeho výhodou je, že máme pod kontrolou chybu výpočtu, hledané řešení $c$ vždy leží v intervalu $(a_n, b_n)$. Pokud délka tohoto intervalu je již kratší než požadovaná přesnost, můžeme algoritmus zastavit a třeba o průměru $\frac{a_n+b_n}{2}$ prohlásit, že se jedná o hledané řešení (v dané přesnosti). Nevýhodou metody půlení intervalu je její ne příliš vysoká rychlost (typicky je potřeba udělat více iterací než se dostaneme k požadované přesnosti). Později během semestru si ukážeme Newtonovu metodu, která často konverguje výrazně rychleji.

Obrázek 7.3: Demonstrace k metodě půlení intervalu, Větě 7.4.
Poznámka 7.4

Předpoklad spojitosti v předešlé Větě 7.4 je podstatný. Jako příklad uvažme funkci

\begin{equation*} f(x) = \begin{cases} 1, & x \in \left\langle 0, \frac{1}{2} \right\rangle, \\ -1, & x \in \left( \frac{1}{2}, 1 \right\rangle \end{cases} \end{equation*}

na intervalu $\langle a,b \rangle = \langle 0,1 \rangle$. Sice $f(0)\cdot f(1) = -1 < 0$, ale neexistuje bod $x\in(0,1)$ splňující $f(x) = 0$. Viz Obrázek 7.4.

Obrázek 7.4: Předpoklad spojitosti pro tvrzení Věty 7.4 je podstatný.
Příklad 7.6 (Numerický výpočet hodnoty odmocniny ze dvou)

Na tomto místě uveďme velmi jednoduchou ukázku použití metody půlení intervalu. Záměrně naivní  Python implementace této metody (viz důkaz Věty 7.4) by mohla vypadat následovně:

def bisection(f, a, b, eps):
  # Kontrola intervalu, případné prohození krajních bodů
  if f(a) * f(b) >= 0:
    raise BaseException("Nevhodný interval!")
  if a > b:
    a, b = b, a
  # Počítadlo iterací, nultá aproximace
  n = 0
  x = (a + b) / 2
  # Výpočetní cyklus
  while b - a >= 2*eps:
    if f(x) == 0:
      return x, n
    elif f(a) * f(x) < 0:
      b = x
    else:
      a = x
    x  = (a + b) / 2
    n += 1
  # Vrátíme poslední aproximaci a počet iterací
  return x, n

Funkce bisection očekává spojitou funkci f, jejíž nulový bod se snažíme nalézt v intervalu s krajními body a a b. Dále musíme zadat požadovanou přesnost výpočtu eps. Metoda pak vrací aproximaci x, která se od skutečné hodnoty nulového bodu liší nejvýše o eps, a počet provedených iterací n.

Použití této metody pro výpočet aproximací odmocniny ze dvou je nyní přímočaré. Vezmeme funkci $f(x) = x^2 - 2$, tedy f = lambda x: (x ** 2) - 2, a například $a = 0$ a $b = 3$. Výsledky tohoto experimentu s různou přesností výpočtu jsou uvedeny v Tabulce 7.1. V tomto případě je samozřejmě přesnost výsledku navíc limitována použitým datovým typem (zde 64 bitový float, viz podkapitolu 2.6). Samotná metoda ale není v principu nijak omezená. Pokud bychom chtěli větší přesnost, stačí použít jiný datový typ.

\(k\) Aproximace \(\sqrt{2}\) Počet iterací \(n\)
1 \(1{,}406\,250\,000\,000\,000\,0\) 4
2 \(1{,}412\,109\,375\,000\,000\,0\) 8
3 \(1{,}414\,306\,640\,625\,000\,0\) 11
4 \(1{,}414\,215\,087\,890\,625\,0\) 14
5 \(1{,}414\,209\,365\,844\,726\,6\) 18
6 \(1{,}414\,212\,942\,123\,413\,0\) 21
7 \(1{,}414\,213\,567\,972\,183\,2\) 24
8 \(1{,}414\,213\,562\,384\,247\,8\) 28
9 \(1{,}414\,213\,561\,685\,755\,8\) 31
10 \(1{,}414\,213\,562\,296\,936\,3\) 34
11 \(1{,}414\,213\,562\,367\,876\,9\) 38
12 \(1{,}414\,213\,562\,372\,651\,7\) 41
13 \(1{,}414\,213\,562\,373\,078\,0\) 44
14 \(1{,}414\,213\,562\,373\,094\,0\) 48

Tabulka 7.1: Aproximace hodnoty $\sqrt{2}$ získané pomocí metody půlení intervalu (viz důkaz Věty 7.4) aplikované na funkci $f(x) = x^2 - 2$ a body $a = 0$ a $b = 3$ s absolutní přesností $10^{-k}$. Výpočet byl zastaven po $n$ iteracích. Prvních „správných“ 17 cifer $\sqrt{2}$ je $1{,}414\,213\,562\,373\,095\,0$. Viz Příklad 7.6.