V tomto článku by som v krátkosti a ukážkovito vysvetlil, prečo je dobré sa nad grafmi, ktoré prikladáme do vedeckých prác (protokoly, zadania, články) zamyslieť a nie len tak šplechnúť nejaký printscreen.
Veľmi často sa stretávame s grafmi, v ktorých porovnávame odozvu systému s rôznymi regulátormi. Práve na tomto príklade som sa rozhodol demonštrovať dôležitosť formátovania grafov. Predpokladajme riadenie jednoduchého systému pomocou troch regulátorov a jednotlivé obvody máme implementované v Simulinku. Najlepšie čo môžeme urobiť aby ste videli, ako sa jednotlivé regulátory správajú, je všetky výstupné signály s referenčnou hodnotou pustiť do bloku Scope. Výsledok t.j. graf by vyzeral napríklad takto:
v tom lepšom prípade, študenti priložia do protokolu graf vľavo, bohužial stále je veľmi veľa študentov, ktorí "šplechnú" do zadania obrázok, ktorý sa nachádza vpravo. S týmito obrázkami (grafmi) sú dva podstatné problémy. Ten prvý, menej dôležitý je, že grafy z bloku Scope nie sú principiálne určené na publikovanie. Slúžia výlučne na "development", čiže pozrieť si pri vyrábaní a implementovaní algoritmov v Simulinku, ako sa dané signály vyvíjajú. Ten druhý, závažný, problém je, že čitateľ nemá šancu vedieť o čo sa jedná. Chýbajú popisky osí a legenda. Bez týchto dvoch parametrov je každý graf nekompletný a v prípade, že sa takýto graf nachádza v protokole, tak je každému jasné že študent svoju robotu odflákol.
Čiže, čo s tým? Vhodným spôsobom ako sa vyhnúť vkladaniu takýchto obrázkov do zadaní je použitie príkazov plot
a print
. Tomu však predchádza nastavenie v bloku Scope, ktoré uloží časové priebehy veličín do premennej, ktorú potom môžeme použiť pri vykresľovaní. Tento stav docielime tak, že v grafe vygenerovam pomocou bloku Scope klikneme na Parameters (ikona vedľa tlačiarne, viď obrázok vyššie) a zvolíme kartu History.
Na tejto karte odškrtneme "Limit data points to last", zaškrtneme "Save data to workspace", nastavíme meno premennej, u mňa to je "output" a zvolíme formát v akom budú údaju uložené. Ja osobne som zvyknutý používať typ "Array". Zmeny uložíme a môžeme sa presunúť do m-file, pomocou ktorého vykreslíme daný graf, ktorý bude vhodný na publikovanie.
Ak prvé je vhodné, začínať príkazmi clear
a close all
, ktoré vám upracú workspace a zavrú všetky už otvorené grafy. Následne potrebujete zadefinovať všetky potrebné konštanty aby Simulinková schéma mohla zbehnúť. Potom pomocou príkazu sim
odsimulujete danú schému.
%% init
clear, close all
%% constants
% here comes constants for simulink blocks
%% simulate
sim('controllers', 10)
Keďže sme nastavili do Scope, aby sa do premennej "output" uložili jednotlivé priebehy, tak po odsimulovaní možeme vykresliť graf. Premenná "output" obsahuje po stĺpcoch jednotlivé priebehy, pričom prvý stĺpec je vždy časový vektor. Z hľadiska prehľadnosti kódu odporúčam si z premennej "output" najprv priradiť jednotlivé stĺpce do premenných, tak aby sme vedeli ktorý stĺpec prislúha ku ktorému priebehu. Čiže nejak takto:
%% plot data
time = output(:, 1);
ref = output(:, 2);
y1 = output(:, 3);
y2 = output(:, 4);
y3 = output(:, 5);
Následne, môžeme vykresliť graf. Pri vykresľovaní grafu si treba dať pozor na niekoľko základných princípov. Ako prvé si treba uvedomiť, ktorá krivka je najdôležitejšia. Inými slovami, ktorá je tá čiara, ktorú chceme aby si čitateľ ihned všimol a uvedomil si, že čo znamená. Túto krivku potom vykresľujeme ako poslednú a výraznou farbou, čiže obyvkle volíme červenú alebo magentu (fialová po slovensky?). V našom prípade, výraznou farbou označím ten priebeh, ktorý najrýchlejšie konverguje k žiadanej hodnote. (Pozor, ak bude vašou úlohou prdviesť negatívne vlastnosti zlého regulátora, potom výraznou farbou označíte ten.) Potom si treba uvedomiť, ktorá krivka je najmenej dôležitá. V našom prípade to je žiadaná hodnota, pretože tá len indikuje kde sa má výstup procesu ustáliť, sama o sebe potrebná nie je. Zvyšné farby zvolím tak aby boli viditeľné, ale aby neprebili najdoležitejšiu krivku. Vykreslenie by teda pomocou m-file mohlo vyzerať takto:
figure
hold on
plot(time, ref, 'g');
plot(time, y1, 'b')
plot(time, y2, 'k')
plot(time, y3, 'r')
grid on
legend('ref', 'PID 1', 'PID 2', 'PID 3', 'location', 'SouthEast')
xlabel('Time [s]')
ylabel('Height [m]')
Výsledný graf potom bude vyzerať nasledovne:
takýto graf je potom súci na publikovanie. Prv než ale tento graf použijeme v nejakom textovom editore, tak je ho potrebné uložiť. V prípade, že používať na prípravu protokolov MS Word alebo OpenOffice pod operačným systémom Windows, odporúčam obrázky ukladať ako png súbory a to pomocou nasledovného príkazu, ktorý treba napísať hneď za vykreslením obrázka so všetkými popiskami:
print(gcf, '-dpng', 'nice_figure')
tento príkaz uloží graf ako png súbor do pracovného priečinka a potom už len pomocou Drag&Drop natiahneme obrázok do Wordu. V prípade, že pracujete pod Linuxom, alebo pužívate LaTeX na prípravu zadaní alebo iných publikácii, tak odporúčam používať vektorý formát a to:
print(gcf, '-depsc2', 'nice_figure')
Dúfam, že odteraz už neuvidím v protokoloch kockaté JPEG obrázky s "facebook"-ovým pozadím alebo telefónom odfotený priebeh so Simulinku...