Předpokládejme, že máme reálnou funkci jedné proměnné $f: \mathbb{R} \rightarrow \mathbb{R}$ spojitou na intervalu $[a, b] \in \mathbb{R}$, pro který platí, že funkční hodnoty v krajních bodech tohoto intervalu mají opačné znaménko. Metoda bisekce je iterační algoritmus pro hledání kořene takovéto funkce na zadaném intervalu. V každé iteraci povede metoda bisekce následující dva kroky:
Uvedené dva kroky se opakují, dokud není dosaženo požadované přesnosti nebo není dosaženo maximálního počtu iterací. Jako zastavovací kritérium můžeme použit funkční hodnotu v bodě $c$, tzn. algoritmus bude ukončen pokud platí $|f(c)| < \varepsilon$ pro zadanou toleranci $\varepsilon \in \mathbb{R}$.
Metoda regula falsi se od metody bisekce liší pouze tím, jak vybírá bod $c$. Pro tuto metodu se používá následující vzorec
$$ c = \frac{a\cdot f(b) - b\cdot f(a)}{f(b) - f(a)}. $$
Naimplementujte funkci findroot
, která nalezne kořen zadané funkce na zadaném intervalu. Funkce findroot
musí mít následující vstupní argumenty (v uvedeném pořadí):
method
: metoda, která bude použita pro hledání kořene,
f
: funkce jedne proměnné jejíž kořen chceme nalézt,
a
: spodní mez intervalu,
b
: horní mez intervalu.
Zvolte vhodné typy pro všechny vstupní parametry funkce findroot
. Pro rozlišení metody pro hledání kořene použijte následující typovou hierarchii.
abstract type BracketingMethod end struct Bisection <: BracketingMethod end struct RegulaFalsi <: BracketingMethod end
Dále musí funkce findroot
akceptovat následující argumenty klíčových slov (hodnoty za =
jsou hodnoty ):
atol = 1e-8
: tolerance algoritmu,
maxiter = 1000
: maximální počet iterací.
Při implementaci si uvědomte, že metoda bisekce a metoda regula falsi se liší pouze výběrem nového bodu. Napište funkci findroot
obecně po obě metody. Využijte multiple-dispatch a napište funkci midpoint
, která bude na základě použité metody vracet nový bod. Tato funkce musí mít následující vstupní argumenty (v uvedeném pořadí):
method
: metoda, která bude použita pro hledání kořene,
f
: funkce jedne proměnné jejíž kořen chceme nalézt,
a
: spodní mez intervalu,
b
: horní mez intervalu.
Funkce findroot
také musí splňovat následující vlastnosti:
a < b
a pokud ne, tak musí prohodit proměnné, aby tato nerovnost byla splněna.