Reálná funkce jedné reálné proměnné (definice, definiční obor a obor hodnot, graf funkce, limita a spojitost funkce), polynomy (definice, vlastnosti, Hornerovo schéma), numerické řešení nelineárních rovnic (metoda půlení intervalu, Newtonova metoda)
Každému prvku z množiny $A$ přiřazuje právě jeden prvek z množiny $B$.
V kontextu funkce:
Skutečný obor hodnot funkce je množina všech hodnot, kterých funkce skutečně nabývá:
\[f(A)=\{f(x)\ |\ x \in A\}\]Předpis funkce popisuje závislost mezi prvky definičního oboru a odpovídajícími prvky oboru hodnot. Jinými slovy určuje, jakým způsobem se z hodnoty vstupu vypočítá odpovídající hodnota výstupu.
Speciálním případem je:
\[f : \mathbb{R} \to \mathbb{R}\]Každému reálnému číslu z definičního oboru přiřazuje právě jedno reálné číslo z oboru hodnot.

\(f(x)=\frac{1}{x}\)
\[D(f)=\mathbb{R}\setminus\{0\}\]protože pro danou hodnotu:
\[x=0\]nelze určit funkční hodnotu.
\(f(x)=x^2\) \(H(f)=[0,\infty)\)
protože druhá mocnina reálného čísla nikdy není záporná.
Každý bod grafu odpovídá dvojici:
\[[x,f(x)]\]Graf funkce tvoří všechny body:
\[\{[x,f(x)] \mid x \in D(f)\}\]\(f(x)=x^2\) Grafem této funkce je parabola otevřená směrem nahoru.
To znamená, že pokud se: \(x \to a\)
pak se odpovídající funkční hodnoty: \(f(x) \to L\)
přičemž „$\to$“ v tomto kontextu čteme jako „se blíží k“.


Polynom je výraz ve tvaru:
\[p(x)=\sum_{i=0}^{n} a_i x^i = a_0 + a_1x + a_2x^2 + \dots + a_nx^n\]kde:
Polynom $p(x)$ je polynom druhého stupně.
Polynomy $p(x)$ a $q(x)$ jsou si rovny právě tehdy, když mají stejné koeficienty u členů se stejnými exponenty proměnné $x$.

Bez Hornerova schématu bychom hodnotu polynomu počítali přímým dosazením:
\[P(x)=2x^3-3x^2+4x-5\]pro $x=2$:
\[P(2)=2 \cdot 2^3 - 3 \cdot 2^2 + 4 \cdot 2 - 5\] \[=2 \cdot 8 - 3 \cdot 4 + 8 - 5\] \[=16 -12 +8 -5\] \[=7\]Musíme zde opakovaně počítat mocniny:
U polynomů vysokého stupně by byl tento výpočet pomalý a numericky nevhodný, protože je nutné opakovaně počítat vysoké mocniny typu $x^n$, které mohou být výpočetně drahé, způsobovat ztrátu přesnosti a u velmi velkých hodnot vést k přetečení (overflow) nebo k práci s extrémně velkými čísly zabírajícími více paměti.
def horner(coefficients: list[float], x: float) -> float:
result = coefficients[0]
for coefficient in coefficients[1:]:
result = result * x + coefficient
return result
# P(x) = 2x^3 - 3x^2 + 4x - 5, x = 2
result = horner(coefficients=[2, -3, 4, -5], x=2)
print(result)
Cílem je najít kořen rovnice ve tvaru:
\[f(x)=0\]tedy hodnotu $x$, pro kterou funkce vyjde nula.
Například:
\[x^2-2=0\]řešení:
\[x=\sqrt{2}\approx1.41421356\]U složitých funkcí neumíme kořen spočítat přesně analyticky. Použijí se numerické metody.
Máme interval:
\[[a,b]\]ve kterém funkce změní znaménko:
\[f(a)\cdot f(b)<0\]To znamená:
Takže mezi nimi musí existovat kořen.
Najdi kořen:
\[f(x)=x^2-2\]Interval:
\[[1,2]\]protože:
\[f(1)=-1\] \[f(2)=2\]změna znaménka existuje.
Střed:
\[c=\frac{1+2}{2}=1.5\]Výpočet:
\[f(1.5)=0.25\]Kořen je tedy vlevo:
\[[1,1.5]\]Další krok:
\[c=\frac{1+1.5}{2}=1.25\]atd.
def bisection(f, a: float, b: float, tolerance: float = 1e-10) -> float:
while abs(b - a) > tolerance:
c: float = (a + b) / 2
if f(a) * f(c) < 0:
b = c
else:
a = c
return (a + b) / 2
def f(x: float) -> float:
return x**2 - 2
root = bisection(f=f, a=1.0, b=2.0)
print(root)
kde:
| Metoda půlení | Newtonova metoda | |
|---|---|---|
| Rychlost | pomalejší | obvykle rychlejší (kvadratická konvergence v ideálním případě) |
| Derivace | nepotřebuje | potřebuje $f’(x)$ |
| Spolehlivost | vždy konverguje při změně znaménka na intervalu | může divergovat při špatném $x_0$ |
| Počáteční podmínka | interval $[a,b]$ se změnou znaménka | počáteční bod $x_0$ |
Najdi kořen:
\[f(x)=x^2-2\]Derivace:
\[f'(x)=2x\]Vzorec iterace:
\[x_{n+1}=x_n-\frac{x_n^2-2}{2x_n}\]Počáteční odhad $x_0=2$:
\[x_1=2-\frac{4-2}{4}=1.5\] \[x_2=1.5-\frac{2.25-2}{3}\approx 1.4167\]Postupně se přibližujeme k $\sqrt{2}\approx 1.4142$.
def newton(f, df, x0: float, tolerance: float = 1e-10, max_iter: int = 100) -> float:
x: float = x0
for _ in range(max_iter):
fx: float = f(x)
dfx: float = df(x)
if abs(dfx) < 1e-12:
raise ValueError("Derivace je příliš blízko nule.")
x_next: float = x - fx / dfx
if abs(x_next - x) < tolerance:
return x_next
x = x_next
return x
def f(x: float) -> float:
return x**2 - 2
def df(x: float) -> float:
return 2 * x
root = newton(f=f, df=df, x0=2.0)
print(root)