UÎ.9.
matlab
CUPRINS
9.1. Introducere
9.2. Expresii în matlab
9.3 Help on-line, formatul datelor, opţiuni
de salvare
9.4. Crearea fișierelor matlab (.m files)
Lucrare de verificare nr. 9.
Obiective
• Introducerea într-un limbaj de
programare, matlab;
După parcurgerea unității de învățare
nr. 9. cursanții vor fi capabili:
• să realizeze programe în
matlab.
49
9.1. Introducere
MATLAB® = Limbaj de înaltă performanţă pentru proiectarea asistată de
calculator.
MATLAB este în acelaşi timp un limbaj de programare şi un sistem de
dezvoltare care integrează calculul, vizualizarea şi programarea într-un mediu
uşor de utilizat (easy-to-use), problemele şi soluţiile acestor probleme fiind
exprimate într-un limbaj matematic accesibil.
Domenii de utilizare:
• Matematică şi calcul numeric
• Dezvoltarea algoritmilor
• Modelare, simulare şi testarea prototipurilor
• Analiza şi vizualizarea datelor
• Grafica inginerească şi din ştiinţele aplicate
• Dezvoltarea de aplicaţii, inclusiv GUI
MATLAB = sistem interactiv care are ca element de bază tabloul, matricea,
ceea ce permite rezolvarea problemelor de calcul numeric, în special cele care
necesită prelucrarea de vectori sau matrici.
Numele MATLAB provine de la Matrix laboratory, firma producătoare este
The MathWorks, Inc., SUA.
MATLAB-ul a evoluat:
• în mediul universitar unde este pachetul standard pentru cursurile
introductive şi avansate de matematică, inginerie şi ştiinţe
• în industrie, unde este utilizat pentru cercetarea de înalt randament,
dezvoltare şi producţie
MATLAB permite dezvoltarea unei familii de aplicaţii sub forma toolbox-
urilor. Aceste toolbox-uri permit învăţarea şi aplicarea tehnologiilor
specializate din diverse domenii. Sunt disponibile toolbox-uri pentru domenii
cum ar fi: procesarea numerică a semnalelor, sisteme de conducere automată,
reţele neurale, logică fuzzy, wavelet, simulare (SIMULINK), identificare etc.
50
Sistemul MATLAB constă în cinci părţi principale:
• Limbajul MATLAB
• Mediul de lucru MATLAB
• Handle Graphics®
• Biblioteca de funcţii matematice a MATLAB-ului
• Interfaţa de aplicaţii program a MATLAB-ului (API)
Limbajul MATLAB: Reprezintă un limbaj de nivel înalt de tip matrice/tablou
cu instrucţiuni de control al salturilor, funcţii, structuri de date, intrări/ieşiri
şi cu proprietăţi de programare orientată pe obiecte. Facilităţile de programare
sunt organizate pe 6 directoare:
Tabelul 9.1
ops Operators and special characters.
Lang Programming language constructs.
Strfun Character strings.
Iofun File input/output.
Timefun Time and dates.
Datatypes Data types and structures.
Mediul de lucru MATLAB: Reprezintă un set de facilităţi care permit
manevrarea variabilelor în spaţiul de lucru, importul şi exportul de date,
dezvoltarea, manipularea, editarea şi depanarea fişierelor MATLAB (.m) şi a
aplicaţiilor MATLAB. Aceste facilităţi sunt organizate în directorul:
Tabelul 9.2
general General purpose commands.
Handle Graphics®: Reprezintă sistemul grafic al MATLAB-ului. Cuprinde
comenzi de înalt nivel pentru vizualizarea datelor bi şi tri-dimensionale,
procesarea imaginilor, animaţie, prezentări de grafice. Permite de asemenea
utilizarea unor comenzi de nivel scăzut pentru crearea unor interfeţe grafice
GUI. Funcţiile grafice sunt organizate în 5 directoare:
Tabelul 9.3
graph2d Two-dimensional graphs.
Graph3d Three-dimensional graphs.
Specgraph Specialized graphs.
Graphics Handle Graphics.
51
Uitools Graphical user interface tools.
Biblioteca de funcţii matematice a MATLAB-ului: Reprezintă o colecţie
complexă de algoritmi de calcul pornind de la funcţii elementare (sinus,
cosinus etc.) până la funcţii sofisticate (inversarea de matrice, valori proprii,
funcţii Bessel, FFT etc.). Funcţiile matematice sunt organizate în 8 directoare:
Tabelul 9.4
elmat Elementary matrices and matrix manipulation.
Elfun Elementary math functions.
Specfun Specialized math functions.
Matfun Matrix functions – numerical linear algebra.
Datafun Data analysis and Fourier transforms.
Polyfun Interpolation and polynomials.
Funfun Function functions and ODE solvers.
Sparfun Sparse matrices.
Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care
permite scrierea de programe în C sau Fortran care interacţionează cu
MATLAB-ul. Include facilităţi pentru apelarea rutinelor din MATLAB,
apelarea MATLAB-ului ca maşină de calcul, scrierea şi citirea fişierelor de
tip .MAT .
Pachetul SIMULINK
• SIMULINK® este un pachet software ataşat MATLAB-ului şi
reprezintă un sistem interactiv pentru simularea dinamicii sistemelor
neliniare (bineînţeles şi a celor liniare). Este conceput sub forma unei
interfeţe grafice care permite crearea unui model prin “trasarea”
schemei bloc a sistemului şi apoi simularea dinamicii sistemului.
• SIMULINK poate lucra cu sisteme liniare, neliniare, continue,
discrete, multivariabile etc.
• SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt
biblioteci suplimentare care conţin aplicaţii specializate din domenii
cum ar fi: comunicaţii, procesarea semnalelor etc.
• Real-time Workshop® este un program foarte important care permite
generarea unui cod C pentru schemele bloc create în SIMULINK şi
prin urmare permite rularea de aplicaţii în timp real de o mare
diversitate.
52
Toolbox-urile MATLAB
Toolbox-urile reprezintă o familie de aplicaţii care permit învăţarea şi
aplicarea tehnologiilor specializate din diverse domenii. Aceste toolbox-uri
sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul
MATLAB pentru rezolvarea unor clase particulare de probleme. Câteva din
cele mai utilizate aplicaţii sunt prezentate în figura următoare.
Figura 9.1
9.2. Expresii
MATLAB-ul lucrează cu expresii matematice ca şi celelalte limbaje de
programare, dar spre deosebire de majoritatea acestor limbaje, aceste expresii
implică la scară largă lucrul cu matrici.
Expresiile sunt alcătuite cu ajutorul următoarelor tipuri:
• Variabile
53
• Numere
• Operatori
• Funcţii
Variabile
MATLAB-ul nu necesită declararea dimensiunii variabilelor, deoarece la
întâlnirea unui nou nume de variabilă generează automat variabila respectivă
şi alocă spaţiul necesar de memorie.
Numele unei variabile este o literă, urmată de un număr oricât de mare de
litere, cifre sau simboluri. Din acest număr “oricât de mare” sunt oprite
primele 31 de caractere.
MATLAB-ul este case sensitive - face distincţie între literele mici şi cele
mari.
Exemplu:
» a = 30
crează o matrice 1 x 1 cu numele a şi stochează valoarea acesteia 30 într-o
singură locaţie corespunzătoare singurului element al matricei.
Numere
MATLAB-ul utilizează notaţia zecimală, cu punct zecimal opţional şi cu semn
+ sau -. Se utilizează şi notaţia ştiinţifică cu litera e pentru a specifica o putere
a lui 10. Reprezentarea numerelor imaginare este realizată cu litera i sau j
ca sufix.
Exemple:
3 -99 0.0001
9.6397238 1.60210e-20 6.02252e23
1i -3.14159j 3e5i
Toate numerele sunt stocate intern utilizând formatul long specificat de
standardul IEEE în virgulă mobilă (precizie de 16 zecimale semnificative în
domeniul 10-308 la 10+308).
Operatori
Expresiile utilizează operatori aritmetici uzuali.
54
Tabelul 9.5
+ Adunare
- Scădere
* Multiplicare
/ Împărţire
\ Împărţire la stânga
^ Ridicarea la o putere
' Transpusa complex conjugată
( ) Operatorul de specificare a ordinii de evaluare
Funcţii
MATLAB-ul furnizează un mare număr de funcţii matematice elementare
standard (abs, sqrt, exp, sin …).
Există şi funcţii matematice avansate (funcţii Bessel, gama etc.), multe dintre
acestea acceptând argumente complexe.
Pentru vizualizarea funcţiilor elementare se poate tasta:
» help elfun
Pentru a vedea lista funcţiilor avansate se poate tasta:
» help specfun
» help elmat
O parte din funcţii (cum ar fi sqrt, sin) sunt de tip built-in, adică sunt o
parte a nucleului MATLAB, au o mare eficienţă, dar detaliile constructive nu
sunt accesibile utilizatorului.
Alte funcţii sunt implementate ca fişiere MATLAB (M-files) şi pot fi chiar
modificate.
Câteva funcţii furnizează valorile unor constante universale:
Tabelul 9.6
pi 3.14159265
I Imaginary unit, -1
J Same as I
Eps Floating-point relative precision, 2-52
Realmin Smallest floating-point number, 2-1022
Realmax Largest floating-point number, 21023
Inf Infinity
NaN Not-a-number
55
Numele funcţiilor nu sunt rezervate şi deci este posibilă suprascrierea lor.
Exemplu:
eps = 1.e-6
Funcţia originală este reconstituită prin comanda:
» clear eps
Exemple de expresii şi rezultatele corespunzătoare ale evaluării acestor
expresii:
» rho = (1+sqrt(5))/2
rho =
1.6180
» a = abs(3+4i)
a =
» z = sqrt(besselk(4/3,rho-i))
z =
0.3730+ 0.3214i
» huge = exp(log(realmax))
huge =
1.7977e+308
» toobig = pi*huge
toobig =
Inf
56
9.3. Help on-line, formatul datelor, opţiuni de salvare
Help on-line
Pentru rularea MATLAB pe un PC trebuie pur şi simplu executat un dublu
click cu mouse-ul pe icon-ul MATLAB. Dacă sistemul de operare nu este de
tip Windows (este de tip UNIX) trebuie tastat matlab după prompter-ul
sistemului de operare.
Pentru aflarea tuturor informaţiilor utile despre o comandă sau o funcţie se
tastează help urmat de numele comenzii sau funcţiei respective.
Pachetul MATLAB dispune de asemenea de informaţii complete despre
utilizare sub forma unei documentaţii tip .pdf.
În cazuri particulare se poate apela la INTERNET, existând o legătură la
pagina Web a firmei producătoare.
Alte comenzi utile pentru aflarea de informaţii sunt: helpwin, lookfor,
help help.
Exemple:
>> help sin
sin Sine of argument in radians.
sin(X) is the sine of the elements of X.
See also asin, sind.
Reference page for sin
Other functions named sin
>> help exp
exp Exponential.
exp(X) is the exponential of the elements of X,
e to the X.
57
For complex Z=X+i*Y, exp(Z) =
exp(X)*(COS(Y)+i*SIN(Y)).
See also expm1, log, log10, expm, expint.
Reference page for exp
Other functions named exp
>> help plot
plot Linear plot.
plot(X,Y) plots vector Y versus vector X. If X
or Y is a matrix,
then the vector is plotted versus the rows or
columns of the matrix,
whichever line up. If X is a scalar and Y is a
vector, disconnected
line objects are created and plotted as discrete
points vertically at X.
plot(Y) plots the columns of Y versus their
index.
If Y is complex, plot(Y) is equivalent to
plot(real(Y),imag(Y)).
In all other uses of plot, the imaginary part is
ignored.
Various line types, plot symbols and colors may
be obtained with
plot(X,Y,S) where S is a character string made
from one element
from any or all the following 3 columns:
b blue . point - solid
58
g green o circle : dotted
r red x x-mark -. dashdot
c cyan + plus -- dashed
m magenta * star (none) no line
y yellow s square
k black d diamond
w white v triangle (down)
^ triangle (up)
< triangle (left)
> triangle (right)
p pentagram
h hexagram
For example, plot(X,Y,'c+:') plots a cyan dotted
line with a plus at each data point; plot(X,Y,'bd')
plots blue diamond at each data point but does not
draw any line.
plot(X1,Y1,S1,X2,Y2,S2,X3,Y3,S3,...) combines
the plots defined by the (X,Y,S) triples, where the
X's and Y's are vectors or matrices and the S's are
strings.
For example, plot(X,Y,'y-',X,Y,'go') plots the
data twice, with a solid yellow line interpolating
green circles at the data points.
The plot command, if no color is specified, makes
automatic use of the colors specified by the axes
ColorOrder property. By default, plot cycles through
the colors in the ColorOrder property. For
monochrome systems, plot cycles over the axes
LineStyleOrder property.
59
Note that RGB colors in the ColorOrder property
may differ from similarly-named colors in the
(X,Y,S) triples. For example, the second axes
ColorOrder property is medium green with RGB [0 .5
0], while plot(X,Y,'g') plots a green line with RGB
[0 1 0].
If you do not specify a marker type, plot uses
no marker.
If you do not specify a line style, plot uses a
solid line.
plot(AX,...) plots into the axes with handle AX.
plot returns a column vector of handles to
lineseries objects, one handle per plotted line.
The X,Y pairs, or X,Y,S triples, can be followed
by parameter/value pairs to specify additional
properties of the lines. For example,
plot(X,Y,'LineWidth',2,'Color',[.6 0 0]) will create
a plot with a dark red line width of 2 points.
Example
x = -pi:pi/10:pi;
y = tan(sin(x)) - sin(tan(x));
plot(x,y,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
60
See also plottools, semilogx, semilogy, loglog,
plotyy, plot3, grid,
title, xlabel, ylabel, axis, axes, hold, legend,
subplot, scatter.
Reference page for plot
Other functions named plot
Formatul datelor
MATLAB-ul afişează numerele cu 5 zecimale (setare implicită). Această
setare se poate modifica cu ajutorul comenzii format.
>> help format
format Set output format.
format with no inputs sets the output format to
the default appropriate
for the class of the variable. For float
variables, the default is
format SHORT.
format does not affect how MATLAB computations
are done. Computations
on float variables, namely single or double, are
done in appropriate
floating point precision, no matter how those
variables are displayed.
Computations on integer variables are done
natively in integer. Integer
variables are always displayed to the
appropriate number of digits for
the class, for example, 3 digits to display the
INT8 range -128:127.
format SHORT and LONG do not affect the display
of integer variables.
format may be used to switch between different
output display formats
of all float variables as follows:
format SHORT Scaled fixed point format
with 5 digits.
format LONG Scaled fixed point format
with 15 digits for double
61
and 7 digits for single.
format SHORTE Floating point format with 5
digits.
format LONGE Floating point format with 15
digits for double and
7 digits for single.
format SHORTG Best of fixed or floating
point format with 5
digits.
format LONGG Best of fixed or floating
point format with 15
digits for double and 7
digits for single.
format SHORTENG Engineering format that has
at least 5 digits
and a power that is a
multiple of three
format LONGENG Engineering format that has
exactly 16 significant
digits and a power that is a
multiple of three.
format may be used to switch between different
output display formats
of all numeric variables as follows:
format HEX Hexadecimal format.
format + The symbols +, - and blank are
printed
for positive, negative and zero
elements.
Imaginary parts are ignored.
format BANK Fixed format for dollars and
cents.
format RAT Approximation by ratio of small
integers. Numbers
with a large numerator or large
denominator are
replaced by *.
format may be used to affect the spacing in the
display of all
variables as follows:
format COMPACT Suppresses extra line-feeds.
format LOOSE Puts the extra line-feeds back
in.
Example:
format short, pi, single(pi)
62
displays both double and single pi with 5 digits
as 3.1416 while
format long, pi, single(pi)
displays pi as 3.141592653589793 and single(pi)
as 3.1415927.
format, intmax('uint64'), realmax
shows these values as 18446744073709551615 and
1.7977e+308 while
format hex, intmax('uint64'), realmax
shows them as ffffffffffffffff and
7fefffffffffffff respectively.
The HEX display corresponds to the internal
representation of the value
and is not the same as the hexadecimal notation
in the C programming
language.
Exemple:
» c=1.333456789233
c =
1.3335
» format long
» c
c =
1.33345678923300
» format short e
» c
c =
1.3335e+000
» format long e
» c
c =
1.333456789233000e+000
63
» format
» c
c =
1.3335
Opţiuni de salvare
Pentru salvarea variabilelor curente cu care se lucrează în MATLAB la
încheierea unei sesiuni de lucru se poate utiliza comanda save.
Această comandă va salva toate variabilele curente generate de către utilizator
într-un fişier numit [Link] . Dacă se doreşte se poate da un nume
fişierului de date în care se salvează variabilele.
Exemplu:
» save date c determ A
realizează salvarea datelor c, determ şi A într-un fişier [Link] .
Pentru restituirea variabilelor într-o sesiune de lucru ulterioară se foloseşte
comanda load.
Exemplu:
» load date
Dacă se doreşte aflarea variabilelor curente se pot utiliza comenzile who,
whos:
Exemplu:
» who
Your variables are:
A c determ
» whos
Name Size Bytes Class
64
A 2x2 32 double array
c 1x1 8 double array
determ 1x1 8 double array
Grand total is 6 elements using 48 bytes
Pentru ştergerea tuturor variabilelor curente din memoria de lucru se poate
utiliza comanda clear.
9.4. Crearea fișierelor MATLAB (.m files)
Deoarece este mult mai comod şi util decât introducerea comenzilor linie
după linie la prompterul MATLAB, se lucrează cu fişiere text care conţin
aceste linii program cu comenzile necesare.
Aceste fişiere conţin cod în limbajul MATLAB şi sunt denumite .m files (sau
M-files). Fişierele se creează utilizând un editor de text şi apoi se utilizează
ca o comandă MATLAB obişnuită.
Sunt două tipuri de fişiere .m:
• Fişiere Script, care nu acceptă argumente de intrare şi nu returnează
argumente de ieşire. Aceste fişiere operează cu datele din spaţiul de
lucru.
• Rutine (funcţii), care acceptă argumente de intrare şi returnează
argumente de ieşire. Variabilele utilizate sunt variabile locale
(interne) ale funcţiei.
Pentru a vedea conţinutul unui fişier MATLAB, de exemplu iedm.m, se
foloseşte comanda:
» type iedm
Fişiere Script
Atunci când se apelează la un fişier script, MATLAB-ul execută comenzile
găsite în fişierul respectiv. Fişierele script pot lucra cu date din spaţiul de
lucru (workspace) sau pot crea date noi cu care operează. Script-urile nu
furnizează argumente de ieşire, iar variabilele create rămân în workspace,
pentru a fi eventual folosite în calculele ulterioare.
Fişierele script pot furniza ieşiri grafice folosind funcţii cum ar fi plot,
bar.
65
Exemplu de fişier script:
magicrank.m, cu următoarele comenzi MATLAB:
% Investigate the rank of magic squares
r = zeros(1,32);
for n = 3:32
r(n) = rank(magic(n));
end
r
bar(r)
La tastarea numelui fişierului script (fără extensia .m):
» magicrank
MATLAB-ul execută comenzile, calculează rangul unor matrici (matricile
magice), şi trasează graficul cu rezultatele calculului. După ce se termină
execuţia fişierului, variabilele n şi r rămân în spaţiul de lucru.
Graficul rezultat este prezentat în continuare:
Figura 9.2
66
Funcţii (rutine)
Aceste fişiere acceptă argumente de intrare şi furnizează argumente de ieşire.
Numele fişierului MATLAB (M-file) şi cel al funcţiei (subrutinei) respective
trebuie să fie identice. Funcţiile (subrutinele) lucrează cu variabile proprii
separate de spaţiul de lucru uzual al MATLAB-ului.
Exemplu:
funcţia rank. Fişierul M-file rank.m este disponibil în directorul
toolbox/matlab/matfun.
Se poate vizualiza fişierul cu comanda:
» type rank
function r = rank(A,tol)
%RANK Matrix rank.
% RANK(A) provides an estimate of the number of
linearly
% independent rows or columns of a matrix A.
% RANK(A,tol) is the number of singular values of
A
% that are larger than tol.
% RANK(A) uses the default tol = max(size(A)) *
eps(norm(A)).
% Class support for input A:
% float: double, single
% Copyright 1984-2007 The MathWorks, Inc.
s = svd(A);
67
if nargin==1
tol = max(size(A)) * eps(max(s));
end
r = sum(s > tol);
Prima linie a unei funcţii M-file începe cu cuvântul cheie function.
Această linie dă numele funcţiei, ordinea şi numărul argumentelor.
Liniile următoare (care încep cu caracterul %) sunt linii de comentariu, care
de fapt sunt şi liniile afişate atunci când se apelează la comanda » help
rank.
Restul liniilor sunt executabile. Variabila s, ca şi r, A, tol sunt variabile locale
ale funcţiei şi sunt separate de variabilele din workspace.
uncţia rank poate fi utilizată în diferite moduri:
» rank(A)
» r = rank(A)
» r = rank(A,1.e-6)
Variabile globale
Dacă se doreşte ca mai multe astfel de subrutine să utilizeze o anume variabilă
comună, se declară variabila respectivă ca globală utilizând comanda global
în toate funcţiile respective.
Exemplu:
fişierul falling.m:
function h = falling(t)
global GRAVITY
h = 1/2*GRAVITY*t.^2;
Se introduc apoi în mod interactiv liniile:
» global GRAVITY
» GRAVITY = 32;
68
» y = falling((0:.1:5)');
Funcţia eval
Funcţia eval lucrează cu variabilă text pentru implementarea unei facilităţi
puternice de tip macro text.
Expresia eval(s) foloseşte interpreter-ul MATLAB pentru evaluarea
expresiei sau execuţia declaraţiei din şirul de caractere s.
Vectorizarea
Pentru a obţine o viteză de calcul mare, este foarte importantă aşa-numita
vectorizare a algoritmilor în fişierele MATLAB. Acolo unde alte limbaje
folosesc bucle de repetitive, MATLAB-ul poate utiliza operaţii matriceale sau
vectoriale.
Exemplu:
x = 0;
for k = 1:1001
y(k) = log10(x);
x = x + .01;
end
Versiunea vectorizată a aceluiaşi program este:
x = 0:.01:10;
y = log10(x);
Funcţii de funcţii
În MATLAB există o clasă de funcţii care lucrează cu funcţii neliniare ca
argument. Funcţiile de funcţii includ:
• găsirea zerourilor;
• optimizare;
• integrare numerică;
69
• ecuaţii diferenţiale ordinare.
MATLAB-ul reprezintă funcţia neliniară ca o funcţie M-file care poate fi
ulterior utilizată ca argument de alte funcţii MATLAB.
Exemplu:
Următorul fişier creează o funcţie neliniară:
function y = humps(x)
y = 1./((x-.3).^2 + .01) + 1./((x-.9).^2 + .04) - 6;
Această funcţie poate fi evaluată pentru un set de puncte în intervalul 0 x
1 cu programul:
x = 0:.002:1;
y = humps(x);
şi apoi se poate reprezenta grafic funcţia cu comanda
plot(x,y)
Graficul arată că funcţia are un minim local la aproximativ x = 0.6. Dacă de
exemplu utilizăm funcţia fmins putem găsi imediat valoarea exactă a lui x .
Primul argument al funcţiei fmins este chiar numele funcţiei pentru care
calculăm minimul (al doilea parametru este o aproximare grosieră a localizării
minimului).
» p = fmins('humps',.5)
p =
0.6370
Se poate acum evalua valoarea funcţiei în punctul de minim local:
» humps(p)
ans =
11.2528
70
Figura 9.3
71
Lucrare de verificare nr. 9.
✓ Identificați care este formatul datelor în matlab.
✓ Care este tipul fisierelor în matlab?
✓ Care este semnificația operatorilor utilizați de matlab.
72