Search
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í):
findroot
method
f
a
b
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
maxiter = 1000
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í):
midpoint
Funkce findroot také musí splňovat následující vlastnosti:
a < b