Sunteți pe pagina 1din 28

2.

Introducere n GNU Octave

2.1. Comparaia dintre GNU Octave i MATLAB

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.

GNU Octave este free software [http://www.gnu.org/software/octave/], putnd fi utilizat,


redistribuit i/sau modificat n termenii unei licene (GNU General Public License, publicat de
ctre Free Software Foundation). Pe lng faptul c este accesibil utilizatorilor, recomandm
GNU Octave deoarece nu necesit resurse hardware importante: dup instalarea cu toate
pachetele necesare (similare toolbox-urilor1), GNU Octave ocup un spaiu pe disc de 355MB.
Proiectul Octave a fost conceput n 1988, dar abia n 1992 John W. Eaton a nceput efectiv
elaborarea Octave, n limbaj C++; prima lansare a software-ului Octave a avut loc n ianuarie
1993. Octave a devenit GNU Octave n 1997, ca parte a GNU Project. Alturi de John W.
Eaton, Octave a fost dezvoltat n mod continuu de muli programatori (codul fiind de tip open
source). Ultima versiune, GNU Octave 3.8.1, a fost lansat n martie 2014. Aceast versiune
precum i toate versiunile anterioare din perioada 19972013 sunt disponibile la adresa:
ftp://ftp.gnu.org/gnu/octave. GNU Octave ruleaz pe sisteme de operare Unix-like, Mac OS X
i Windows. n prezent, sunt disponibile pachete binare precompilate ale GNU Octave pentru
urmtoarele sisteme de oprerare: Debian, Ubuntu, RedHat, SuSE i Fedora GNU/Linux; Mac
OS X; Windows 98/ 2000/ XP/ Vista/ 7/ 8. Versiunile compilate nu sunt distribuite de ctre
Proiectul Octave, ci de ctre alte proiecte sau de ctre programatori independeni [vezi http://
www.gnu.org/software/octave/download.html]. Ultima versiune compilat pentru Windows

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++.

MATLAB este un software comercial [http://www.mathworks.com/products/matlab/]


distribuit de ctre compania MathWorks. MATLAB necesit resurse hardware importante:
dup instalarea personalizat, fr Simulink2 i fr toate toolbox-urile, ocup un spaiu pe disc
de peste 6GB; anumite aplicaii MATLAB utilizeaz la rulare mai mult de 3GB din memorie
[http://www.mathworks.com/products/matlab/choosing_hardware.html#memory].
Denumirea MATLAB deriv din cuvintele MATrix LABoratory (laborator matriceal). Prima
versiune MATLAB a fost elaborat n Fortran de ctre Cleve Moler, la sfritul anilor 70'. La
nceputul anilor 80', Jack Little i Steve Bangert au reprogramat MATLAB n limbaj C i, n
anul 1984, alturi de Cleve Moler, au nfiinat compania MathWorks, care comercializeaz
software-ul MATLAB. Ultima versiune, MATLAB R2014a (versiunea 8.3), a fost lansat n
martie 2014. MATLAB poate fi instalat sub diferite sisteme de operare: Windows, Mac OS X
i Linux (Debian, RedHat, SuSE, Ubuntu).

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

simbol care precede un


# %
comentariu
simbol care delimiteaz " (ghilimele) ' (apostrof)
irul de caractere (string) exemplu: "string" exemplu: 'string'
operatori de ridicare la
** (exemplu 2**3) ^ (exemplu 2^3)
putere a unui numr
constanta e este
constanta constanta e = 2.71828...
predefinit i pot fi
e = 2.71828182845905 nu este definit n
efectuate operaii exp(1)
(baza logaritmului MATLAB, deci nu e
cu e, de exemplu:
natural) recunoscut n MATLAB
log(e), sau 2*e
operatorul de negaie
! ~
logic (NOT)
simbol utilizat pentru a
plasat dup textul de pe
continua o linie pe rndul \ ...
primul rnd
urmtor
end la finalul unui bloc de
tip function salvat *.m
este opional; idem pentru
endfunction endfunction n fiier *.m
ncheierea unui bloc de endif
comenzi de tip function, endfor end n GNU Octave, end (sau
if, for, while, switch endwhile endfunction) se scrie
endswitch obligatoriu la finalul unui
bloc de tip function dac
funcia e scris direct n
linia de comand
se asigneaz rezultatul
exemplul 1:
intermediar unei
[3 1 4 1 5 9](3)
variabile i se
indexarea unei entiti ans = 4
indexeaz variabila;
care nu este declarat ca
exemplul 2:
variabil exemplul 2:
d = cos([0 pi pi/4 7])
cos([0 pi pi/4 7])(3)
d(3)
ans = 0.70711
ans = 0.70711
i++ (returneaz
valoarea curent a
operatori de incrementare pentru vectori i matrice,
lui i i apoi adaug
i preincrementare operatorii de incrementare/
o unitate la aceasta) i=i+1
specifici limbajelor C, preincrementare se aplic
++i (adaug 1 la i i
C++ fiecrui element
apoi returneaz
rezultatul)
operatori de decrementare
pentru vectori i matrice,
i predecrementare i
i=i1 aceti operatori se aplic
specifici limbajelor C, i
fiecrui element
C++
Capitolul 2. Introducere n GNU Octave 117

funcii built-in pentru fiecare software utilizeaz


crearea de interfee propriile funcii pentru
grafice (GUI) crearea de GUI

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.

2.2. Noiuni de baz din GNU Octave4

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

1.576 103 , iar 8.25e6 nseamn 8.25 106 .


Pentru a terge informaiile stocate n memorie, se utilizeaz comanda clear all (istoricul
de comenzi nu se terge, astfel nct pot fi reapelate instruciuni scrise anterior, cu ajutorul
cursorului ). Pentru a terge coninutul de pe ecran, se utilizeaz comanda clc
Ieirea din GNU Octave se face obligatoriu prin comanda exit tastat n linia de comand5.
Ieirea din MATLAB se poate face prin comanda exit (tastat n linia de comand) sau, mult
mai comod, prin nchidere de la simbolul (close) din colul drepta-sus.
Comenzile tic i toc calculeaz timpul scurs n executarea unei funcii sau unui program, de
exemplu denumit nume_program (valoarea timpului afiat depinde de tipul i de ncrcarea
procesorului n momentul execuiei). Se aplic astfel: tic, nume_program, toc

Modul de introducere a datelor


Instruciunile se pot tasta pe rnd, cte una pe fiecare linie de comand, iar introducerea
fiecreia se face prin tasta Enter.
Instruciunile se pot tasta i pe acelai rnd, caz n care sunt separate una de cealalt prin
virgul de exemplu: x = 1, y = 3, z = cos(x)
Dac introducerea unei date (sau unei operaii) se termin cu caracterul special ; (punct-i-
virgul), atunci data este memorat n sesiunea de lucru, fr a mai fi afiat pe ecran (sau
rezultatul operaiei este memorat n sesiunea de lucru, fr a mai fi afiat pe ecran). n cazul n
care datele de intrare i/sau rezultatele calculate se afl ntr-un vector sau ntr-o matrice de
dimensiuni mari, sau n cazul n care se execut un calcul iterativ, se recomand inhibarea
afirii datelor pe ecran (afiarea datelor pe ecran mrete timpul de rulare).
Vectorii, matricele sau irurile de caractere pot fi introduse n sesiunea de lucru i prin
importare (ncrcare) dintr-un fiier text, denumit de exemplu nume.txt, prin folosirea
comenzii load, adic load {-ascii} nume.txt sau prin folosirea comenzii input.
Exemplu: Fie fiierul text denumit valori_masurate (generat de exemplu ntr-un editor de text,
ca Notepad); se recomand ca acest fiier ASCII s nu aib extensie. Fiierul poate fi creat prin
inserarea pe 2 coloane (sau m coloane) a valorilor a 2 variabile (sau m variabile) diferite. Se

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".

Extragerea i salvarea datelor


Dac v este un vector cu n elemente, iar vk este elementul vectorului situat n poziia k,

unde k 1 n , atunci v(k) permite extragerea elementului de pe poziia k.


Dac A este o matrice de dimensiuni n m , iar aij este elementul situat pe linia i i coloana j,

unde i 1 n , iar j 1 m , atunci A(i,j) permite extragerea elementului de pe poziia {i,j}.

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

Constante utile i variabile speciale


n GNU Octave i n MATLAB sunt definite constante utile i variabile speciale (tabelul 2.2).

Tabelul 2.2. Constante predefinite i variabile speciale

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

MATLAB i GNU Octave se bazeaz pe calculul matriceal. O matrice oarecare de dimensiuni


n m are n linii i m coloane, deci un scalar este o matrice de dimensiuni 1 1 cu o linie i o
coloan, un vector linie de dimensiuni 1 m este o matrice cu o linie i m coloane, un vector
coloan de dimensiuni n 1 este o matrice cu n linii i o coloan. Ca urmare, nu se pot nmuli
doi vectori linie, sau doi vectori coloan. Operaiile de nmulire, mprire i ridicare la putere
aplicate element-cu-element fiecrei componente a vectorilor sau matricelor necesit
utilizarea operatorilor descrii mai sus ( .* sau ./ sau .^ ).
Operatorii relaionali sunt urmtorii: = = (egalitate), ~= (diferit), < (mai mic), > (mai mare),
<= (mai mic sau egal), >= (mai mare sau egal).
Dintre operatorii logici amintim: ~ (negaia logic), & (i logic), | (sau logic).

Funcii matematice elementare i funcii de statistic general


n tabelul 2.3 sunt prezentate cteva funcii matematice elementare.
Dac funciile matematice se aplic vectorilor, matricelor sau tablourilor multidimensionale,
ele acioneaz asupra fiecrui element. Pentru funciile trigonometrice, argumentul este
interpretat n radiani.
n tabelul 2.4 sunt prezentate cteva funcii de statistic general.

Tabelul 2.3. Funcii matematice elementare n GNU Octave i MATLAB

Funcia Descriere i exemplu de aplicare

sqrt(x) rdcina ptrat din x, adic x


exp(x) exponeniala din x, adic e x
log(x) logaritm natural din x, adic ln x
log10(x) logaritm zecimal din x, adic lg x
log2(x) logaritm n baza 2 din x, adic log2 x
cos(x) cosinus de x, adic cos x
acos(x) arcul al crui cosinus este x, adic arccos x
sin(x) sinus de x, adic sin x
asin(x) arcul al crui sinus este x, adic arcsin x
tan(x) tangenta de x, adic tg x
atan(x) arcul al crei tangent este x, adic arctg x
rand genereaz un numr aleator (random) ntre 0 i 1
rand(n) genereaz o matrice ptrat nn de numere aleatoare cuprinse ntre 0 i 1
rand(n,m) genereaz o matrice dreptunghiular nm de numere aleatoare cuprinse ntre 0 i 1
abs(x) valoarea absolut din x
122 Staii de pompare i Reele hidraulice cu GNU Octave

real(z) returneaz coeficientul prii reale (notat x) a numrului complex z x i y


imag(z) returneaz coeficientul prii imaginare (notat y) a numrului complex z x i y

Tabelul 2.4. Funcii de statistic general n GNU Octave i MATLAB

Funcia Descriere i exemplu de aplicare


Dac v este un vector, atunci min(v) returneaz cel mai mic element din v, iar max(v)
returneaz cel mai mare element din v.
min(v) Dac v este o matrice, atunci min(v) sau max(v) returneaz un vector coninnd
max(v) elementele cele mai mici sau cele mai mari, de pe fiecare coloan. Dac v este o
matrice, atunci min(min(v)) returneaz cel mai mic element al matricei i max(max(v))
returneaz cel mai mare element al matricei
Dac v este un vector, atunci sum(v) returneaz suma elementelor din v, iar prod(v)
returneaz produsul elementelor din v.
sum(v) Dac v este o matrice, atunci sum(v) sau prod(v) returneaz un vector coninnd suma
prod(v) sau produsul elementelor de pe fiecare coloan. Dac v este o matrice, atunci
sum(sum(v)) returneaz suma elementelor matricei i prod(prod(v)) returneaz
produsul elementelor matricei
cumsum(v) Calculeaz sumele pariale (cumulate)
cumprod(v) Calculeaz produsele pariale (cumulate)
Dac v este un vector, calculeaz media aritmetic a elementelor din v.
mean(v) Dac v este o matrice, calculeaz media aritmetic a elementelor de pe fiecare coloan a
matricei
Dac x este un vector, atunci std(x) calculeaz deviaia standard (notat ) a
n
elementelor lui x, adic
1
xi x 2 .
std(x) n 1 i 1
Dac x este o matrice, atunci std(x) returneaz un vector linie care conine deviaiile
standard ale fiecrei coloane din matrice
sort(v) Sorteaz termenii irului (vectorului) v n ordine cresctoare
-sort(-v) Sorteaz termenii irului (vectorului) v n ordine descresctoare

Generarea vectorilor, matricelor i irurilor de caractere


Generarea vectorilor, matricelor i irurilor de caractere (string) este exemplificat n
tabelul 2.5, alturi de comenzile legate de controlul dimensiunii vectorilor i matricelor.

Tabelul 2.5. Introducerea/generarea vectorilor, matricelor i irurilor de caractere n GNU Octave i


MATLAB. Comenzi pentru controlul dimensiunii vectorilor i matricelor

Sintaxa Descriere i exemple de aplicare


vector_linie = [b1 b2 b3 ...] Creeaz un vector linie care conine valorile sau variabilele b1, b2,
sau b3, ... (sau combinaii ntre valori i variabile). Valorile/variabilele
Capitolul 2. Introducere n GNU Octave 123

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)

2.3. Script-uri i funcii definite de utilizator n GNU Octave6

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.

2.4. Comenzi i funcii built-in utile din GNU Octave8

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.

Inserarea simbolurilor matematice n irurile de caractere


Legat de reprezentrile grafice, vom prezenta mai nti inserarea irurilor de caractere n
etichetele de pe axele graficului, n titlu, n legend i/sau ntr-o anumit poziie pe grafic.
MATLAB i GNU Octave ncorporeaz un interpretor Te pentru iruri de caractere, care
permite utilizarea unora dintre simbolurile matematice din Te i LaTe n cadrul unui
ir de caractere (string) [http://cs.brown.edu/about/system/software/latex/doc/symbols.pdf].

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)

Simbol Sintaxa Simbol Sintaxa Simbol Sintaxa

\alpha \rho \Omega


\beta \sigma \pm
\gamma \tau \equiv
\delta \phi \cong
\epsilon \varphi \approx
\zeta \chi \leq
\eta \psi \geq
\theta \omega \times
\kappa \Gamma \infty
\lambda \Delta \nabla
\mu \Pi \partial
\nu \Sigma \int
\xi \Phi \in
\pi \Psi \subset

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

circumflex). De exemplu, 30 se scrie '\beta = 30^o' iar p3 se scrie '\Deltap_3' sau se

poate scrie p3 n stil italic, astfel: '\it \Deltap_3'

Pentru a scrie un ir de caractere cu indice i exponent, de exemplu Q 2max , sintaxa este:

'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.

Tabelul 2.7. Funcii generale pentru grafica 2D n GNU Octave i MATLAB

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

Funcia i/sau opiunile


Descriere
(proprietile) ataate
Traseaz graficul y=y(x), unde x i y sunt vectori cu acelai
numr de elemente. Numeroasele optiuni (proprieti) ce pot
fi utilizate vor fi explicitate n continuare, n acest tabel.
plot(x, y) Dac nu se specific culoarea n comanda plot, se va
sau utiliza automat ordinea culorilor din proprietatea presetat
plot(x, y, 'optiuni') ColorOrder
Dac nu se specific tipul liniei, se va trasa implicit o linie
continu
Dac nu se specific tipul marker-ului, nu se va insera nici
130 Staii de pompare i Reele hidraulice cu GNU Octave

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

Opiunea de stil a liniei/curbei


'' (aici este semnul minus) Seteaz stilul linie continu (este stilul implicit i nu este
nevoie s fie explicitat)
':' Seteaza stilul linie punctat
'.' (semnul minus urmat de punct) Seteaz stilul linie-punct
' ' (dou minusuri succesive) Seteaz stilul linie ntrerupt
Opiunea de grosime a liniei Permite setarea grosimii curbei trasate, la valoarea
'linewidth', val specificat val (numr ntreg)
Seteaz tipul de marker specificat prin simbol. Se poate
utiliza9:
'*' pentru asterisc
Opiunea tipului de marker 'o' pentru cercuri deschise
'simbol' '+' pentru plusuri
'x' pentru x-uri
'^' pentru triunghi cu vrful n sus
'.' pentru punct (se recomand i opiunea 'markersize', 8)
Mrimea marker-ului Seteaz mrimea marker-ului la valoarea numeric val
'markersize', val specificat (numr ntreg)
Seteaz linia/curba cu culoarea col specificat, conform
codului de culori. Culoarea col poate fi10:
'r' roie (red)
'b' albastr (blue)
Opiunea de culoare a liniei/curbei
'k' neagr (black)
'col'
'g' verde (green; de fapt este verde fluorescent)
'm' roz (magenta; un amestec spectral dintre rou i albastru)
'c' turcoaz (cyan)
'y' galben (yellow)

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

'w' alb (white)


semilogx(x, y) Traseaz graficul y=y(x) utiliznd scara logaritmic pe axa
sau Ox (logaritmi zecimali). La logaritmare, sunt omise valorile
semilogx(x, y, 'optiuni') negative
semilogy(x, y) Traseaz graficul y=y(x) utiliznd scara logaritmic pe axa
sau Oy (logaritmi zecimali). La logaritmare, sunt omise valorile
semilogy(x, y, 'optiuni') negative
loglog(x, y) Traseaz graficul y=y(x) utiliznd scara logaritmic
sau (logaritmi zecimali) pe ambele axe Ox i Oy. La logaritmare,
loglog(x, y, 'optiuni') sunt omise valorile negative
Traseaz un grafic de tip bare, util n reprezentarea variaiei
bar(x, y) unor valori de-a lungul timpului (exprimat n ore, zile, luni sau
sau ani). Implicit, limea unei bare este de 0.8; dac se dorete
bar(x, y, val) impunerea unei alte valori numerice, atunci se alege o valoare
val n sintaxa bar(x, y, val)
stairs(x, y) Traseaz un grafic n trepte
Traseaz un grafic y=y(x) cu segmente care definesc erorile
[y+er y-er], cuprinse n vectorul er (un vector de aceeai
errorbar(x, y, er)
lungime cu x i y)
sau
Exemplu:
errorbar(y, er)
x = 1:10;, y = x.*cos(x);, er = std(y)*0.5*ones(size(x))
errorbar(x, y, er, 'k', 'linewidth', 2), grid
Funcia subplot permite desenarea unor grafice dispuse
ntr-o matrice nm (cu n linii i m coloane), fiecare grafic
fiind trasat n pozitia specificat (cu numerotarea poziiilor
pornind din colul de stnga-sus: de la stnga la dreapta i de
sus n jos)
Exemple de dispunere a graficelor:
Pentru a obine grafice dispuse ca n matricele de mai jos,
1 1 1 1

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

sau 0 0.5 1 0 0.5 1 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

subplot(2,2,2), plot(x, y2, 'k-.', 'linewidth', 2), grid,


title('y_2(x)')
subplot(2,2,3), plot(x, y3, 'k--', 'linewidth', 2), grid,
title('y_3(x)')
subplot(2,2,4), plot(x, y4, 'k^'), grid, title('y_4(x)')
y 1(x) y 2(x)
1 1

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

Identificarea i manipularea componentelor vectorilor i matricelor


Exist comenzi i funcii pentru identificarea i manipularea componentelor vectorilor i
matricelor. Avnd n vedere c un vector v are un numr de n componente vk , cu k 1 n ,

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

A=[1 2 3; -5 6 0; 1 0 8], [i,j]=find(A>7), p=A(i,j) sau se scrie direct r=A(find(A>7))


Rspunsul este: i=3, j=3, p=8 respectiv r=8

Rezolvarea sistemelor de ecuaii liniare


Fie un sistem de ecuaii liniare scris sub form matricial: A X B , unde A este matricea
coeficienilor, X este vectorul coloan al necunoscutelor i B este vectorul coloan al
termenilor liberi. Dac sistemul este determinat (numrul de ecuaii este egal cu numrul
necunoscutelor), matricea A este ptrat i soluia X se obine cu sintaxa:
X = inv(A)*B
unde funcia inv calculeaz inversa matricei.
Indiferent dac sistemul de ecuaii liniare este determinat, subdeterminat (cu mai puine ecuaii
dect numrul de necunoscute) sau supradeterminat (cu mai multe ecuaii dect numrul de
necunoscute), soluia X se obine cu sintaxa general valabil:
X = A\B
n care s-a utilizat operatorul backslash.

Rezolvarea ecuaiilor polinomiale (cu coeficieni reali sau compleci)


Ecuaiile polinomiale de gradul n, de forma

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

centrifuge cu caracteristica energetic H Q 40 60000 Q 2 , unde Q 0; 0.02 m3/s, care

este montat ntr-o instalaie cu caracteristica H instQ 25 25000 Q 2 . Debitul QF se afl la

intersecia celor dou curbe, deci se poate scrie PQF 60000 25000 QF2 40 25 0 ;

soluia pozitiv QF a acestei ecuaii polinomiale se obine cu sintaxa:


134 Staii de pompare i Reele hidraulice cu GNU Octave

c = [(-60000-25000) 0 (40-25)]; Qsol = roots(c); QF = Qsol(find(Qsol>0))


Rezult deci QF = 0.0133 n m3/s.

Rezolvarea ecuaiilor transcendente i a sistemelor de ecuaii neliniare


Pentru rezolvarea ecuaiilor transcendente, f x 0 , se pot utiliza funciile built-in
denumite fzero i fsolve.
Pentru rezolvarea sistemelor de ecuaii neliniare f x 0 se poate utiliza funcia fsolve.
Pentru n ecuaii cu n necunoscute, x este vectorul coloan ale crui n componente sunt
necunoscutele xi cu i 1 n , iar f este vectorul corespunztor celor n ecuaii din sistem,

trecute fiecare ntr-un singur membru i egalate cu zero: fi x1, x2 ,, xn 0 cu i 1 n .

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)

Aplicarea funciei fsolve pentru soluionarea ecuaiilor transcendente se poate efectua n


trei variante. Exemplu: fie ecuaia

f x x3 sin x 5 0 , (2.2)

cu aproximaia de start x0 2 . Rezolvarea numeric este urmtoarea:


Se scrie n editorul de text o funcie12 care se salveaz ca fiier nume.m astfel:
function f = nume(x)
f = x^3 + sin(x) -5;
end % finalizarea funciei cu end este opional
apoi se tasteaz n linia de comand: x = fsolve(@nume, 2) i rezult x = 1.5874
Se utilizeaz direct n linia de comand13 sintaxa pentru anonymous function:
x = fsolve(@(x) x^3+sin(x)-5, 2)
Se recurge la inline function:
x = fsolve(inline('x^3+sin(x)-5'), 2)
Pentru i , rezult x = 1.5874 (variantele i se recomand pentru ecuaii simple).

Aplicarea funciei fsolve pentru soluionarea sistemelor de ecuaii neliniare se poate


efectua n dou variante. Exemplu: fie sistemul f w 0 , unde

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

Rezolvarea numeric este:


Se scrie n editorul de text o funcie14 care se salveaz ca fiier sistem.m astfel:
function f = sistem(w)
f(1) = w(1)^2 + w(1)*w(2) + 3*w(2) -2;
f(2) = w(2)^2 - 7*w(1) -5;
end % finalizarea funciei cu end este opional
- 0.6499
apoi se tasteaz n linia de comand: w = fsolve(@sistem, [1; 1]) i rezult w =
0.6713
Se tasteaz direct n linia de comand15 (cu sintaxa pentru anonymous function):
w = fsolve(@(w) [w(1)^2+w(1)*w(2)+3*w(2)-2; w(2)^2-7*w(1)-5], [1; 1])
unde sistemul de 2 ecuaii a fost introdus ca vector coloan, la fel ca i aproximaia de start.
Rezult aceleai valori ale componentelor lui w. Varianta se aplic pentru sisteme mici.

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

k 1 m , unde xk i yk sunt componentele a doi vectori x i y . Datele din tabel pot fi

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)

Funcia built-in denumit polyfit permite determinarea coeficienilor ci (cu i 0 n ) afereni

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).

Integrarea numeric integrale curbilinii


Fie o integral curbilinie de forma,
b
J y x dx . (2.5)
a

Dac integrandul y yx este definit tabelar, prin perechi de valori discrete xk , yk cu

k 1 m , unde xk i yk sunt componentele a doi vectori x i y , atunci valoarea integralei se

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

Se scrie n linia de comand16 (utiliznd sintaxa pentru anonymous function):


J = quad(@(x) x.^2.*sin(x), 0, 10)
sau se poate utiliza inline function:
J = quad(inline('x.^2.*sin(x)'), 0, 10)
i rezult: J = 69.3486

2.5. Structurile de control n GNU Octave17

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.9. Blocuri de comenzi de tip if i switch n GNU Octave i MATLAB


if (condiie)
if (condiie_1)
instruciuni
instruciuni_1
end
elseif (condiie_2)
if (condiie)
instruciuni_2
instruciuni_1
else
else
instruciuni_3
instruciuni_2
end
end
switch (variabila sau expresie)
switch (variabila)
case (etichet sau expresie)
case 1
instruciuni_1
instruciuni_1
case (etichet sau expresie)
case 2
instruciuni_2
instruciuni_2
...
otherwise
otherwise
instruciuni_3
instruciuni_n
end
end

Tabelul 2.10. Blocuri de comenzi de tip for, while i do until n GNU Octave i MATLAB

for variabila = expresie while (condiie) do


instruciuni instruciuni instruciuni
end end until (condiie)

Se face urmtoarea observaie: codul de calcul n MATLAB i GNU Octave poate fi


formulat vectorizat, n scopul accelerrii calculului. Cu ajutorul comenzilor tic i toc se
poate estima timpul de calcul (acesta depinde ns de tipul i de ncrcarea procesorului n
momentul execuiei).
S lum ca exemplu calculul valorilor lui sin x , pentru valori ale lui x cuprinse ntre 0 i 100,
cu pas 0.0001 (rezult 1000001 de valori) problema se poate rezolva n mai multe moduri,
formulate direct n linia de comand, ca mai jos (ntre tic i toc nu se d Enter):
cu ajutorul ciclului cu contor
tic, i=0; for x=0:0.0001:100 i=i+1; y(i)=sin(x); end, toc
Timpul de calcul rezultat este de 0.394602 secunde n MATLAB R2012a i de 10.5612 s n
GNU Octave 3.6.1 (dup cum s-a menionat, valorile timpului de calcul depind de procesor);
n form vectorizat
tic, x = 0:0.0001:100; y = sin(x); toc
140 Staii de pompare i Reele hidraulice cu GNU Octave

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.

S-ar putea să vă placă și