Sunteți pe pagina 1din 36

CURS: Metode numerice avansate (MS5)

Partea 1: Introducere n GNU Octave

Partea 1. INTRODUCERE N GNU OCTAVE


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 n
aceast carte, vor fi utilizate 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 prin 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 web:
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 [http://
www.gnu.org/software/octave/download.html]. Ultima versiune compilat pentru Windows
1

familii/colecii de aplicaii (funcii built-in) specializate

CURS: Modele numerice n Hidraulic i Hidroenergetic

este GNU Octave 3.6.4 (din mai 2013). n prezenta lucrare, exemplificrile vor fi 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, GUI 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++.
Exist un Front-End pentru Octave, anume QtOctave, creat n 2008; interfaa grafic (GUI)
din QtOctave este oarecum asemntoare interfeei grafice din MATLAB. Instruciuni pentru
instalarea QtOctave se gsesc n pagina web: http://www.malinc.se/math/octave/mainen.php
QtOctave 0.10.1 poate fi instalat sub Windows, fiind nc disponibil (din ianuarie 2011) la
adresa web: http://www.outsch.org/2011/01/29/qtoctave-0-10-1-for-windows/
Ca s ruleze QtOctave, mai nti trebuie s fie instalat GNU Octave (cu o versiune din 2011,
de exemplu GNU Octave 3.2.4, din iunie 2011).
Din pcate, din 2011 s-a stopat dezvoltarea QtOctave. Pentru necesitile de calcul ale
studenilor, QtOctave este o opiune/variant practic, iar GNU Octave 3.2.4 este o versiune
acceptabil. Se menioneaz faptul c dup instalare, QtOctave ocup foarte puin spaiu pe
disc (sub 18MB).
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 Simulink i nu cu toate toolbox-urile, ocup un spaiu pe

Partea 1: Introducere n GNU Octave

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).
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 i orice comand poate fi reapelat cu cursorul .
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). 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-in2 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 utilizator, trebuie evitat utilizarea
elementelor unice, specifice limbajului Octave. Recomandm deci cititorilor s utilizeze
sintaxa comun celor dou limbaje de programare.

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
2

CURS: Modele numerice n Hidraulic i Hidroenergetic

Dup cum se va vedea n tabelul 2.1, un dezavantaj al MATLAB n raport cu GNU Octave este
lipsa unei funcii unice de tip built-in, care s permit rezolvarea cu mare acuratee a ecuaiilor
i sistemelor de ecuaii difereniale ordinare (EDO) ataate oricrui tip de problem, simpl sau
dificil. Pentru probleme din categoria EDO, n MATLAB exist diferite funcii, dintre care
numai unele sunt destinate problemelor dificile i oricum, nici una nu asigur o acuratee
ridicat a calculelor. GNU Octave conine a astfel de funcie (lsode), care asigur rezolvarea
cu acuratee ridicat a oricrei probleme, simple sau dificile, din categoria EDO. Acelai gen
de dezavantaj3 se regsete n MATLAB i la rezolvarea ecuaiilor algebrice difereniale, EAD.

Tabelul 2.1. 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
Semnificaie
funcie definit de ctre
utilizator (bloc de
comenzi de tip function)
simbol care precede un
comentariu
simbol care delimiteaz
irul de caractere (string)

Capabiliti/
elemente unice din
GNU Octave
se editeaz funcia
direct n linia de
comand

Capabiliti/ elemente
comune cu MATLAB
se scrie funcia n
editorul de text i se
salveaz *.m

" (ghilimele)

' (apostrof)

exemplu: "string"

exemplu: 'string'

operatori de ridicare la
putere a unui numr

** (exemplu 2**3)

constanta
e = 2.71828182845905
(baza logaritmului
natural)

constanta e este
predefinit i pot fi
efectuate operaii
cu e, de exemplu:
log(e), sau 2*e

exp(1)

...

operatorul de negaie
logic (NOT)
simbol utilizat pentru a
continua o linie pe rndul
urmtor

Observaii

^ (exemplu 2^3)
constanta e = 2.71828 nu
este definit n MATLAB,
deci nu e recunoscut n
MATLAB

plasat dup textul de pe


primul rnd
end la finalul unui bloc de
tip function salvat *.m

ncheierea unui bloc de


comenzi de tip function,
if, for, while, switch

endfunction
endif
endfor
endwhile
endswitch

este opional; idem pentru


endfunction n fiier *.m
end

n GNU Octave, end (sau


endfunction) se scrie
obligatoriu la finalul unui
bloc de tip function dac

Aceste inconveniente nu vor afecta liniile de program, comune celor dou limbaje, propuse n prezenta
carte, deoarece sistemele de ecuaii studiate aici nu sunt de tip EDO/EAD
3

Partea 1: Introducere n GNU Octave

ciclul cu test final


(blocul de comenzi de tip
do until)

indexarea unei entiti


care nu este declarat ca
variabil

funcia e scris direct n


linia de comand
aceast structur de control
nu poate fi utilizat n
MATLAB

do
instruciuni
until (condiie)
exemplul 1:
[3 1 4 1 5 9](3)
ans = 4

exemplul 2:
cos([0 pi pi/4 7])(3)
ans = 0.70711

se asigneaz rezultatul
intermediar unei
variabile i se
indexeaz variabila;
exemplul 2:
d = cos([0 pi pi/4 7])
d(3)
ans = 0.70711

i++ (returneaz

valoarea curent a
lui i i apoi adaug
o unitate la aceasta)
++i (adaug 1 la i i
apoi returneaz
rezultatul)
i (returneaz
valoarea curent a
operatori de decrementare
lui i i apoi scade o
i predecrementare
unitate din aceasta)
specifici limbajelor C,
i (scade 1 din i
C++
i apoi returneaz
rezultatul)
operatori de incrementare
i preincrementare
specifici limbajelor C,
C++

lsode

funcii built-in pentru


ecuaii difereniale
ordinare2 (EDO) aferente
problemelor dificile

lsode

funcii built-in pentru


ecuaii algebrice
difereniale5 (EAD)

dassl
daspk

i i1

pentru vectori i matrice,


operatorii de
decrementare/
predecrementare se aplic
fiecrui element
n MATLAB exist
funciile ode45 (acuratee
moderat), ode23
(acuratee slab) i ode113
(acuratee de la slab la
ridicat)

funcii built-in pentru


ecuaii difereniale
ordinare4 (EDO) aferente
problemelor simple

ii1

pentru vectori i matrice,


operatorii de incrementare/
preincrementare se aplic
fiecrui element

Ordinary Differential Equation (ODE) n englez


Differential-Algebraic Equation (DAE) n englez

ode45
ode23

n GNU Octave, funciile


ode compatibile-MATLAB
se gsesc n pachetul
odepkg
[http://octave.sf.net/odepk
g/], iar utilizarea lor nu
este explicat n manualul
GNU Octave [3]
n MATLAB exist
funciile ode15s, ode23s,
ode23t i ode23tb

(acuratee slab, exceptnd


ode15s cu acuratee cel
mult moderat)

CURS: Modele numerice n Hidraulic i Hidroenergetic

6
aferente problemelor
dificile
funcii built-in pentru
crearea de interfee
grafice (GUI)

2.

fiecare software utilizeaz


propriile funcii pentru
crearea de GUI

Noiuni de baz, script-uri i funcii ale utilizatorului, comenzi

i funcii built-in, structuri de control


n acest paragraf, 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 leam considerat relevante (utile) pentru tematica abordat n prezenta carte.

2.1. Noiuni de baz din GNU Octave i MATLAB


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 ale utilizatorului) 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,

Partea 1: Introducere n GNU Octave

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.
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 comand6.
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. 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-ivirgul), 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 (n cazul calculelor iterative, 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 dou variabile (sau m variabile) diferite.
6

nchiderea de la simbolul (close) conduce la un mesaj de eroare privitor la nchiderea programului

CURS: Modele numerice n Hidraulic i Hidroenergetic

Se 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). 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 scrie astfel:
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

comanda format long sau cu doar dou cifre semnificative dup virgul (format bancar)
utiliznd comanda format bank

Partea 1: Introducere n GNU Octave

Constante utile i variabile speciale

n GNU Octave i n MATLAB sunt definite constante utile de tip built-in. n tabelul 2.2 sunt
prezentate cteva dintre constantele importante, urmate de variabile speciale.
Tabelul 2.2. Constante predefinite i variabile speciale
Constanta
pi
i
j
inf
Inf
NaN

Descriere

3.141592653589793
ambele desemneaz

1 , coeficientul prii imaginare a unui numr complex

ambele reprezint infinit; exemple: 1 0 inf sau 1 0 inf


reprezint nedeterminare (Not A Number); exemple de neterminri ce returneaz NaN:
0/0, inf/inf, 0*inf

realmin

= 2.225073858507201e-308 (adic 2,225 10 308 ): cel mai mic numr pozitiv utilizabil
n calcule (n virgul mobil i dubl precizie)

realmax

= 1.797693134862316e+308 (adic 1,797 10 308 ): cel mai mare numr pozitiv


utilizabil n calcule (n virgul mobil i dubl precizie)

eps

eps = 2.220446049250313e-16 (adic 2,22 10 16 ) n dubl precizie. Se recomand


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
special
ans
nargin
nargout

Descriere
nume de variabil atribuit unui rezultat, dac acesta nu a fost iniial atribuit unei alte
variabile. Exemplu: 2+3, returneaz ans = 5
numrul de argumente de intrare ale unei funcii
numrul de argumente de ieire ale unei funcii

Operatori

Pe lng operatorii aritmetici obinuii (+, , *, / ) i ^ pentru ridicarea la putere,


amintim i operatorul \ (backslash), utilizat n rezolvarea sistemelor de ecuaii liniare. 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.
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 .^ ).

CURS: Modele numerice n Hidraulic i Hidroenergetic

10

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
Funcia

Descriere i exemplu de aplicare

sqrt(x)

rdcina ptrat din x, adic

exp(x)
log(x)
log10(x)

exponeniala din x, adic e x


logaritm natural din x, adic ln x
logaritm zecimal din x, adic lg x

log2(x)

logaritm n baza 2 din x, adic log 2 x

cos(x)
acos(x)

cosinus de x, adic cos x


arcul al crui cosinus este x, adic arccos x
sinus de x, adic sin x
arcul al crui sinus este x, adic arcsin x
tangenta de x, adic tg x
arcul al crei tangent este x, adic arctg x
genereaz un numr aleator (random) ntre 0 i 1
genereaz o matrice ptrat nn de numere aleatoare cuprinse ntre 0 i 1
genereaz o matrice dreptunghiular nm de numere aleatoare cuprinse ntre 0 i 1
valoarea absolut din x
returneaz coeficientul prii reale (notat x) a numrului complex z x i y
returneaz coeficientul prii imaginare (notat y) a numrului complex z x i y

sin(x)
asin(x)
tan(x)
atan(x)
rand
rand(n)
rand(n,m)
abs(x)
real(z)
imag(z)

Tabelul 2.4. Funcii de statistic general


Funcia

min(v)
max(v)

sum(v)
prod(v)

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.
Dac v este o matrice, atunci min(v) sau max(v) returneaz un vector coninnd
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.
Dac v este o matrice, atunci sum(v) sau prod(v) returneaz un vector coninnd suma

Partea 1: Introducere n GNU Octave

11

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
Calculeaz sumele pariale (cumulate)
Calculeaz produsele pariale (cumulate)
Dac v este un vector, calculeaz media aritmetic a elementelor din 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

cumsum(v)
cumprod(v)
mean(v)

elementelor lui x, adic

std(x)

xi x 2 .

n 1
1

i 1

Dac x este o matrice, atunci std(x) returneaz un vector linie care conine deviaiile
standard ale fiecrei coloane din matrice
Sorteaz termenii irului (vectorului) v n ordine cresctoare
Sorteaz termenii irului (vectorului) v n ordine descresctoare

sort(v)
-sort(-v)

Generarea vectorilor, matricelor i irurilor de caractere


Introducerea/generarea vectorilor i matricelor (inclusiv matrice speciale) este exemplificat
n tabelul 2.5, alturi de comenzile legate de controlul dimensiunii vectorilor i matricelor.
La finalul aceluiai tabel este prezentat i introducerea unui ir de caractere (string).
Tabelul 2.5. Introducerea/generarea vectorilor, matricelor i irurilor de caractere. Comenzi pentru
controlul dimensiunii vectorilor i matricelor
Sintaxa
vector_linie = [b1 b2 b3 ...]

sau
vector_linie = [b1, b2, b3, ...]
v = [v1 v2 v3 ...]

v'

sau
transpose(v)

vector_col = [b1; b2; b3;...]

sau
vector_col = [b1 b2 b3 ...]'

Descriere i exemple de aplicare


Creeaz un vector linie care conine valorile sau variabilele b1, b2,
b3, ... (sau combinaii ntre valori i variabile). Valorile/variabilele
sunt delimitate ntre ele prin spaiu, Tab sau virgul.
Exemple: v1 = [1, sqrt(9), 5+i] sau v1 = [1 sqrt(9) 5+i]
Construiete vectorul v, prin concatenarea vectorilor 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,
atunci v' este un vector coloan i invers. Dac vectorul linie
conine numere complexe, prin transpunerea cu v' vor fi afiate
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/
variabilele sunt delimitate ntre ele prin punct-i-virgul sau prin
transpunere dintr-un vector linie folosind caracterul ' (apostrof).
Exemple: v4 = [-3; 5; 2^5] i v5 = [1 5 9]' sunt vectori coloan;
v6 = [log10(1000); log10(10)] returneaz vectorul coloan v6 =

vector = val_in:pas:val_fin

sau
vector = val_in:val_fin

3
1

Genereaz o mulime/serie numeric, ntre valoarea iniial


specificat val_in i valoarea final val_fin, cu pasul specificat:
pas. n cazul n care nu se specific pasul, atunci implicit, pas = 1.

12

CURS: Modele numerice n Hidraulic i Hidroenergetic

v = linspace(val_in, val_fin, n)

sau
v = linspace(val_in, val_fin)

v = logspace(jos, sus, n)

M = [a11 a12 ... a1m; a21 a22 ...


a2m; ...; an1 an2 ... anm]

Exemple: v10 = 1:2:10 returneaz v10 = 1 3 5 7 9


v11 = 1:10 returneaz v11 = 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
nu se specific n, atunci vectorul e generat cu 100 de termeni (99
de subintervale egale). Dac val_in > val_fin, termenii vor fi
generai n ordine descresctoare.
Exemple:
v12 = linspace(0,10,5) returneaz 5 valori v12 = 0 2.5 5 7.5 10
v13 = linspace(12,2,5) returneaz v13 = 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,
atunci vectorul este generat cu 50 de termeni
Exemplu:
v14 = logspace(0,3,4) returneaz v14 = 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 delimitate ntre ele prin punct-i-virgul
Exemplu:
1 2 3

M1 = [1 2 3; 4 5 6; 7 8 9] returneaz matricea M1 = 4 5 6
7 8 9

M = [v_col1 v_col2 v_col3 ...]

sau
M = [v_lin1; v_lin2; v_lin3; ...]

Construiete matricea M, prin concatenarea (alturarea) unor


vectori coloan numii v_col1 v_col2 v_col3 ... (toi de aceeai
dimensiune), sau prin concatenarea unor vectori linie numii
v_lin1, v_lin2, v_lin3, ... (toi de aceeai dimensiune).
Exemple:
Fie 2 vectori linie de cte 3 elemente w1 = [1 2 3] i w2 = [4 5 6]
M2 = [w1; w2] returneaz matricea 23 de forma
M2 =

1 2 3
4 5 6

1 4

M3 = [w1' w2'] matricea 32 de forma M3 = 2 5


3 6

M = [matrice1 matrice 2
matrice3 ...]

sau
M = [matrice1; matrice 2;
matrice3; ...]

Construiete o matrice M prin concatenarea mai multor matrice


numite matrice1, matrice 2, matrice3, ...
Exemple:
Fie 2 matrice 22 definite ca M4 = [1 2; 3 4] i M5 = [5 6; 7 8]
M6 = [M4 M5] returneaz matricea 24 de forma
M6 =

1 2 5 6
3 4 7 8

1 2

M7 = [M4; M5] matricea 42 de forma M7 =

3 4
5 6
7 8

eye(n)

sau
eye(n,m)

eye(n) returneaz matricea identitate de dimensiuni nn (avnd 1


pe diagonala principal i n rest elemente egale cu 0).
eye(n,m) returneaz matricea identitate de dimensiuni nm.

Partea 1: Introducere n GNU Octave

13

Exemple:
1 0 0

M11 = eye(3) returneaz matricea M11 = 0 1 0


0 0 1
M12 = eye(2,3) returneaz matricea M12 =

1 0 0
0

1 0

Returneaz matricea zero de dimensiuni nn, respectiv nm


(avnd toate elementele egale cu 0).
0 0

Exemple: M13 = zeros(2) returneaz matricea M13 =


zeros(n)

sau
zeros(n,m)

M14 = zeros(2,3) returneaz matricea M14 =

0 0

0 0 0
0 0 0

Pentru a crea un vector linie cu m elemente nule se scrie:


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


(avnd toate elementele egale cu 1).
Exemple: M15 = ones(2) returneaz matricea M15 =
ones(n)

sau
ones(n,m)

M16 = ones(2,3) returneaz matricea M16 =

1 1
1 1

1 1 1
1 1 1

Pentru a crea un vector linie cu m elemente egale cu 1 se scrie:


ones(1,m)

Pentru a crea un vector coloan cu n elemente egale cu 1 se scrie:


ones(n,1)
length(v)
length([1:20])
size(A)
size([ 1 2 3; 4 5 6])
string = 'textul meu'

Returneaz lungimea vectorului v (numrul n de elemente din v)


Returneaz ans = 20 (sunt 20 de elemente n irul generat cu pas
egal cu 1, de la 1 la 20)
Returneaz numrul n linii i numrul m de coloane al matricei A
de dimensiuni nm
Returneaz ans = 2 3 (adic 2 linii i 3 coloane)
Definete irul de caractere textul meu

2.2. Script-uri i funcii ale utilizatorului n GNU Octave i MATLAB


Dup cum este descris n Eaton et al [3; pagina 167], sunt 7 moduri n care utilizatorul poate
scrie script-uri i funcii; dintre acestea, 5 vor fi enumerate n cele ce urmeaz:
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;

CURS: Modele numerice n Hidraulic i Hidroenergetic

14

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;
inserarea de 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);
inserarea de 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.
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.


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:

Partea 1: Introducere n GNU Octave

15

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.

2.3. Comenzi i funcii built-in utile din GNU Octave i MATLAB


n tabelele 2.62.9 vor fi prezentate succint comenzi i funcii built-in comune ambelor limbaje
de programare. Excepia de la partea comun corespunde unor funcii built-in aferente
rezolvrii de EDO.
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].
Sintaxa aferent tuturor acestor simboluri ncepe cu operatorul \ (backslash). 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 etc) poate fi scris n stil italic, dac este 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 cei cu experien redus n programare, este practic delimitarea blocurilor de comenzi

CURS: Modele numerice n Hidraulic i Hidroenergetic

16

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

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

\alpha
\beta
\chi
\delta
\epsilon
\eta
\gamma
\mu
\nu
\omega

Simbol

Sintaxa

Simbol

Sintaxa

\psi
\rho
\sigma
\tau
\theta
\zeta
\Delta
\Gamma
\Omega
\Phi

\pm
\equiv
\cong
\approx
\leq
\geq
\times
\infty
\nabla
\partial

\phi

\Pi

\int

\varphi
\pi

\Psi
\Sigma

\in
\subset

Reprezentri grafice
Cteva funcii built-in folosite uzual pentru reprezentri grafice 2D (bidimensionale) i 3D
(tridimensionale) sunt prezentate n tabelele 2.72.9, alturi de opiunile/proprietile ataate.
Tabelul 2.7. Funcii generale pentru grafica 2D i 3D
Funcia
grid sau grid on sau grid('on')
xlabel('variabila_pe_abscisa')
ylabel('variabila_pe_ordonata')
zlabel('variabila_pe_verticala')

title('nume_grafic')

legend('curba_1', 'curba_2')

sau
legend('c1', 'c2', 'location', 'pozitia')

Descriere
Adaug graficului un caroiaj
Adaug graficului o etichet pe abscis (axa Ox), inserat ca
string: 'variabila_pe_abscisa'
Adaug graficului o etichet pe ordonat (axa Oy), inserat
ca string: 'variabila_pe_ordonata '
Adaug graficului o etichet pe axa vertical Oz, pentru
graficele 3D, inserat ca string: 'variabila_pe_verticala '
Adaug graficului un titlu, inserat ca string n funcia title;
implicit, titlul va fi pozitionat n partea de sus a graficului.
Cuvintele default, factory i remove sunt cuvinte rezervate
care nu trebuie s apar n titlu ca un string normal. Pentru a
le include n titlu, se va utiliza sintaxa '\default', '\factory'
respectiv '\remove'
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

Partea 1: Introducere n GNU Octave

axis('auto')
axis([x_left, x_right, y_infer, y_sup])

axis equal sau axis('equal')


axis square sau axis('square')
axis off sau axis('off')
hold on sau hold('on')
hold off sau hold('off')
clf
text(x, y, 'textul_dorit')
gtext('textul_dorit')
orient landscape
orient portrait
orient tall

fill(x, y, 'col')

view(val_azimut, val_elevatie)

[X,Y] = meshgrid(x,y)

17

semnificatia celei de-a doua curbe se trece pe a doua poziie


.a.m.d.
Implicit, legenda este pozitionat n colul de sus-dreapta al
graficului. Pentru poziionarea legendei n alt loc, se va trece
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)
Permite scalarea automat a axelor.
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).
Scaleaz axele cu unitatea pe axa Ox egal cu unitatea de pe
axa Oy.
Scaleaz axele astfel nct graficul s se ncadreze ntr-un
ptrat.
Nu mai afieaz axele graficului
Permite suprapunerea urmtorului grafic peste graficul
curent
Anuleaz suprapunerea unui alt grafic peste graficul curent
terge graficul (curbe, axe, legenda etc) i afieaz fereastra
grafic goal
Adaug graficului textul_dorit, n locul ale crui coordonate
(valori numerice) x i y sunt specificate.
Adaug graficului textul_dorit, n locul ales cu un click al
mouse-ului
Seteaz orientarea graficului tip peisaj (landscape), cu afiare
pe toat pagina.
Seteaz orientarea graficului tip portret (portrait).
Seteaz afiarea graficului pe toat nlimea paginii, n
orientare tip portret
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
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')
Schimb unghiul din care este vizualizat un grafic 3D. Se
va specifica valoarea numeric val_azimut a unghiului
azimutal n grade (rotaia dup axa Oz) i valoarea numeric
val_elevatie a elevaiei n grade (unghi de vedere ctre partea
superioar, sau inferioar a graficului). Implicit, un grafic 3D
este afiat cu view(-37.5, 30)
Comanda meshgrid este folosit n grafica 3D, pentru
generarea suprafeelor tridimensionale; meshgrid genereaz 2
matrice X i Y care definesc o reea dreptunghiular cu m
linii i n coloane n planul xOy, pe baza lui x care este vectorul
linie cu n elemente de pe axa Ox i pe baza lui y care este
vectorul linie cu m elemente de pe axa Oy. Dac n = m,
reeaua este ptratic. n fiecare punct definit de linia i i

CURS: Modele numerice n Hidraulic i Hidroenergetic

18

coloana j din reeaua de dimensiuni mn, coodonatele sunt x(j)


i y(i). Poate fi utilizat i sintaxa: [x,y] = meshgrid(x,y) n
care n dreapta, x i y sunt vectori, iar n stnga, acetia au fost
transformai n matricele x i y.
Exemplu: Fie x = [1 2] i y = [3 4 5]
1 2

3 3

[x,y] = meshgrid(x,y) returneaz x = 1 2 i y = 4 4


1 2
5 5

print -doptiune numegrafic

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);
tiff sau jpeg (format 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. 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
(proprietile) ataate

Descriere
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.
Dac nu se specific culoarea n comanda plot, se va
utiliza automat ordinea culorilor din proprietatea presetat
ColorOrder

plot(x, y)

sau
plot(x, y, 'optiuni')

Dac nu se specific tipul liniei, se va trasa implicit o linie


continu
Dac nu se specific tipul marker-ului, nu se va insera
niciun 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')

Partea 1: Introducere n GNU Octave

19

Grafic 2D
600
y 1 = x 3 sin(x)
400

y 2 = x 3 cos(x)

200

y 1 si y 2

0
-200
-400
-600
-800
-1000

Opiunea de stil a liniei/curbei


'' (aici este semnul minus)
':'
'.' (semnul minus urmat de punct)
' ' (dou minusuri succesive)

Opiunea de grosime a liniei


'linewidth', val

Opiunea tipului de marker


'simbol'

Mrimea marker-ului
'markersize', val

Opiunea de culoare a liniei


'col'

semilogx(x, y)

sau
semilogx(x, y, 'optiuni')

semilogy(x, y)

sau

5
x

10

Seteaz stilul linie continu (este stilul implicit i nu este


nevoie s fie explicitat)
Seteaza stilul linie punctat
Seteaz stilul linie-punct
Seteaz stilul linie ntrerupt
Permite setarea grosimii curbei trasate, la valoarea
specificat val (numr ntreg)
Seteaz tipul de marker specificat prin simbol. Se poate
utiliza8:
'*' pentru asterisc
'o' pentru cercuri deschise
'+' pentru plusuri
'x' pentru x-uri
'^' pentru triunghi cu vrful n sus
'.' pentru punct (se recomand i opiunea 'markersize', 8)
Seteaz mrimea marker-ului la valoarea numeric val
specificat (numr ntreg)
Seteaz linia/curba cu culoarea col specificat. Conform
codului de culori, culoarea col poate fi9:
'r' roie (red)
'b' albastr (blue)
'k' neagr (black)
'g' verde (green; de fapt este verde fluorescent)
'm' roz (magenta; un amestec spectral dintre rou i albastru)
'c' turcoaz (cyan)
'w' alb (white)
Traseaz graficul y=y(x) utiliznd scara logaritmic pe axa
Ox (logaritmi zecimali). La logaritmare, sunt omise valorile
negative
Traseaz graficul y=y(x) utiliznd scara logaritmic pe axa
Oy (logaritmi zecimali). La logaritmare, sunt omise valorile
negative
Exemplu:

semilogy(x, y, 'optiuni')

x = 1:1000;, y = x.^3;
semilogy(x, y, 'g', 'linewidth', 3)
legend('y = x^3','location','east'), grid
xlabel('x'), ylabel('y'), title('Scara logaritmica pe Oy')

loglog(x, y)

Traseaz graficul y=y(x) utiliznd scara logaritmic


(logaritmi zecimali) pe ambele axe Ox i Oy. La logaritmare,
sunt omise valorile negative

sau
loglog(x, y, 'optiuni')

n MATLAB sunt mult mai multe tipuri de marker


n MATLAB, 'y' reprezint culoarea galben (yellow), iar n toolbox-ul de grafic este disponibil
ntreaga palet de culori
8
9

20

bar(x, y)

sau
bar(x, y, val)

CURS: Modele numerice n Hidraulic i Hidroenergetic


Traseaz un grafic de tip bare, util n reprezentarea variaiei
unor valori de-a lungul timpului, exprimat n ore, zile, luni sau
ani. Implicit, limea unei bare este de 0.8; dac se dorete
impunerea unei alte valori numerice, atunci se alege o valoare
val n sintaxa bar(x, y, val)
Exemplu:
x = 1:12, y = abs(sin(x)), bar(x, y, 0.5), xlabel('luni')

stairs(x, y)
errorbar(x, y, er)

sau
errorbar(y, er)

Traseaz un grafic n trepte


Exemplu:
x = 1:10;, y = x.^2.*cos(x);
stairs(x, y, 'm', 'linewidth', 2), grid, axis([1 10 -80 40])

Traseaz un grafic y=y(x) cu segmente care definesc erorile


[y+er y-er], cuprinse n vectorul er (un vector de aceeai
lungime cu x i y)
Exemplu:
x = 1:10;, y = x.*cos(x);, er = std(y)*0.5*ones(size(x))
errorbar(x, y, er, 'k', 'linewidth', 2), grid

errorbar(x,y, jos, sus)

Traseaz un grafic y=y(x) cu segmente care definesc erorile


definite n vectorul jos pentru {yjos} i n vectorul sus
pentru {y+sus}.
Fiecare segment de eroare are lungimea (jos(i)+sus(i)) i este
desenat poziionat cu valoarea jos(i) sub punctul {x(i), y(i)},
respectiv cu valoarea sus(i) peste punctul {x(i), y(i)}. Vectorii
x, y, jos i sus trebuie s aib aceeai lungime
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

0.5

0.5

0.5

0.5

0.5

0.8

0.9

0.6

0.8

0.4
0

0.5

0.7

0.2
0

0.6
0

0.5

1
0.5

1
0

0.5

0.5

0.5

0.5

0.4

0.8

0.3

0.6
0.2

0.4

0.1

0.2

sau
se vor tasta urmtoarele combinaii (n, m, pozitia) n cadrul
funciei subplot:
0

subplot(n, m, pozitia)

0.5

0.5

3,2,1 3,2,2
3,2,3 3,2,4
3,2,5 3,2,6

0.5

0.5

2,2,1
2,2,3 1,2,2

sau

Exemplu: Graficul graficul matrice 22 de mai jos este trasat


cu urmtoarele comenzi
y 1(x)

y 2(x)

0.5

0.5

-0.5

-0.5

-1

10

15

20

-1

y 3(x)

x 10

10

15

20

15

20

y 4(x)
1

0.5

0.5

0
0

-0.5
-1

10

15

20

-0.5

10

Partea 1: Introducere n GNU Octave

21

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

Tabelul 2.9. Funcii pentru trasarea graficelor 3D


Funcia i/sau opiunile
(proprietile) ataate

Descriere
Traseaz o suprafa z = z(x,y), cu faete colorate. Variabilele
x, y i z sunt matrice de aceleai dimensiuni. Dac iniial x0 i
y0 sunt vectori, se transform n x matrice i y matrice cu
ajutorul funciei meshgrid.
sin ( x 2 y 2 )

, cu
Se va exemplifica pentru ecuaia z

(x2 y2 )
care se traseaz plria mexican (sombrero), unde
x 10; 10 i y x , considernd o discretizare cu cte N
puncte (fie N = 101) pe fiecare ax din planul xOy (anume Ox
i Oy). Exemplu:
surf(x, y, z)

x0 = linspace(-10, 10, 101);


% sau x0 = -10:20/100:10;
y0 = x0;, [x, y] = meshgrid(x0,y0);
r = sqrt(x.^2+y.^2);, z = sin(r)./(r+eps);
% s-a adaugat eps la numitor pentru a evita impartirea cu 0
cand x = y =0
surf(x,y,z), xlabel('x'), ylabel('y'), zlabel('z')
title('Sombrero')

returneaz graficul:
Sombrero

1
0.8
0.6

0.4
0.2
0
-0.2
-0.4
10
5

10
5

-5
y

shading interp

-5
-10

-10

Aceast comand interpoleaz culorile de pe faetele


graficului trasat cu funcia surf. Pentru sombrero, aplicarea
shading interp conduce la urmtorul grafic:

22

CURS: Modele numerice n Hidraulic i Hidroenergetic


Sombrero

1
0.8
0.6

0.4
0.2
0
-0.2
-0.4
10
5

10
5

-5

-5
-10

-10

Aceast opiune permite setarea paletei de culori, codul de


culori presetate pentru 'paleta' fiind: 'jet', 'hsv', 'hot',
'spring', 'summer', 'autumn', 'winter', cool', 'copper',
'gray', 'bone', 'pink'; vezi help colormap.
Implicit, colormap este setat pe 'jet'. Utiliznd
colormap(cool) pentru sombrero, rezult:
Sombrero

colormap('paleta')

1
0.8
0.6

0.4
0.2
0
-0.2
-0.4
10
5

10
5

-5

-5
-10

-10

Traseaz o suprafa z = z(x,y), format dintr-o reea 3D de


linii colorate (ca o plas). Variabilele x, y i z sunt matrice de
aceleai dimensiuni.
Exemplu: pentru matricele x, y i z calculate anterior pentru
suprafaa sombrero, funcia mesh returneaz graficul de mai
jos; am adugat i comanda colormap(winter)
mesh(x, y, z)

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
10
5

10
5

-5

-5
-10

-10

Traseaza o suprafa z = z(x,y), cu faete colorate i cu linii de


contur proiectate n planul xOy, obinute prin intersectarea
suprafeei 3D cu plane paralele cu planul xOy i proiectarea
curbelor de nivel pe planul xOy de jos.
Exemplu: pentru matricele x, y i z calculate anterior pentru
suprafaa sombrero, funcia surfc returneaz graficul:
surfc(x, y, z)

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
10
5

10
5

-5

-5
-10

-10

Partea 1: Introducere n GNU Octave

23

Traseaz o curb tridimensional, unde x, y i z sunt vectori


cu acceai lungime. Exemplu: Spirala 3D prezentat aici
Spirala 3D

35
30
25

20
15
10
5

plot3(x, y,z)

0
40
20

40
20

-20

-20
-40

x cos(x)

-40

x sin(x)

este generat prin comenzile


x = 0:pi/50:10*pi;, plot3(x.*sin(x), x.*cos(x), x)
grid, axis square
xlabel('x sin(x)'), ylabel('x cos(x)'), zlabel('x')
title('Spirala 3D')
Traseaz liniile de contur de valori z const. (curbe de
contour(z)

sau
contour(x, y, z)

sau
contour(z, N)

[dzdx, dzdy] = gradient(z,dx,dy)

nivel) n planul xOy, corespunztoare interseciei unei


suprafee 3D, z zx, y , cu plane z const.
Funciile contour(z) i contour(x,y,z) sunt echivalente i
traseaz implicit 8 curbe de nivel.
Funcia contour(z,N) permite trasarea unui numr N specificat
de curbe de nivel.
Calculeaz componentele gradientului unei funcii de 2
variabile, adic derivatele z x dz dx i z y dz dy
ale gradientului funciei z zx, y .
Exemplu: pentru funcia sombrero, vom scrie urmtoarele linii
de comand (vectorul x0 va avea doar 51 de componente)
x0 = -10:20/50:10; y0 = x0;, [x, y] = meshgrid(x0,y0);
r = sqrt(x.^2+y.^2);, z = sin(r)./(r+eps);
[dzdx, dzdy] = gradient(z, 20/50, 20/50);

Traseaz vectorii vitez ca sgei ale cror componente sunt u


i v, n puncte de coordonate (x,y). Matricele x, y, u i v
trebuie s aib aceeai dimensiune. Funcia quiver scaleaz
automat sgeile aferente vitezelor. Dac dorim s mrim
dimensiunea sgeilor, se poate da o valoarea numeric lui
val. Pentru a schimba culoarea implicit (care este albastru),
se poate folosi codul de culori n 'optiune'
Exemplu: pentru funcia sombrero, pentru care s-a calculat
deja gradientul funciei, vectorii vitez (de componente dzdx
i dzdy) se pot trasa astfel
quiver(x, y, u, v)

quiver(x, y, dzdx, dzdy, 5, 'k')

sau

returneaz graficul:

quiver(x, y, u, v, val, 'optiune')

15

10

-5

-10

-15
-15

-10

-5

10

15

CURS: Modele numerice n Hidraulic i Hidroenergetic

24

Peste acest grafic, putem aduga i curbe de nivel trasate


pentru sombrero cu funcia contour (de exemplu, 25 de curbe
de nivel), utiliznd sintaxa:
hold on, contour(x, y, z, 25), colormap(cool)

Identificarea i manipularea componentelor vectorilor i matricelor


Exist comenzi i funcii pentru identificarea i manipularea componentelor vectorilor i
matricelor. Astfel, 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
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


Pentru a roti o matrice A cu 90 n sens trigonometric, se folosete comanda rot90(A)
Pentru a roti o matrice A cu multipli de 90 n sens trigonometric se scrie rot90(A,k) unde k
este multiplul respectiv, pozitiv, cu valori k = 1, 2, 3; pentru rotire n sens orar, multiplii au
valori negative: k = -1, -2, -3

Partea 1: Introducere n GNU Octave

25

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: P x x 7 3 x 2 2 x 1 0 ; soluia se obine cu sintaxa c=[1 0 0 0 0 -3 2 -1],
x=roots(c) sau se poate scrie direct (dac ecuaia este scurt), x=roots([1 0 0 0 0 -3 2 -1])

Rezult o soluie real i 3 perechi de soluii complexe, conjugate.


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

CURS: Modele numerice n Hidraulic i Hidroenergetic

26

Ambele funcii fzero i fsolve necesit o soluie de start (o aproximare iniial a soluiei, pe
care s o furnizeze utilizatorul); apoi, funcia built-in specific va cuta soluia final n
apropierea soluiei de start, iar convergena va depinde (n mod evident) 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 LevenbergMarquardt) i poate furniza soluia pentru sisteme neliniare ataate problemelor inginereti,
chiar dac soluia de start este non-fizic (departe de realitate). n consecin, recomandm
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).
Sintaxa aferent funciei fsolve este: [X, valoareF, codconverg] = fsolve(@nume, X0) unde
X0 este valoarea soluiei de start pentru o ecuaie transcendent, sau vectorul coloan al soluiei

de start pentru un sistem de ecuaii neliniare, nume este denumirea funciei scrise de ctre
utilizator, n care este inclus, dup caz, ecuaia sau sistemul de ecuaii neliniare (nume fiind
un string, el poate fi inserat precedat de @, adic @nume sau sub forma clasic 'nume' cu
apostroafe), X este soluia sau vectorul soluiei, valoareF conine, dup caz, valoarea lui f sau
valorile fiecrei componente a vectorului F dup aflarea soluiei (aceste valori trebuie s fie
cvasi-nule dac a fost atins soluia), iar codconverg este un mesaj codificat corespunztor
gradului de convergen atins; codconverg = 1 nseamn c a fost atins convergena; pentru
alte valori numerice din codul de convergen, accesai help fsolve Se poate utiliza i sintaxa
scurt: X = fsolve(@nume, X0)
Aplicarea funciei fsolve pentru soluionarea ecuaiilor transcendente se poate efectua n
dou variante. Exemplu: fie ecuaia
f x x 3 sin x 5 0 ,

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


Se scrie n editorul de text o funcie10 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

10

n function, nu este nevoie de operator element-cu-element; se poate scrie x.^3 sau x^3

(2.2)

Partea 1: Introducere n GNU Octave

27

Se tasteaz direct n linia de comand11: x = fsolve(@(x) x^3+sin(x)-5, 1) i rezult


aceeai valoare x = 1.5874 (varianta este mult mai compact i se poate aplica uor pentru
ecuaiile care nu au o form prea complicat).
Aplicarea funciei fsolve pentru soluionarea sistemelor de ecuaii neliniare se poate
efectua, de asemenea, n dou variante. Exemplu: fie sistemul FW 0 , unde
f1 w12 w1w2 3w2 2 0
, cu soluia de start

f 2 w22 7 w1 5 0

w10 1
.

1
20

(2.3)

Rezolvarea numeric este:


Se scrie n editorul de text o funcie12 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

apoi se tasteaz n linia de comand: w = fsolve(@sistem, [1; 1]) i rezult w =

- 0.6499
0.6713

Se tasteaz direct n linia de comand13:


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 soluia de start. Rezult aceleai valori ale
componentelor vectorului w. n cazul sistemelor de ecuaii neliniare, varianta compact se
poate aplica uor doar pentru sisteme mici, cu puine ecuaii, n care ecuaiile nu au o form
prea complicat, deoarece n acest caz, sistemul trebuie scris sub forma unui vector coloan.
Aproximarea datelor
Regresia polinomial poate fi abordat cu ajutorul funciilor denumite polyfit i polyval.
Fie o funcie y y x , 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:

n fsolve, nu este nevoie de operator element-cu-element; se poate scrie x.^3 sau x^3
n function, nu este nevoie de operatori element-cu-element; se poate scrie w(1).^2 sau w(1)^2
13
n acest mod de scriere compact n fsolve, nu este nevoie de operatori element-cu-element
11
12

28

CURS: Modele numerice n Hidraulic i Hidroenergetic

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


Interpolarea cu funcii cubice spline este o alt variant de aproximare a funciei y y x
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
Pentru integrale curbilinii,
b

J yx dx ,

(2.5)

dac integrandul y y x este definit tabelar, prin perechi de valori discrete

xk , yk

cu

k 1 m , unde xk i y k 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 y x 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: J = quad(@nume,a,b) unde nume este denumirea

Partea 1: Introducere n GNU Octave

29

funciei scrise de ctre utilizator, n care este inclus integrandul (nume fiind un string, el poate
fi inserat precedat de @, adic @nume sau sub forma clasic 'nume' cu apostroafe), iar a i b
sunt limitele de integrare. Dac integrandul are o form simpl, poate fi utilizat sintaxa
compact J = quad(@(x) integrand, a, b) n care pe poziia cuvntului integrand se trece
expresia matematic a lui y x . Exemplu: fie integrala curbilinie
10

J x 2 sin x dx .

(2.6)

Se scrie n linia de comand14: J = quad(@(x) x.^2.*sin(x),0,10) i rezult valoarea integralei:


J = 69.3486

Funcia quad poate fi aplicat i pentru integrale improprii convergente, pentru care limitele de
integrare pot fi +inf sau -inf.
Integralele duble, de tipul
J f x, y dx dy ,

(2.7)

se pot rezolva numeric cu funcia built-in dblquad aplicabil cu sintaxa: J = dblquad(@nume,


xmin, xmax, ymin, ymax), n care nume este denumirea funciei scrise de ctre utilizator, n

care este inclus integrandul; limitele de integrare dup x sunt xmin i xmax, iar limitele de
integrare dup y sunt ymin i ymax.
Exist i o sintax compact: J = dblquad(@(x,y) integrand, xmin, xmax, ymin, ymax) n
care pe poziia cuvntului integrand se trece expresia matematic a lui f x, y . Pentru
integrala dubl, se vor prezenta n continuare dou variante de aplicare a funciei dblquad
Exemplu: fie integrala dubl
2

y sin x x cos y dx dy .

(2.8)

Se scrie n editorul de text o funcie15 care se salveaz ca fiier nume.m astfel:


function f = nume(x,y)
f = y.*sin(x) + x.*cos(y);
end

% finalizarea funciei cu end este opional

apoi se tasteaz n linia de comand: J=dblquad(@nume,-pi,2*pi,0,2*pi) i rezult J=-39.4784


Se tasteaz direct n linia de comand16:

14
15

n quad, se aplic obligatoriu operatorii element-cu-element; trebuie scris x.^2.*sin(x)


n function, nu este nevoie de operatori element-cu-element; poate fi scris y.*sin(x) sau y*sin(x)

CURS: Modele numerice n Hidraulic i Hidroenergetic

30

J = dblquad(@(x,y) y*sin(x) + x*cos(y), -pi, 2*pi, 0, 2*pi) i rezult J = -39.4784

Integralele triple, J f x, y, z dx dy dz , se pot rezolva numeric cu funcia triplequad


aplicabil cu sintaxa: J = triplequad(@nume, xmin, xmax, ymin, ymax, zmin, zmax), n care
nume este denumirea funciei scrise de ctre utilizator, n care este inclus integrandul; limitele

de integrare dup x sunt xmin i xmax, limitele de integrare dup y sunt ymin i ymax, iar
limitele de integrare dup z sunt zmin i zmax. Poate fi utilizat i sintaxa compact:
J = triplequad(@(x,y,z)

integrand, xmin, xmax, ymin, ymax, zmin, zmax) n care pe

poziia cuvntului integrand se trece expresia matematic a lui f x, y, z .


Rezolvarea ecuaiilor i sistemelor de ecuaii difereniale ordinare (EDO)
Dup cum s-a specificat deja, excepia de la partea comun ambelor limbaje de programare
(GNU Octave i MATLAB) corespunde unor funcii built-in aferente rezolvrii de EDO.
Astfel, GNU Octave conine a astfel de funcie, denumit lsode, care asigur rezolvarea cu
acuratee ridicat a oricrei probleme, simple sau dificile, din categoria EDO; funcia lsode nu
este implementat n MATLAB. Pentru probleme din categoria EDO, n MATLAB exist 7
funcii diferite, dintre care numai 4 sunt destinate problemelor dificile, iar acurateea calculelor
este limitat (vezi tabelul 2.1). n continuare, nu vor fi prezentate dect sintaxele (cu exemple
de aplicare) aferente funciei lsode din GNU Octave, precum i aferente funciei ode45, care
se regsete n ambele software-uri (n conformitate cu tabelul 2.1, sunt doar 2 funcii comune
ambelor software-uri pentru soluionarea EDO, anume ode45 i ode23). Pentru oricare alt
variant de funcie de tip ode din MATLAB, sintaxa de aplicare este similar funciei ode45.
O ecuaie diferenial ordinar de ordinul 1, cu condiie iniial, poate fi scris, de
exemplu, sub forma:

dy
f x, y ,
dx

(2.9)

unde y y x pentru x x1; xn , pentru care se cunoate valoarea yx1 y0 impusa ,


aceasta reprezentnd condiia iniial a problemei. Rezolvarea const n integrarea ecuaiei
(2.9) de-a lungul intervalului de variaie a lui x i aflarea valorii finale yxn .
Un sistem de m ecuaii difereniale ordinare de ordinul 1, cu condiii iniiale, poate fi
scris sub forma:

16

n dblquad, nu este nevoie de operatori element-cu-element; poate fi scris y.*sin(x) sau y*sin(x)

Partea 1: Introducere n GNU Octave

dy1
dx f1 y1 , y2 , yn , x

dy2 f y , y , y , x
2 1 2
n
, cu condiii iniiale:
dx

dy m f y , y , y , x
m 1 2
n
dx

y1 x1 y01

y2 x1 y0 2
,

ym x1 y0
m

31

(2.10)

unde y y x este un vector ale crui componente depind de x , pentru x x1; xn , iar y 0 este
vectorul corespunztor celor m condiii iniiale cunoscute.
O ecuaie diferenial ordinar de ordinul m, cu m condiii iniiale, poate fi transformat
ntr-un sistem de m EDO de ordinul 1, cu condiii iniiale, ca cel scris mai sus: (2.10).
Sintaxa corespunztoare pentru aplicarea funciei lsode din GNU Octave este urmtoarea:
y=lsode(@edo, y0, x) unde edo este denumirea funciei scrise de ctre utilizator, n care este

inclus ecuaia (2.9) sau sistemul (2.10), y0 este valoarea condiiei iniiale pentru (2.9) sau este
vectorul condiiilor iniiale pentru (2.10), iar x este vectorul valorilor lui x ; intervalul de
variaie a lui x , anume x x1; xn , trebuie discretizat de ctre utilizator n n 1 intervale,
astfel nct s rezulte un numr n rezonabil de valori ale lui x .
Particularitatea aplicrii funciei lsode const n modul de scriere a funciei edo, o funcie n
care prima variabil de intrare este y (pentru 2.9) sau y pentru (2.10), iar cea de-a doua
variabil de intrare este x , rezultnd edo(y,x)
Exemplul 1: fie urmtoarea EDO de gradul 1, cu condiie iniial
y

dy
3x 2

3
( x 3 1) y 2 sin x , unde x 0; , cu y 0 1 .
dx
( x 1)
4

(2.11)

Intervalul de variaie a lui x se va discretiza n 50 de subintervale. Se scrie n editorul de text o


funcie17 care se salveaz ca fiier edo.m astfel:
function f = edo(y,x)
f = -3*x^2/(x^3+1) + (x^3+1)*y^2*sin(x);
end

% finalizarea funciei cu end este opional

apoi se tasteaz n linia de comand:


x = 0:pi/200:pi/4;
y = lsode(@edo, 1, x)

17

n function, nu este nevoie de operatori element-cu-element; poate fi scris x.^2 sau x^2

CURS: Modele numerice n Hidraulic i Hidroenergetic

32

i rezult vectorul y cu 50 de valori; ultima valoare calculat este y 4 0.95091 . Soluia

analitic a ecuaiei (2.11) este: ya ( x3 1) cos x

, care pentru x 4 , are valoarea

ya 4 0.95267, eroarea relativ dintre cele dou rezultate fiind de 0.18%.


Exemplul 2: fie urmtoarea EDO de gradul 2, cu condiii iniiale (care reprezint ecuaia lui
Van der Pol, deoarece descrie micarea oscilatorului Van der Pol)
d2 y
dt 2

1 y2

ddyt y 0 , unde t 0; 20, cu yy0000.25 .

(2.12)

Fie constanta 1 . Notnd y w1 i y w2 , ecuaia (2.12) se transform n urmtorul


sistem de 2 EDO de gradul 1, cu condiii iniiale:

w1 w2
, unde t 0; 20 , cu

w2 1 w1 w2 w1

w1 0 0.25
.

w2 0 0

(2.13)

Intervalul de variaie a lui x se va discretiza n 200 de subintervale.


Se scrie n editorul de text o funcie18 care se salveaz ca fiier edo.m astfel:
function f = edo(w,t)
f(1) = w(2);
f(2) = (1-w(1)^2)*w(2)-w(1);
end

% finalizarea funciei cu end este opional

care se poate scrie i compact, cu f sub form de vector coloan:


function f = edo(w,t)
f = [w(2); (1-w(1)^2)*w(2)-w(1)];
end

% finalizarea funciei cu end este opional

Apoi se tasteaz n linia de comand:


t = 0:0.1:20;
w = lsode(@edo, [0.25; 0], t)

i rezult matricea w cu dou coloane, n care prima coloan w(:,1) este w1 (adic y ) i a doua
coloan w(:,2) este w2 (adic derivata y ). Ultima valoare y t 20 este w(201,1)=1.44751
Graficul de variaie y y t i y yt se traseaz n GNU Octave (vezi figura 2.1) cu
urmtoarele comenzi:
plot(t,w(:,1), 'k', 'linewidth', 2), grid, hold on, plot(t,w(:,2), 'k')
xlabel('t'), ylabel('y & dy/dt'), legend('y', 'dy/dt', 'location', 'northwest')
print -dpng vanderpol.png
18

% grafic salvat ca fisier numit vanderpol.png

n function, nu este nevoie de operatori element-cu-element; poate fi scris w(1).^2 sau w(1)^2

Partea 1: Introducere n GNU Octave

33

Fig. 2.1. Oscilatorul Van der Pol: variaia y y t cu linie groas i y y t cu linie subire

Vom relua acum Exemplul 1 i Exemplul 2 cu ajutorul funciei ode45, care este implementat
n ambele software-uri.
Sintaxa corespunztoare pentru aplicarea funciei ode45 din MATLAB i din GNU Octave
este urmtoarea: [x,y]= ode45(@edom, [x1 xn], y0) unde edom este denumirea funciei
scrise de ctre utilizator, n care este inclus ecuaia (2.9) sau sistemul (2.10), [x1 xn] este
intervalul de variaie a lui x , anume x1; xn , cu prima i ultima valoare din interval, iar y0 este
valoarea condiiei iniiale pentru (2.9) sau este vectorul condiiilor iniiale pentru (2.10). Pentru
funcia ode45, utilizatorul nu trebuie s trebuie discretizeze intervalul de variaie a lui x ;
variaia lui x va fi un rezultat (output) al rulrii.
Pentru aplicarea funciei built-in ode45 se scrie funcia edom, n care prima variabil de
intrare este x , iar cea de-a doua variabil de intrare este y (pentru 2.9) sau y pentru (2.10),
rezultnd edom(x,y)
Pentru Exemplul 1 EDO de gradul 1, cu condiie iniial (2.11), rezolvarea se face cu
urmtoarele linii de comand:
function f = edom(x,y)
f = -3*x^2/(x^3+1) + (x^3+1)*y^2*sin(x);
end

% finalizarea funciei cu end este opional

apoi se tasteaz n linia de comand:


[x,y] = ode45(@edom, [0 pi/4], 1)

i se obin vectorii coloan x i y (cu cte 41 de valori, numrul de valori fiind aici un rezultat
al calculului); ultima valoare calculat este y 4 0.95091 (la fel ca n cazul lsode).

CURS: Modele numerice n Hidraulic i Hidroenergetic

34

Pentru Exemplul 2 sistem de 2 EDO de gradul 1, cu condiii iniiale (2.13), rezolvarea se


face cu urmtoarele linii de comand:
function f = edom(t,w)
f = [w(2); (1-w(1)^2)*w(2)-w(1)];
end

% finalizarea funciei cu end este opional

Apoi se tasteaz n linia de comand:


[t,w] = ode45(@edom, [0 20], [0.25; 0])

i se obine vectorul t (cu 201 elemente, numrul de elemente fiind aici un rezultat al
calculului, fr legtur cu rezultatul obinut cu lsode), respectiv se obine matricea w cu dou
coloane i 201 linii, n care prima coloan w(:,1) este w1 (adic y ) i a doua coloan w(:,2)
este w2 (adic derivata y ). Ultima valoare y t 20 este w(201,1)=1.49001 (rezultat care
este mai mare cu 2.8% fa de rezultatul obinut cu funcia lsode). Valoarea credibil pentru

y t 20 este cea din lsode, fiindc funcia lsode asigur o acuratee de calcul ridicat;
funcia ode45 are o acuratee de calcul cel mult moderat i este o funcie destinat
problemelor simple; sistemul (2.13) derivat din ecuaia Van der Pol ine de categoria
problemelor dificile. La rezolvarea aceluiai sistem (2.13) n MATLAB, cu o funcie
destinat problemelor dificile, anume ode15s (unde s vine de la stiff, adic dificil), rezult:
[t,w] = ode15s(@edom, [0 20], [0.25; 0])

i se obine un vector t cu 193 elemente, iar soluia cutat, y t 20 , este w(193,1)=1.44253


(fa de rezultatul obinut cu lsode, aceasta nseamn o subestimare de 0,3%).

2.4. Structurile de control n GNU Octave i MATLAB


Structurile de control sunt scrise aici n forma comun ambelor limbaje de programare:
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.10.
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 comenzi de
tip while), sau ntr-un ciclu cu test final (blocul de comenzi de tip do until), dup cum urmeaz
n tabelul 2.11.

Partea 1: Introducere n GNU Octave

35

Tabelul 2.10. Blocuri de comenzi de tip if i switch


if (condiie)

instruciuni
end
if (condiie)

instruciuni_1
else

instruciuni_2

if (condiie_1)

instruciuni_1
elseif (condiie_2)

instruciuni_2
else

instruciuni_3
end

end
switch (variabila)
case 1

instruciuni_1
case 2

instruciuni_2
otherwise

instruciuni_3
end

switch (variabila sau expresie)


case (etichet sau expresie)

instruciuni_1
case (etichet sau expresie)

instruciuni_2
...
otherwise

instruciuni_n
end

Tabelul 2.11. Blocuri de comenzi de tip for i while n GNU Octave i MATLAB,
respectiv bloc de comenzi de tip do until n GNU Octave
for variabila = expresie
instruciuni
end

while (condiie)
instruciuni
end

do
instruciuni
until (condiie)

Timpul de calcul
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).
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 cu ajutorul ciclului cu
contor, formulat astfel:
tic
i = 0;
for x = 0:0.0001:100
i = i + 1;
y(i) = sin(x);
end
toc

care apoi se scrie direct n linia de comand ca mai jos (ntre tic i toc nu se d Enter):
tic, i=0; for x=0:0.0001:100 i=i+1; y(i)=sin(x); end, toc

36

CURS: Modele numerice n Hidraulic i Hidroenergetic

Timpul de calcul rezultat este: 0.394602 secunde n MATLAB R2012a i 10.5612 s n GNU
Octave 3.6.1. n scrierea vectorizat sub forma:
tic, x = 0:0.0001:100; y = sin(x); toc

rezult 0.026515 s n MATLAB (de circa 15 ori mai repede ca n ciclul cu contor) i
0.0623999 secunde n GNU Octave (de 169 de ori mai repede ca n ciclul cu contor). Exist o
form mult mai compact,
tic, y = sin(0:0.0001:100); toc

pentru care 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.