Sunteți pe pagina 1din 63

Lector univ. dr. A.

Dunca

Software matematic Matlab

Universitatea Spiru Haret, 2008

Cuprins
1 Introducere

2 Lucrul cu fisiere in Matlab

10

3 Functii de gestionare a timpului

14

4 Lucrul cu vectori si matrici

18

5 Instructiuni de control

23

6 Siruri de caractere

27

7 Numere Complexe

29

8 Functii matematice

29

9 Operatii cu matrici

31

10 Functii pentru calcule statistice

34

11 Optimizari de functii, rezolvari de ecuatii neliniare 36


12 Operatii cu polinoame

40

13 Derivare si integrare numerica

47

14 Functii pentru grafica

49

Prefata

Prezentele notite de curs se adreseaz


a studentilor de la Facultatea de Matematic
a-Informatic
a a Universitatii Spiru Haret care
sunt nscrisi la cursul de Software Matematic.
Prezentele notite au fost redactate utiliz
and pachetul MikTex,
www.miktex.org, versiunea pentru Windows a sistemului LATEX.
Editia electronic
a utilizeaz
a formatul PDF al companiei Adobe
Systems.

Lector univ. dr. A. Dunca


Facultatea de Matematic
a-Informatic
a
Universitatea Spiru Haret, Bucuresti, 2008

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

linux pe care o aveti. Exista compatibilitate foarte mare intre


Octave si Matlab, scripturile Octave putand fi rulate pe platforma
Matlab si invers.
Se poate spune ca Matlab e cel mai eficient limbaj de programare pentru proiectarea de soft ce presupune un bogat continut
matematic precum calcule extinse sau grafica. Ca drawback, datorita flexibilitatii ce duce la scriere foarte rapida de cod el ruleaza
mai incet decat executabile in C si chiar Java, de aceea pentru
probleme foarte mari ce presupun foarte multe calcule (de pilda
rezolvarea unui sistem cu matrice de dimesiunea milioanelor) e de
preferat ca Matlab sa fie utilizat numai ca unealta pt proiectarea
rutinelor, verificarea lor pe probleme mai mici si apoi convertirea
rutinelor Matlab in cod C/C++ sau alt limbaj de programare mai
rapid.
Atat Matlab cat si versiunea free Octave sunt amplu documentate atat online cat si in editii tiparite. Se pot consulta de pilda
siturile
site-ul Gnu Octave, in engleza
MathWorks site, in engleza
tutorial Matlab al Univ. of Ottawa, in engleza
tutorial Matlab al Univ. of Michigan, in engleza
tutorial Matlab, Univ. A.I. Cuza, Iasi
sau cartea [1].

10

Lucrul cu fisiere in Matlab

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

Instructiunile matlab se pot scrie la linia de comanda in terminalul


octave sau se pot plasa intr-un fisier si apoi executa apeland la linia
de comanda numele fisierului respectiv.
Presupunand ca ati scris instructiuni matlab in fisierul test.m in
directorul curent pentru a le executa tipariti la linia de comanda
din octave
test
De pilda, daca fisierul test.m contine linia de cod
x=1
atunci comanda test afiseaza valoarea 1. Fisierele matlab pot contine doar instructiuni matlab(scripturi matlab) sau pot contine
functii. Fisierele ce contin o functie trebuie sa aiba acelasi nume
ca si functia pe care o contin iar prima linie din fisier trebuie sa
contina antetul functiei. De exemplu pentru implementarea unei
functii numita patrat care calculeaza patratul unui numar real vom
crea fisierul patrat.m(cu notepad, de exemplu) in directorul curent
dupa care adaugam in el liniile de cod
function z=patrat(x)
z=x^2;
Dupa efectuarea in terminalul octave a comenzii
patrat(2)
octave va afisa numarul 4.
Comanda help
Comanda help urmata de numele unei comenzi built-in matlab
afiseaza intructiuni ajutatoare in legatura cu acea comanda.
Comanda help urmata de numele unei functii matlab create de
dumneavoastra si care se afla in path afiseaza intructiunile comentate cu % pe care le-ati plasat imediat dupa antetul functiei.

12

Revenind la exemplul anterior, daca vom considera functia patrat.m


function z=patrat(x)
%calculeaza patratul unui numar x
z=x^2;
comanda
help patrat
va afisa textul calculeaza patratul unui numar x. Acest mod de
comentare a modului de utilizare a unei functii poate fi foarte util
pentru a obtine cu unsurinta informatii despre functii precum ce
input accepta si ce anume returneaza.
Tipuri de date
In matlab exista o flexibilitate foarte mare in ce priveste utilizarea
variabilelor din spatiul de lucru.
Variabilele pot fi printre altele de tip real, intreg, complex, sir de
caractere, vectori sau matrici, ele nu necesita declarare si tipul lor e
detectat automat de matlab la momentul intializarii lor. Deasemenea in timpul executiei tipul variabilei se poate schimba dand variabilei respective o valoare de un tip diferit.
De pilda, se pot efectua succesiv la linia de comanda operatiile
x=1;
x=[1 2];
initializeaza mai intai variabila x cu valoare de tip intreg 1, dupa
care se stocheaza in x vectorul linie de componente 1,2.

13

Comanda which urmata de o comanda matlab functioneaza


precum comanda similara din sistemul linux. Ea returneaza calea
catre comanda matlab respectiva.
Comanda who listeaza numele variabilelor din sesiunea curenta.
Comanda whos listeaza numele variabilelor din sesiunea curenta
precum si tipul si dimensiunea lor.
Comanda diary test stocheaza in fisierul test din directorul
curent toate comenzile efectuate la linia de comanda si rezultatele
afisate dupa efectuarea comenzii diary. Inregistrarea comenzilor si
a rezultatelor se poate opri cu comanda diary off.
Pentru mai multe informatii si exemple in ce priveste utilizarea
comenzilor which, whos, who, diary consultati [1] sau siturile recomandate in primul capitol, Introducere.

14

Functii de gestionare a timpului

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>

Comenzile size si length


In calculul matricial este necesar sa se cunoasca dimensiunile unei
matrici precum si lungimea unui vector de finit in program. Pentru
aceasta se pot utiliza functiile size si length.
De exemplu
size([1 2;3 7])
va returna dimensiunea matricii cu linii 1 2 si 2 3, adica dimensiunea 2,2 iar comanda
length([1 2 3 9 5])
va returna 5, adica lungimea vectorului linie [1 2 3 9 5].
variabila ans
Dupa fiecare instructiune efectuata, variabila ans stocheaza rezultatul obtinut in urma efectuarii acelei operatii, cata vreme rezultatul acelei operatii nu e deja stocat intr-o variabila deja definita
de programator.
Iata mai jos un exemplu de utilizare a variabilei ans.
octave:21> 3
ans = 3
octave:22> x=4
x = 4
octave:23> ans
ans = 3

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.

Lucrul cu vectori si matrici

Vectorii se definesc prin listarea componentelor incadrate de paranteze drepte.


x=[1 2 3 4]
e vectorul linie de componente 1 2 3 4. comanda
x=[1,2,3,4]
returneaza acelasi lucru.
Comanda
x=[1;2;3;4]
e vectorul coloana de componente 1 2 3 4.
Comanda
x
creeaza transpusul vectorului x. Deci daca x e un vector linie, x
e vectorul coloana cu aceleasi componente, si invers.
De pilda liniile
x=[1 2 3 4]
x

19

vor returna vectorul coloana de componente


1 2 3 4.
Sunt valide operatii de concatenare de tipul
x=[1 2]
y=[3 4]
z=[x,y]
In urma acestor operatii z este vectorul linie de componente 1 2 3
4. Liniile
x=[1 2]
y=[3;4]
z=[x,y]
au acelasi efect.
Comanda
x=0:3:9
creeaza un vector obtinut prin impartirea segmentului [0,9] in trei
parti egale si stocarea celor 4 numerelor echidistante aparute. deci
x=[0 3 6 9]
Acelasi efect poate fi obtinut cu functia linspace
x=linspace(0,9,4)
gaseste 4 puncte echidistante in intervalul 0,9, primul fiind 0 iar
ultimul 9. deci
x=[0 3 6 9]
Indexarea vectorilor in matlab incepe de la 1(spre deosebire de C
sau Java unde incepe de la 0). Pentru a accesa prima componenta
a vectorului
x=[1 2 3 4]
putem efectua comanda
x(1)
Ea va afisa valoarea 1. In acelasi mod,

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

Pentru a selecta linia 1din A si stoca intr-un vector x putem folosi


comanda
x=A(1,:)
Comanda
B=[A;A]
creeaza matricea 4x2 cu prima linie 1 2, a doua 3 4,a treia 1 2,a
patra 3 4. (deci se pune A sub matricea A)
Comanda
B=[A,A]
creeaza matricea 2x4 cu linii 1 2 1 2 si 3 4 3 4 (deci se pune A in
dreapta lui A)
Fie matricea
A=[1 2 3; 2 3 4; 4 5 6]
pentru a selecta submatricea obtinuta prin intersectarea primelor
2 linii cu primele doua coloane poate fi folosita comanda
A(1:2,1:2)
Comanda
A
calculeaza transpusa matricii A, deci daca A=[ 1 2; 3 4]
A va fi matricea [1 3;2 4].
Comanda
det(A) calculeaza determinantul matricii A iar comanda trace(A)
calculeaza suma elementelor de pe diagonala lui A.
Comanda
eye(3) sau eye(3,3) genereaza matricea identica de dimensiune 3.
Comanda
zeros(3,4)
genereaza o matrice de dimensiune 3x4 cu toate componentele 0.
Comanda
ones(3,4)

22

genereaza o matrice de dimensiune 3x4 cu toate componentele


egale cu 1.
Comanda
rand(3,3)
genereaza o matrice de dimensiune 3x3 cu toate componentele generate aleator in intervalul [0,1). Pentru mai multe exemple consultati [1] sau siturile recomandate in primul capitol, Introducere.

23

Instructiuni de control

Operatorii relationali folositi in matlab sunt:


1. <
2. <=
3. >
4. >= mai mare sau egal
5. == egal cu
6. = diferit de
Formatul de utilizare este
A= B (operator relational) C
De pilda executand
x = 2 = 3
variabila x va stoca valoarea 1.
iar x = 2 = 2
variabila x va stoca valoarea 0.
In cazul comparatiilor intre vectori se compara fiecare componente
din vectorii respectivi.De pilda
x = [1 2 3] >= [3 2 1]
initializeaza x cu valoarea [0 1 1].
Operatorii logici folositi in matlab sunt
1. non
2. & si
3. | sau

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

daca expresia logica e adevarata, executa instructiunile A, altfel


executa B.
Se mai poate utiliza si forma
if (expresie logica 1)
instructiuni 1
elseif (expresie logica 2)
instructiuni 2
elseif (expresie logica 3)
instructiuni 3
end
Daca expresia logica 1 e adevarata se executa instructiunile 1, altfel, daca expresia logica 2 e adevarata se executa instructiunile 2,
altfel, daca expresia logica 3 e adevarata se executa instructiunile
3.
Vezi [1] sau siturile recomandate in primul capitol, Introducere
pentru exemple.
Instructiunea repetitiva for. Forma generala este
for(i=a:b)
instructiuni
end
Pentru fiecare valoare i de la a la b(inclusiv) executa instructiunile.
De pilda dupa executarea liniilor de cod
x=0;

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

Functia abs(x) returneaza codurile ASCII ale caracterelor din sirul


de caratere x. Atentie, functia abs are o functionalitate diferita
atunci cand inputul este un numar real. abs(abc)
returneaza vectorul de componente 97 98 99.
In cazul in care un sir de caracatere contine o comanda matlab,
aceasta comanda poate fie executata utilizand functia eval.
De pilda
x=2;
z=x^2;
eval(z)
va returna valoarea 4.
Comanda feval poate fi utilizata pentru evaluarea functiilor.
De pilda
feval(f,2)
va evalua functia f in valoarea 2. Functia feval e utila atunci cand
vrem ca o functie f1 sa accepte ca input o alta functie f2. Aceasta
se realizeaza pasand in functia f1 ca input sirul de caractere f2 si
apoi apeland functia f2 cu comanda feval (f2, valoare).
Sirurile de caractere se pot compara cu comanda strcmp. De pilda
strcmp(xyz,Xyz) va returna valoarea 0 pentru ca xyz si Xyz
nu sunt identice.
Comanda findstr(sir1,sir2) va cauta verifica daca sir2 contine sir1
si va returna pozitia de inceput in care sir1 incape prima oara in
sir2.
De pilda,
findstr(sa,acasa) va returna valoarea 4.
Comanda upper(sir) transforma toate caracterele din sir in litere
mari.

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

Pentru mai multe exemple consultati [1] sau siturile recomandate


in primul capitol, Introducere.
Operatia de ridicare la putere 23 se apeleaza cu comanda
2^3
Logaritmul natural al lui 2 se calculeaza cu formula
log(2)
iar logaritmul in baza 10 cu formula
log10(2).
Pentru a calcula e2 se efectueaza comanda exp(2).

2 se calculeaza cu comanda sqrt(2)


In ce priveste functiile trigonometrice, ele se apeleaza cu comenzile
cos(x), sin(x), tan(x), cot(x)
unde x e un numar real.
Functiile trigonometrice inverse se apeleaza cu comenzile
asin, acos, atan, acot. Comanda gcd(x,y) calculeaza cel mai mare
divizor comun al numerelor naturale x si y iar lcm(x,y) cel mai mic
multiplu comun al celor doua numere.
de pilda gcd(12,15) returneaza valoarea 3
iar
lcm(4,3)
returneaza valoarea 12.

31

Operatii cu matrici

Valorile proprii precum si vectorii proprii ai unei matrici patratice


date se obtin cu comanda eig.
x=eig(A)
va stoca in vectorul x valorile proprii ale lui A iar
[x y]=eig(A)
va stoca pe diagonala lui y valorile proprii ale lui A iar in coloanele
matricii x vectori proprii unitari asociati acelor valori proprii.
Operatia
inv(A) returneaza inversa unei matrici nesingulare A.
comanda diag(A) returneaza un vector cu componentele de pe
diagonala lui A.
de pilda diag([1 2; 2 3]) va returna vectorul linie de componente
1,3.
Daca x e un vector dat atunci diag(x) returneaza o matrice ce are
peste tot 0 cu exceptia diagonalei unde regasim componentele lui
x.
Rotirea unei matrici.
Comanda
fliplr(A) inverseaza coloanele lui A. de pilda
fliplr ([1 2 3; 1 2 3])
va returna matricea cu liniile 3 2 1 si 3 2 1, adica, in sintaxa matlab
[ 3 2 1; 3 2 1].
Comanda
flipud(A) functioneaza similar, numai ca se inverseaza liniile lui
A. De pilda, daca A=[1 2;2 1] atunci
flipud(A)
va returna matricea
[2 1; 1 2]
Exemplu:

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

Functii pentru calcule statistice

Comanda mean(x) calculeaza media aritmetica a componentelor


vectorului x. de pilda mean([1 2]) returneaza 1.5.
Comanda
median(x)
va sorta crescator componentele lui x si apoi va alege componenta
din mijloc sau media aritmetica a componentelor din mijloc, daca
sunt 2. De pilda
median([3 1 2])
returneaza 2
iar median([3 1 2 3]) va returna 2.5
Comanda sum(x) calculeaza suma componentelor vectorului x.
daca x este o matrice sum(x) calculeaza suma elementelor de pe
fiecare coloana a lui x.
Comanda prod(v) calculeaza produsul valorilor vectorului v.
Abaterea medie patratica a componentelor unui vector x se calculeaza cu formula std(x).
Comanda sort(x) sorteaza in ordine crescatoare elementele vectorului x.
Apelata sub forma
[a,b]=sort(x)
ea va returna in a componentele lui x ordonate crescator iar in b
indexul lor.
De pilda [a,b]=sort([7 5 6]);
va returna
a=[5 6 7]
b=[2 3 1]
Comanda max(x) va returna valoarea maxima a componentelor
vectorului x.

35

Apelat cu comanda [a b]=max(x)


a va contine valoarea maxima iar b indicele acestei componente.
daca x este o matrice max(x) devine un vector ce contine valorile
maxime pe fiecare coloana a lui x.
De pilda comanda
max([ 1 2;3 0]) va returna
32
Comanda min(x) se defineste similar, vezi [1] sau siturile recomandate in primul capitol, Introducere.

36

11

Optimizari de functii, rezolvari de ecuatii neliniare

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

ceea ce confirma previziunile noastre din moment ce polinomul


de coeficienti 1,-5,4 este p(x) = x2 5x + 4 de radacini 1,4.
Pentru a evalua intr-o valoare data a un polinom cu coeficientii
stocati in vectorul x se poate utiliza comanda polyval(x,a). De
pilda
polyval([1 0 -1], 2)
va returna valoarea 3. Observati ca 1 0 -1 sunt exact coeficientii
polinomului
x2 1.
Comanda polyder(v) calculeaza derivata polinomului p ai carui
coeficienti sunt stocati in vectorul v in ordine descrescatoare a
puterilor lui x din polinomul p.
Exemplu:
octave:70> v=[1 0 -1];
octave:71> polyder(v)
ans =
2

octave:72>
2x.

Calculul de mai sus confirma ca derivata lui x2 1 este exact

Comanda conv(p,q) calculeaza coeficientii produsului polinoamelor


ale caror coeficienti sunt stocati in vectorii p,q.
Exemplu:
octave:72> p=[1 1 1];q=[1 -1];
octave:73> conv(p,q)
ans =
1

-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

Daca x si y contin prima, respectiv a doua linie din tabelul dat


atunci
o comanda polyfit(x,y,1) va returna coeficientii polinomului f de
grad 1 care minimizeaza suma patratelor distantelor de la fiecare
y din tabel la f(x) corespunzator lui.
Exemplu:
octave:89> x=[-1,0,1,2]
x =
-1

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

octave:92> plot(x,y,*);hold on;plot(x,c(1)*x.+c(2))


va produce urmatorul grafic

44

unde graficul verde reprezinta polinomul aproximant iar punctele


negre valorile aproximate.
O comanda polyfit(x,y,3) va returna coeficientii polinomului f de
grad 3 care minimizeaza suma patratelor distantelor de la fiecare
y din tabel la f(x) corespunzator lui.
Exemplu
octave:114> x=[-1.75 -1 -0.5 0 0.5 1 1.75]
x =
Columns 1 through 4:
-1.75 -1.0

-0.5

Columns 5 through 7:

0.0

45

0.5

1.0

1.75

octave:115> y=[-6.5 0.3 0.4 -0.5 -0.5 -0.2 6]


y =
Columns 1 through 4:
-6.5

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

Aici graficul verde este graficul polinomului aproximant iar


punctele negre sunt punctele ce se doreste a fi aproximate.
Pentru mai multe exemple vezi [1] sau siturile recomandate in
primul capitol, Introducere.

47

13

Derivare si integrare numerica

Comanda diff(v) calculeaza diferentele dintre componentele succesive ale vectorului v.


De exemplu
octave:122> diff([-1 0 1])
ans =
1

Aceasta comanda poate fi utilizata pentru aproximarea derivatei


unei functii. Se foloseste formula
f 0 (a) = limxa

f (x) f (a)
xa

ce conduce la formula de aproximare a derivatei


f (x) f (a)
xa
atunci cand x este aproape de a. Pentru mai multe detalii in
ce priveste aceasta formula de aproximare consultati sintezele de
analiza numerica.
Exemplu: Sa se aproximeze derivata functiei f (x) = x2 exp(x)
pe intervalul [-1,1].
Pentru aceasta vom efectua comenzile
f 0 (a)

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

La sfarsitul acestui calcul vectorul fprim va stoca aproximari ale


derivatei lui f in numerele -0.99,-0.98,....,0.99,1.
O alta functie ce poate fi utilizata pentru calculul derivatelor
partiale ale unei functii este gradient, vezi [1] sau siturile recomandate in primul capitol, Introducere.
Pentru a aproxima integrala unei functii date se pot utiliza
comenzile quad (utilizeaza metoda lui Simpson, vezi sintezele de
analiza numerica) sau trapz(utilizeaza metoda trapezului, vezi sintezele de analiza numerica). R
1
Exemplu: Sa se aproximeze 0 e( x2 )dx.
Cu quad
octave:132> f=inline(exp(x.^2))
f =
f(x) = exp(x.^2)
octave:133> quad(f,0,1)
ans = 1.46265174590718
Cu trapz
octave:134> x=0:0.01:1;
octave:135> y=exp(x.^2);
octave:136> trapz(x,y)
ans = 1.46269704984927

49

14

Functii pentru grafica

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

Pentru a realiza graficul functiei f (x) = sin(x) pe intervalul [, ]


se pot utiliza comenzile
x=-pi:0.01:pi;
plot(x,sin(x))
Graficul produs este

53

Pentru a realiza simultan graficul a doua functii f (x) = sin(x), g(x) =


x2 pe intervalul [, ] se pot utiliza comenzile
x=-pi:0.01:pi;
plot(x,sin(x)); hold on; plot(x,x.^2);
Graficul produs este

54

Comanda hold on permite suprapunerea graficului lui g(x) =


x2 peste graficul lui f (x) = sin(x). In cazul in care nu este efectuata comanda hold off orice alta comanda grafica va scrie peste
graficul curent fara a-l sterge.
Comanda grid permite suprapunerea unui grid pe grafic. Exemplu:
x=-pi:0.01:pi;
plot(x,sin(x)); hold on; plot(x,x.^2);grid
produce graficul

55

Pentru a da un titlu graficului curent se poate utiliza comanda


title.
Exemplu de utilizare:
plot(x,sin(x));grid;title(graficul lui sin)

56

Comenzile xlabel si ylabel permit scrierea de text pe axa Ox


respectiv Oy.
Exemplu de utilizare:
plot(x,sin(x));grid;title(graficul lui sin);
xlabel(valorile lui x);ylabel(valorile lui f(x))

57

Pentru controlul axelor de coordonate se poate utiliza comanda


axis.
De pilda axis(on) va permite desenarea axelor de coordonate
pe grafic in timp ce comanda axis(off) le va sterge.
Comanda axis(equal) stopeaza scalarea axelor, unitatea de
masura in directia x e egala cu unitatea de masura in directia y.
Pentru alte argumente pentru comanda axis efectuati comanda
help axis.
Alte comenzi utile sunt legend, text, vezi [1] sau siturile recomandate in primul capitol, Introducere.
Comanda
fill(X,Y,c) va reprezenta grafic poligonul cu varfurile de coordonate
x stocate in X si coordonate y stocate in Y. Indexul c decide

58

culoarea interiorului poligonului. Pentru mai multe optiuni si alte


functii de realizare de grafice vezi [1] sau siturile recomandate in
primul capitol, Introducere.
Pentru realizarea unui grafic tridimensional ce reprezinta o
suprafata se poate utiliza comanda mesh. Pentru aceasta se genereaza
mai intai doua matrici x, y ce contin coordonatele punctelor in
planul xOy si apoi se construieste matricea ce contine coordonata
Z a punctelor de pe suprafata respectiva. de exemplu pentru a construi graficul unei functii f (x, y) = x2 + y 2 pentru x, y [1, 1] se
pot folosi comenzile
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;
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

Se pot utiliza si pentru grafice in 3 dimensiuni comenzile xlabel,


ylabel, legend, title, grid, text, axis mentionate anterior.
Toate setarile grafice efectuate se sterg cu comanda clf.

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.

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