Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
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
endfunction
endif
endfor
endwhile
endswitch
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
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
lsode
dassl
daspk
i i1
ii1
ode45
ode23
6
aferente problemelor
dificile
funcii built-in pentru
crearea de interfee
grafice (GUI)
2.
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.
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
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
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
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
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
realmin
= 2.225073858507201e-308 (adic 2,225 10 308 ): cel mai mic numr pozitiv utilizabil
n calcule (n virgul mobil i dubl precizie)
realmax
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
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
sqrt(x)
exp(x)
log(x)
log10(x)
log2(x)
cos(x)
acos(x)
sin(x)
asin(x)
tan(x)
atan(x)
rand
rand(n)
rand(n,m)
abs(x)
real(z)
imag(z)
min(v)
max(v)
sum(v)
prod(v)
11
cumsum(v)
cumprod(v)
mean(v)
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)
sau
vector_linie = [b1, b2, b3, ...]
v = [v1 v2 v3 ...]
v'
sau
transpose(v)
sau
vector_col = [b1 b2 b3 ...]'
vector = val_in:pas:val_fin
sau
vector = val_in:val_fin
3
1
12
v = linspace(val_in, val_fin, n)
sau
v = linspace(val_in, val_fin)
v = logspace(jos, sus, n)
M1 = [1 2 3; 4 5 6; 7 8 9] returneaz matricea M1 = 4 5 6
7 8 9
sau
M = [v_lin1; v_lin2; v_lin3; ...]
1 2 3
4 5 6
1 4
M = [matrice1 matrice 2
matrice3 ...]
sau
M = [matrice1; matrice 2;
matrice3; ...]
1 2 5 6
3 4 7 8
1 2
3 4
5 6
7 8
eye(n)
sau
eye(n,m)
13
Exemple:
1 0 0
1 0 0
0
1 0
sau
zeros(n,m)
0 0
0 0 0
0 0 0
sau
ones(n,m)
1 1
1 1
1 1 1
1 1 1
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
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
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.
pentru cei cu experien redus n programare, este practic delimitarea blocurilor de comenzi
16
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
axis('auto')
axis([x_left, x_right, y_infer, y_sup])
fill(x, y, 'col')
view(val_azimut, val_elevatie)
[X,Y] = meshgrid(x,y)
17
18
3 3
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')
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
Mrimea marker-ului
'markersize', val
semilogx(x, y)
sau
semilogx(x, y, 'optiuni')
semilogy(x, y)
sau
5
x
10
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)
sau
loglog(x, y, 'optiuni')
20
bar(x, y)
sau
bar(x, y, val)
stairs(x, y)
errorbar(x, y, er)
sau
errorbar(y, er)
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
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
21
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)
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
22
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
10
5
10
5
-5
-5
-10
-10
colormap('paleta')
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
10
5
10
5
-5
-5
-10
-10
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
10
5
10
5
-5
-5
-10
-10
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
10
5
10
5
-5
-5
-10
-10
23
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)
sau
contour(x, y, z)
sau
contour(z, N)
sau
returneaz graficul:
15
10
-5
-10
-15
-15
-10
-5
10
15
24
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))
25
(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])
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 ).
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 ,
10
n function, nu este nevoie de operator element-cu-element; se poate scrie x.^3 sau x^3
(2.2)
27
f 2 w22 7 w1 5 0
w10 1
.
1
20
(2.3)
- 0.6499
0.6713
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
y yx cn x n c2 x 2 c1x c0 .
(2.4)
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)
xk , yk
cu
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
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)
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)
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)
14
15
30
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)
dy
f x, y ,
dx
(2.9)
16
n dblquad, nu este nevoie de operatori element-cu-element; poate fi scris y.*sin(x) sau y*sin(x)
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)
17
n function, nu este nevoie de operatori element-cu-element; poate fi scris x.^2 sau x^2
32
1 y2
(2.12)
w1 w2
, unde t 0; 20 , cu
w2 1 w1 w2 w1
w1 0 0.25
.
w2 0 0
(2.13)
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
n function, nu este nevoie de operatori element-cu-element; poate fi scris w(1).^2 sau w(1)^2
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
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).
34
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])
35
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
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
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.