BI-ZMA Základy matematické analýzy
Jdi na navigaci předmětu

5. Funkce a jejich grafy

SageMath podporuje mnoho způsobů jak vytvářet všemožné typy grafů. Nejjednodušším způsobem je asi vytvoření symbolického výrazu s jednou symbolickou proměnnou a použití příkazu plot. Předveďme si tento postup na jednoduchém příkladě.

# Buď $x$ symbolická proměnná.
var('x')
# Graf funkce $1/x*\sin(x^2)$ pro $x$ z intervalu $\langle 1,15 \rangle$.
plot(1/x*sin(x^2),(x,1,15))
Graf funkce

Na předchozím obrázku jsme jen specifikovali funkci a rozsah nezávisle proměnné. SageMath nám umožňuje vyladit i ostatní parametry grafu. V následující ukázce si ukážeme několik užitečných parametrů. Interně SageMath k tvorbě grafů využívá Pythonovskou knihovnu matplotlib.

plot(1/x*sin(x^2),(x,1,15),
    ymin=-0.5, ymax=1,                  # rozsah svislé osy
    thickness=2,                        # tloušťka křivky
    rgbcolor='red',                     # barva
    axes_labels=['$x$','$y=f(x)$'],     # popisky os, lze využívat LaTeX
    tick_formatter='latex',             # cejchování os stejným fontem jako popisky os
    legend_label='$y = \\sin(x^2)/x$',  # legenda (vhodné při kombinování více grafů)
    figsize=4)                          # velikost výsledného obrázku
Graf funkce

Občas je potřeba přesně specifikovat na kterých místech se mají osy cejchovat (typicky u goniometrických funkcí). V následující ukázce grafu funkce arkus sinus si uážeme jak na to.

plot(arcsin(x),(x,-1,1),
    ymin=-pi/2, ymax=pi/2,
    thickness=2, rgbcolor='green',
    axes_labels=['$x$','$y$'], tick_formatter='latex',
    legend_label='$y = \\arcsin(x)$',
    ticks=[[-1,-1/2,1/2,1],[-pi/2,-pi/4,pi/4,pi/2]], # cejchování os
    gridlines=True,                                  # souřadná mříž
    figsize=6)
Graf funkce

Funkce plot akceptuje i obyčejnou Pythonovskou funkci, která vrací číselné výsledky. Syntaxe je jen nepatrně odlišná (neuvádí se nezávisle proměnná).

def lambert(z):
    """
        Naivní implementace Lambertovy funkce, tedy inverze
        k g(w) = w*exp(w), kde w > -1. Výpočet pomocí Newtonovy
        metody s očekávanou přesností na 5 cifer za desetinnou
        tečkou.
    """

    # Je argument "z" z definičního oboru?
    if z <= -1/e:
        raise ValueError('Argument není v definičním oboru Lambertovy funkce!')

    # Přesnost a iterátor rekurentní posloupnosti.
    eps = 1e-6
    newton = lambda w: w - (w*exp(w) - z) / (exp(w) + w*exp(w))

    # První nástřel.
    if z < 0:
        y1 = -0.5
    elif z > 0:
        y1 = z/2
    else:
        return 0

    # Iterativní výpočet.
    y2 = newton(z)
    while abs(y1 - y2) > eps:
        y1,y2 = y2,newton(y2)

    return y2

A nakonec graf s oběma funkcemi. Zde také ukazujeme, jak kombinovat více grafických objektů do jednoho. K tomu slouží operátor +. Různa nastavení grafiky (osy, velikost obrázku, atp.) stačí uvést jednou v prvním grafickém objektu.

fig1 = plot(x*exp(x),(x,-1,e),
    ymin=-1,ymax=e,
    thickness=2, rgbcolor='blue',
    axes_labels=['$x$','$y$'], tick_formatter='latex',
    legend_label='$y = g(x) := x e^x$', gridlines=True,
    figsize=6,aspect_ratio=1)

fig2 = plot(lambert,(-1/e,e),
    thickness=2, rgbcolor='red',
    legend_label='$y = g^{-1}(x)$')

fig1 + fig2
Grafy funkcí