Documente Academic
Documente Profesional
Documente Cultură
Introducere în MATLAB
În cele ce urmează ne propunem să revedem câteva dintre comenzile MATLAB utile în prelucrarea numerică a
semnalelor. Programul MATLAB integrează analiza numerică, calculul matriceal, procesarea semnalelor, reprezentările
grafice 2D şi 3D, realizarea interfeţelor grafice.
MATLAB (MATrix LABoratory) este un program interactiv, destinat prelucrării numerice a datelor furnizate
sub formă vectorială sau matriceală. MATLAB-ul include și aplicaţii specifice, strânse în TOOLBOX-uri. Acestea sunt
colecţii extinse de funcţii MATLAB (fişiere *.m) care dezvoltă mediul de programare de la o versiune la alta, pentru a
rezolva probleme specifice.
Selecţia unei comenzi, din bara de comenzi sau din meniul principal, se poate face cu mouse-ul sau cu
ajutorul săgeţilor, prin deplasarea zonelor active sau prin tastarea literei marcate în fiecare subcomandă.
După lansarea în execuţie, programul MATLAB intră în modul de comandă, afişând prompterul ‘>>’, şi
aşteaptă introducerea unei comenzi de către utilizator. De exemplu, comanda:
>> var = 0:5
va crea variabila var afişând cele 6 elemente ale vectorului linie var, de la v(1)=0 la v(6)=5:
var =
0 1 2 3 4 5
Comenzile introduse anterior pot fi readuse în linia de comandă prin folosirea săgeţilor de la tastatură, ‘↑’ şi
‘↓’ (căutarea se face ca într-o ‘listă’).
În afara modului de lucru în linia de comandă, MATLAB-ul lucrează cu programe conţinute în fişiere. Fişierele
ce conţin instrucţiuni MATLAB se numesc fişiere M (*.m). Un program MATLAB poate fi scris sub forma fişierelor script
sau a fişierelor function. Un fişier script este un fişier extern care conţine o secvenţă de comenzi MATLAB. După
execuţia completă a unui fişier script, variabilele create de acest tip de fişier rămân în zona de memorie a aplicaţiei.
Dacă prima linie a fişierului conţine cuvântul ‘function’, fişierul respectiv este fişier funcţie, care se caracterizează prin
faptul că poate lucra cu argumente. La terminarea execuţiei unei funcţii, în memoria calculatorului nu rămân decât
variabilele de ieşire ale acesteia.
• Meniul principal
Pentru a deschide un fişier în Editorul/Debugger-ul MATLAB-ului din meniul de comandă se procedează
astfel:
1. Pentru un fişier nou, se selectează File→New→M-file (figura 2);
2. Pentru un fişier existent se selectează File→Open şi apoi se selectează fişierul dorit (figura 3).
Figura 2. Crearea unui fişier nou Figura 3. Deschiderea unui fişier *.m existent
Din meniul principal se pot seta anumite proprietăţi, legate de formatul dorit la afişare, fonturi și opţiuni de copiere.
Pentru aceasta se selectează File→Preferences.
1
Sisteme inteligente de suport decizonal –Proiect 5
MATLAB-ul lucrează cu două tipuri de ferestre: o fereastră de comenzi şi una de reprezentări grafice. La un moment
dat poate fi deschisă numai o fereastră de comenzi. Fereastra grafică este utilizată în reprezentarea grafică a datelor; pot fi
deschise mai multe ferestre grafice în acelaşi timp. Selectarea ferestrei grafice se face în modul următor: File→New→Figure.
Pe monitor va apare o fereastră grafică ca în figura 4.
Un anumit program MATLAB, aflat într-un anumit director, nu poate fi rulat decât dacă directorul respectiv este
directorul de lucru.
3. Fişiere MATLAB
Fişierele MATLAB *.m pot fi privite ca macro-uri ale comenzilor MATLAB salvate în fişiere cu extensia .m, adică
numefisier.m. Un fişier *.m poate fi o funcţie cu variabile de intrare şi ieşire sau o listă de comenzi.
MATLAB-ul cere ca fişierele *.m să fie salvate fie în directorul de lucru, fie într-un director care este specificat în lista
căilor din MATLAB. Pentru a putea accesa fişierul *.m dintr-un anumit director, trebuie să adăugam directorul/fişierul la calea
MATLAB. Acest lucru se realizează astfel: se apasă butonul Browse for folder, se caută directorul dorit, iar apoi se confirmă cu
OK, ca în figura 5.
3
Sisteme inteligente de suport decizonal –Proiect 5
Comanda addpath nume_director adaugă directorul nume_director la calea curentă din MATLAB. Această comandă este
echivalentă cu procedura prezentată anterior de adăugare a unei noi căi.
Fişierele MATLAB pot utiliza variabile definite de utilizator, variabile definite cu comanda input. Să presupunem că
dorim să rulăm un fişier MATLAB pentru diferite valori ale unei variabile N. Atunci, în fişierul MATLAB, se utilizează următoarea
comandă:
N = input(‘N=’)
4. Definirea variabilelor
Variabilelor li se atribuie valori numerice, tipărindu-se direct expresia numerică. Dacă se tastează în linia de comandă:
>> var1 = 1+2
vom obţine rezultatul:
var1 =
3
Simbol Semnificaţie
+ Adunare
- Scădere
* Înmulţire
.* Înmulţire între două matrici (sau vectori) element cu element
/ Împărţire
./ Împărţire între două matrici (sau vectori) element cu element
^ Ridicare la putere
.^ Ridicare la putere a unei matrici (sau vector) element cu element
' Transpunere şi conjugare
.' Transpunere
() Specificarea ordinii de evaluare a operaţiilor
Tabel 1. Operatori aritmetici în MATLAB
În MATLAB există variabile predefinite – acestea nu pot fi declarate şi sunt accesibile global în orice fişier *.m. Aceste
variabile speciale sunt introduse în mod obişnuit în construcţiile funcţiilor MATLAB, ele returnând valorile scalare utile. Câteva
dintre variabilele şi constantele speciale sunt:
• ans – variabilă creată automat în care este returnat rezultatul unui calcul, atunci când expresia nu a avut asignat
un nume;
Dacă se tastează direct în fereastra de comandă:
4
Sisteme inteligente de suport decizonal –Proiect 5
>> 3
obţinem
ans = % nu s-a alocat nici un nume.
3
>> x = 2
x= % s-a alocat numele x.
2
• eps – variabilă permanentă în care este memorată eroarea relativă pentru calculele efectuate în virgulă mobilă.
Valoarea implicită este 2.2204e-016, dar poate fi redefinită la orice altă valoare;
• pi – variabilă permanentă care are asignată valoarea π = 3.141592653589 ;
• i= −1 - variabilă utilizată pentru introducerea numerelor complexe;
• j= −1 - alternativă pentru i;
• inf – variabilă utilizată pentru reprezentarea lui +∞ în aritmetica IEEE, rezultat al împărţirii 1.0 0.0 ;
• NaN – variabilă folosită pentru reprezentarea lui Not-a-Number, în aritmetica IEEE, rezultat al împărţirii
nedefinite 0.0 0.0 .
Utilizatorul poate defini şi alte variabile, cu ajutorul unor funcţii predefinite.
5
Sisteme inteligente de suport decizonal –Proiect 5
• asinh – arcsinus hiperbolic;
• acosh – arccosinus hiperbolic;
• atanh – arctangentă hiperbolică;
• acoth – arcotangentă hiperbolică;
• asech – arcsecantă hiperbolică;
• acsch – arccosecantă hiperbolică.
Pentru informaţii despre modul de utilizare al acestor funcţii folosiţi comanda help însoţită de numele funcţiei dorite.
1 2 3 −1
Fie matricea A = şi vectorii B = ( 7 8 9 ) , C = .
4 5 6 −2
>> A = [1, 2, 3; 4, 5, 6]
A=
1 2 3
4 5 6
>> A = [1 2 3; 4 5 6]
A=
1 2 3
4 5 6
>> A = [1 2 3 enter
4 5 6]
A=
1 2 3
4 5 6
>> B = [7 8 9]
6
Sisteme inteligente de suport decizonal –Proiect 5
B=
7 8 9
>> C = [-1; -2]
C=
-1
-2
Sintaxe:
Pentru o matrice M:
M(i, j ); % reprezintă elementul din matricea M corespunzător liniei i şi coloanei j;
M(i); % reprezintă elementul i din matrice, numărarea elementelor făcându-se pe coloane.
Pentru un vector v:
v(i); % reprezintă elementul de pe poziţia i din vector.
Pentru A, B şi C definite anterior verificaţi:
>> A(1, 3)
ans =
3
>> A(2)
ans =
4
Dacă dorim să schimbăm elementele unei matrici sau să adăugăm alte elemente, fără a rescrie întreaga matrice, se
procedează astfel:
>> A(1, 3) = 0
A=
1 2 0
4 5 6
>> A(3, 3) = -2
A=
1 2 0
4 5 6
0 0 -2
>> C(3) = 1
C=
-1
-2
1
Se pot construi matrici de dimensiuni mai mari pornind de la matrici de dimensiuni mai reduse. Pentru exemplificare,
vom folosi matricea A şi vectorii B şi C în ultima lor formă (A – 3 × 3 , B – 1× 3 , C – 3 × 1 ):
>> D = [A; B]
D=
1 2 0
4 5 6
0 0 -2
7 8 9 % s-a construit matricea D de dimensiune 4 × 3 , prin adăugarea vectorului B la matricea A
% (ca ultimă linie);
% A şi B au acelaşi număr de coloane (3) pentru a fi posibilă construcţia.
>> E = [A, C]
E=
1 2 0 -1
4 5 6 -2
0 0 -2 1
% s-a construit matricea E de dimensiune 3 × 4 , prin adăugarea vectorului C la matricea A
% (ca ultimă coloană);
% A şi C au acelaşi număr de linii (3) pentru a fi posibilă construcţia.
7
Sisteme inteligente de suport decizonal –Proiect 5
M(i, :); % selectează linia i a matricii M;
M(:, i:j); % selectează coloanele de la i la j ale matricii M;
M(i:j, :); % selectează liniile de la i la j ale matricii M;
M(:, i:j:k); % selectează coloanele i, i+j, i+2j, ..., k ale matricii M (selectează cu pasul j);
M(i:j:k, :); % selectează liniile i, i+j, i+2j, ..., k ale matricii M;
M(i:j, k:l); % extrage submatricea formată cu elementele aflate la intersecţia liniilor de la i la j şi
% coloanelor de la k la l ale matricii M;
M(:, [i, j, k]); % selectează coloanele i, j, k ale matricii M;
M([i, j, k], :); % selectează liniile i, j, k ale matricii M;
M([i, j, k], [l, m, n]); % extrage submatricea formată cu elementele aflate la intersecţia liniilor i, j, k şi
% coloanelor l, m, n ale matricii M;
M(:, :); % selectează întreaga matrice M;
M(i:j); % selectează elementele de i la j ale matricii M şi le pune sub forma unui vector linie
% (elementele într-o matrice se numără pe coloane);
M(:); % selectează toate elementele matricii M şi le pune sub forma unui vector coloană (pune
% coloanele matricii M una sub alta,sub forma unui vector coloană).
Verificaţi sintaxele de mai sus folosind matricea A şi vectorii B şi C din exemplele anterioare sau construind alte matrici şi
vectori.
2. Matricea goală
Sintaxă:
x = [] % generează o matrice goală (fără nici un element).
>> x = []
x=
[]
3. Matricea unitate
Sintaxe:
ones(n); % returnează o matrice de dimensiune nxn cu toate elementele egale cu 1;
ones(m, n); % returnează o matrice de dimensiune mxn cu toate elementele egale cu 1.
ones(size(M)); % returnează o matrice de dimensiunea matricii M cu toate elementele egale cu 1.
8
Sisteme inteligente de suport decizonal –Proiect 5
1 1
ones(1, 4)
ones(3, 2)
ones(size(D)) % unde D este matricea definită anterior.
4. Matricea zero
Sintaxe:
zeros(n); % returnează o matrice de dimensiune nxn cu toate elementele egale cu 0;
zeros(m, n); % returnează o matrice de dimensiune mxn cu toate elementele egale cu 0.
zeros(size(M)); % returnează o matrice de dimensiunea matricii M cu toate elementele egale cu 0.
5. Matricea diagonală
Dacă v este un vector (linie sau coloană) şi M este o matrice, atunci avem următoarele sintaxe:
diag(v); % returnează o matrice pătrată diagonală, cu elementele vectorului v pe diagonala principală;
diag(v, k); % returnează o matrice pătrată cu elementele vectorului v pe diagonala k deasupra celei
% principale, dacă k>0, sau sub cea principală dacă k<0;
% restul elementelor sunt 0.
diag(M); % returnează un vector coloană ce conţine elementele de pe diagonala principală a matricii M;
diag(M, k); % returnează un vector coloană ce conţine elementele din matricea M de pe diagonala k
% deasupra celei principale, dacă k>0, sau sub cea principală, dacă k<0.
9
Sisteme inteligente de suport decizonal –Proiect 5
Exercițiu: Realizați o funcție care calculează media aritmetică a elementelor unui vector. Apelați această funcțe din linia de
comandă.
if expresie_logica_1
grup_instructiuni_A
else
grup_instructiuni_B
end % dacă expresie_logica_1 este adevărată, se execută grup_instructiuni_A dintre
% instrucţiunea if şi clauza else;
% dacă expresie_logica_1 este falsă, se execută grup_instructiuni_B dintre clauza
% else şi instrucţiunea end;
Dacă funcţia de calculat are mai multe nivele de instrucţiuni if-else, este dificilă determinarea expresiei logice
adevarate, care selectează grupul de istrucţiuni ce urmează a fi executat. În acest caz se foloseşte clauza elseif.
Sintaxă:
if expresie_logica_1
grup_instructiuni_A
elseif expresie_logica_2
grup_instructiuni_B
elseif expresie_logica_3
grup_instructiuni_C
end % dacă expresie_logica_1 este adevărată, se execută numai grup_instructiuni_A;
% dacă expresie_logica_1 este falsă şi expresie_logica_2 este adevărată, se execută
% numai grup_instructiuni_B;
% dacă expresie_logica_1 este falsă şi expresie_logica_2 este de asemenea falsă, iar
% expresie_logica_3 este adevărată, se execută doar grup_instructiuni_C;
% dacă mai multe expresii logice sunt adevărate, prima instrucţiune logică adevărată
% determină care grup de instrucţiuni este executat prima dată;
% dacă toate expresiile logice sunt false, nu se execută nici un grup de instrucţiuni din
% structura if;
10
Sisteme inteligente de suport decizonal –Proiect 5
3. Instrucţiunea repetitivă ‘while’
Instrucţiunea while este o structură care se foloseşte pentru repetarea unui set de instrucţiuni, atât timp cât o condiţie
specificată este adevărată.
Sintaxă:
while expresie
grup_instructiuni
end % dacă expresie este adevărată se execută grup_instructiuni.
4. Instrucţiunea ‘break’
Instrucţiunea break se utilizează pentru a ieşi dintr-o buclă înainte ca aceasta să se fi terminat. Se recomandă utilizarea
acesteia la detectarea unei condiţii de eroare în interiorul buclei. Instrucţiunea break încetează execuţia ciclurilor for şi while. În
cazul unor cicluri imbricate, break comandă ieşirea din ciclul cel mai interior.
Sintaxă:
break
9. Reprezentări grafice
Dacă x şi y sunt doi vectori de aceeaşi lungime şi N este o matrice de aceeaşi dimensiune cu matricea M:
plot(x, y); % se vor reprezenta grafic elementele vectorului y în funcţie de elementele vectorului x;
% dacă lungimea vectorului x nu este egală cu lungimea vectorului y reprezentarea nu este
% posibilă.
plot(x, M); % dacă lungimea vectorului x este egală cu numărul de linii al matricii M, atunci se vor
% reprezenta pe acelaşi grafic coloanele matricii M în funcţie de elementele vectorului x;
% dacă lungimea vectorului x este egal cu numărul de coloane al matricii M atunci se vor
% reprezenta pe acelaşi grafic liniile matricii M în funcţie de elementele vectorului x;
% dacă lungimea vectorului x nu este egală cu una dintre dimensiunile matricii M, atunci
11
Sisteme inteligente de suport decizonal –Proiect 5
% reprezentarea nu este posibilă.
plot(M, N); % se vor reprezenta pe acelaşi grafic coloanele matricii N în funcţie de coloanele matricii M
% (coloana k din matricea N va fi reprezentată funcţie de coloana k din matricea M, unde
% k=1, 2, 3, …, număr coloane);
% dacă cele două matrici nu au aceeaşi dimensiune, atunci reprezentarea nu este posibilă.
Pentru reprezentarea mai multor grafice în aceeaşi fereastră, utilizând o singură comandă, folosim:
plot(x1, y1, x2, y2, ..., xn, yn);
% se vor reprezenta pe acelaşi grafic y1 în funcţie de x1, y2 în funcţie de x2, …, yn în
% funcţie de xn (pot fi vectori sau matrici);
% rămân valabile considerentele făcute în sintaxele anterioare, referitor la cazurile când avem
% vectori sau matrici;
% dacă xi şi yi (i=1, 2, ..., n), nu au aceeaşi dimensiune, atunci reprezentarea nu este
% posibilă.
Se pot folosi diverse linii, markere şi culori pentru reprezentarea graficelor (vezi tabelul 4).
Observaţie: Funcţia stem realizează o reprezentare în formă discretă a datelor. Vezi help stem.
4. Precizarea titlului graficului şi a etichetelor axelor. Trasarea unei reţele pe grafic. Plasarea unui text pe grafic
Sintaxe:
title(’text’); % plasează deasupra graficului, ca titlu, textul text;
xlabel(’text’); % textul text devine eticheta de pe abscisă;
ylabel(’text’); % textul text devine eticheta de pe ordonată.
grid; % trasează pe grafic o reţea de linii, uşurând astfel citirea graficului;
gtext(’text’); % plasează pe grafic textul text (folosind mouse-ul).
Toate aceste sintaxe urmează după comanda de reprezentare grafică.
12
Sisteme inteligente de suport decizonal –Proiect 5
5. Suprapunerea succesivă a graficelor
Dacă dorim să reţinem graficul curent şi să adăugăm în aceeaşi fereastră grafică următoarele reprezentări grafice se
poate folosi funcţia hold.
Sintaxe:
hold on; % reţine graficul curent şi adaugă în aceeaşi fereastră grafică următoarele reprezentări grafice;
hold off; % dacă se doreşte în continuare reprezentarea în ferestre grafice separate (dezactivează comanda hold on).
Dacă se doreşte în cadrul unui program reprezentarea mai multor grafice în ferestre separate, fiecare comandă grafică
va trebui să fie precedată de un nume de forma figure(n), unde n este numărul figurii respective. În caz contrar, la sfârşitul
execuţiei programului va apărea numai ultima reprezentare grafică (se va folosi o singură fereastră grafică ce va fi ‘ştearsă’ de
fiecare dată la întâlnirea unei noi comenzi grafice).
Exercițiu: Să se reprezinte grafic funcţia f ( t ) = sin ( 2π 0.2t ) , cu culoarea albastră şi linie-plus şi g ( t ) = 1 − f ( t ) cu linie-steluţă
de culoare roşie. Să se scrie titlul ‘f(t) = sin(2 \pi 0.2 t) si g(t) = 1 - f(t)’ pe axa x să se scrie ‘timp’, iar pe axa y să se scrie
‘Amplitudine’. Pentru reprezentarea grafică se vor folosi atât funcţia plot (subfereastra 211), cât şi funcţia stem (subfereastra
212).
>> t = 0:0.1:5;
f = sin(2*pi*0.2*t);
g = 1-f;
figure(1); subplot(211); plot(t, f, '-+b', 'LineWidth', 1.5);
hold on
plot(t, g, '-*r', 'LineWidth', 2);
hold off; grid;
l1 = legend('f(t)', 'g(t)', 0);
title('f(t) = sin(2 \pi 0.2 t) si g(t) = 1 - f(t)');
ylabel('Amplitudine');
subplot(212); stem(t, f, 'ob', 'LineWidth', 1.5);
hold on
stem(t, g, '^r', 'LineWidth', 2);
hold off; grid;
l2 = legend('f(t)', 'g(t)', 0);
xlabel('timp'); ylabel('Amplitudine');
Sunt predefinite 4 tipuri de interfețe grafice: interfață fără elemente implicite (blank), interfață cu elemente de
control (Uicontrols), interfață cu sistem de axe și meniuri (axes and menus), interfață cu ferestre de dialog (modal question
dialog). De asemenea, se pot deschide și edita interfețe existente. Toate interfețele vor fi salvate în mod automat cu extensia
.fig.
Exercițiu: Se va crea o intefață grafică, care să afișeze un semnal sinusoidal, amplitudine și frecvență introduse manual.
13