Documente Academic
Documente Profesional
Documente Cultură
Matlab Tutorial
Matlab Tutorial
Dunca
Cuprins
1 Introducere
10
14
18
5 Instructiuni de control
23
6 Siruri de caractere
27
7 Numere Complexe
29
8 Functii matematice
29
9 Operatii cu matrici
31
34
40
47
49
Prefata
Introducere
Pachetul software Matlab al companiei MathWorks este un software special conceput pentru rezolvarea cu usurinta a problemelor
de calcul numeric ce apar in domeniul stiintei si ingineriei. El are o
gama bogata de rutine ce permite scrierea rapida de cod datorita
felului natural in care variabilele pot fi definite si initializate in
Matlab. Printre domenii de aplicabilitate se afla:
1. calcul matricial si vectorial
2. operatii cu functii trigonometrice, exponentiale, polinomiale
3. rezolvarea de sisteme de ecuatii liniare si neliniare
4. interpolare
5. optimizari
6. statistica
7. grafica
8. operatii cu siruri de caractere
Pachetul software Matlab nu este gratis. Pentru rularea exemplelor din aceste note vom folosi Octave, versiunea free a softului
Matlab. La data scrierii acestor note Octave putea fi downloadat de pe situl http://sourceforge.net, efectuati pe acel site o
cautare dupa cuvantul cheie Octave. Downloadati de acolo fisierul
Octave Forge Windows. Fisierul are aprox. 32Mb. Puteti gasi
Octave deasemenea in distributia cygwin (linux emulator for windows),www.cygwin.com. Daca sunteti utilizator de linux atunci
puteti instala Octave selectand in sectiunea Math din pachetele
dumneavoastra distributia Octave corespunzatoare versiunii de
10
Presupunand ca ati instalat versiunea Windows a pachetului Octave, trebuie doar ca sa deschideti terminalul de lucru Octave selectand Octave din sectiunea All Programs a calculatorului dumneavoastra. Daca lucrati pe cygwin sau linux, tipariti comanda
octave in terminal si apoi apasati enter.
Din acest moment aveti acces la comenzile built-in din Octave/Matlab.
Comanda path
Puteti vedea caile de acces la aceste comenzi executand comanda
path. In cazul meu, comanda path returneaza
octave:1> path
Octaves search path contains the following directories:
.
/usr/lib/octave/2.1.73/site/oct/i686-pc-cygwin//
/usr/lib/octave/site/oct/api-v13/i686-pc-cygwin//
/usr/lib/octave/site/oct/i686-pc-cygwin//
/usr/share/octave/2.1.73/site/m//
/usr/share/octave/site/api-v13/m//
/usr/share/octave/site/m//
/usr/lib/octave/2.1.73/oct/i686-pc-cygwin//
/usr/share/octave/2.1.73/m//
m-files
Fisierele in care dumneavoastra veti scrie instructiuni matlab trebuie sa aiba extensia .m. Daca ele sunt plasate in directorul curent,
adica directorul returnat de comanda pwd, ele pot fi apelate direct,
altfel ele se apeleaza impreuna cu intreaga cale la ele.
11
12
13
14
Functiile matlab tic,toc,clock, etime ne dau informatii despre timpul de executia al unei comenzi si informatii despre data si ora momentului curent conform ceasului calculatorului. Aceste comenzi
sunt utile atunci cand se doreste optimizarea timpului de executie
al unei rutine.
Liniile de cod
tic;
for(i=1:100)
i
end
toc
vor masura timpul necesar pentru afisarea tuturor numerelor intregi intre 1 si 100.
Linia de cod
tic;lagrange1(12);toc
va afisa timpul de executie in secunde al comenzii lagrange1(12).
Acelasi rezultat poate fi obtinut cu liniile de cod
t=clock;
lagrange1(12);
etime(clock,t)
Pentru a afla informatii despre data si ora curente se poate utiliza
comanda clock. De exemplu,
data_curenta=fix(clock)
returneaza in vectorul data curenta (in aceasta ordine) anul, luna,
ziua, ora, minutul, secunda curente.
15
octave:2> data_curenta=fix(clock)
data_curenta =
2008
octave:3>
21
30
40
16
Variabile predefinite
Comenzile format long si format short pot fi folosite pentru controlul numarului de cifre ce vor fi afisate dintr-un numar
zecimal. format short permite afisarea primelor 5 cifre iar format
long afisarea primelor 15 cifre.
octave:3> format short
octave:4> pi
pi = 3.1416
octave:5> format long
octave:6> pi
pi = 3.14159265358979
octave:7>
Vezi deasemenea [1] sau siturile recomandate in primul capitol,
Introducere, pentru cateva exemple.
Pentru afisarea de text sau valori numerice in interiorul unui program se poate folosi comanda disp . De exemplu, instructiunea
disp(soft matematic)
va afisa textul
soft matematic
In cazul in care disp primeste ca input un vector sau matrice ea
va afisa valorile din vector sau matrice fara a mai afisa numele
variabilei.
octave:9> x=[1 2 3]
x =
1
octave:10> disp(x)
17
1 2 3
octave:11>
18
octave:24> 5
ans = 5
octave:25> x=ans*6
x = 30
octave:26>
Alte variabile predefinite in matlab sunt eps, realmin, realmax, pi,i
. Puteti consulta [1] sau siturile recomandate in primul capitol,
Introducere, sau executati
help numele variabilei
pentru a afla informatii in legatura cu aceste variabile.
19
20
daca
x=[4 5 6 7]
comanda
x(1:3)
returneaza un vector ce contine toate componentele lui x de la 1
la 3 , adica vectorul linie
[4 5 6].
x(2:3) va afisa [5,6].
Pentru a selecta din vectorul x componentele de index impar(adica
prima si a treia) se poate utiliza comanda
x(1:2:4)
Ea selecteaza componentele lui x din 2 in 2, adica
[4 6]
Pentru a defini o matrice A de linii 1 2 si 3 4 se utilizeaza comanda
A=[1 2;3 4]
Se specifica deci succesiv liniile separate de ;
Urmatoarele linii
x=[1 2]
y=[3 4]
A=[x;y]
creeaza matricea de linii 1,2 si 3,4.
Comanda
size(A)
returneaza dimensiunea lui A adica numerele 2,2.
Pentru a acesa componenta matricii A de pe linia 2, coloana 1 se
poate utiliza comanda
A(2,1)
Pentru a selecta coloana 2 din A si stoca intr-un vector x putem
folosi comanda
x=A(:,2)
21
22
23
Instructiuni de control
24
De pilda, operatia
x = (2 > 3)|(3 < 4)
da lui x valoarea 1 pe cand operatia
x = (2 > 3)|(3 > 4)
da lui x valoarea 0.
Forma generala a instructiunii if este
if (expresie logica)
instructiuni
end
Daca expresia logica e adevarata se executa instructiunile.
De exemplu, linia de cod
x=2;
if(x<3)
x=1;
end;
va da lui x valoarea 1.
O alta forma a instructiunii if este
if (expresie logica)
instructiuni A
else
instructiuni B
end
25
26
for(i=1:3)
x=x+i;
end
x va avea valoarea 6.
o instructiune for de tipul
for(i=1:2:5)
instructiuni
end
va executa instructiunile pentru i de la 1 la 5 din 2 in 2, adica
i=1,3,5.
Instructiunile while, break, return, switch ce se intalnesc si in alte
limbaje de programare au variante similare in matlab, vezi [[1]]
sau siturile recomandate in primul capitol, Introducere.
Instructiunea any(conditii logice) testeaza daca vreuna din conditii
e satisfacuta, caz in care returneaza valoarea 1, altfel returneaza
valoarea 0. De pilda
any([1 2 3]>1)
va returna valoarea 1.
Instructiunea all(conditii logice) testeaza daca toate conditiile sunt
satisfacute, caz in care returneaza valoarea 1, altfel returneaza
valoarea 0. De pilda
all([1 2 3] > 1) va returna valoarea 0.
Instructiunea exist poate fi utilizata pentru a verifica daca o variabila exista.
De pilda
x=1;
exist(x)
va returna valoarea 1.
27
Siruri de caractere
28
De pilda
upper(xyZ)
returneaza sirul de caractere XYZ
lower(sir) transforma toate caracterele din sir in litere mici.
Comanda str2num converteste un sir de caractere ce reprezinta un
numar in acel numar. de pilda comanda
x=str2num(12.3)
da lui x valoarea reala 12.3.
Similar, num2str converteste o valoare reala intr-un sir de caractere. de pilda
y=2.3;
x=num2str(y)
va da lui x valoarea 2.3. Pentru mai multe explicatii si exemple in
ce priveste lucrul cu siruri de caractere consultati [[1]] sau siturile
recomandate in primul capitol, Introducere.
29
Numere Complexe
Comanda
x=2+3*i
defineste numarul real x cu parte reala 2 si parte imaginara 3.
Partea reala a unui numar real dat x se calculeaza cu comanda
real(x)
iar partea imaginara cu imag(x). Conjugatul lui x se calculeaza
cu formula conj(x) argumentului lui cu
angle(x) iar modulul cu comanda abs(x).
Pentru mai multe
exemple consultati [1] sau siturile recomandate in primul capitol,
Introducere.
Functii matematice
Comanda
ceil(x) calculeaza cel mai mic numar intreg mai mare ca x. De
pilda ceil(2.3) returneaza 3.
Comanda floor(x) returneaza partea intreaga a lui x. Pentru a
calcula restul impartirii unui numar natural x la numarul natural
y se poate utiliza comanda rem(x,y).
De pilda rem(5,2) returneaza valoarea 1.
Daca x si y sunt vectori atunci rem(x,y) va calcula restul impartirii
fiecarei componente din x la componenta corespunzatoare din y.
Pentru a detecta scrierea fractionara a unui numar zecimal se
poate utiliza comanda rats.
De pilda rats(1.5) va returna valorile 3 si 2 pentru ca 3/2 = 1.5
Pentru a detecta semnul unei valori reale se poate utiliza functia
sign.
Daca x > 0 , sign(x) returneaza 1, daca x < 0 sign(x) returneaza
-1 iar daca x=0 sign(x) returneaza 0.
30
31
Operatii cu matrici
32
octave:27> A=[1 2; 3 4]
A =
1
3
2
4
octave:28> fliplr(A)
ans =
2
4
1
3
octave:29> flipud(A)
ans =
3
1
4
2
octave:30>
Comanda triu(A) returneaza o matrice ce are deasupra diagonalei
si pe diagonala aceleasi componente ca si A si 0 in rest. De pilda
triu([ 1 2;2 1]) va returna
[1 2;0 1].
Comanda tril(A) returneaza o matrice ce are sub diagonala si pe
diagonala aceleasi componente ca si A si 0 in rest. De pilda tril([
1 2;2 1]) va returna
[1 0;2 1].
Exemplu:
octave:30> A=[1 2 3;4 5 6;7 8 9]
A =
33
1
4
7
2
5
8
3
6
9
octave:31> triu(A)
ans =
1
0
0
2
5
0
3
6
9
octave:32> tril(A)
ans =
1
4
7
0
5
8
0
0
9
34
10
35
36
11
Exemplele din acest capitol au fost verificate in Octave, implementarea free a sistemului Matlab. E posibil ca rularea exemplelor
in matlab sa necesite mici modificari.
Pentru minimizarea unei functii de o singura variabila reala date
se poate utiliza comanda fmin.
fmin(f,a,b, optiuni) va determina o aproximare(in functie de o
toleranta specificata in optiuni) a valorii din intervalul [a,b] unde
functia f atinge cea mai mica valoare.
Daca vom considera functia f (x) = x2 pe intervalul [-1,2], cea mai
mica valoare e atinsa in 0, deci o comanda de tipul
fmin(f,-1,2) va returna o aproximare a valorii 0.
In exemplul de mai jos, functia f al carei minim in intervalul [-1,1]
este aproximat este definita inline
octave:33> f=inline(x.^2);
octave:34> fmin(f,-1,1)
ans = -1.44247747862210e-17
octave:35>
Alternativ, functia f de mai sus putea fi definita intr-un m-file
numit f.m.
Comanda
fmin(cos,3,4,[1,1.e-12])
va calcula o aproximare cu 12 zecimale exacte a valorii (din moment ce minimizeaza functia cos(x) pe intervalul [3, 4].
Comanda fmax se defineste similar, vezi [1] sau siturile recomandate in primul capitol, Introducere.
Pentru minimizarea functiilor de mai multe variabile reale se poate
utiliza functia fmins. Aceasta functie necesita specificarea unei
37
predictii initiale pentru gasirea unui minim local apropiat de predictia initiala. E posibil ca functia sa nu returneze o aproximare
a unui minim local in cazul cand schema numerica utilizata nu
converge. Sa consideram functia f1
function z=f1(x)
z=x(1)^4+x(2)^2
Un apel de tipul
fmins(f1,[1,1],[0,0.0001])
va calcula o aproximare a vectorului bidimensional unde f1 are
un minim local, adica vectorul [0,0]. Toleranta aleasa, 0.0001, se
aplica ambelor componente.
Pentru simplificarea exemplului se poate utiliza un functionhandler de tipul
octave:48> f1=@(x)x(1)^4+x(2)^2;
octave:49> fmins(f1,[1,1],[0,0.0001])
ans =
0
octave:50>
Pentru a rezolva o ecuatie de tipul
f(x)=0
unde x e o variabila reala, se poate utiliza comanda
fmin prezentata anterior tinandu-se seama de faptul ca
solutia x a ecuatiei f (x) = 0 minimizeaza functia
f 2 (x).
De pilda, pentru rezolvarea ecuatiei cos(x) = 21 pe [0, /2]
se poate minimiza functia
f (x) = (cos(x) 1/2)2 pe intervalul [0, /2]. Exemplu:
38
octave:50> f=inline((cos(x)-1/2).^2);
octave:51> fmin(f,0,pi/2)
ans = 1.04719755119660
octave:52> pi/3
ans = 1.04719755119660
Altfel, se poate utiliza functia fzero care gaseste solutia unei
ecuatii f (x) = 0 in preajma unei predictii initiale specificate x0
sau intr-un interval dat. Apelul functiei fzero este
f zero(0 f 0 , x0 , optiuni)
sau f zero(0 f 0 , [a, b], optiuni)
unde optiunile pot contine toleranta cu care solutia e aproximata.
In prima varianta x0 este o predictie a solutiei iar in a doua se
incearca gasirea unei solutii in intervalul [a,b].
De exemplu, sa consideram functia f
function z=f(x)
z=sin(x);
x = fzero(f,0.1);
va returna valoarea 0. iar x = fzero(f,-0.1,0.1); va returna valoarea 0.
Fie
function z=f(x)
z=exp(x)-1;
Comanda
options.abstol=0.01;x = fzero(f,-0.1,0.1,options);
va aproxima solutia exacta a ecuatiei ex 1 = 0, adica 0, cu doua
zecimale exacte.
Acelasi rezultat ca si fzero poate fi obtinut cu comanda fsolve. Sa
consideram functia matlab f definita mai jos
39
function z=f(x)
z=exp(x)-1;
Comanda
x = fsolve(f,0.1);
va calcula o aproximare a unei solutii a ecuatiei f (x) = 0 cu predictie initiala 0.1 iar comanda
x = fsolve(f,-1,1)
va calcula o aproximare a unei solutii a ecuatiei f (x) = 0 in intervalul [-1,1]. In ambele Cazuri comanda returneaza o aproximare
a valorii 0.
40
12
Operatii cu polinoame
Comanda poly(x) unde x este un vector va calcula coeficientii polinomului monic care admite ca radacini componentele vectorului x.
De pilda poly([1 -1])
va returna numerele
1 0 -1, adica coeficientii polinomului x2 1.
octave:67> poly([-1,1])
ans =
1
-1
octave:68>
pentru a calcula radacinile unui polinom cu coeficienti stocati in
ordinea descrescatoare a puterilor lui x in vectorul v se poate utiliza comanda roots(v).
Exemplu:
octave:68> v=[1 -5 4]
v =
1
-5
octave:69> roots(v)
ans =
4
1
octave:70>
41
octave:72>
2x.
-1
42
octave:74>
ceea ce confirma ca
(x2 + x + 1)(x 1) = x3 1
Comanda deconv poate fi utilizata pentru a afla restul si catul
impartirii unui polinom la alt polinom. Sintaxa este
[q,r]=deconv(f,g)
unde f contine coeficientii polinomului ce este inpartit, g srocheaza
coeficientii polinomului prin care se imparte iar q si r contin coeficientii catului, respectiv restului in aceasta operatie de impartire.
De pilda,
octave:74> f=[1 0 0 1 -1];g=[1 0 1];
octave:75> [q,r]=deconv(f,g)
q =
1
-1
r =
0
octave:76>
ceea ce confirma faptul ca catul si restul impartirii lui f (x) =
+ x 1 la g(x) = x2 + 1 sunt q(x) = x2 1 respectiv r(x) = x.
Pentru aproximarea datelor dintr-un tabel cu graficul unui polinom de grad specificat se poate utiliza metoda celor mai mici
patrate. Aceasta metoda e implementata in matlab cu ajutorul
comenzii polyfit.
x4
43
octave:90> y=[0.2,0.8,2.2,2.9]
y =
0.2
0.8
2.2
2.9
octave:91> c=polyfit(x,y,1)
c =
0.95
1.05
44
-0.5
Columns 5 through 7:
0.0
45
0.5
1.0
1.75
0.3
0.4
-0.5
Columns 5 through 7:
-0.5 -0.2
6.0
octave:116> c=polyfit(x,y,3)
c =
Columns 1 through 2:
1.7627568077263764
-0.0218522146044181
Columns 3 through 4:
-1.8418921621853301
-0.1159320927195561
octave:117> plot(x,y,*);
hold on;
plot(a,c(1)*a.^3+c(2)*a.^2+c(3)*a+c(4))
va produce graficul
46
47
13
f (x) f (a)
xa
octave:124>
octave:125>
octave:126>
octave:127>
octave:128>
x=-1:0.01:1;
xprim=diff(x);
y=x.^2-exp(x);
yprim=diff(y);
fprim=yprim./xprim;
48
49
14
In foarte multe situatii graficele sunt utile pentru a obtine informatii despre o anumita functie, informatii ce nu pot fi extrase cu
usurinta din forma analitica a functiei respective. In matematica
de liceu ele pot fi utilizate de pilda pentru studiul derivabilitatii
unei functii, limita unei functii sau sir, monotonia unei functii sau
pentru generarea si studiul de suprafete in geometrie.
La baza rutinelor de grafica in matlab sta comanda plot.
Pentru vectori x,y comanda
plot(x,y) realizeaza graficul punctelor x(i),y(i) si apoi uneste puncte
succesive cu segmente.
Comanda
plot([1 2 3],[3 4 5])
va face graficul punctelor (1,3),(2,4),(3,5) si apoi va uni
(1,3) cu (2,4) si (2,4) cu (3,5) prin segmente , vezi graficul urmator.
50
Comanda
plot(x,y,*) va reprezenta grafic numai punctele (x(i),y(i)).
Exemplu: Comanda
plot([1 2 3],[3 4 5],*)
va produce graficul
51
pentru mai multe optiuni vezi [1] sau siturile recomandate in primul
capitol, Introducere.
Pentru a reprezenta vectori in coordonate semilogaritmice se pot
utiliza comenzile
semilogy si semilogx , vezi [1] sau siturile recomandate in primul
capitol, Introducere.
Exemplu Comanda
semilogy([1 2 3],[10^3 10^4 10^5],*)
va produce graficul
52
53
54
55
56
57
58
x=-1:0.01:1;
y=-1:0.01:1;
[X,Y]=meshgrid(x,y);
Z=X.^2+Y.^2;
mesh(X,Y,Z)
va produce graficul
59
Comanda surf(X,Y,Z) va produce un grafic identic cu cel produs mai sus de comanda mesh.
Comanda surfc(X,Y,Z) realizeaza graficul suprafetei in acelasi
timp cu liniile de acelasi nivel in planul xOy(sectiuni ale suprafetei
cu plane paralele cu xOy).
De exemplu comanda
octave:179>
octave:180>
octave:181>
octave:182>
octave:183>
x=-1:0.01:1;
y=-1:0.01:1;
[X,Y]=meshgrid(x,y);
Z=X.^2+Y.^2;
surfc(X,Y,Z)
va produce graficul
60
61
DE FIGURI
LISTA
List
a de figuri
62
Index
abs, 27, 29
acos, 30
acot, 30
all, 26
angle, 29
ans, 17
any, 26
asin, 30
atan, 30
axis, 57
break, 26
ceil, 29
clf, 60
clock, 14
concatenarea vectorilor, 19
conj, 29
conv, 41
cos, 30
cot, 30
deconv, 42
determinantul unei matrici, 21
diag, 31
diary, 13
diary off, 13
diff, 47
disp, 16
eig, 31
eps, 18
etime, 14
eval, 27
exist, 26
eye, 21
feval, 27
fill, 57
findstr, 27
flipr, 31
flipud, 31
floor, 29
fmin, 36
fmins, 36
for, 25
format long, 16
format short, 16
functii matlab, 11
fzero, 38
gcd, cel mai mare divizor comun,
30
gradient, 48
grid, 54
help, 11
hold off, 54
hold on, 54
INDEX
64
i, 18
polyval, 41
imag, 29
prod, 34
Indexarea vectorilor in matlab, pwd, 10
19
radacina patrata, 30
inline, 36
rand, 22
inv, 31
rats, 29
lcm, cel mai mic multiplu co- real, 29
mun, 30
realmax, 18
length, 17
realmin, 18
linspace, 19
rem, 29
logaritm in baza 10, 30
return, 26
logaritm natural, 30
ridicarea la putere, 30
lower, 28
scripturi matlab , 11
m-files, 10
semilogx, 51
matrice, definire, 20
semilogy, 51
matrici, 18
sign, 29
max, 34
sin, 30
mean, 34
size, 17
median, 34
sort, 34
min, 35
std, abaterea medie patratica, 34
str2num, 28
NaN, 18
strcmp, 27
num2str, 28
sum, 34
surf, 59
path, 10
surfc, 59
pi, 18
switch, 26
plot, 49
poly, 40
tan, 30
polyder, 41
tic,toc, 14
polyfit, 43
tipuri de date, 12
INDEX
title, 55
trace, 21
transpusa unei matrici, 21
transpusul unui vector, 18
tril, 32
triu, 32
upper, 27
vector coloana, 18
vector generat cu pas constant,
19
vector linie, 18
vectori, 18
which, 13
while, 26
who, 13
whos, 13
xlabel, 56
ylabel, 56
zeros, 21
65
BIBLIOGRAFIE
66
Bibliografie
[1] V. Fireteanu M. Ghinea. Matlab-Calcul numeric, Grafica,
Aplicatii. Editura Teora, 2007.