Sunteți pe pagina 1din 63

Lector univ. dr. A.

Dunca

Software matematic Matlab

Universitatea Spiru Haret, 2008

Cuprins
1 Introducere 2 Lucrul cu siere in Matlab 3 Functii de gestionare a timpului 4 Lucrul cu vectori si matrici 5 Instructiuni de control 6 Siruri de caractere 7 Numere Complexe 8 Functii matematice 9 Operatii cu matrici 10 Functii pentru calcule statistice 8 10 14 18 23 27 29 29 31 34

11 Optimizari de functii, rezolvari de ecuatii neliniare 36 12 Operatii cu polinoame 13 Derivare si integrare numerica 14 Functii pentru graca 40 47 49

Prefat a

Prezentele notite de curs se adreseaz studentilor de la Facul a tatea de Matematic-Informatic a Universitatii Spiru Haret care a a sunt nscrii la cursul de Software Matematic. s Prezentele notite au fost redactate utiliznd pachetul MikTex, a A www.miktex.org, versiunea pentru Windows a sistemului L TEX. Editia electronic utilizeaz formatul PDF al companiei Adobe a a Systems.

Lector univ. dr. A. Dunca Facultatea de Matematic-Informatic a 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 denite si initializate in Matlab. Printre domenii de aplicabilitate se aa: 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. graca 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 downloadat de pe situl http://sourceforge.net, efectuati pe acel site o cautare dupa cuvantul cheie Octave. Downloadati de acolo sierul 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 rulate pe platforma Matlab si invers. Se poate spune ca Matlab e cel mai ecient limbaj de programare pentru proiectarea de soft ce presupune un bogat continut matematic precum calcule extinse sau graca. Ca drawback, datorita exibilitatii 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 e utilizat numai ca unealta pt proiectarea rutinelor, vericarea 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 siere 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-les 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 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 sier si apoi executa apeland la linia de comanda numele sierului respectiv. Presupunand ca ati scris instructiuni matlab in sierul test.m in directorul curent pentru a le executa tipariti la linia de comanda din octave test De pilda, daca sierul test.m contine linia de cod x=1 atunci comanda test aseaza 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 sier trebuie sa contina antetul functiei. De exemplu pentru implementarea unei functii numita patrat care calculeaza patratul unui numar real vom crea sierul 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 asa numarul 4. Comanda help Comanda help urmata de numele unei comenzi built-in matlab aseaza intructiuni ajutatoare in legatura cu acea comanda. Comanda help urmata de numele unei functii matlab create de dumneavoastra si care se aa in path aseaza 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 asa textul calculeaza patratul unui numar x. Acest mod de comentare a modului de utilizare a unei functii poate 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 exibilitate foarte mare in ce priveste utilizarea variabilelor din spatiul de lucru. Variabilele pot 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 sierul test din directorul curent toate comenzile efectuate la linia de comanda si rezultatele asate dupa efectuarea comenzii diary. Inregistrarea comenzilor si a rezultatelor se poate opri cu comanda diary o. 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 asarea tuturor numerelor intregi intre 1 si 100. Linia de cod tic;lagrange1(12);toc va asa timpul de executie in secunde al comenzii lagrange1(12). Acelasi rezultat poate obtinut cu liniile de cod t=clock; lagrange1(12); etime(clock,t) Pentru a aa 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> 4 21 9 30 40

16

Variabile predenite Comenzile format long si format short pot folosite pentru controlul numarului de cifre ce vor asate dintr-un numar zecimal. format short permite asarea primelor 5 cifre iar format long asarea 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 asarea de text sau valori numerice in interiorul unui program se poate folosi comanda disp . De exemplu, instructiunea disp(soft matematic) va asa textul soft matematic In cazul in care disp primeste ca input un vector sau matrice ea va asa valorile din vector sau matrice fara a mai asa numele variabilei. octave:9> x=[1 2 3] x = 1 2 3

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 nit 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 ecare 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 denita 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 predenite 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 aa informatii in legatura cu aceste variabile.

Lucrul cu vectori si matrici

Vectorii se denesc 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 obtinut cu functia linspace x=linspace(0,9,4) gaseste 4 puncte echidistante in intervalul 0,9, primul ind 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 asa 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 asa [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 deni o matrice A de linii 1 2 si 3 4 se utilizeaza comanda A=[1 2;3 4] Se specica 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 folosita comanda A(1:2,1:2) Comanda A calculeaza transpusa matricii A, deci daca A=[ 1 2; 3 4] A va 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 ecare 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 ecare 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 utilizata pentru a verica 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 e executata utilizand functia eval. De pilda x=2; z=x^2; eval(z) va returna valoarea 4. Comanda feval poate 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 ndstr(sir1,sir2) va cauta verica daca sir2 contine sir1 si va returna pozitia de inceput in care sir1 incape prima oara in sir2. De pilda, ndstr(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 deneste 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 oor(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 ecarei 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 iplr(A) inverseaza coloanele lui A. de pilda iplr ([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 ipud(A) functioneaza similar, numai ca se inverseaza liniile lui A. De pilda, daca A=[1 2;2 1] atunci ipud(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 ecare 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 ecare coloana a lui x. De pilda comanda max([ 1 2;3 0]) va returna 32 Comanda min(x) se deneste 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 vericate in Octave, implementarea free a sistemului Matlab. E posibil ca rularea exemplelor in matlab sa necesite mici modicari. 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 specicata 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 denita 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 denita intr-un m-le 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 deneste 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 specicarea 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 simplicarea 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 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). 1 De pilda, pentru rezolvarea ecuatiei cos(x) = 2 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 specicate x0 sau intr-un interval dat. Apelul functiei fzero este f zero( f , x0 , optiuni) sau f zero( f , [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 obtinut cu comanda fsolve. Sa consideram functia matlab f denita 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 coecientii polinomului monic care admite ca radacini componentele vectorului x. De pilda poly([1 -1]) va returna numerele 1 0 -1, adica coecientii polinomului x2 1. octave:67> poly([-1,1]) ans = 1 0 -1

octave:68> pentru a calcula radacinile unui polinom cu coecienti 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 4

octave:69> roots(v) ans = 4 1 octave:70>

41

ceea ce conrma previziunile noastre din moment ce polinomul de coecienti 1,-5,4 este p(x) = x2 5x + 4 de radacini 1,4. Pentru a evalua intr-o valoare data a un polinom cu coecientii 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 coecientii polinomului x2 1. Comanda polyder(v) calculeaza derivata polinomului p ai carui coecienti 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 0

octave:72> 2x. Calculul de mai sus conrma ca derivata lui x2 1 este exact

Comanda conv(p,q) calculeaza coecientii produsului polinoamelor ale caror coecienti sunt stocati in vectorii p,q. Exemplu: octave:72> p=[1 1 1];q=[1 -1]; octave:73> conv(p,q) ans = 1 0 0 -1

42

octave:74> ceea ce conrma ca (x2 + x + 1)(x 1) = x3 1 Comanda deconv poate utilizata pentru a aa restul si catul impartirii unui polinom la alt polinom. Sintaxa este [q,r]=deconv(f,g) unde f contine coecientii polinomului ce este inpartit, g srocheaza coecientii polinomului prin care se imparte iar q si r contin coecientii 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 r = 0 0 0 1 0 0 -1

octave:76> ceea ce conrma 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 gracul unui polinom de grad specicat se poate utiliza metoda celor mai mici patrate. Aceasta metoda e implementata in matlab cu ajutorul comenzii polyt. x4

43

Daca x si y contin prima, respectiv a doua linie din tabelul dat atunci o comanda polyt(x,y,1) va returna coecientii polinomului f de grad 1 care minimizeaza suma patratelor distantelor de la ecare y din tabel la f(x) corespunzator lui. Exemplu: octave:89> x=[-1,0,1,2] x = -1 0 1 2

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 grac

44

unde gracul verde reprezinta polinomul aproximant iar punctele negre valorile aproximate. O comanda polyt(x,y,3) va returna coecientii polinomului f de grad 3 care minimizeaza suma patratelor distantelor de la ecare 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 0.0

Columns 5 through 7:

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 Columns 3 through 4: -1.8418921621853301 -0.1159320927195561 -0.0218522146044181

octave:117> plot(x,y,*); hold on; plot(a,c(1)*a.^3+c(2)*a.^2+c(3)*a+c(4)) va produce gracul

46

Aici gracul verde este gracul polinomului aproximant iar punctele negre sunt punctele ce se doreste a aproximate. Pentru mai multe exemple vezi [1] sau siturile recomandate in primul capitol, Introducere.

47

13

Derivare si integrare numerica

Comanda di(v) calculeaza diferentele dintre componentele succesive ale vectorului v. De exemplu octave:122> diff([-1 0 1]) ans = 1 1

Aceasta comanda poate utilizata pentru aproximarea derivatei unei functii. Se foloseste formula f (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 (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 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). 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 graca

In foarte multe situatii gracele sunt utile pentru a obtine informatii despre o anumita functie, informatii ce nu pot extrase cu usurinta din forma analitica a functiei respective. In matematica de liceu ele pot 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 graca in matlab sta comanda plot. Pentru vectori x,y comanda plot(x,y) realizeaza gracul punctelor x(i),y(i) si apoi uneste puncte succesive cu segmente. Comanda plot([1 2 3],[3 4 5]) va face gracul 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 gracul urmator.

50

Comanda plot(x,y,*) va reprezenta grac numai punctele (x(i),y(i)). Exemplu: Comanda plot([1 2 3],[3 4 5],*) va produce gracul

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 gracul

52

Pentru a realiza gracul functiei f (x) = sin(x) pe intervalul [, ] se pot utiliza comenzile x=-pi:0.01:pi; plot(x,sin(x)) Gracul produs este

53

Pentru a realiza simultan gracul 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); Gracul produs este

54

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

55

Pentru a da un titlu gracului 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 grac in timp ce comanda axis(o) 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 ll(X,Y,c) va reprezenta grac 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 grace vezi [1] sau siturile recomandate in primul capitol, Introducere. Pentru realizarea unui grac 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 gracul 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 gracul

59

Comanda surf(X,Y,Z) va produce un grac identic cu cel produs mai sus de comanda mesh. Comanda surfc(X,Y,Z) realizeaza gracul 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 gracul

60

Se pot utiliza si pentru grace in 3 dimensiuni comenzile xlabel, ylabel, legend, title, grid, text, axis mentionate anterior. Toate setarile grace efectuate se sterg cu comanda clf.

61

LISTA DE FIGURI

62

List de guri a

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 o, 13 di, 47 disp, 16 eig, 31 eps, 18 etime, 14 eval, 27 exist, 26 eye, 21 feval, 27 ll, 57 ndstr, 27 ipr, 31 ipud, 31 oor, 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 o, 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-les, 10 semilogx, 51 matrice, denire, 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 polyt, 43 tipuri de date, 12

INDEX

65

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

BIBLIOGRAFIE

66

Bibliograe
[1] V. Fireteanu M. Ghinea. Matlab-Calcul numeric, Graca, Aplicatii. Editura Teora, 2007.