| 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.00000000000000CALCULUL 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
10.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.388104881622213. 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 =
Infans.
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 =
Infrealmin - 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 bitssintaxa:
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 =
wotformat =
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