Documente Academic
Documente Profesional
Documente Cultură
GNU Octave i MATLAB sunt limbaje de programare de nivel nalt, destinate cu precdere
calculelor numerice tiinifice i inginereti. Cele dou limbaje sunt cvasi-compatibile. n
acest paragraf vor fi semnalate diferenele dintre cele dou limbaje, ns n continuare, vor fi
utilizate doar comenzile comune ambelor limbaje.
Un program (script) care execut o serie de instruciuni sau o funcie creat de ctre utilizator
este salvat() cu extensia .m att n MATLAB, ct i n GNU Octave. Fiierele *.m sunt fiiere
ASCII, n consecin sunt editabile i n afara MATLAB/GNU Octave, cu orice editor simplu
de text, de exemplu cu Notepad.
1
familii/colecii de aplicaii cu funcii built-in specializate
114 Staii de pompare i Reele hidraulice cu GNU Octave
este GNU Octave 3.6.4 (din mai 2013). n prezenta lucrare, exemplificrile sunt realizate cu
versiunea GNU Octave 3.6.1 (din martie 2012; Copyright 2012, John W. Eaton et al.),
instalat sub Windows 7, 64-bit.
Pentru a instala n mod corect sub Windows GNU Octave cu toate pachetele necesare, se
recomand studierea informaiilor din pagina web http://wiki.octave.org/Octave_for_Windows
GNU Octave 3.6.4 compilat pentru Windows poate fi descrcat de la Octave Forge Project:
http://sourceforge.net/projects/octave/files/Octave%20Windows%20binaries/
Pn n prezent, marele dezavantaj al software-ului GNU Octave a fost lipsa interfeei grafice
(Graphical User Interface GUI). ncepnd cu GNU Octave 3.8.1, acest inconvenient pare s
dispar, deoarece ultima versiune lansat n martie 2014 are o interfa grafic (GUI) care
poate fi lansat ca opiune. ncepnd cu seriile GNU Octave 4.0.x, interfaa grafic va fi
setat implicit (by default) n acest software.
n versiunile GNU Octave 3.6.x i anterioare, lipsite de GUI, utilizatorul lucreaz direct n
fereastra de comand. n fereastra de comand nu funcioneaz operaii de tip copy/paste
aferente textelor/datelor. Exist un istoric al comenzilor i orice comand poate fi reapelat cu
ajutorul cursorului . Pentru editarea programelor i funciilor, poate fi apelat n linia de
comand un editor de texte, cu comanda edit. Dac pe computer este instalat Notepad++
(recomandat), atunci comanda edit lanseaz direct Notepad++.
2
Simulink reprezint un pachet de programe integrat n MATLAB, care permite modelarea/simularea
sistemelor dinamice (liniare i neliniare). n interfaa grafic din Simulink, blocurile disponibile sau
seturile de blocuri pot fi plasate i interconectate foarte uor.
Capitolul 2. Introducere n GNU Octave 115
MATLAB are o interfa grafic (GUI) foarte prietenoas. Spre deosebire de GNU Octave, n
fereastra de comand din MATLAB funcioneaz operaii de tip copy/paste aferente textelor i
datelor. Editorul de text pentru programe i funcii scrise de ctre utilizator este ncorporat n
GUI. Exist un istoric al comenzilor; o comand poate fi reapelat cu cursorul (ca i n GNU
Octave). Toolbox-ul de grafic al MATLAB este foarte bine dezvoltat i permite personalizarea
graficelor ntr-o gam mult mai larg dect o permit comenzile specifice de grafic 2D i 3D,
cu opiunile ataate acestora (comenzi ce pot fi utilizate n general i n GNU Octave). O
caracteristic foarte important, care distinge MATLAB de Octave, este aceea c MATLAB
accept variabile i calcule simbolice. Marele dezavantaj al software-ului MATLAB este
preul de cost al licenei i necesarul de resurse hardware pentru instalare i rulare.
n general, n GNU Octave sunt implementate majoritatea funciilor de tip built-in3 care se
regsesc n modulul de baz MATLAB. ns, deoarece Octave este un proiect comunitar,
toolbox-urile (pachetele) sale sunt donate de ctre cei interesai de ele prin intermediul Octave
Forge; ca urmare, doar cteva dintre funciile de tip built-in din toolbox-urile din MATLAB se
regsesc i n toolbox-urile din Octave.
Limbajul Octave are cteva capabiliti i elemente unice, care nu se regsesc n limbajul
MATLAB. n general, fiecare element unic este dublat n Octave de elementul corespunztor
utilizat n MATLAB. n tabelul 2.1 sunt incluse strict capabilitile i elementele unice pe care
le considerm relevante pentru cititorii prezentei cri. Pentru a putea rula n oricare dintre cele
dou software-uri programe i funcii *.m definite de ctre utilizator, trebuie evitat utilizarea
elementelor unice, specifice limbajului Octave. Recomandm deci cititorilor s utilizeze
sintaxa comun celor dou limbaje de programare.
Tabelul 2.1. Selecie de capabiliti i elemente unice din limbajul Octave, care nu se regsesc n
MATLAB [http://wiki.octave.org/FAQ#Why_.22Octave.22.3F], alturi de elementele comune celor
dou limbaje de programare
Capabiliti/
Capabiliti/ elemente Observaii
Semnificaie elemente unice din
comune cu MATLAB (dac este cazul)
GNU Octave
funcie definit de ctre se editeaz funcia se scrie funcia n
utilizator (bloc de direct n linia de editorul de text i se
comenzi de tip function) comand salveaz *.m
3
Funciile built-in sunt ncorporate n software-urile GNU Octave i MATLAB i sunt, de regul, scrise
n C++, C sau Fortran; sunt fiiere de tip .m i sunt apelabile fr extensia .m
116 Staii de pompare i Reele hidraulice cu GNU Octave
n continuare, sunt prezentate mai nti cteva noiuni de baz din GNU Octave i MATLAB,
destinate celor care nu sunt familiarizai cu aceste software-uri. Apoi, sunt prezentate script-uri
(programe de calcul) i funcii scrise de ctre utilizator, cteva comenzi i funcii de tip built-in
(funcii implementate n software), urmate de structurile de control. n ceea ce privete
comenzile i funciile built-in prezentate, le-am selectat doar pe cele pe care le considerm
relevante/utile pentru calcule numerice n domeniul Staiilor de pompare i Reelelor
hidraulice.
n cele ce urmeaz vor fi prezentate succint cteva noiuni de baz comune ambelor limbaje
de programare i software-uri.
Fiierele de tip *.m create de ctre utilizator (script-uri sau funcii definite de utilizator)
trebuie s se gseasc ntr-un folder definit printr-o cale (cu comanda path sau cu comanda cd
care nseamn schimbarea directorului curent de lucru). Implicit, software-ul caut fiierele
*.m n folder-ul bin (de exemplu, n C:\Octave\Octave3.6.1_gcc4.6.2\bin sau n C:\Program
Files\ MATLAB\R2012a\bin). Pentru ambele software-uri, nu se recomand ncrcarea folder-
ului bin cu fiierele utilizatorului, ci includerea acestora ntr-un director al utilizatorului
(denumit, de exemplu nume_folder), aflat pe calea C:\Users\nume_user\nume_folder (pentru
acest folder se poate pune un shortcut pe Desktop).
Nu sunt necesare declaraii legate de tipul i dimensiunea variabilelor (la introducerea
datelor, GNU Octave i MATLAB recunosc tipul de variabil i aloc automat memorie).
Literele mici i majusculele (exemplu, a i A) au semnificaii diferite, deci pot desemna
dou variabile diferite.
Nu se atribuie variabilelor, script-urilor i funciilor definite de ctre utilizator cuvinte
rezervate (este o regul de baz n programare). Dintre cuvintele rezervate amintim: break,
continue, if, else, end, for, while, switch, function, global, cos, sin, log, ... La cuvintele
rezervate clasice din programare, se adaug i funciile de tip built-in specifice software-urilor.
4
Referine bibliografice n ordine cronologic: [39], [23], [3]
118 Staii de pompare i Reele hidraulice cu GNU Octave
Comanda help urmat de nume, adic help nume returneaz indicaii despre nume, unde
nume poate fi o comand, o funcie, un cuvnt rezervat etc.
Afiarea datelor se face de regul n format tiinific; de exemplu, 1.576e-3 nseamn
5
nchiderea de la simbolul (close) conduce la un mesaj de eroare privitor la nchiderea programului
Capitolul 2. Introducere n GNU Octave 119
trec, de exemplu, pe coloana 1 valorile unui vector L care reprezint lungimi (de exemplu, cu
2000 de valori) i se trec pe coloana 2 valorile unui alt vector care reprezint temperaturi T (de
asemenea, cu 2000 de valori); pe fiecare rnd al matricei rezultate, valorile sunt separate
printr-un Tab sau printr-un spaiu. Pentru a importa matricea de dimensiuni 20002 n
programul curent din GNU Octave sau MATLAB, respectiv pentru a citi datele din matrice i a
le atribui variabilelor din program, se scriu urmtoarele linii de comand:
load valori_masurate % importa fisierul valori_masurate
L = valori_masurate(:,1); % citeste si atribuie variabilei L valorile din toata coloana 1
T = valori_masurate(:,2); % citeste si atribuie variabilei T valorile din toata coloana 2
unde caracterul : (dou puncte) are semnificaia "toate liniile".
Comanda diary urmat de nume, adic diary nume salveaz toate secvenele de lucru
(instruciuni, date de intrare, rezultate calculate, exceptnd graficele) ntr-un fiier de tip text,
denumit automat nume.txt iar diary off nchide sesiunea de salvare (deci nchide fiierul
nume.txt); fiierul nume.txt poate fi redeschis cu comanda diary on
Comanda save, de exemplu save -ascii nume v1 v2 salveaz n fiierul nume, n format
text (ASCII), variabilele v1 i v2; vezi help save
save -ascii nume a b* salveaz n fiierul nume, n format text (ASCII), att variabila a, ct i
toate variabilele care ncep cu litera b
Formatul datelor
Comanda format [options] stabilete formatul datelor de ieire din punct de vedere al
numrului de zecimale afiate, n funcie de opiunea precizat (vezi help format); comanda
format fr opiune restabilete modul implicit de ieire a datelor, anume format short
Datele pot fi afiate pe ecran cu 5 digii (4 cifre semnificative dup virgul) utiliznd comanda
format short sau cu 15 digii n dubl precizie (14 cifre semnificative dup virgul) utiliznd
120 Staii de pompare i Reele hidraulice cu GNU Octave
comanda format long sau cu doar 2 cifre semnificative dup virgul (format bancar) utiliznd
comanda format bank
Constanta Descriere
pi 3.141592653589793
i
ambele desemneaz 1 , coeficientul prii imaginare a unui numr complex
j
inf
ambele reprezint infinit; exemple: 1 0 inf sau 1 0 inf
Inf
reprezint nedeterminare (Not A Number); exemple de neterminri ce returneaz NaN:
NaN
0/0, inf/inf, 0*inf
realmin = 2.225073858507201e-308 (adic 2.225 10308 ): cel mai mic numr pozitiv utilizabil
n calcule (n virgul mobil i dubl precizie)
realmax = 1.797693134862316e+308 (adic 1.797 10308 ): cel mai mare numr pozitiv
utilizabil n calcule (n virgul mobil i dubl precizie)
eps = 2.220446049250313e-16 (adic 2.22 1016 ) n dubl precizie. Se recomand
eps utilizarea sa atunci cnd n timpul executrii unor calcule se dorete evitarea unei
mpriri cu zero. Exemplu: cnd x 0, n loc de 1/x se va scrie 1/(x+eps)
Variabila
Descriere
special
nume de variabil atribuit unui rezultat, dac acesta nu a fost iniial atribuit unei alte
ans
variabile. Exemplu: 2+3, returneaz ans = 5
nargin numrul de argumente de intrare ale unei funcii
nargout numrul de argumente de ieire ale unei funcii
Operatori
Pe lng operatorii aritmetici obinuii (+, , *, / ) i ^ pentru ridicarea la putere, amintim
operatorii utilizai n rezolvarea sistemelor de ecuaii liniare, anume \ (backslash), pentru
sisteme de forma A X B , respectiv / (slash) pentru sisteme de forma X A B . La acetia
se adaug operatorii element-cu-element, definii cu punct plasat nainte de operatorii
aritmetici obinuii, rezultnd .* sau ./ sau .^ care permit, dup caz, efectuarea de operaii
element-cu-element de nmulire sau mprire sau ridicare la putere.
Capitolul 2. Introducere n GNU Octave 121
vector_linie = [b1, b2, b3, ...] sunt delimitate ntre ele prin spaiu, Tab sau virgul.
Exemple: v = [1, sqrt(9), 5+i] sau v = [1 sqrt(9) 5+i]
Construiete vectorul v, prin concatenarea vectorilor v1, v2, v3,...
v = [v1 v2 v3 ...] Exemplu: fie v1 = [1, 1, 5+i] i v2 = [-7 sqrt(9)]
v3 = [v2 v1 87] returneaz vectorul linie v3 = -7 3 1 1 5+i 87
Reprezint transpunerea unui vector. Dac v este vector linie,
v' atunci v' este un vector coloan i invers. Dac vectorul linie
sau conine numere complexe, prin transpunerea cu v' vor fi afiate
transpose(v) conjugatele acestora; transpose(v) este echivalent cu v' cu
deosebirea c la transpunere nu conjug elementele complexe
Creeaz un vector coloan care conine valorile sau variabilele b1,
b2, b3, ... (sau combinaii ntre valori i variabile). Valorile/
vector_col = [b1; b2; b3;...] variabilele sunt delimitate ntre ele prin punct-i-virgul sau prin
sau transpunere dintr-un vector linie folosind caracterul ' (apostrof).
vector_col = [b1 b2 b3 ...]' Exemple: v1 = [-3; 5; 2^5] i v1 = [-3 5 2^5]' sunt vectori coloan;
3
v2 = [log10(1000); log10(10)] returneaz vectorul coloan v2 =
1
Genereaz o mulime/serie numeric, ntre valoarea iniial
vector = val_in:pas:val_fin specificat val_in i valoarea final val_fin, cu pasul specificat:
sau pas. n cazul n care nu se specific pasul, atunci implicit, pas = 1.
vector = val_in:val_fin Exemple: v1 = 1:2:10 returneaz v1 = 1 3 5 7 9
v2 = 1:10 returneaz v2 = 1 2 3 4 5 6 7 8 9 10
Genereaz o mulime/serie numeric liniar de tip vector linie,
ntre valoarea iniial specificat val_in i valoarea final val_fin,
cu (n-1) subintervale egale, deci vectorul va avea n termeni. Dac
v = linspace(val_in, val_fin, n) nu se specific n, atunci vectorul e generat cu 100 de termeni (99
sau de subintervale egale). Dac val_in > val_fin, termenii vor fi
v = linspace(val_in, val_fin) generai n ordine descresctoare.
Exemple:
v1 = linspace(0,10,5) returneaz 5 valori v1 = 0 2.5 5 7.5 10
v2 = linspace(12,2,5) returneaz v2 = 12 9.5 7 4.5 2
Genereaz o mulime/serie numeric logaritmic de tip vector
linie, cu n termeni, ntre 10jos i 10sus. Dac nu se specific n,
v = logspace(jos, sus, n) atunci vectorul este generat cu 50 de termeni. Exemplu:
v = logspace(0,3,4) returneaz v = 1 10 100 1000 (unde valoarea
iniial este 100 = 1 i cea final este 103 = 1000)
Definete o matrice M cu n linii m coloane care conine
elementele aij cu i = 1,2,,n i j = 1,2,,m. Pe o linie, elementele
sunt desprite prin spaiu, Tab sau virgul, iar liniile sunt
M = [a11 a12 ... a1m; a21 a22 ... delimitate ntre ele prin punct-i-virgul. Exemplu:
a2m; ...; an1 an2 ... anm] 1 2 3
M = [1 2 3; 4 5 6; 7 8 9] returneaz matricea M = 4 5 6
7 8 9
M = [v_col1 v_col2 v_col3 ...] Construiete matricea M, prin concatenarea (alturarea) unor
124 Staii de pompare i Reele hidraulice cu GNU Octave
sau vectori coloan numii v_col1 v_col2 v_col3 ... (toi de aceeai
M = [v_lin1; v_lin2; v_lin3; ...] dimensiune), sau prin concatenarea unor vectori linie numii
v_lin1, v_lin2, v_lin3, ... (toi de aceeai dimensiune)
M = [M1 M2 M3 ...]
Construiete o matrice M prin concatenarea mai multor matrice
sau
numite M1, M2, M3, ...
M = [M1; M2; M3; ...]
eye(n) eye(n) returneaz matricea identitate de dimensiuni nn (avnd 1
sau pe diagonala principal i n rest elemente egale cu 0).
eye(n,m) eye(n,m) returneaz matricea identitate de dimensiuni nm
Returneaz matricea zero de dimensiuni nn, respectiv nm
zeros(n) (avnd toate elementele egale cu 0)
sau Pentru a crea un vector linie cu m elemente nule se scrie:
zeros(n,m) zeros(1,m) Pentru a crea un vector coloan cu n elemente nule
se scrie: zeros(n,1)
Returneaz matricea unitate de dimensiuni nn, respectiv nm
ones(n) (avnd toate elementele egale cu 1)
sau Pentru a crea un vector linie cu m elemente egale cu 1 se scrie:
ones(n,m) ones(1,m) Pentru a crea un vector coloan cu n elemente egale
cu 1 se scrie: ones(n,1)
length(v) Returneaz lungimea vectorului v (numrul n de elemente din v)
Returneaz ans = 20 (sunt 20 de elemente n irul generat cu pas
length([1:20])
egal cu 1, de la 1 la 20)
size(A) Returneaz numrul n linii i numrul m de coloane al matricei A
de dimensiuni nm
size(A,1) Returneaz numrul n de linii al matricei A de dimensiuni nm
size(A,2) Returneaz numrul m de coloane al matricei A
size([ 1 2 3; 4 5 6]) Returneaz ans = 2 3 (adic 2 linii i 3 coloane)
Definete irul de caractere textul meu (care se insereaz ntre
string = 'textul meu'
apostroafe)
Sunt 7 moduri n care utilizatorul poate scrie script-uri i funcii [3; pagina 167], anume:
tastnd funcia direct n linia de comand operaie permis doar n GNU Octave, deci
inaplicabil n MATLAB;
tastnd funcia ntr-un editor de text i salvnd-o ntr-un fiier de tip *.m (function file), de
exemplu ca nume_functie.m; apelarea acestei funcii n linia de comand sau ntr-un script se
face fr extensia .m, ca n cazul oricrei funcii de tip built-in;
6
Referine bibliografice n ordine cronologic: [39], [23], [3]
Capitolul 2. Introducere n GNU Octave 125
tastnd un numr de comenzi ntr-un editor de text i salvnd fiierul de tip *.m (script file),
de exemplu ca nume_cod.m; apelarea acestui script n linia de comand se face fr extensia
.m; un script poate conine (aproape) orice secven de comenzi; spre deosebire de function
file, un script nu are voie s fie nceput cu cuvntul rezervat function; un script difer de
function file i prin faptul c variabilele numite n script nu sunt variabile locale;
insernd subfuncii ntr-o funcie de tip function file (n function file pot fi inserate alte
funcii, secundare, care pot fi executate numai n interiorul funciei primare care le conine;
aceste funcii secundare nu pot fi apelate din exterior, din afara funciei primare ce le conine);
insernd multiple funcii ntr-un script; dup cum s-a precizat anterior, un script nu are voie
s fie nceput cu function; dac ntr-un script dorim s includem o funcie chiar de la nceput,
atunci obligatoriu nainte de prima inserare a function file n corpul unui script, trebuie scris
minim o instruciune, de exemplu una banal ca 1; i abia apoi se insereaz function file;
insernd funcia n linia de comand (inline function) utiliznd comanda inline;
construind funcia fr salvare ca fiier .m, sub forma anonymous function.
Cel mai simplu mod de definire a unui bloc de comenzi de tip function este urmtorul:
function nume
instructiuni
end
Se poate atribui funciei o list de argumente (n care argumentele sunt separate prin virgul):
function nume(lista_argumente)
instructiuni
end
Pentru ca funcia s returneze un rezultat, funcia va fi scris sub forma:
function var_retur = nume(lista_argumente)
instructiuni
end
unde lista_argumente conine variabilele de intrare (input), iar var_retur este numele
variabilei care conine rezultatul (output).
Pentru ca funcia s returneze mai multe rezultate, funcia va fi scris sub forma:
function [lista_retur] = nume(lista_argumente)
instructiuni
end
unde [lista_retur] este lista variabilelor rezultate, separate prin virgul.
126 Staii de pompare i Reele hidraulice cu GNU Octave
Este posibil s se scrie o funcie care s returneze mai multe rezultate, dar care s fie lipsit
de o list de argumente, de exemplu:
function [x, y, z] = nume( )
x=1; y=-5; z=8;
end
care apelat ulterior sub forma [a b c] = nume( ) conduce la urmtoarele rezultate (listate n
coloan): a=1 b=-5 c=8
n conformitate cu cele prezentate deja n tabelul 2.1, la poziia corespunztoare ncheierii unui
bloc de comenzi de tip function, dac funcia scris de ctre utilizator este editat n editorul de
text i apoi este salvat ca fiier *.m, atunci end la finalul acestui bloc de comenzi este
opional. n prezenta carte, end este utilizat pentru a facilita nelegerea7 unui cod de calcul.
O funcie poate fi inserat n linia de comand (inline function), cu comanda inline sub forma:
f = inline(expresie)
unde expresie este expresia propriu-zis a funciei, inserat ca string (ntre apostroafe).
O funcie poate fi construit fr salvare ca fiier .m, sub forma anonymous function:
fhandle = @(lista_argumente) expresie
unde expresie este expresia propriu-zis a funciei, iar fhandle permite invocarea funciei.
n tabelele 2.62.8 vor fi prezentate succint comenzi i funcii built-in comune ambelor limbaje
de programare: GNU Octave i MATLAB. Selectarea acestora corespunde utilitii/
utilizrii lor n calcule numerice n domeniul Staiilor de pompare i Reelelor hidraulice.
7
pentru cei cu experien redus n programare, este practic delimitarea acestui bloc de comenzi
8
Referine bibliografice n ordine cronologic: [31], [39], [24], [23], [3]
Capitolul 2. Introducere n GNU Octave 127
Sintaxa aferent tuturor acestor simboluri ncepe cu operatorul \ (backslash). Simbolurile mai
des utilizate n inginerie sunt incluse n tabelul 2.6.
Tabelul 2.6. Sintaxa ctorva simboluri matematice din Te i LaTe utilizat pentru inserarea
acestora ntr-un ir de caractere, ntre apostroafe (de exemplu '\alpha' va deveni ntr-un grafic)
De exemplu, pentru scrierea unei litere mici din limba greac, dup operatorul \ se insereaz
denumirea n extenso a acelei litere greceti, scris cu caractere latine (toate trebuie s fie litere
mici). Pentru majuscule n limba greac, prima liter a denumirii n extenso se scrie cu liter
mare.
Un caracter (latin, grec, operator de derivare) poate fi scris n stil italic, dac e precedat de \it
Pentru a scrie un indice, fiecare caracter din indice trebuie s fie precedat de _ (underscore) iar
pentru a scrie un exponent, fiecare caracter din exponent este precedat de ^ (accent
'Q_m_a_x^2' sau 'Q^2_m_a_x' (nu conteaz ordinea de scriere dintre indice i exponent).
128 Staii de pompare i Reele hidraulice cu GNU Octave
Reprezentri grafice 2D
Cteva funcii built-in folosite uzual pentru reprezentri grafice 2D (bidimensionale) sunt
prezentate n tabelele 2.7 i 2.8, alturi de opiunile/proprietile ataate. Nu vom aborda funcii
pentru reprezentri grafice 3D (tridimensionale), deoarece nu sunt utilizate n prezenta carte.
Funcia Descriere
grid sau grid on sau grid('on') Adaug graficului un caroiaj
grid minor Adaug graficului un caroiaj trasat cu pas fin
xlabel('variabila_pe_abscisa') Adaug graficului o etichet pe abscis (axa Ox), inserat ca
string: 'variabila_pe_abscisa'
ylabel('variabila_pe_ordonata') Adaug graficului o etichet pe ordonat (axa Oy), inserat
ca string: 'variabila_pe_ordonata'
Adaug graficului un titlu, inserat ca string n funcia title;
title('nume_grafic')
implicit, titlul va fi pozitionat n partea de sus a graficului
Adaug graficului o legend. De exemplu, dac sunt
reprezentate 2 curbe diferite, semnificaia primei curbe trasate
se trece ca string pe prima poziie din funcia legend, iar
semnificatia celei de-a doua curbe se trece pe a doua poziie.
legend('curba_1', 'curba_2') Implicit, legenda este pozitionat n colul de sus-dreapta al
sau graficului. Pentru poziionarea legendei n alt loc, se va trece
legend('c1', 'c2', 'location', 'pozitia') opiunea 'location', 'pozitia', unde 'pozitia' poate fi: 'north',
'south', 'east', 'west', 'northeast' (implicit, deci nu e nevoie
s fie inserat), 'northwest', 'southeast', 'southwest',
'outside', 'northoutside', 'southoutside', ... ,
'northeastoutside', ... (vezi help legend)
axis('auto') Permite scalarea automat a axelor.
axis([x_left, x_right, y_infer, y_sup]) Permite scalarea axelor cu limitele specificate pentru axe.
Traseaz graficul cu axa Ox de la valoarea numeric x_left
(limita din stnga), pn la valoarea numeric x_right (limita
din dreapta), respectiv cu axa Oy de la valoarea numeric
y_infer (limita de jos), pn la valoarea numeric y_sup
(limita de sus).
axis equal sau axis('equal') Scaleaz axele cu unitatea pe axa Ox egal cu unitatea de pe
axa Oy.
axis square sau axis('square') Scaleaz axele astfel nct graficul s se ncadreze ntr-un
ptrat.
axis off sau axis('off') Nu mai afieaz axele graficului
Permite suprapunerea urmtorului grafic peste graficul
hold on sau hold('on')
curent
hold off sau hold('off') Anuleaz suprapunerea unui alt grafic peste graficul curent
terge graficul (curbe, axe, legenda etc) i afieaz fereastra
clf
grafic goal
Capitolul 2. Introducere n GNU Octave 129
text(x, y, 'textul_dorit') Adaug n grafic textul_dorit, ncepnd din locul ale crui
coordonate (valori numerice) x i y sunt specificate.
gtext('textul_dorit') Adaug n grafic textul_dorit, n locul ales cu un click al
mouse-ului
Umple cu culoarea col specificat suprafaa unui poligon =
suprafaa mrginit de curba nchis, descris de vectorii x i
y (cu acceai lungime), n care primul element din x (respectiv
fill(x, y, 'col')
primul element din y) este egal cu ultimul element din x
(respectiv din y). Codul de culori col este dat n tabelul 2.8.
Exemplu: x = [1:12 1]; y = [sin(1:12) sin(1)]; fill(x, y, 'c')
Salveaz graficul cu numele specificat, numegrafic, n
varianta de format grafic specificat prin optiune (extensia
fiierului). Vezi help print
-d nseamn device
Unele dintre opiunile de format grafic sunt:
eps (format Encapsulated PostScript);
epsc2 (format Encapsulated Postscript, color, nivel 2),
este recomandat, deoarece are cea mai mare rezoluie;
png (format Portable Network Graphic, 24-bit, color);
print -doptiune numegrafic tiff sau jpeg (format TIFF sau format JPEG); formatul
jpeg are rezoluie slab i nu este recomandat
Exemplu:
x = 1:10;, y=x.^2;, plot(x,y), print -depsc2 curba.eps
va salva graficul n fiierul curba.eps
Fisierele PostScript ps i Encapsulated PostScript eps pot fi
vizualizate cu GSview (numit i GhostView), care este free
software (se instaleaz mpreun cu Ghostscript); aceste
tipuri de grafice .ps i .eps pot fi inserate direct n MS Word,
MS Power Point, ... chiar dac nu este instalat GSview
Tabelul 2.8. Funcii pentru trasarea graficelor 2D n GNU Octave i MATLAB. Pentru funcia plot,
sunt explicitate opiunile (proprietile) ataate acesteia; vezi help plot. Majoritatea opiunilor pot fi
setate i n alte funcii de trasare grafic, anume n: semilogx, semilogy, loglog
un marker
Exemplu: Graficul urmtor este trasat cu comenzile
x = 0:0.1:10;, y1 = x.^3.*sin(x);, y2 = x.^3.*cos(x);
plot(x,y1, 'k', 'linewidth', 2), grid
hold on, plot(x,y2, '*k', 'markersize', 6)
legend('y_1 = x^3 sin(x)','y_2 = x^3 cos(x)', 'location',
'northwest')
xlabel('x'), ylabel('y_1 si y_2'), title('Grafic 2D')
Grafic 2D
600
y 1 = x 3 sin(x)
400
y 2 = x 3 cos(x)
200
y 1 si y 2
-200
-400
-600
-800
-1000
0 1 2 3 4 5 6 7 8 9 10
x
9
n MATLAB sunt mult mai multe tipuri de marker
10
n toolbox-ul de grafic din MATLAB este disponibil ntreaga palet de culori
Capitolul 2. Introducere n GNU Octave 131
0.8 0.9
0.5 0.5
0.6
0.8
0 0 0.4
0 0.5 1 0 0.5 1 0.7
0.2
1 1
0.6
0
0 0.5 1
0.5 0.5 0.5
1 0.4
0 0
0 0.5 1 0 0.5 1 0.8
0.3
1 1 0.6
0.2
0.4
0.5 0.5
0.2 0.1
0 0 0 0
0 0.5 1
subplot(n, m, pozitia)
se vor tasta urmtoarele combinaii (n, m, pozitia) n cadrul
funciei subplot:
3,2,1 3,2,2
2,2,1
3,2,3 3,2,4 sau 1,2,2
2,2,3
3,2,5 3,2,6
Exemplu: Graficul matrice 22 care urmeaz este trasat cu
urmtoarele comenzi
x = 0:0.1:20;, y1 = sin(x);, y2 = cos(x);, y3 = x.^3.*sin(x);, y4 =
sin(x)./(x+eps);
subplot(2,2,1), plot(x, y1, 'k', 'linewidth', 2), grid,
title('y_1(x)')
132 Staii de pompare i Reele hidraulice cu GNU Octave
0.5 0.5
0 0
-0.5 -0.5
-1 -1
0 5 10 15 20 0 5 10 15 20
4 y 3(x) y 4(x)
x 10
1 1
0.5
0.5
0
0
-0.5
-1 -0.5
0 5 10 15 20 0 5 10 15 20
elementul cu indicele k 3 de exemplu, va fi desemnat prin sintaxa v(3) sau prin k=3, v(k)
Similar, pentru o matrice A , de componente ai , j (cu i 1 n i j 1 m ), elementul a13 va
fi desemnat prin sintaxa A(1,3) sau (de exemplu) prin i=1, j=3, A(i,j)
Pentru a extrage dintr-o matrice A vectorul coloan w corespunztor indicelui j 3 , se scrie
w=A(:,3) unde : (dou puncte) plasat pe poziia lui i are semnificaia de toate liniile. Similar,
pentru a extrage dintr-o matrice A vectorul linie w corespunztor indicelui i 1 , se scrie
w=A(1,:) unde : (dou puncte) plasat pe poziia lui j are semnificaia de toate coloanele.
Sintaxa A(:,:) poate fi folosit pentru a desemna toate liniile i toate coloanele din A
Pentru a identifica ntr-un vector sau ntr-o matrice poziia tuturor elementelor non-nule, se
utilizeaz funcia find astfel: k=find(v) sau [i,j]=find(A)
Pentru a cuta ntr-un vector sau ntr-o matrice, un anumit element care satisface o condiie,
se utilizeaz funcia find, care d poziia (indicele k pentru v , respectiv indicii i i j pentru A )
la care se afl elementul ce satisface condiia respectiv. Dac se dorete aflarea valorii acelui
element, trebuie apelat funcia find ca n exemplele care urmeaz. Exemple:
v=[-5 8 13 7 -1 0 9], k=find(v<0), p=v(k) sau se scrie direct p=v(find(v<0)) Rspunsul este:
k = 1 5 respectiv p = -5 -1
Capitolul 2. Introducere n GNU Octave 133
Px cn x n cn 1x n 1 c2 x 2 c1x c0 0 , (2.1)
pot fi rezolvate cu funcia roots, care pentru a fi apelat, necesit n prealabil inserarea
coeficienilor polinomului ntr-un vector linie, de exemplu notat c ; coeficienii se insereaz n
ordinea descresctoare a puterilor, adic c cn cn 1 c2 c1 c0 . Dac n cadrul ecuaiei
exist coeficieni nuli, acetia se insereaz cu valoarea 0 obligatoriu pe poziia lor, astfel nct
la final, vectorul c s aib (n+1) elemente pentru o ecuaie de gradul n. Soluia se obine apoi
cu sintaxa:
x = roots(c)
Exemplu: S se determine debitul QF n punctul de funcionare energetic F al unei pompe
intersecia celor dou curbe, deci se poate scrie PQF 60000 25000 QF2 40 25 0 ;
Ambele funcii fzero i fsolve necesit o aproximaie de start (o aproximare iniial a soluiei,
pe care s o furnizeze utilizatorul); apoi, funcia built-in specific va cuta soluia final n
apropierea aproximaiei de start; convergena depinde de alegerea iniial. S-a dovedit c
funcia fsolve este n general convergent, fiind bazat pe o metod de minimizare n sensul
celor mai mici ptrate (implementat prin algoritmul Levenberg-Marquardt [31; paragraful
15.5]).
Funcia fsolve poate furniza soluia pentru majoritatea sistemelor de ecuaii neliniare ataate
problemelor inginereti, chiar dac aproximaia de start este non-fizic (departe de realitate11).
Recomandm deci cititorilor s foloseasc funcia fsolve, care rezolv att ecuaii, ct i
sisteme de ecuaii neliniare (fsolve este utilizat exclusiv n prezenta carte, pentru soluionarea
sistemelor de ecuaii neliniare aferente staiilor de pompare i reelelor hidraulice).
Sintaxele aferente apelrii funciei fsolve sunt:
[x, valoaref, cod] = fsolve(@nume, x0)
sau
x = fsolve(@nume, x0)
unde x0 este valoarea aproximaiei de start pentru o ecuaie transcendent, sau vectorul (de tip
coloan sau linie) al aproximaiei de start pentru un sistem de ecuaii neliniare; x este soluia
sau vectorul soluiei (de tip coloan sau linie); nume este denumirea funciei scrise de ctre
11
De exemplu, pentru sisteme de ecuaii neliniare aferente reelelor inelare alimentate dintr-un
singur nod, ca aproximaie de start se pot lua valori nule pentru toate debitele de pe arterele reelei;
convergena va fi atins (soluia final va fi obinut) fr probleme. Pentru reele inelare alimentate din
mai multe surse (minim 2 noduri de alimentare), convergena este mai greu de atins cu o aproximaie
de start arbitrar; n acest caz se recomand utilizarea unei aproximaii de start cu semnificaie fizic,
determinate pe baza ecuaiei continuitii aplicate n fiecare nod.
Capitolul 2. Introducere n GNU Octave 135
utilizator, n care este inclus, dup caz, ecuaia sau sistemul de ecuaii neliniare dependente de
x; funcia nume depinde de x, deci se definete sub forma: nume(x); valoaref conine, dup
caz, valoarea lui f sau valorile componentelor vectorului f dup aflarea soluiei (aceste valori
trebuie s fie cvasi-nule dac a fost atins soluia), iar cod este un mesaj codificat
corespunztor gradului de convergen atins (accesai help fsolve); de exemplu, cod = 1
nseamn c a fost atins convergena.
Pe lng variabila x, funcia nume poate fi dependent i de un parametru notat a (care
poate fi o constant sau un vector), caz n care funcia se definete: nume(x,a)
Se definete mai nti parametrul a, apoi sintaxele utilizate pentru rezolvare sunt:
[x, valoaref, cod] = fsolve(@(x) nume(x,a), x0)
sau
x = fsolve(@(x) nume(x,a), x0)
f x x3 sin x 5 0 , (2.2)
12
n function, nu este nevoie de operator element-cu-element; se poate scrie x.^3 sau x^3
13
n fsolve, nu este nevoie de operator element-cu-element; se poate scrie x.^3 sau x^3
136 Staii de pompare i Reele hidraulice cu GNU Octave
f1 w1 w1w2 3w2 2 0
2
w1 1
, cu aproximaia de start 0 . (2.3)
2
w
20 1
2
f w 2 7 w1 5 0
Aproximarea datelor
Regresia polinomial de o singur variabil independent poate fi abordat cu ajutorul
funciilor denumite polyfit i polyval. Fie o funcie y yx , a crei expresie analitic nu se
cunoate; aceast funcie este definit tabelar, prin perechi de valori discrete xk , yk cu
aproximate printr-o curb de regresie polinomial, de un anumit grad n, unde n 1 este ales
n funcie de alura curbei pe care punctele xk , yk par s o descrie atunci cnd sunt trasate pe
un grafic. Rezult astfel curba:
y yx cn x n c2 x 2 c1x c0 . (2.4)
curbei de regresie polinomial, cu ajutorul metodei celor mai mici ptrate. Funcia polyfit se
apeleaz cu sintaxa:
c = polyfit(x,y,n)
unde c este vectorul coeficienilor polinomului, cu componente n ordinea descresctoare a
puterilor, adic c cn cn 1 c2 c1 c0 , x este vectorul cu m componente i y este vectorul cu
14
n function, nu este nevoie de operatori element-cu-element; se poate scrie w(1).^2 sau w(1)^2
15
n acest mod de scriere compact n fsolve, nu este nevoie de operatori element-cu-element
Capitolul 2. Introducere n GNU Octave 137
m componente, care conin perechile de valori discrete din tabel, iar n este gradul polinomului
de aproximare.
Dup aflarea coeficienilor curbei de regresie polinomial, valorile funciei y yx se pot
calcula pentru orice valori ale lui x x0 , cu ajutorul funciei polyval care se apeleaz astfel:
ycalculat = polyval(c,x0)
unde x0 poate fi o valoare singular, sau x0 poate fi un vector cu mai multe componente (caz n
care rezultatul, ycalculat, va fi un vector cu acelai numr de componente ca i x0).
Utilizarea funciilor polyfit i polyval va fi exemplificat n paragraful 3.6, la analiza
funcionrii n paralel a turbopompelor.
Interpolarea cu funcii cubice spline este o alt variant de aproximare a funciei y yx
definit tabelar prin perechi de valori discrete xk , yk cu k 1 m . Funcia de tip built-in care
implementeaz acest tip de interpolare a datelor se numete spline, iar sintaxa cu care se
utilizeaz este urmtoarea:
ycalculat = spline(x,y,x0)
unde x0 poate fi o valoare singular, sau x0 poate fi un vector cu mai multe componente; de
regul, x0 este un vector generat cu pas fin, cu un numr de componente mai mare dect m,
definit pe plaja de valori a lui x din tabel, sau pe o plaj mai extins (caz n care se face o
extrapolare a datelor).
poate calcula numeric cu ajutorul funciei built-in denumit trapz, care se bazeaz pe metoda
trapezelor, utiliznd sintaxa:
J = trapz(x,y)
Dac integrandul y yx este definit printr-o expresie analitic, atunci se recomand
utilizarea funciei built-in denumite quad, bazat pe o metod de cuadratur. Valoarea
integralei se poate calcula utiliznd sintaxa:
138 Staii de pompare i Reele hidraulice cu GNU Octave
J = quad(@nume, a, b)
unde nume este denumirea funciei scrise de ctre utilizator, n care este inclus integrandul
yx ; funcia nume depinde de x, deci se definete sub forma: nume(x); a i b sunt limitele de
integrare. Dac integrandul este simplu, poate fi utilizat sintaxa pentru anonymous function:
J = quad(@(x) expresie, a, b)
n care pe poziia cuvntului expresie se trece expresia matematic a integrandului yx , sau se
poate recurge la inline function:
J = quad(inline('expresie'), a, b)
Exemplu:
10
J x 2 sin x dx . (2.6)
0
Structurile de control sunt scrise aici n forma comun ambelor limbaje de programare
(GNU Octave i MATLAB):
structura secvenial (secvena) include instruciuni executate necondiionat una dup
alta (instruciuni de citire, de scriere i de atribuire);
structura alternativ (decizia) include minim o condiie, de care depinde executarea
unei/unor instruciuni; este implementat prin blocurile de comenzi de tip if, sau prin blocul de
comenzi de tip switch, dup cum urmeaz n tabelul 2.9;
structura repetitiv (ciclul) presupune executarea repetat a unor instruciuni, ntr-un
ciclu cu contor (blocul de comenzi de tip for), ntr-un ciclu cu test iniial (blocul de tip while),
sau ntr-un ciclu cu test final (blocul de tip do until), dup cum urmeaz n tabelul 2.10.
16
n quad, se aplic obligatoriu operatorii element-cu-element; trebuie scris x.^2.*sin(x)
17
Referine bibliografice n ordine cronologic: [39], [23], [3]
Capitolul 2. Introducere n GNU Octave 139
Tabelul 2.10. Blocuri de comenzi de tip for, while i do until n GNU Octave i MATLAB
Rezult 0.026515 s n MATLAB (de circa 15 ori mai repede) i 0.0623999 s n GNU Octave
(de 169 de ori mai repede ca n ciclul cu contor);
n form vectorizat compact:
tic, y = sin(0:0.0001:100); toc
Rezult 0.020306 s n MATLAB (de circa 19 ori mai repede ca n ciclul cu contor), respectiv
acelai timp de calcul, de 0.0623999 s n GNU Octave.