Warning
This page is located in archive.

Ú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:

  1. Hledání středového bodu: metoda nalezne střed zadaného intervalu $$ c = \frac{a + b}{2}. $$
  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 DomainError se smysluplnou chybovou zprávou.
courses/b0b36jul/hw/hw1.txt · Last modified: 2023/01/16 17:59 by adamluk3