====== Úkol 1 ====== ==== Metoda bisekce a regula falsi ==== 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: - **Hledání středového bodu:** metoda nalezne střed zadaného intervalu $$ c = \frac{a + b}{2}. $$ - **Aktualizace intervalu pro hledání:** pokud mají funkcí hodnoty $f(a)$ a $f(c)$ stejné znaménko, tak nový interval pro hledání kořene bude $[c, b]$. V opačném případě bude nový interval $[a, c]$. 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)}. $$ ==== Zadání ==== 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: * Funkce musí zkontrolovat, že platí ''a < b'' a pokud ne, tak musí prohodit proměnné, aby tato nerovnost byla splněna. * V případě, že je funkci zadán hledaný kořen, musí funkce tento kořen vrátit bez jakéhokoliv dalšího výpočtu. * V případě, že funkční hodnoty v krajních bodech zadaného intervalu budou mít stejné znaméno, tak musí funkce vrátit [[https://docs.julialang.org/en/v1/base/base/#Core.DomainError|DomainError]] se smysluplnou chybovou zprávou.