Gnuplot I - Funkce 1 proměnné

V úvodním článku bych Vás chtěl naučit vykreslovat grafy funkcí jedné proměnné.

1.9.2004 08:00 | Vladimír Jarý | přečteno 23975×

Základy práce v Gnuplot

Gnuplot slouží ke kreslení grafů funkcí ve 2d a 3d a zpracování statistických dat. V dnešním článku Vás stručně seznámím s možnostmi kreslení dvourozměrných grafů. Gnuplot by měl být součástí většiny hlavních distribucí, pokud na té Vaší chybí, můžete si jej stáhnout z domácí stránky projektu. K dispozici jsou zdrojové kódy pro Unix/Linux, Os/2, pro 32-bitová Windows, Apple Macintosh a další méně významné platformy. Ačkoliv je rozhraní programu řádkové, pro výstup grafu budete potřebovat běžící X window server. Program se spouští z konzole příkazem gnuplot, pro ukončení stiskněte ctrl+d nebo zadejte příkaz exit. Pro vypsání základní nápovědy napište na prompt help.

Zadávání funkcí

Jako proměnná se používá standardně x, v případě třírozměrných grafů pak x a y, u parametrických grafů hraje roli parametru písmeno t. Součet se značí znakem +, rozdíl znakem -, pro součin * podíl / a pro mocninu **. Plus respektive mínus mají navíc i význam unárního operátoru (+5, -3). Ludolfovo číslo lze zadat konstantou pi (pi zde má hodnotu 3.14159265358979). Následuje tabulka některých základních funkcí:

Kromě těchto základních funkcí známých ze středoškolské analýzy zvládá Gnuplot i Besselovy funkce, beta a gamma funkce. U řady funkcí jsou navíc podporovány i komplexní argumenty. Pozor, při zadávání funkcí a psaní příkazů závisí na velikosti písmen! K vyhodnocení aritmetického výrazu použijte příkaz print. V prostředí gnuplot je možné zavádět vlastní proměnné ve tvaru proměnná = hodnota

print sin(0) # vrátí 0
a = 5 # do proměnné a ulož hodnotu 5
print a**2+a+5 # vrátí 30

Vykreslování funkcí jedné proměnné

K nakreslení grafu 1 proměnné (x) slouží příkaz plot. Základním argumentem příkazu je požadovaná funkce, popřípadě více funkcí oddělených čárkou. Zkuste zadat plot sin(x). Pokud napíšete příkaz správně, mělo by se objevit X-ové okno s nakresleným grafem, v případě chyby použijte šipku nahoru (slouží pro pohyb v historii příkazů, obdobně jako v konzoli) a opravte zadání. Výsledný graf, jak je vidět na obrázku, nevypadá příliš pěkně, bylo by potřeba změnit měřítko os. Pokud chceme změnit osy pouze pro jeden konkrétní graf, stačí přímo za příkaz plot připsat požadované rozměry v tomto tvaru:

plot [x1:x2][y1:y2] f(x) 
 # obecná syntaxe, nastaví osu x na (x1, x2) a osu y na (y1, y2)
plot [0:2*pi][-1:1] sin(x) # nakreslí 1 periodu sinusoidy od 0 do 2 pi
plot [0:2*pi] cos(x) # změní pouze osu x
plot [][-1:1] # změní pouze osu y

Pro změnu os po celou dobu relace použijeme příkaz set, který slouží k nastavování mnoha různých aspektů programu. (Pro výpis všech parametrů tohoto příkazu stačí napsat samotné set):

set xrange [x1,x2] # nastaví globálně osu x set yrange [y1,y2] # nastaví globálně osu y

Pokud se chcete vrátit k výchozímu nastavení osy y, napište set autoscale y a osa y se bude opět automaticky dopočítávat. Pro aplikování změn měřítka (a nejenom měřítka) na již vykreslený graf slouží příkaz replot. A k měřítku ještě jednou, občas se hodí nastavit jednu osu v logaritmické stupnici. Opět použijeme příkazu set, tentokráte s parametrem logscale osa. Pro návrat na nelogaritmickou osu se použije příkaz unset s parametrem logscale. Pozor, příkaz unset sloužící jako protiklad příkazu set byl zaveden ve verzi (tuším) 4.0, ve starších verzích se pro zrušení konkrétního nastavení (třeba právě logaritmického měřítka) zavolal příkaz set s parametrem začínajícím prefixem no- (v tomto případě nologscale). Více snad vysvětlí ukázka:

plot log(x), exp(x) #vykresli vhodné funkce
          pro demonstraci logaritmického měřítka
set xrange [1,5]
set logscale x # osa x logaritmická
replot # překreslí graf s novým nastavením
set logscale y # osa y logaritmická
replot # překreslí graf s novým nastavením
# syntaxe platná pro verzi 4.0
unset logscale x
unset logscale y
# syntaxe platná ve starších verzích
set nologscale x
set nologscale y

Vykreslování os

Asi jste si všimli, že normálně je vypnuté zobrazování os x a y (tedy přímek o rovnicích x=0, y=0). K zobrazení těchto os nám pomůže již známý příkaz set:

plot x
set xzeroaxis # zobraz osu x
set yzeroaxis # zobraz osu y
set zeroaxis # zobraz osu x i osu y jediným příkazem :-)
replot # podívej se na výsledek

Pro opětovné skrytí os zavolejte příkaz unset:

unset xzeroaxis # vypne osu x
unset yzeroaxis # vypne osu y
unset zeroaxis # příkaz pro lenochy, vypne obě osy najednou
set nozeroaxis # pouze pokud máte starší verzi

Následuje stručně řada dalších příkazů pro úpravu vzhledu grafu:

set title "Návštěvnost Linuxsoftu :-)'" # Nastav popisek grafu
set xlabel "Čas" # nastav popisek osy x
set ylabel "Hodnota" # nastav popisek osy y
set nokey # skryj legendu 
set noborder #skryj rámeček
set grid # zobraz mřížku
set xrange[0:4]
plot exp(x)

Definování vlastních funkcí:

Ačkoliv gnuplot podporuje celkem slušnou řádku základních funkcí, není na škodu umět nadefinovat si funkci vlastní. Seznam vlastních funkcí zobrazíte příkazem show functions. Následuje syntaxe a několik příkladů:

Syntaxe: jméno_funkce(proměnné) = výraz
parabola(x) = x**2 # definujeme si funkci y=x^2
plot parabola(x) # a vykreslíme ji
pythagoras(x,y) = sqrt(x**2+y**2) # Pythagorova věta
print pythagoras(3,4) # vrátí 5
test(x) = x>0 ? sin(x) : cos(x)

V poslední ukázce je použit podmíněný výraz známý z jazyka C:

podminka ? výraz1 : výraz2

a znamená, že se vyhodnotí pravdivost výroku v podmínce, pokud jesplněna, vykoná se výraz1, jinak výraz2. Také logické operátory jsou převzaté z Céčka:

Za výraz1 nebo výraz2 je možné vložit i další větvení a nadefinovat například funkci signum (funkce signum vrací záporným argumentům hodnotu -1, v nule nabývá hodnotu 0 a konečně kladným argumentům vrací 1).

  znamenko(x) = x>0 ? 1 : (x==0 ? 0 : -1)
  print znamenko(-10)
  print znamenko(0)
  print znamenko(10)

To je pro dnešek vše, doufám, že jsem Vás příliš neznechutil matematikou. V příštím pokračování se naučíme vykreslovat grafy funkcí 2 proměnných.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=374