You are on page 1of 20
| forerr 2 FUNCTI EXTERNE UTIL interne, pentru calcule uzuale, si funcfii extemne, definite in bibliotecile Matlab (toolbox-uri) sau definite de cAtre utilizator. Functiile extemne utilizator se definesc dupa sintaxa: @ function {lista_variabile_de_iesire|= nume_functie(lista_argumente_de_intrare) set_de_instructiuni unde: - fimetion - cuvant cheie (instrucfiune), se foloseste obligatoriu pentru a preciza od urmeaza definirea unei functii externe utilizator; - lista_variabile_de iesire - lista variabilelor de iesire, separate intre ele prin virguld, ‘cu valori returnate de funcfie; in cazul unei singure variabile, nu mai este necesara incadrarea cin paranteze drepte; + nume_funcfie - un nume legal de functie (incepe cu o liter’, confine litere si, eventual cifre, lungime maxima opt caravtere); + lista_argumente_de_intrare - lista argumentelor de i trare (constante sau variabile), separate intre ele prin virgula ~ set_dle_instrucfiuni - set de instructiuni Matlab pentru calculul variabilelor de iesire. Subprogramul functie externa se salveazA obligatoriu cu numele nume_functie.m Instructiunea return - cauzeaza intreruperea execufiei unui program de tip functie externa si transferd execusia citre programul apelant. Se foloseste deasemenea pentru terminarea modului keyboard. Instructiunea global, cu sintaxa: global lista_de_variabile, unde lista_de_variabile este o list& de variabile, separate intre ele prin spatii albe (blank-uri), defineste variabilele din lista ca avénd valori comune in programele si subprogramele in care apare instructiunea, Exemplu Si se calculeze debitul transportat de un canal trapezoidal, cunoscand lajimea la fund b= 1m, coeficientul unghiular m= 1, coeficientul de rugozitate n = 0,018 si panta canalului J = 01%, Fie functia externa fh function Q=fh(h); global mb n I if (m<0|b<0[n<0|1<0) disp('Cel putin una din valorile initiale este negativa'); return end A=(bém*h) *h; P=b+2*h*sqrt (1+m*2); R=A/P; CH1/n*R9 (1/6); Q=A*C*sart (R*I); Fie programul principal pfhm: % program pfh.m global mb n I m=1, b=1, n=0.018, I=-0.001 h=0.50 Q=£h(h) Lansam in executie programul principal: >pfh Se obtine: me 4 b= 1 ne 0.0180 oS -0.001 h= 0.5000 Cel putin una din valorile initiale este negativa. Daca pantei / i se atribuie o valore pozitiva (ex. [= 0.001), atunci se afiseaza valorea debitului O. REZOLVAREA ECUATIILOR NELINIARE DE O SINGURA VARIABILA REZOLVAREA ECUATILOR ALGEBRICE (POLINOMIALE) Fie ecuatia fx) = 0, unde ffx) este un polinom de gradul n, Se) = a,x" a,x" $x"? tax thax bays a cucoeficientii a, ,k=1,2,...,1+ 1, numere reale. Solufile reale si imaginare ale ecuatiei ax" Fax tax"? bta bar ta, Q) se determina in Marlab cu ajutorul functiei roots, cu sintaxa X=roois(A), unde A este vectorul coeficientilor polinomului si X’este vectorul solutiilor. Exemplu Sa se determine solutile ecuatiei x +5x"-6=0. >A=(1 5 0 0-6], X-roots(A) 04668032415002 -0.47665983792499 + 0,980660873172884, -0.47665983792499 - 0.98066087317288i 1.00000000000000 CALCULUL RADACINILOR REALE ALE ECUATHLOR TRANSCENDENTE DE O SINGURA VARIABILA Fie ecuatia de o singura variabila, /(x)=0, f:R— R, unde expresia functiei fs) nu Poate fi adusa la forma polinomiala. Pentru calculul unei ridacini reale a acestei ecuatii, se foloseste in Matlab functia feero, cu una din sintaxele: xefeero(‘nume_functie'x0), unde nume_functie reprezint& numele unei functii externe care calculeaza y=fis), iar x0 este 0 valoare de start. X-feero(‘nume_functie’,tol), unde tol reprezinté precizia impus& in aproximarea solutieis x valorile intermediare din fiecare iteratie, ero(‘nume_funetie’,tol,trace), unde, pentru trace diferit de zero se afiseazs Exemplu S& se calculeze adancimea normal a apei intr-un canal trapezoidal, cunoscéind debitul @ = 10 m/s, lati rugozitate n = 0,018 si panta canalului / = 0,5 %. ea la fund b = 1 m, coeficientul unghiular m = 1, coeficientul de Se editeaz& functia extern’ fhn.m; function y=thn (x); global Qmbnj As (bim+h) *hy P=b+2*h*sqrt (1+m*2) ; C=1/n*R* (1/6) ; -A*C*agrt (R*5) 5 Se editeaza programul principal: ® program calcul h normal global Qb mn 3 9-10, b=1, m=1,/n=0.018, 4=0.005 h=fzero(‘fhn' 4777 1) Se obtine (h calculat cu precizia 1.0e-1 a= 10 Be 1 0.01800000000000 0.00500000000000 Func evals x f(x) Procedure 1 1 4.90377 initial 2 0.971716 5.18844 search 3 1.02828 4.60968 search 4 0.96 5.30362 search 5 1.04 4.48508 search 6 0.943431 5.4638 search 7 1.05657 4.30606 search 8 0.92 5.68495, search 9 1.08 4.04724 search 10 0.986863 5.98703 search a 1.11314 3.6698 search 12 0.84 6.39325, search 13 1.16 3.11289 search u4 0.773726 6.92661, search 1s 1.22627 2.27818 search 16 0.68 7.60122 search 7 1.32 1.00103 search 18 0.547452 8.40301 search 19 1.45255 -1.00529 search Locking for a zero in the interval [0.54745, 1.4525) 20 1.35584 0.482049 interpolation 21 1.38718 00139832 interpolation 22 1.38811 -1.00861e-005 interpolation 23 1.3881 4,17773e-009 interpolation 24 1.3881 3.55271e-015 interpolation 25 1.3881 1.77636e-015 interpolation 26 1.3881 -1.77636e-015 interpolation he 1.38810488162221 3. VARIABILE $I CONSTANTE SPECIALE iN MATLAB in Matlab exist o serie de variabile si constante cu anumite semnificafii, care nu trebuie declarate si sunt accesibile global in orice fisier de tip .m. Dintre acestea menfionam cditeva: «ans - cel mai recent raspuns (.e., answer = rispuns). Este variabila creat in mod automat, cdreia i se atribuie valoarea celei mai recente expresii neasignate. Exemple: >x=1.5; y=0.10; x*y ans = 1.0414 Deci variabilei ans i se atribuie valoarea expresiei x’). > a=(1 23 4 5]; a>=2, ans-1 ans = 0 1 1 1 1 ans = J, 0 oO 0 0 In acest caz, variabilei ans i se atribuie mai intai vectorul cu elementele 0 sau 1 dupa cum este indeplinitd sau nu conditia a>=2, dupa care i se atribuie vectorul cu elementele ans-l. eps - returneaza precizia relativa in reprezentarea numerelor in modul virgul& mobila (epsilon masind, distanta dintre 1 si urmatorul numar reprezentabil in virgula mobila). in unele func{ii Matlab, eps reprezint& toleranta imy it (eroarea maxima admisf, criteriul de convergent) in aproximarea solutiei, atribuita prin program, cu valoare diferita, in general, de precizia masinii. Exemple: >eps ans = 2.220446049250313e-016 > epse=1; while l+epsc>1; epsc=epsc/2; end; epsc=2*epsc epse = 2.220446049250313e-016 Se observa ck epsc=eps si acest exemplu reprezinté un mod practic pentru determinarea preciziei curente a masinii, >Lteps>1, lteps/2>1 ans = ans = 0 in acest caz, pentru I+eps>1 se obfine valoarea 1, corespunzand valorii logice adevarat, in timp ce pentru 1-+eps/2>1 se obfine valoarea 0, corespunznd valorii logice fals, rspuns incorect datorat preciziei limitate in reprezentarea numerelor in modul virgula mobila. pi- retumeaza valoarea numarului 27; Exemple: > pi ans 3.141592653589793e+000 >4*atan(1) ans = 3.141592653589793e+000 >1log(-1) ans = 0 +3.141592653589793e+0001 >sin(pi) ans = 1.224606353822377e-016 Valoarea functiei sin(pi) este foarte micd, dar nu zero, datorit& erorilor care decurg din reprezentarea in virgula mobila a numerelor pe un numa finit de biti. i si j - unitafi imaginare, folosite pentru reprezentarea numerelor complexe; pot fi folosite si ca nume de variabile, de reguld pentru variabilele de ciclare in instructiunile de calcul repetitiv, prin redefinirea lor. Exemple: oi, j ans = 0 + 1.000000000000004 ans = 0 + 1.000000000000003. >a=1+3i, b=2+4j, c=atb are 1.0000 + 3.00004 b 2.0000 + 4.00004 ere 3.0000 + 7.00004 > for i=1:10; a(i)=i/2; end; a a Columns 1 through 7 0.5000 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 Columns 8 through 10 4.0000 4.5000 5.0000 In acest caz, j este variabila de ciclare a calculelor si nu mai reprezinta, in continuare, unitatea imaginard, Inf - plus infinit, reprezentat in aritmetica virgula mobila; in calcule, se obfine ca rezultat al impértirii unui numar prin zero sau prin deptigirea celui mai mare numar reprezentabil in aritmetica curenta (overflow). Exemple: >1/0, exp(710), Inf+Inf Warning: Divide by zero. ans = Inf ans. Inf ans = Inf NaN - Nu este un numa (I. e., Not-a-Number), in aritmetica virgulé mobila. Se obfine ca rezultat al unor operafii: 0/0, Inf/Inf, Inf-Inf's.a. curent, Exemple: >0/0, Inf/Inf, Inf-Inf, NaN-NaN Warning: Divide by zero. ans = NaN ans = NaN ans = NaN ans = NaN realmax - cel mai mare numér pozitiv reprezentabil in virgula mobild pe calculatorul Exemple: > ealmax, x+1.0e+291, x+1.0e+292, xx x 1.797693134862316e+308 ans = 1.797693134862316e+308 ans = Inf ans = Inf realmin - cel mai mic numar pozit eprezentat normalizat in modul virgul mobil; orice numar mai mic este egalat cu zero sau reprezentat “denormal” in modul virguliia mobila. Exempl > realmin ans = 2.225073858507202e-308 > realmin/1.0e+015, realmin/1.0e+016, realmin/realmax ans = 2.470328229206233e-323 ans = 0 ans = 0 flops ~ contor pentru numérul celor mai importante operafii efectuate in virgula ‘mobili, considernd: pentru adunare gi scadere, 1 operarfie pentru numere reale si 2 operati pentru numere complexe; pentru inmultire si imparfire, 1 operatie pentru numere reale si 6 operatii pentru numere complexe; pentru functii elementare, 1 operatie pentru cele reale si mai ‘multe pentru cele complexe. flops(0) reseteazii contorul pe zero. Exemple: > flops(0), a=1+2i, nroper=flops a 1.00000000000000 + 2.000000000000004 nroper = 2 > flops(0), a=1+2i, b=1-2i, c=a*b, nroper=flops a 1.00000000000000 + 2.000000000000003 b 1,00000000000000 - 2.000000000000004 ce 5 nroper = 10 > flops(0); A=(1 2 3; 5 -3 1; -1 4 1), b=[1; -1; 31, Isinv(A), f1=flops, x=inv(A)*b, nroper=flops 2 3 5 -3 - 4 1 b= 1 -1 3 -0.21875000000000 —0.31250000000000 0. 3437500000000 ~0.18750000000000 0.12500000000000 0. 43750000000000 0.53125000000000 -0.18750000000000 -0.40625000000000 fl = 111 a 0.50000000000000 1.00000000000000 -0.50000000000000 nroper = 129 Deci, pentru rezolvarea sistemului de ecuatii A X = B, cu A si B definite mai sus, au fost efectuate 111 operatii elementare pentru inversarea matricei A si 18 operatii elementare (diferenta pana la 129) pentru inmultirea inversei matricei A cu vectorul B. 4. IMPORTUL SI EXPORTUL FISIERELOR DE DATE 4.1, DATE NEFORMATATE 4a, Salvarea $i inedtrcarea fisierelor de date in formit binartt save - salveaza toate variabilele in figierul matlab.mat. Joad - incarca variabilele din fisierul matlab. mat. Exemple: >clear, a=(1 2 3 4 5]; save Saving to: matlab.mat >clear, load, a Loading from: matlab.mat as save cale_si_nume_fisier.mat - salveazi toate variabilele in fisierul nume_fisier.mat; Toad cale_si_nume_fisier.mat - incarc& variabilele din figierul nume_fisier. mat; Exemple: >clear; a=[1 2 3 4 5]; save d:\fisierl.mat >elear; load d:\fisierl.mat, a a save cale_si_nume_fisier.mat lista_de_variabile - salveaz variabilele specificate in lista_de_variabile in fisierul nume_fisier.m save cale_si_nume_fisier.mat lista_de_variabile - append - adaugi variabilele din lista_de_variabile in fisierul existent nume_fisier.mat; Joad cale_si_nume_fisier.mat - incarcé variabilele din fisierul nume_fisier.mat (la fel ‘ca mai sus. c=[a' b'], d-a*c, save d:\fisier2.mat AO 1 2 3 4 5 be 5 4 3 2 1 ao a 5 2 4 3 3 4 2 5 1 a= 5535 >clear; load d:\fisier2.mat; c,d ee 1 5 2 4 3 3 4 2 5 1 a= 55 35 6, Salvarea si incitrcarea fisierelor de date in forma ASCI save cale_si_nume_fisier lista_de_variabile - ascit salveaza in fisierul nume_fisier, {in format ASCII cu 8 cifte, variabilele specificate in lista_de_variabile; save cale_si_nume_fisier lista_de_variabile - ascii -double - salveazi in fisierul nume_fisier, in format ASCII cu 16 cifte, variabilele specificate in lista_de_variabile; save cale_si_nume_fisier lista_de_variabile -ascii -double -tabs ~ salveazi in fisierul ‘ume _fisier, in format ASCII cu 16 cifre, variabilele specificate in lista_de_ variabile, separate prin tabs. load cale_si_nume_fisier ~ incarci datele, dispuse pe linii, cu acelasi numar de coloane pe fiecare linie, din fisierul mume_fisier, si le atribuie variabilei mume_fisier. Exemple: >a=1:5; save d:\fisier3.dat a -ascii 15; save d:\fisier4.dat a -ascii -double >a=1:5; save d:\fisierS.dat a -ascii -double -tabs >load d:\fisier3.dat, fisier3 fisier3 = 1 2 3 4 5 >load d:\fisier4.dat, fisier4 fisiera = 1 2 3 4 5 >load d:\fisierS.dat, fisier5 fisiers = 1 2 3} 4 5 >a=eye(3), b=1:3, M=[a b'], save d:\fisier6.dat M -ascii as 1 0 0 0 1 0 0 0 1 b= 1 2 3 M= 1 0 0 1 0 1 0 2 0 0 1 3 >clear, load d:\fisier6.dat, fisier6, a=fisier6(1:3,1:3) isier6(:,4)' fisieré = oe 1 0 0 0 1 0 0 0 1 b= 1 203 4.2: DATE FORMATATE Salvarea si incdrcarea figierelor de date formatate (date reprezentate dupa un format prestabilit), implica parcurgerea urmiitoarelor etape: * deschiderea fisierului; + sorierea sau citirea datelor dupa format; + inchiderea fisierului. 4.2.1, Deschiderea fisierului Pentru deschiderea unui figier de date formatate, se foloseste functia fopen, cu sintaxele posibile: idemificator_fisier = fopen(nume_fisier,permisiune); identificator fisier, mesaj| = fopen(nume_fisier,permisiune); identificator_fisier,mesaj| = fopen(nume_fisier,permisiune format_masina), unde: ~ nume_fisier ~ constanta sau variabila sir care desemneaza numele fisierului sau calea si numele fisicrului, dupa cum acesta se afla in directorul implicit sau nu; ~ permisiune - constanta sir pentru desemnarea operatiei permise de lucru cu fisierul, dupa codul: =‘? -citire date; ~‘w" = scriere date, creazit figierul dacd nu exist; ~‘a’ ~ adaugare date, creaza fisierul daca nu existi; ~ ‘r#’ - citire gi scriere date, nu creaza fisierul; - ‘w+? - trunchiere sau creare pentru citire si scriere; - ‘at? - citire si adaugare, creaza fisierul daca nu exist’; Implicit, fisierele sunt deschise in modul binar. Pentru deschiderea unui figier text, se adauga caracterul ‘t’, de exemplu 't’, ‘wt+! ete. - identificator_fisier - numar intreg returnat de functia fopen, asociat figierului nume_fisier ca identificator de figier, cu valorile: 1 daca descl jerea fisierului nu a fost posibila; 3, 4, 5, ~ daca deschiderea figierului s-a soldat cu un succes (numerele 1 si 2 sunt rezervate pentru iesiri standard); - mesaj - un mesaj de eroare in cazul in care fisierul nu poate fi deschis; - format_masina - constanta sir pentru cod format masind: = ‘native’ sau ‘n’ - formatul local al masini, implicit; + Sieee-le* sau ‘I’ - format aritmeticd in virgula mobila, cu “little-endian byte ordering”; = “ieee-be’ sau “b’ - format aritmeticd in virgula mobild, cu “big-endian byte ordering”; ~ “ieee-le.164° sau ‘a’ - format aritmeticd in virguld mobila, cu “little-endian byte ordering”, si tip de date pe 64 biti; ‘iece-be.64” sau ‘s’ - format aritmeticd in virgula mobil’, cu “big-endian byte ordering”, si tip de date pe 64 biti. Funetia fopen, cu sintaxa: identificatori_fisiere = fopen(‘all’) returneazi un vector linie care confine identificatorii tuturor fisierelor deschise momentan (fara 1 si 2), iar cu sintaxa: [nume_fisier,permisiune, format_masina] = fopen(identificator_fisier) returneazi numele fisierului, permisiunea si formatul magin& asociate identificatorului identificator_fisier. Daca identificator_fisier nu exist’, atunci este returnat un caracter sir vid pentru fiecare variabila, 4.2.2. Scrierea datelor formatate in fisiere a) Date formatate extern Pentru scrierea datelor dupa un format extern de reprezentare, se foloseste functia prim, cu sintaxa: contor = forintftidentificator fis ier format lista_de_variabile) unde: ~ identificator fisier reprezint& identificatorul asociat fisierului in care se doreste insorierea datelor, obtinut din fopen; poate lua si valorile 1 pentru output standard (eeran), sau 2 pentru eroare standard. = format ~ constanta sir pentru formatul de scriere a datelor (format specific limbajului C) - vezi help. - lista_de_variabile - lista de variabile, separate intre ele prin virgula; ordinea scrieri elementelor matricelor este pe coloane. b) Date formatate intern Pentru scrierea datelor dupa format de reprezentare intern’, se foloseste functia Forite, cu sintaxa: contor=fwrite(identificator_fisierista_de_variabile,precizie) unde: + identificator_fisier reprezints identificatorul asociat fisicrului in care se doreste scrierea datelor, obinut din fopen; poate lua si valorile 1 pentru output standard (ecran), sau 2 pentru eroare standard. + lista_de_variabile - lista de variabile, separate intre ele prin virgula; ordinea serierii clementelor matricelor este pe coloane. + precizie - sir de caractere pentru controlul formei si mérimii rezultatului (numarul bitilor pentru fiecare valoare si interpretarea acestor bi a, caracter sir, intreg sau numar in virguli mobili. Oricare dintre urmatoarele giruri de caractere, fie in versiunea Matlab, fie in C sau Fortran, pot fi folosite. daca nu se precizeaza, implicit este ‘uchar’. MATLAB C sau Fortran Descriere ‘char’ ‘char* 1" caracter, 8 bits sintaxa: unde: “uchar’ ‘unsigned char’ unsigned character, 8 bits ‘schar’ ‘signed char’ signed character, 8 bits ‘inte “integer*1’ integer, 8 bits. ‘intl’ “integer*2! integer, 16 bits. "int32" ‘integer*4' integer, 32 bits. “imo4 ‘integer*8' integer, 64 bits ‘uints" ‘integer* 1’ unsigned integer, 8 bits. ‘uintl6" ‘integer #2" unsigned integer, 16 bits. ‘uint32" ——_‘integer*4 unsigned integer, 32 bits. ‘uint64' ——_‘integer*8" unsigned integer, 64 bits ‘float32'—_‘'real*4’ floating point, 32 bits ‘float64' —_‘real*8! floating point, 64 bits. 4.2.3, Citirea datelor formatate din fisiere a), Date formatate extern Pentru citirea datelor formatate extern dintr-un fisier, se foloseste functia fscanf, cu [variabita,contor] _facanffidentificator_fisier format,marime) - identificator _fisier reprezinta identificatorul asociat figierului din care se doreste citirea datelor, obsinut din fopen; - format - constanta sir pentru formatul de citire a datelor; vezi forinif - marime - numérul elementelor de citit din fisier; este optional - dack nu se precizeazi, este considerat intreg fisierul, dact se precizeaza, poate fi: n- un numir intreg; inf citeste pand la sfarsitul fisierului; [m,n] - citeste m * n elemente, pentru matricea m x n, pe coloane; - variabila - variabila care conjine elementele citite; = contor - numérul elementelor citite, b) Date formatate intern Pentru citirea datelor formatate dup format intern (binare), se foloseste functia fread, cu sintaxa: unde: [variabila,contor|=fread{(identificator._fisier,marime,precizie) ~ identificator_fisier reprezinta identificatorul asociat fisierului din care se doreste citirea datelor, obinut din fopen; - marime - numérul elementelor de citit din figier; este optional - dack nu se precizeaza, este considerat intreg fisierul, daca se precizeaza, poate fi: furrite, n= un numar intreg; inf - citeste pana la sfargitulfigieruluis [m,n] - citeste m * n elemente, pentru matricea mx n, pe coloane; ~ precizie - sir de caractere pentru controlul formei si marimii rezultatului, vezi - variabila - variabila care contine elementele citite; ~ contor - numarul elementelor citite. Exemple: >ident1=fopen ('d:\fisier30.dat','w') identl = >[ident2,mesaj]=fopen('d:\fisier31.dat', 'w+', 'b') ident2= mesaj = >[fisier, permisie, format ]=fopen (ident2 fisier = d:\fisier31.dat permisie = wot format = ieee-be > [ident3,mesaj]=fopen('d:\fisier00.dat', 'r') ident3 = -1 mesaj = Cannot open file. Existence? Permissions? Memory? in acest caz, s-a intenfionat deschiderea pentru c datelor a unui fisier care nu a fost creat. >ident=fopen('all') ident = » fid=fopen('d:\fisier9.dat','w'), | fprint£(fid, '%5.0£ %12.4f\n',M), f£close(fid), type d:\fisier9.dat fid 3 ans = 95 ans = 0 1 0.8415 2 0.9093 3 0.1412 4 -0.7568 5 -0.9589

You might also like