Octave/tutorial

První seznámení

editovat

(popisována verse 3.0.0)

Spuštění

editovat
  • Z terminálového okna příkazem: octave
  • Z GUI nadstavby: QtOctave

Základní způsob práce je příkazový řádek. který se ohlásí promptem, např:

octave:1>

V dalších příkladech budeme pro jednoduchost označovat prompt znaky >>. To znamená, že co následuje za znaky >>, to jsme zadali z klávesnice (v případě jednořádkových příkazů). Další řádky jsou odpovědi octave.

Základní datové typy a operace s nimi

editovat

Matice (Matrix)

editovat

Elementy v řádcích matic oddělujeme čárkami; jednotlivé řádky od sebe pak středníky:

>> a = [1, 2, 3; 4, 5, 6; 7, 8, 9]

Po takovém zadání octave vypíše matici a.

a =

   1   2   3
   4   5   6
   7   8   9

Pokud ale řádek ukončíme středníkem, matice se nevypíše:

>> a = [1, 2, 3; 4, 5, 6; 7, 8, 9];

Proto běžně v programu příkazové řádky ukončíme středníkem; pouze, když chceme výsledek operace vypsat, středník neděláme.

Násobení matice skalárem:

>> 2*a

ans =

    2    4    6
    8   10   12
   14   16   18

Je to to samé, jako součet dvou stejných matic:

>> a+a

ans =

    2    4    6
    8   10   12
   14   16   18


Vektor (Vector)

editovat

Matice, která má jen jeden řádek nebo jeden sloupec, se nazývá vektor:

>> b = [1, 2, 3, 4]

b =

   1   2   3   4
>> c = [5; 6; 7; 8]

c =

   5
   6
   7
   8

Ukážeme si, že násobení matic není obecně komutativní:

>> b*c

ans =  70
>> c*b

ans =

    5   10   15   20
    6   12   18   24
    7   14   21   28
    8   16   24   32

Rozsah (Range)

editovat

Rozsah je řádkový vektor, jehož elementy tvoří aritmetickou řadu. Vyznačíme jej mezemi (tj. prvním a posledním elementem), oddělenými dvojtečkou:

>> 3:7
ans =

  3  4  5  6  7

Pokud chceme jiný inkrement než jedničku, uvedeme jej (opěd oddělený dvojtečkou) mezi obě krajní meze:

>> 3:-2:-7
ans =

   3   1  -1  -3  -5  -7

Konstanty

editovat
>> e
ans =  2.7183

>> pi
ans =  3.1416

Termínem funkce míněn podprogram, kterému můžeme zadat nějaké argumenty a který vrací nějakou funkční hodnotu. Jako příklad poslouží třeba známé trigonometrické funkce:

>>  sin(pi/6)
ans =  0.50000
>> tan(pi/2)
ans =  1.6332e+16

Zajímavé je, že jako argument můžeme funkci předat třeba vektor argumentů:

>> sin(0:pi/6:2*pi)
ans =

 Columns 1 through 12:

   0.00000   0.50000   0.86603   1.00000   0.86603   0.50000   0.00000  -0.50000  -0.86603  -1.00000  -0.86603  -0.50000

 Column 13:

  -0.00000

Kreslení

editovat

V průběhu vývoje octave se měnily systémy pro grafický výstup. Původní program GNUplot byl poznenáhlu opouštěn a od octave verze 3.0 se už s ním nepočítá.

Než si funkční hodnoty nechat takto vypisovat, je názornější si je nechat vykreslit graficky ve 2D (dvojdimenzionálním) prostoru, ve kterém nejčastěji používáme kartézskou soustavu souřadnic, tvořenou dvěma souřadnicemi, kterým se nejčastěji říká:

  • nezávisle proměnná, x, argument, vodorovná souřadnice, abscisa
  • závisle proměnná, y, funkční hodnota, pořadnice, ordináta

Pro vykreslení 2D grafu potřebujeme zadat vektor vodorovných a odpovídajících svislých souřadnic (abscis a ordinát). Proto si nejdříve připravíme vektor např. 25 hodnot nezávislé proměnné:

>>  x=0:pi/12:2*pi

A pak již není problém si vykreslit nějakou funkci:

>> plot (x, sin(x))

Otevře se nám grafické okno, ve kterém se nám znázorní přiměřené souřadné osy a v nich požadovaný graf, spojující čarami zadané body.

Všimněme si reakce tohoto okna na pohyb myší: u levého spodního okraje se zobrazují souřadnice kursoru. Po kliknutí prostředním tlačítkem myši se bod i se souřadnicemi zanese do grafu. Není problém si velikost okna libovolně zvětšovat a zmenšovat, plocha grafu se vždy náležitě přizpůsobí. Popsané okno si vymažeme:

>> clf
hold on;  # před kreslením dalšího grafu podrží již nakreslené na plátně
hold off; # před kreslením dalšího grafu již předtím nakreslené smaže



Právě vykreslený obrázek si můžeme uložit do souboru. Např. příkazy:

print -dpng jmenosouboru.png;  #uloží obrázek do souboru ve formátu PNG
print -dsvg jmenosouboru.svg;  #uloží obrázek do souboru ve formátu SVG.

Přehled dostupných výstupních formátů a další argumenty získáme příkazem

help print

subplot

editovat

Funkce

subplot (rows, cols, index)

namaluje více grafů do jednoho obrázku. Např:

subplot (2, 1, 1)
fplot (@sin, [-10, 10]);
subplot (2, 1, 2)
fplot (@cos, [-10, 10]);
>>
>>

Historie příkazů a editace příkazového řádku

editovat

Šipkami nahoru a dolů si zobrazujeme dříve zadané příkazy, šipkami vlevo a vpravo pohybujeme kursorem a tak můžeme editovat dříve zadané příkazy. Tak si funkci sin přepíšeme třeba na cos, tan (to je zajímavý výsledek! Vysvětlete!), sec, csc aj. funkce. (Viz [http://www.gnu.org/software/octave/doc/interpreter/Trigonometry.html 18.3 Trigonometry)

Pokud máme raději úhlové stupně než radiány, není problém si to přepočítat:

>> plot (180*x/pi, cos(x))

Kupodivu funkci plot() stačí zadat i jen jeden vektor, a to vektor ordinát; vektor abscis si pak funkce plot() domyslí jakožto aritmetickou řadu, začínající číslem 1, s inkrementem 1.

Zkuste uhodnout, co bude výsledkem příkazu:

>> plot((1:10).^2)

Výraz 1:10 už známe, je to aritmetická posloupnost (rozsah) od 1 do 10 ve formě řádkového vektoru. Symbol ^ znamená mocninu, tedy mocníme na druhou. Druhá mocnina je jako násobek sebou samým. Tedy např.

y^2 = y*y

Co se ale stane, když je y řádkový vektor? Samozřejmě, že sybol * značí maticové násobení a to musí nutně skončit chybou, protože počet sloupců první matice se v tomto případě nerovná počtu řádků druhé. Proto musíme použít operaci, která se bude provádět element po elementu, tj. každý element vektoru se umocní na druhou. Takovou operaci "element po elementu" vyznačujeme tečkou, tedy .^. Tím pádem je nám už jasné, že ve výsledku dostaneme graf paraboly.

Na druhé straně můžeme jako argumenty funkce plot(x,y) zadat na prvním místě vektor x a na druhém matici y. Co se stane? Pokud počet prvků vektoru x bude stejný jako počet řádků matice y, pak se pod sebou budou vykreslovat sloupce matice (tj. zobrazí se tolik čar, kolik má matice sloupců, a každá jinou barvou). Pokud počet řádků nebude souhlasit, pokusí se funkce plot() mohutnost vektoru x srovnat s počtem sloupců a pak se budou vykreslovat jednotlivé řádky matice; pokud ale ani zde nedojde k souhlasu, dostaneme chybu. Zkusme si schválně dva jednoduché příklady:

>> d=[1,2,3,4;5,6,7,8;9,10,11,12]
d =

    1    2    3    4
    5    6    7    8
    9   10   11   12

>> plot(1:3,d)
>> plot(1:4,d)

Zapamatujeme si, že v tomto případě mohutnost vektoru udává pokaždé počet funkčních hodnot.

Možná, že srozumitelnější zde bude příklad:

>>  x=0:pi/12:2*pi;
>> plot(x,[sin(x);cos(x)];

V jednom společném souřadném systému budeme mít vykresleny grafy obou goniometrických funcí, každý jinou barvou.

Funguje to ale i naopak, když na první místo zadáme matici a na druhé vektor:

>> plot(d,1:3)
>> plot(d,1:4)

Funkce plot(x,y) opět zkusí srovnat počet řádků (tedy výšku) matice d s mohutností vektoru 1:3, což v prvním případě podaří, a tak se začnou vykreslovat ordináty, dané vektorem 1:3, ale pokaždé pro jinou množinu souřadnic na abscise, danou jednotlivými sloupci matice d. Ve druhém případě sice už mohutnost vektoru 1:4 s počtem řádků nesouhlasí, ale souhlasí s počtem sloupců; proto abscisy budou dány řádkovými vektory matice d.

Zapamatujeme si, že v tomto případě mohutnost vektoru udává pokaždé počet vykreslených čar.

Dále oba argumenty mohou být matice; v tom případě se postupně berou abscisy jako sloupcové vektory z první matice a ordináty jako sloupcové vektory z druhé matice; dimenze obou matic musí naprosto souhlasit, jinak nastane chyba ve výpočtu.

Pokud zadáme jen jeden argument jako matii plot(y), pak se ordináty budou brát postupně z po sobě následujících sloupců této matice a na místě abscis se bude předpokládat vektor 1:m, kde m je počet sloupců; je to tedy případ podobný případu, kdy na prvním místě je vektor a na druhém matice.

V nejjednoduším případě mohou být oba argumenty skaláry; v tom případě se vykreslí jen jeden odpovídající bod.

Alternativou je funkce fplot, které namísto souřadnic zadáme jen jméno funkce (za zavináčem) a pak rozsah nezávisle proměnných:

>> fplot (@sin, [-10, 10]);


>>