Interní rozvojová soutěž (IRS 2017) - Octave

Octave

Octave je velmi rozsáhlý nástroj na práci s daty, který ocení každý uživatel, který potřebuje pracovat s objemnými datovými soubory o velikosti až řádově ve stovkách MB s někilika miliony body. Jedná se o volně přístupnou alternativu ke všeobecně známému MatLABu, do které rovněž existuje nespočet různých balíčků s rozšířeními. Již základní verze ovšem umožňuje vše potřebné pro základní práci s daty, jako je přepočet pomocí kalibračních konstant, filtrace, změna oddělovače sloupců a mnoho dalšího.

V rámci tohoto manuálu budou představeny pouze základy, které slouží ke zpracování signálu, neboť podrobný manuál na Octave se všemi jeho funkcemi by zabral pravděpodobně hned několik knih běžné velikosti. Cílem manuálu je seznámit uživatele s přípravou  a zpracováním experimentálních dat pro následné vykreslení v gnuplotu a publikování.

Jedná se o volně dostupný software, který lze stáhnout z domovské stránky: https://www.gnu.org/software/octave/

1.     Základní operace s Octave

Octave lze spustit dvěma odlišnými způsoby. Dřive bylo běžné s Octave pracovat bez grafického rozhraní v terminálovém okně, které lze spustit pomocí Octave (CLI). Dnes již pravděpodobně převládá využívání grafického rozhraní, kterému se věnuje i tato kapitola. Ke spuštění grafického rozhraní slouží Octave (GUI). 

1.1.     Rozložení pracovního okna

V grafickém rozhraní je okno Octave rozděleno do pěti částí, které si uživatel může velikostí i pozicí přizpůsobit podle vlastních potřeb (případně některou část skrýt). Následující obrázek tedy přináší představu o tom, jak pracovní okno v grafickém rozhraní může vypadat, a jaké funkce jednotlivé části plní.

V průzkumníku souborů lze vyhledávat, otevírat a celkově spravovat soubory uložené na disku. Pracovní plocha ukazuje seznam všech vygenerovaných matic a jejich parametry. Nejdůležitějším oknem je editor, kde probíhá psaní samotného skriptu, jeho úpravy i jeho spuštění. Pro práci s jednotlivými příkazy slouží příkazové okno, kam lze kopírovat/ psát samostatné části skriptu, a tím je zkoušet nebo spouštět skript po menších částech. Dále pomocí hesla „help save“ lze vyvolávat nápovědu např. pro uložení a jakékoliv další příkazy nahrazením save za hledaný příkaz. Pro zobrazení historie spuštěných příkazů slouží okno historie.

1.2.     Spuštění a uložení skriptu

K uložení v průběhu práce slouží ikona zvýrazněná na následujícím obrázku. Skripty Octave jsou ukládány s příponou .m. Spuštění skriptu lze pak provést druhou zvýrazněnou ikonou, nebo nakopírováním části skriptu do příkazového okna.

1.3.     Otevření uloženého skriptu

V případě, že máme již skript napsaný, lze postupem uvedeným na následujících obrázcích otevřít. Nejprve je potřeba zadat cestu do složky obsahující skript a následně dvojklikem v levém okně otevřít. K potvrzení slouží tlačítko "vybrat", po jehož použití se v průzkumníku souborů objeví všechny podsložky a skripty ve vybrané složce. 

 

Poté již stačí pouze zvolit skript a dvojklikem ho otevřít, což se projeví jeho zobrazeném v editoru. 

true

2.    Načtení datového souboru

Do Octave lze načítat data uložená v mnoha různých formátech včerně binárních souborů nebo i obrázků. K načtení běžného datového souboru slouží funkce dlmread a load, které lze dále upřesnit řadou příkazů uvedených níže. 

Příklad:

X = dlmread ('XXX.csv', " ", [0, 0, 50000, 2]);

Pojmenování matice = načteného souboru.

  • X =

Funkce pro načtení datového souboru:

  • dlmread()

Název datového souboru pod kterým je uložen na disku:

  • 'XXX.csv'

Oddělovač sloupců, který je v načítaném souboru použit (mezera):

  •  " "

Hranice dat, která se ze souboru načítají. Počáteční řádek, sloupec, koncový řádek, sloupec. Konkrétně budou načteny dva sloupce a v každém z nich 50 000 řádků.

  • [0, 0, 50000, 2]

Příklad:

CH1 = load('Rana1_CH1.csv');

Pojmenování nahrané matice (např. CH1 jako channel 1 pro první ránu experimentu):

  • CH1 = 

Funkce pro nahrání datového souboru:

  • load()

Název datového souboru na disku:

  • "Rana1_CH1.csv"

 

2.1.     Rozdělení do jednotlivých sloupců

V prvním kroku byl načtený datový soubor a uložen jako matice X. Protože jde často potřeba pracovat s jednotlivými sloupci samostatně (např. převod na jiné jednotky, násobení každého kanálu kalibrační konstantou příslušného čidla), lze matici X rozdělit pomocí následujícím postupem do jednotlivých sloupců.

Příklad:

Time = X (:,1);

ch1 = X(:,2);

Jako první sloupec při experimentech bývá nejčastěji ukládán čas. Matici pouze s časem o rozměru (počet řádku x 1) tedy získáme načtením pouze prvního sloupce z matice X. Za předpokladu, že matici X jsme získali načtením datového souboru o více kanálech (sloupcích).

Pojmenování nově tvořené matice jako „Time“:

  • Time =

Název matice, ze které jsou načítány hodnoty a volba počtu řádků a sloupců, které mají být do nové matice uloženy:

  • X(:,1);
  • : – Všechny řádky
  • 1 – Volba sloupce
true

3.     Základní operace s daty

V této kapitile bude ukázáno, jakým způsobem se dají dělat jednoduché matematické operace jako je sčítání a odčítání matic nebo konstanty od matice. Zde bude tedy i ukázáno, jakým způsobem lze přepočíst jednotky v každém sloupci pomocí jiné kalibrační konstanty nebo změnit jednotku. 

3.1.     Základní matematické operace

Obecně je nutné u jakékoliv matematické operace s maticemi dávat pozor na správný rozměr matic. Například sčítání a odčítání tedy vyžaduje stejné rozměry obou matic:

  • x + y

odčítání hodnoty od matice:

  • x – y

násobení matic x a y:

  • x * y

dělení matice x maticí y

  • x / y

negace

  •  -x

odmocnina z matice y

  • x=sqrt(y)

 

Příklad:

X = dlmread("matice1.csv",";");
Y = dlmread("matice2.csv",";");

Z = X + Y;

Nejprve jsou jako matice X a Y načteny matice 1 a 2 ze souborů na disku. Následně jsou sečteny. Octave tedy provede operaci znázorněnou v následující tabulce.

Matice 1   Matice 2   Výsledek
1 1 1 + 2 2 2 = 3 3 3
2 2 2 2 2 2 4 4 4
3 3 3 2 2 2 5 5 5

Pro vyzkoušení základních matematických operací s malými a jednoduchými maticemi lze stáhnout výchozí .csv soubory zde: matice1 a matice2.

 

3.2.     Matematické operace prvek po prvku (tečkové)

Často je místo klasické matematické operace s maticemi potřeba pracovat s jednotlivými prvky matice a k nim přičíst, odečíst konstantu nebo vynásobit prvek po prvku. K tomu slouží tečkové operace, které se od běžných matematických operací při psaní skriptu liší pouze dopsáním tečky za název první z matic.

násobení prvek po prvku. Např. pro (1 2 3).*(4 5 6) vypadá násobení (1*4  2*5  3*6):

  • x.* y

dělení prvek po prvku

  • x./y

odečítání hodnoty od matice

  • x. – y

 umocnění prvek po prvku

  • x.^y

Příklad násobení matice konstantou nejprve je nutné určit hodnotu konstanty, poté lze jednoduše vynásobit zvolenou matici konstantou napsáním hvězdičky jako matematického operátoru pro násobení mezi názvy násobené matice a konstanty. Následující příklad uvádí přepočet experimentálních dat z elektrického signálu pomocí kalibrační konstanty čidla na přetlak.

Příklad:

k_ch1 = 13.54;

ch1p=ch1.*k_ch1;

Název konstanty:

  • k_ch1

Hodnota konstanty:

  • = 13.54

název (např. kanál 1 přepočtený na tlak):

  • ch1p

násobíme matici ch1. Tečka je funkce k násobení prvku prvkem. Jinak by došlo ke standardnímu násobení matic, což by změnilo rozměr matice.

  • ch1.*

konstanta, kterou je matice násobena

  • k_ch1

 

3.3.     Cyklická funkce for

V případě, kdy je potřeba stejnou funkci provést několikrát pro různá data, lze využít cyklické funkce pomocí příkazu for. Po otevření smyčny příkazem for a zadáním rozsahu čísel, pro které bude smyčka platit, je potřeba smyčku uzavřít příkazem end.

Příklad:

for i=1:5

x(i)=10*i;

end

Pro čísla 1, 2, 3, 4 a 5 je zadáno násobení deseti. Výsledná matice x bude mít tím pádem hodnoty prvků 10, 20, 30, 40 a 50.

 

3.4.     Podmínka if

Pomocí podmínky if lze do skriptu zahrnout podmínku. Pokud je hodnota některé matice jakkoliv podmíněna hodnotou jiné matice nebo logickou funkcí (větší, menší, rovno, atd.), pak lze pormínku napsat podle uvedeného příkladu.

Příklad:

if x>y

z=10;

else

z=5;

end

Pokud je hodnota x větší než hodnota y, pak se z rovná 10. V opačném případě se z rovná 5.

true

4.     Pokročilé matematické operace

4.1.     Numerická integrace dat

Pro numerickou integraci je v Octave předepsaná funkce cumtrapz. Máme-li naměřený signál ch1p v závislosti na čase Time, který chceme integrovat, funkce cumtrapz řádek po řádku zintegruje data a uloží do nové matice.

Příklad:

i1 = cumtrapz(Time,ch1p);

pojmenování matice se zintegroavnými daty:

  • i1

funkce numerické integrace:

  • cumtrapz

určení dat k integraci (závislost prvního kanálu ch1p na čase):

  • (Time, ch1p)

 

4.2.     Proložení experimentálních dat

4.2.1.  Lineární a polynomické funkce

V Octave lze k lineárnímu a polynomickému prokládání dat využívat stejných funkcí, jak bude níže ukázáno. 

Funkce na proložení dat. K proložení jsou použity hodnoty vzdálenosti v závislosti na čase. Hodnoty jsou proloženy polynomem druhého řádu. Pro lineární proložení lze použít "1". Nahrazením za vyšší čísla bychom pak prokládali  polynom em třetího a dalších řádů.

  • p = polyfit (Time, Distance, 2);

Funkce k vygenerogání bodů na proložení. Pro každou hodnotu v matici "Time" je podle matice "p" a tím proložení z předchozího kroku vygenerovaná hodnota y.

  • fit = polyval(p, Time);

Příkaz k vykreslení grafu o dvou křivkách. První křivkou jsou experimentální body a druhou křivku tvoří křivka k jejich proložení.

  • plot (Time,Distance,".", Time, fit);

Funkce k zobrazení rovnice křivky proložení:

  • polyout(p, 'x');

Příkazy k výpočtu regresního koeficientu R2:

  • R = corr (Time, Distance);
  • R2 = R^2

Lineární fit za použití výše uvedeného postupu. 

Proložení bodů polynomem třetího řádu.

 

true

5.    Export souboru

Octave uchovává veškeré výpočty a vytvořené matice v mezipaměti a dokud nedostane příkaz k jejich uložení na disk, nebudeme tedy moci s upravenými daty pracovat dále v jiných programech (např. kreslení grafu v gnuplotu). Před uložením dat je nejprve potřeba definovat matici, která bude uložena a její formu, jak bude ukázáno na příkladu níže.

Příklad:

ulozit = [Time ch1p ch2p ch3p ch4p];

save -ascii "rana1.txt" ulozit;

Vytvoření matice k následnému uložení:

  • ulozit = [Time ch1p ch2p ch3p ch4p]

Uložení matice jako textový soubor v ascii formátu bez hlavičky:

  • save -ascii

Pojmenování uloženého souboru:

  • "rana1.txt"

Volba matice pro uložení:

  • ulozit;

Vytvoření matice pojmenované jako "ulozit", jenž bude uložena jako "rana1.txt".  V maticích ch1p, ch2p atd. byly sloupce přepočtených dat na požadované jednotky, přepočteny podle kalibrace čidel. Výsledná matice "ulozit"  bude mít tedy 5 sloupců oddělených mezerou, kde první sloupec odpovídá času a zbylé čtyři jednotlivým kanálům. 

true

6.     Vykreslení grafu

V octave lze rovněž připravená data vykreslit do grafu, nebo graf použít k odčítání hodnot. Octave ovšem není plně grafický program, proto přípravu pokročilých grafů s přizpůsobením vzhledu bude ve finále lepší přenechat do gnuplotu a data pro něj v Octave zpracovat. 

Příklad:

plot(Time(1:A:end,1),ch1p(1:A:end,2).-10, ";PCB;"

Popisky os v grafu:

  • xlabel ('Time [ms] ');
  • ylabel ('Pressure [kPa] ');

Zapnutí mřížky v grafu:

  • grid on;

Definování faktoru decimace. Při jeho použití bude vykreslen každý 10. bod:

  • A=10;

Příkaz ke kreslení grafu:

  • plot

Matice, ze které se data osy x berou (od 1 řádku, každý několikátý podle A, do konce sloupce, ze sloupce 1 v matici)

  • (Time(1:A:end,1)

Hodnota y z matice ch1p (od 1 do konce každý několikátý dle A, ze sloupce 2 v matici ch1p)

  • ch1p(1:A:end,2)

Posun křivky po ose y o 10.

  • -10

Pojmenování křivky

  • ";PCB;"
true
Obrázek uživatele Ing. Jindřich Kučera,

Ing.
Jindřich
Kučera


Fakulta chemicko-technologická

jindrich.kucera@student.upce.cz
Obrázek uživatele doc. Ing. Jiří Pachman, Ph.D.

doc. Ing.
Jiří
Pachman
,
Ph.D.


Fakulta chemicko-technologická

jiri.pachman@upce.cz
466 038 099

MSc.
Aline
Cardoso Anastácio


Fakulta chemicko-technologická

aline.cardoso.anastacio@student.upce.cz