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))
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
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)
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