Documente Academic
Documente Profesional
Documente Cultură
Matlab Course
Matlab Course
1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Aplicaţia MATLAB . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Comenzile help şi doc . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Variabile şi comenzi MATLAB . . . . . . . . . . . . . . . . . . 3
1.4 Funcţii matematice . . . . . . . . . . . . . . . . . . . . . . . . 7
2 Matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1 Utilizarea semnului : în manipularea matricelor . . . . . . . 30
2.2 Operarea element cu element . . . . . . . . . . . . . . . . . . 38
2.3 Analiza datelor . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4 Funcţii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.1 Fişiere de tip function . . . . . . . . . . . . . . . . . . . . . . . 53
4.2 Funcţii anonymous . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3 Funcţii inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5 Programare în MATLAB . . . . . . . . . . . . . . . . . . . . . . . . 65
5.1 Operatori relaţionali şi operatori logici . . . . . . . . . . . . . 65
5.2 Structuri if-elseif-else-end . . . . . . . . . . . . . . . 73
5.3 Structuri ciclice de tip for-end . . . . . . . . . . . . . . . . . 77
5.4 Structuri ciclice de tip while-end . . . . . . . . . . . . . . . 80
5.5 Structuri switch-case . . . . . . . . . . . . . . . . . . . . . 82
6 Polinoame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Introducere
1
2 1. Introducere
clc
clear
s, tergem toate variabilele definite până atunci (dispar s, i din fereastra Work-
space).
În fereastra Command History sunt afis, ate toate comenzile efectuate de
noi în Command Window. Printr-un dublu click pe o comandă aceasta apare
din nou în Command Window s, i se execută.
atunci se deschide o listă de categorii3 , care la rândul lor (se pot deschi-
de) cont, in liste de comenzi.
Dacă scriem comanda
>> doc nume_comanda
vom obt, ine, într-o fereastră separată, informat, ii mai detaliate s, i exem-
ple diverse de utilizare a comenzii dată de nume_comanda
De exemplu, comanda
>> doc exp
afis, ează informat, ii mai detaliate s, i exemple de utilizare a funct, iei expo-
nent, iale.
De asemenea, pentru a utiliza sistemul de help al MATLAB se poate
deschide meniul Help al MATLAB (sau se tastează F1).
afis, ează
suma =
55
la finalizarea comenzii.
Pe o linie de comandă se pot scrie mai multe expresii, dar se vor separa
folosind semnul ,
Comenzile cu , la sfârs, it se vor efectua s, i se vor afis, a valorile obt, inute.
Celor cu ; la sfârs, it nu li se vor afis, a valorile obt, inute.
>> a = 5, b=2*a, c = a + b; d = a + b + c
afis, ează
a =
5
b =
10
d =
30
Comanda pi Comentarii
MATLAB
4 zecimale
(modul implicit)
format short 3.1416 (pentru numere
între 0.001 s, i 1000,
în rest e short e)
15 zecimale
format long 3.141592653589793 (pentru numere
între 0.001 s, i 100,
în rest e long e)
format short e
3.1416e+00 4 zecimale s, i două
sau
cifre exponent5
format shorte
format long e
sau 3.141592653589793e+00 15 zecimale s, i două
cifre exponent
format longe
format bank 3.14 2 zecimale
Ment, ionăm că modalitatea de afis, are a valorilor nu influent, ează valoa-
rea lor; doar modalitatea de afis, are este schimbată.
c_5 =
2.0000 - 0.4794i
afis, ează
y_g =
45
Section
Section 2.7
2.7 Mathematical
Mathematical Functions
Functions 35
35
Imaginea 1.3: Funcţii exponenţiale şi putere
Exponential
Exponential Function
Function Description
Description
^
^ Power
Power
exp
exp Exponential
Exponential
expm1
expm1 Exponential
Exponential minus
minus 11 [i.e., exp(x)
[i.e., exp(x) 1]
1]
log
log Natural
Natural logarithm
logarithm
log10
log10 Base
Base 10
10 logarithm
logarithm
log1p
log1p Natural
Natural logarithm of xx
logarithm of 11 [i.e., log(x
[i.e., log(x 1)]
1)]
log2
log2 Base
Base 22 logarithm
logarithm and
and floating-point
floating-point number
number
dissection
dissection
th
nthroot
nthroot nth real
n real root
root of
of real
real numbers
numbers
pow2
pow2 Base
Base 22 power
power and
and floating-point
floating-point number
number scaling
scaling
reallog
reallog Natural logarithm limited to real nonnegative
Natural logarithm limited to real nonnegative
values
values
realpow
realpow Power
Power limited
limited to
to real-valued
real-valued arguments
arguments
realsqrt
realsqrt Square
Square root
root limited
limited to
to real-valued
real-valued values
values
sqrt
sqrt Square root
Square root
nextpow2
nextpow2 Next
Next higher
higher power
power of
of 22
Matrice
17
18 2. Matrice
>> A = [1 2 ; 3 4]
sau
>> A = [1 2
3 4]
sau
>> A = [1, 2 ; 3, 4]
nu afis, ează vectorul a, dar afis, ează mărimea lui, adică afis, ează un vector
cu două elemente: numărul de linii s, i numărul de coloane al vectorului a
ans =
1 4
iar comanda
>> length(a)
nu afis, ează matricea A, dar afis, ează mărimea matricei A, adică afis, ează
un vector cu două elemente: numărul de linii s, i numărul de coloane
ans =
2 2
19
Comanda Semnificat, ia
MATLAB
A.’ transpusa matricei A
ans =
1+i 3+2i
2-i 4+3i
>> A = [1 2 ; 3 4];
>> B = [A zeros(2,4) ; eye(4,2) ones(4) ; 10:-2:-1]
nu afis, ează matricea A, dar afis, ează matricea B. Aceasta este scrisă pe
blocuri (a fost creată cu ajutorul altor matrice).
B =
6
Dacă se doreşte o matrice pătratică (la toate comenzile din acest tabel), atunci se poate
renunţa la scrierea ambelor variabile. De exemplu, dacă se scrie zeros(3) se obţine o
matrice pătratică de dimensiune 3 cu toate elementele 0
21
1 2 0 0 0 0
3 4 0 0 0 0
1 0 1 1 1 1
0 1 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
10 8 6 4 2 0
Exemplul 2.14 Dacă vrem că creăm o matrice cu acelas, i element peste tot,
avem la dispozit, ie mai multe variante. Astfel următoarele comenzi (le
scriem în ordine: de la cea mai lentă la cea mai rapidă):
>> A = pi*ones(2,3), B = pi+zeros(2,3),
>> x = pi, C = x(ones(2,3)), D = repmat(pi,2,3)
afis, ează aceeas, i matrice:
23
Simulările din cadrul aplicat, iilor (din matematică, fizică etc.) cer de-
seori crearea s, i utilizarea de numere aleatoare. MATLAB are trei comenzi
(rand, randn s, i randi) care pot fi folosite pentru obt, inerea de numerea
aleatoare:
Este cunoscut, din cadrul Teoriei Probabilităt, ilor, că dacă se dores, te genera-
rea unor elemente distribuite uniform între două numere reale a s, i b, atunci
folosim relat, ia de legătură: variabila aleatoare X este distribuită uniform
între 0 s, i 1 dacă s, i numai dacă (b − a) X + a este distribuită uniform între a
s, i b.
De asemenea, variabila aleatoare X este distribuită normal √ standard,
adică de medie 0 s, i dispersie (variant, ă) 1, dacă s, i numai dacă σ 2 X + m
este distribuită normal de medie m s, i dispersie (variant, ă) σ 2 .
Comanda Semnificat, ia
MATLAB
7
De fapt, se generează n numere echidistante de la a la b: a1 =a,a2 ,...,an−1 ,an =b
s, i apoi se scrie vectorul linie 10a1 ,10a2 ,10a3 ,. . . ,10an .
25
MATLAB are un set comenzi prin care se pot manipula matricele. Printre
acestea amintim:
>> E = C’
afis, ează
E =
1 2 3
4 5 6
7 8 9
10 11 12
1 5 9
2 6 10
3 7 11
4 8 12
B =
1 2 3 4
5 6 7 8
9 10 11 12
E =
0 2 3
0 0 6
0 0 0
Comanda Semnificat, ia
MATLAB
rezultatul este o matrice diagonală
cu vectorul a pus pe diagonală principală translată cu
diag(a,k) k unităt, i deasupra (pentru k>0)
sau cu k unităt, i dedesubt (pentru k<0)
(restul elementelor sunt 0)
rezultatul este un vector coloană
diag(A,k) cu diagonala k a matricei A
(A nu e neapărat pătratică)
extrage partea triunghiular superioară
triu(A,k) diagonalei k a matricei A (nu neapărat pătratică)
(restul elementelor sunt 0)
extrage partea triunghiular inferioară
tril(A,k) diagonalei k a matricei A (nu neapărat pătratică)
(restul elementelor sunt 0)
A_2 =
30 2. Matrice
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
A_3 =
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
A(i:j,k:l)
A(:,c)
2.1. Utilizarea semnului : în manipularea matricelor 31
A(l,:)
Alte modalităt, i prin care MATLAB poate crea s, i manipula matrice sunt
date de următoarele exemple concrete, dar importante.
A =
1 2 3 4
5 6 99 8
9 10 11 12
Comanda Semnificat, ia
MATLAB
A/B este8 solut, ia X a sistemului X*B = A
A\B este9 solut, ia X a sistemului A*X = B
Comanda Semnificat, ia
MATLAB10
Pentru a obt, ine produsul scalar sau cel vectorial dintre doi vectori x s, i y
avem la dispozit, ie comenzile:
8
Înmult, ind cu B^(-1) în partea dreaptă obt, inem că rezultatul X este matricea
A*B^(-1).
9
Înmult, ind cu A^(-1) în partea stângă obt, inem că rezultatul X este matricea A^(-1)*B.
Cu toate acestea, pentru a determina vectorul X, MATLAB nu calculează inversa A^(-1)
(care foloses, te o metodă mai put, in precisă) ci aplică o metodă numerică care rezolvă efectiv
sistemul A*X = B, mai precis metoda de eliminare a lui Gauss (diferent, ele de precizie se
văd dacă matricele sunt de dimensiuni mari).
10
Nu trebuie lăsat un spat, iu liber înainte de operator. Astfel, comanda A. *B va pro-
duce o eroare.
2.2. Operarea element cu element 39
Comanda Semnificat, ia
MATLAB
>> d = A.^2
afis, ează matricea A cu fiecare element ridicat la pătrat:
d =
1 4 9
16 25 36
49 64 81
Comanda
>> e = A.^(-1)
afis, ează matricea cu elementele (ai,j )−1 .
Comanda
>> f = 2.^A
afis, ează matricea cu elementele 2ai,j .
Comanda
>> g = A.^B
afis, ează matricea cu elementele (ai,j )bi,j .
a =
0.44 0.38 0.77 0.80 0.19
min =
0.19
max =
0.80
media =
0.51
cresc =
0.19 0.38 0.44 0.77 0.80
descr =
0.80 0.77 0.44 0.38 0.19
suma =
2.58
sumacumul =
0.44 0.82 1.59 2.39 2.58
Exemplul 2.51 În ceea ce prives, te comanda sort, pentru a obt, ine aran-
jarea în ordine descrescătoare, am folosit comanda -sort(-a)
Dar comanda sort permitea indicarea modului cum să facă aranjarea.
Astfel, comanda
>> cresc2 = sort(a,’ascend’)
are acelas, i efect cu comanda cresc = sort(a), adică
cresc2 =
0.19 0.38 0.44 0.77 0.80
iar comanda
>> descr2 = sort(a,’descend’)
are acelas, i efect cu comanda descr = -sort(-a), adică
descr2 =
0.80 0.77 0.44 0.38 0.19
A =
0.17 0.91
0.36 0.09
0.88 0.18
0.74 0.95
0.42 0.10
min =
0.17 0.09
max =
0.88 0.95
media =
0.51 0.45
iar comanda
>> minabs = min(min(A)) , maxabs = max(max(A))
afis, ează minumul s, i apoi maximul tuturor elementelor lui A
minabs =
0.09
maxabs =
0.95
Acelas, i rezultat se poate obt, ine dacă se folosesc comenzile
>> minabs2 = min(A(:)) , maxabs2 = max(A(:))
(deoarece A(:) afis, ează o coloană cu toate coloanele lui A puse una sub
alta).
iar
>> [maxim,j] = max(A)
se obt, in valorile maxime (vector notat de noi cu maxim) ale fiecărei
coloane a lui A, precum s, i indicii (vector notat de noi cu j), în cadrul acelor
coloane, a respectivelor valori maxime:
maxim =
0.88 0.95
j =
3 4
Pentru a crea un fis, ier de tip M se alege, din bara de instrumente (tool-
bar), New Script sau New s, i apoi se alege Script (sau Function, dacă
se dores, te un fis, ier M pentru a defini o funct, ie).
Dacă în Command Window se scrie
>> edit
se deschide fereastra cu editorul MATLAB-ului.
Apoi aceste fis, iere trebuie salvate. Numele trebuie să înceapă cu o literă
care poate fi urmată apoi de orice literă, cifră sau de simboluri underscore.
Pentru a deschide un fis, ier de tip M deja existent se alege, din bara de
instrumente, Open.
45
46 3. Fişiere de tip script
Exemplul 3.1 Prezentăm cont, inutul unui fis, ier de tip script (sau de tip M):
% acesta este primul fisier de tip script
% deci este un fisier cu extensia .m
%{
vom scrie produsul scalar si norma vectorilor
mai intai generam doi vectori de dimensiune (4n+1)
%}
n = 10 ; x = -n:.5:n ; y = 0:.5:2*n ;
ps1 = x*y’ , ps2 = dot(x,y) , ps3 = sum(x.*y)
norma1 = sqrt(sum(x.^2)) , norma2 = norm(x)
Salvăm aces fis, ier cu numele ProdScal_Norma s, i cu extensia .m
Dacă scriem apoi în Command Window
>> ProdScal_Norma
se va executa acest fis, ier s, i se va afis, a
ps1 = 1435 ps2 = 1435 ps3 = 1435
norma1 = 37.8814 , norma2 = 37.8814
De asemenea, ment, ionăm că atunci când se execută un fis, ier de tip script
variabilele ce sunt utilizate în acel fis, ier trebuie să fie deja definite s, i cu
nume atribuit.
47
• ori declarăm s, i numim variabilele într-un fis, ier de tip script (după
prima executare a acestuia, toate variabilele declarate în el vor apare
s, i ele în Workspace);
nume_var = input(’text_afisat’)
nume_var = input(’text_afisat’,’s’)
În afara acestei afis, ări automate MATLAB pune la dispozit, ie alte două
comenzi: comanda disp prin care se poate afis, a un text s, i/sau date nu-
merice s, i comanda fprintf prin care se poate afis, a un text s, i/sau date
numerice preferate de noi s, i se pot, eventual, salva într-un fis, ier.
Comanda disp are structura:
disp(’nume_var’)
sau
disp(’text_afisat_doar_caractere’)
Comanda disp poate afis, a s, i variabile dacă le convertim în caractere. A-
ceasta poate fi făcută folosind comanda num2str care are structura:
num2str(nume_var,6)
sau
num2str(nume_var,’%-5.2f’)
unde:
Exemplul 3.3 Să introducem trei note (creăm vectorul nota s, i introducem
componentele lui) s, i să le calculăm media:
>> nota(1) = 7; nota(2) = 9; nota(3) = 10;
>> media = mean(nota)
Varianta mai simplă de afis, are este (pentru aceasta, mai întâi, creăm un
vector cu textul de afis, at):
>> a = [’Media notelor introduse este ’ ,
num2str(media)];
>> disp(a)
Altă variantă de afis, are este (dorim să afis, ăm valoarea în formatul de
maxim 4 cifre):
>> b = [’Media notelor introduse este ’ ,
num2str(media,4)];
>> disp(b)
Altă variantă de afis, are este (dorim să afis, ăm valoarea în formatul de
număr cu două zecimale):
>> c = [’Media notelor introduse este ’ ,
num2str(media,’%.2f’)];
>> disp(c)
Să afis, ăm notele introduse s, i media lor:
>> d=[’Am introdus notele ’ , num2str(nota(1),
’%.2f’),’, ’ , num2str(nota(2),’%.2f’), ’ si
’, num2str(nota(3),’%.2f’), ’si am obtinut
media ’, num2str(media,’%.2f’)];
>> disp(d)
Comanda fprintf (în varianta mai simplă, de afis, are a unui text) are
structura:
fprintf(’text_afisat_doar_caractere’)
Această comandă poate fi folosită în Command Window, într-un fis, ier de tip
script sau într-un fis, ier de tip function.
Dacă se dores, te trecerea pe o linie nouă, în cadrul s, irului de caractere
afis, ate (de exemplu, dacă fraza afis, ată e prea lungă), atunci se inserează
\n
50 3. Fişiere de tip script
fprintf(’\n’)
după o altă comandă de tip fprintf pentru a insera o linie nouă (fără
cont, inut), adică un spat, iu vertical după textul precedent.
Dacă se dores, te inserarea unui spat, iu TAB în cadrul s, irului de caractere
afis, ate, atunci se inserează
\t
acolo unde se dores, te inserarea spat, iului.
unde:
• nume_var este variabila ce se dores, te a fi afis, ată (trebuie să fie definită
în prealabil); pot fi enumerate mai multe variabile (deci în text vor
apare corespunzător mai multe semne % );
Funcţii
%}
···
··· definirea efectivă a funct, iei nume_fct
···
end
unde:
• function este cuvântul obligatoriu cu care trebuie să înceapă prima
linie;
53
54 4. Funcţii
• nume_fct este numele dat funct, iei s, i trebuie să fie identic cu numele
fis, ierului de tip M care cont, ine acea funct, ie (deci fis, ierul se va numi
nume_fct.m);
Ment, ionăm că un fis, ier de tip M care defines, te o funct, ie nu se poate
executa (doar fis, ierele de tip script se pot executa).
rez =
0
Dacă în Command Window scriem
>> sumapatrate([1 2;3 4],[1 2;3 4])
se va afis, a
ans =
-23 -17
-7 7
ans =
5 0
4.33 2.50
2.50 4.33
0 5
Mai precis, definirea unei funcţii de tip anonymous este dată de comanda
Exemplul 4.10 Să creăm un fis, ier de tip M cu numele deriv_aprox.m pentru
a defini funct, ia numită deriv_aprox care va da valoarea aproximativă a
derivatei unei funct, ii, într-un punct (vezi Exemplul 4.19)
function y = deriv_aprox(f,x)
60 4. Funcţii
y = (f(x+sqrt(eps))-f(x))/sqrt(eps);
Acum, în Command Window, scriem:
>> deriv_aprox(@exp,1)
s, i obt, inem o aproximare a valorii derivatei funct, iei ex în punctul x = 1,
adică
ex+h − ex
(ex )0 ≈ , unde h := sqrt(eps)
x=1 h
deci o valoare aproximativă a lui e1 :
ans =
2.7183
În final, ment, ionăm alte câteva cazuri în care un function handle este
utilizat pentru a utiliza o funct, ie (deja definită) drept argument.
Un exemplu util este comanda arrayfun care aplică o funct, ie (deja
definită de noi sau de MATLAB) tuturor elementelor unei matrice con-
form structurii:
B = arrayfun(@(x) functie(x),A)
unde:
În cazul în care funct, ia functie este definită într-un fis, ier de tip M,
putem scrie sub forma:
B = arrayfun(@functie,A)
Pn k+1 xk
Exemplul 4.11 Folosim aproximarea ln (x + 1) ' k=1 (−1) k , pen-
tru orice x ∈ (−1, 1], pentru n suficient de mare.
Să definim acum un fis, ier de tip function cu numele dezv_ln.m:
function y = dezv_ln(x)
4.2. Funcţii anonymous 61
k = 1:100;
y = sum((-1).^(k+1).*x.^k./k);
Apoi definim a:
>> a = [-0.5 0 0.5]
Acum putem aplica funt, ia fiecărui element al matricei a:
>> b = arrayfun(@(x) dezv_ln(x),a)
Acelas, i efect se obt, ine dacă scriem direct:
>> b = arrayfun(@dezv_ln,a)
(am apelat funct, ia fct_fzero folosind un function handle).
Exemplul 4.12 În caz că o funct, ie are mai multe argumente, putem proceda
astfel.
Să luăm funct, ia de mai sus depinzând s, i de n (creăm un fis, ier de tip
function cu numele dezv2_ln.m):
function y = dezv2_ln(x,n)
k = 1:n;
y = sum((-1).^(k+1).*x.^k./k);
Apoi definim a:
>> a = [-0.5 0 0.5]
Acum putem aplica funt, ia fiecărui element al matricei a:
>> b = arrayfun(@(x) dezv2_ln(x,100),a)
Exemplul 4.17 Să creăm, în Command Window, o funct, ie de tip inline (funct, ia
dă suma pătratelor a două numere s, i se poate aplica s, i vectorilor):
>> sumapatrate = inline( ’ x.^2+y.^2 ’ )
Astfel se va afis, a
sumapatrate =
Inline function:
sumapatrate = x.^2+y.^2
Dacă în Command Window scriem
>> sumapatrate(3,4)
se va afis, a
ans =
25
4.3. Funcţii inline 63
Exemplul 4.18 Dacă se defines, te inline o funct, ie, atunci ordinea implicită a
argumentelor este cea alfabetică:
>> sumapatrate = inline( ’ a*x.^2+b*y.^2 ’ )
s, i se va afis, a
sumapatrate =
Inline function:
sumapatrate(a,b,x,y) = a*x.^2+b*y.^2
Dar dacă se dores, te o anumită ordonare a argumentelor scriem astfel:
>> sumapatrate = inline( ’ a*x.^2+b*y.^2 ’ ,
’x’,’y’,’a’,’b’)
s, i se va afis, a
sumapatrate =
Inline function:
sumapatrate(x,y,a,b) = a*x.^2+b*y.^2
Exemplul 4.19 Să creăm un fis, ier de tip M cu numele deriv_aprox.m pentru
a defini funct, ia numită deriv_aprox care va da valoarea aproximativă a
derivatei unei funct, ii, într-un punct, folosind faptul că
f (x + h) − f (x)
f 0 (x) ≈ , dacă h > 0 este suficient de mic.
h
function y = deriv_aprox(f,x)
%{
functia da o aproximare a derivatei
unei functii f intr-un punct x
valoarea f’(x) este aproximata de (f(x+h)-f(x))/h
iar pe h il vom lua foarte mic, de exemplu
h = sqrt(eps)
%}
y = (f(x+sqrt(eps))-f(x))/sqrt(eps);
Acum, în Command Window, definim o funct, ie inline
>> functia2 = inline( ’ sqrt(x)./(1+x.^2) ’ )
Dacă scriem s, i
>> deriv_aprox(functia2,.5)
64 4. Funcţii
√
x
obt, inem o aproximare a valorii derivatei funct, iei în punctul x =
1 + x2
0.5 :
ans =
0.1131
Capitolul 5
Programare în MATLAB
65
66 5. Programare în MATLAB
== egal12 cu
∼= diferit de
Dacă se compară două matrice, atunci cele două matrice trebuie să aibă
aceleas, i dimensiuni s, i se compară element cu element. Rezultatul este o
matrice (cu aceleas, i dimensiuni cu matricele comparate) de 0 s, i 1.
Se poate compara s, i un scalar cu o matrice atunci se compară scalarul
cu fiecare element al matricei. Rezultatul este o matrice de 0 s, i 1.
afis, ează
y =
0.8415 0.9276 0.9816 NaN 0.9816
0.9276 0.8415
sin 0
Exemplul 5.4 Dacă se dores, te ocolirea problemei , atunci redefinim
0
pe x scriind
>> x = x + eps * (x==0); y = sin(x)./x
0.9276 0.8415
În plus fat, ă de operatorii logici s, i cei relat, ionali ment, ionat, i mai sus MAT-
68 5. Programare în MATLAB
Funct, ia Semnificat, ia
and(x,y) echivalentă funct, ional cu x&y
or(x,y) echivalentă funct, ional cu x|y
not(x) echivalentă funct, ional cu ∼x
SAU exclusiv;
xor(x,y) 1 dacă x este nenul sau dacă y este nenul
s, i 0 dacă ambii sunt nuli sau ambii sunt nenuli
1 dacă există o componentă nenulă a vectorului x;
any(x) 1 pentru fiecare coloană a matricei x
pentru care există o componentă nenulă
1 dacă toate componentele vectorului x sunt nenule;
all(x) 1 pentru fiecare coloană a matricei x
care are toate elementele nenule
afis, ează
Q5 =
0 0 0 0 1 1 1 1 1
iar
>> Q6 = not(A>4)
afis, ează
Q1 =
1
iar
>> Q2 = b == 1 && a == 0
afis, ează
Q2 =
0
iar
>> Q3 = (1/a) < 0 || a == 0
Ordinea descrescătoare
Operatorul a nivelului de
precedent, ă
parantezele 1
transpusa .’ transpusa conjugată ’
2
puterea .^ puterea ^
plusul unar + minusul unar - negat, ia ∼ 3
înmult, irea .∗ înmult, irea ∗
împărt, irea ./ împărt, irea / 4
împărt, irea .\ împărt, irea \
adunarea + scăderea - negat, ia logică ∼ 5
generarea unui vector linie :
6
(notat, ia „pentru” coloană)
< <= > >= == ∼= 7
& 8
| 9
&& 10
|| 11
afis, ează
ans =
0
Funct, ie Semnificat, ia
ischar testează dacă argumentul este s, ir de caractere
isempty testează dacă argumentul este vid
isequal testează dacă tablourile sunt identice
isfinite testează dacă elementele unui tablou sunt finite
isinf testează dacă elementele unui tablou sunt infinite
islogical testează dacă argumentul este un tablou logic
isprime testează dacă argumentul este număr prim
isnumeric testează dacă argumentul este s, ir de caractere
isreal testează dacă argumentul este un tablou real
afis, ează
ans =
1
2
5
6
iar
>> find(A<0)
afis, ează
ans =
1
6
···
··· grup 2 de comenzi MATLAB
···
else
···
··· grup 3 de comenzi MATLAB
···
end
···
··· Program MATLAB
···
Ment, ionăm că elseif s, i grupul 2 de comenzi poate lipsi; astfel construcţia
se reduce la una de tip if-else-end.
De asemenea, elseif, else s, i grupurile 2 s, i 3 de comenzi pot lipsi;
astfel construcţia se reduce la cea mai simplă formă a ei: o construct, ie de
tip if-end.
Pe de altă parte, poate apare în plus un alt elseif însot, it de un alt grup
de comenzi.
Dacă prima expresia condit, ionată este adevărată (are valoarea 1), atunci
programul continuă să execute toate comenzile care urmează după if,
adică grupul 1 de comenzi, până la elseif.
Dacă prima expresie condit, ionată este falsă (are valoarea 0), atunci pro-
gramul omite să execute grupul 1 de comenzi s, i trece direct la elseif.
Dacă expresia condit, ionată asociată ei este adevărată (are valoarea 1), atunci
programul continuă să execute toate comenzile care urmează după elseif,
adică grupul 2 de comenzi, până la else.
Dacă a doua expresie condit, ionată este falsă (are valoarea 0), atunci pro-
gramul omite să execute s, i grupul 2 de comenzi s, i trece direct la else s, i la
executarea grupului de 3 comenzi, până la end.
Exemplul 5.15 Se defines, te, mai întâi, un număr folosind comanda input
>> numar = input(’Introduceti numarul = ’)
se va afis, a
Introduceti numarul =
Apoi utilizatorul trebuie să introducă o valoare (de exemplu, −5) iar,
după ce se tastează Enter, va apare
numar =
-5
Apoi se testează: dacă variabila noastră are valoarea pozitivă, se păs-
trează, iar dacă e negativ, atunci se înlocuies, te valoarea lui cu 0 :
>> if numar < 0
numar = 0
end
Acum, dacă se tastează Enter, va apare
numar =
0
(dacă numărul introdus ar fi fost pozitiv, atunci nu s-ar fi afis, at nimic).
Acum dacă se scrie:
>> fprintf(’Radicalul numarului %.4f este %.4f \n’,
numar, sqrt(numar))
se va afis, a
Radicalul numarului 0.0000 este 0.0000
76 5. Programare în MATLAB
Exemplul 5.18 Să creăm un fis, ier de tip M cu numele fct_ramuri.m care de-
fineşte o funct, ie cu ramuri:
function y = fct_ramuri(x)
%{
definim o functie cu ramuri
intr-un fisier de tip M
%}
if x < -1
y = 1;
5.3. Structuri ciclice de tip for-end 77
else
if x == -1
y = 7
else
if x <= 2
y = x^2
else
y=4
end
end
end
Apoi, dacă în Command Window scriem
>> fct_ramuri(-5)
se va afis, a
ans =
1
Exemplul 5.19 Aceeas, i funct, ie cu ramuri se obt, ine dacă scriem scriem fi-
s, ierul fct_ramuri2.m, folosind elseif
function y = fct_ramuri2(x)
if x < -1
y = 1;
elseif x == -1
y = 7
elseif x <= 2
y = x^2
else
y=4
end
început numărul de pas, i (instruct, iuni de tip for-end) ori se repetă până
când o anumită condit, ie e satisfăcută (instruct, iuni de tip while-end).
Structura comenzii for-end este, în linii mari, următoarea:
···
··· Program MATLAB
···
for k = a:h:b
···
··· grup de comenzi MATLAB
···
end
···
··· Program MATLAB
···
În primul pas avem k=a iar grupul de comenzi este executat cu această
valoare a lui k. Apoi noua valoare a lui k este a+h iar grupul de comenzi
este executat din nou cu noua valoare a lui k. S, .a.m.d. până se ajunge
ca valoarea k=b când se execută pentru ultima dată grupul de comenzi
folosind valoarea k=b. Apoi se execută comenzile de după comanda end
Evident, pasul h poate fi negativ sau pozitiv. Dacă a<b iar h<0 sau
a>b iar h>0, atunci pasul nu se execută.
Este posibil ca ultimul pas să nu fie pentru k=b dacă b nu poate fi scris
sub forma a+n*h, cu n ∈ N. Astfel, ultimul k pentru care se execută pasul
este cel mai mare număr de tipul a+n*h, cu n ∈ N, din stânga lui b.
În loc de vectorul a:h:b se poate scrie orice altă matrice linie se dores, te.
if k == l
A(k,l)=2;
elseif abs(k-l) == 1
A(k,l) = -1;
else
A(k,l) = 0;
end
end
end
∞
X (−1)k k
Exemplul 5.21 Vom calcula suma primilor n termeni ai seriei .
2k
k=1
Este convenabil să scriem instruct, iunile într-un fis, ier de tip script s, i apoi să
îl executăm:
n = input(’Introduceti numarul de termeni = ’)
S = 0;
for k = 1:n
S = S+(-1)^k*k/2^k;
end
fprintf(’Suma primilor %-.0f termeni ai seriei
este %-.6f \n’,n,S)
X∞ (−1)k x2k+1
sin (x) = .
k=0 (2k + 1)!
Să calculăm valoarea sin (x) folosind aproximarea dată de suma primilor
n termeni ai seriei precedente. Este convenabil să definim un fis, ier de tip
function cu numele taylor_sin.m:
function y = taylor_sin(x,n)
xr = x*pi/180;
y=0
for k = 0:n-1
y = y+(-1)^k*xr^(2*k+1)/factorial(2*k+1);
end
fprintf(’Valoarea lui sin in %-.2f radiani este
aproximativ %-.6f (am folosit primii %-.0f
termeni ai dezvoltarii Taylor) \n’,xr,y,n)
80 5. Programare în MATLAB
end
···
··· Program MATLAB
···
Expresia condit, ionată trebuie să cont, ină cel put, in o variabilă. În primul
pas grupul de comenzi este executat pentru prima dată iar valoarea acelei
(acelor) variabile este schimbată. Cu această nouă valoare este verificată
din nou expresia condit, ionată. Dacă e adevărată, atunci se execută din
nou grupul de comenzi iar valoarea acelei (acelor) variabile este din nou
schimbată. Grupul de comenzi este executat atâta timp cât valoarea acelei
(acelor) variabile verifică expresia condit, ionată.
5.4. Structuri ciclice de tip while-end 81
Exemplul 5.24 Să definim o funct, ie care verifică ce factorial este mai mic
decât un număr introdus de noi. Creăm un fis, ier de tip function cu numele
factorial_max.m:
function y = factorial_max(x)
i = 0; fact = 1;
while fact <= x
i = i+1;
fact = fact*i;
end
y = fact/i
fprintf(’(am obtinut ca %-.0f ! e mai mic decat
numarul %-.0f introdus de noi)’,i-1,x)
Să calculăm valoarea exp (x) folosind aproximarea dată de suma primilor
n termeni ai seriei precedente. Dar să facem verificarea: dacă noul termen
adunat la sumă este mai mic decât 0.0001 sau dacă numărul de termeni de-
păs, es, te 40, atunci nu mai adăgăm nici un termen nou la suma termenilor.
Este convenabil să scriem instruct, iunile într-un fis, ier de tip script s, i apoi să
îl executăm:
x = input(’Introduceti valoarea = ’)
k =1; xk = 1 ; S = xk;
while abs(xk) >= 0.0001 & k <= 40
xk = x^k/factorial(k);
S = S + xk;
k = k+1;
end
if k >= 40
82 5. Programare în MATLAB
otherwise
···
··· grup 3 de comenzi MATLAB
···
end
···
··· Program MATLAB
···
5.5. Structuri switch-case 83
Exemplul 5.26 Vom scrie un program care să convertească centimetrii in-
trodus, i de noi într-o altă unitate de măsură indicată de noi. Ment, ionăm că
unitatea de măsură trebuie introdusă de noi (fiind un s, ir de caractere) între
două semne ’
Este convenabil să scriem instruct, iunile într-un fis, ier de tip script numit,
de exemplu, switch_ex1.m s, i apoi să îl executăm:
x = input(’Introduceti valoarea, in centimetri,
pe care doriti sa o transformati = ’);
unit = input(’Introduceti unitatea de masura
in care doriti sa transformam
valoarea introdusa;\nvariantele sunt:
inch (in), feet (ft), metri (m),
milimetri (mm), centimetri (cm) = ’);
switch unit
case{’inch’,’in’}
y = x / 2.54
case{’feet’,’ft’}
y = x / 2.54 / 12
case{’metri’,’m’}
y = x / 100
case{’milimetri’,’mm’}
y = x * 10
case{’centimetri’,’cm’}
y = x
84 5. Programare în MATLAB
otherwise
disp([’Unitate de masura necunoscuta: ’ unit])
y = nan
end
Exemplul 5.27 Vom scrie un program care să calculeze norma13 , introdusă
de noi, a unui vector introdus de noi. Este convenabil să scriem instruct, iu-
nile într-un fis, ier de tip script numit, de exemplu, switch_ex2.m s, i apoi să îl
executăm:
v = input(’Vectorul v = ’);
p = input(’Scrieti indicele p al normei pe care
doriti sa o calculam (p = 1,2,inf,-inf)= ’);
switch p
case 1
disp(’Norma 1 este = ’)
y = norm(v,1)
case 2
disp(’Norma 2 este = ’)
y = norm(v,2)
case inf
disp(’Norma Inf este = ’)
y = norm(v,inf)
case -inf
disp(’Norma -Inf este = ’)
y = norm(v,-inf)
otherwise
disp(’Norma nu poate fi calculata in raport
cu p-ul introdus ’)
y = nan
end
13
Comanda norm(A,p) calculează norma matricei sau vectorului A în raport cu indicele
normei p care poate fi 1, 2, ∞ sau −∞, i.e. norm(A,p)=sum(abs(A)^p)^(1/p). Pen-
tru detalii (definit, ii, sintaxă, exemple etc.) utilizează comanda doc norm în Command
Window.
Capitolul 6
Polinoame
polyval(p,x)
85
86 6. Polinoame
Exemplul 6.3 Să determinăm polinomul care are rădăcinile date de vec-
torul r2 din exemplul precedent:
>> pol2 = poly(r2)
va afis, a
pol2 =
1.00 -3.00 1.00 0.00 43.00
Dacă dorim să determinăm câtul s, i restul împărt, irii a două polinoame
folosim comanda
deconv(p,q)
unde p,q sunt vectorii cu coeficient, ii celor două polinoame.
Exemplul 6.5 Să determinăm câtul s, i restul împărt, irii a două polinoame
(folosim polinoamele precedente):
>> [cat,rest] = deconv(u,p4)
Obt, inem, evident,
cat =
2 1 -3 1
rest =
0 0 0 0 0 0 0
Obt, inem
v =
6 2 -3
w =
2 1 -3 1
Capitolul 7
89
90 7. Rezolvarea numerică a unor probleme
Exemplul 7.2 Acelas, i rezultat se obt, ine dacă apelăm astfel funct, ia f :
Exemplul 7.3 Acelas, i rezultat se obt, ine dacă apelăm astfel funct, ia f (folo-
sim un function handle):
Exemplul 7.4 Acelas, i rezultat se obt, ine dacă definim funct, ia f ca fiind de
tip inline:
s, i apoi o apelăm
Exemplul 7.5 Acelas, i rezultat se obt, ine dacă definim funct, ia f ca fiind de
tip anonymous (folosim un function handle):
s, i apoi o apelăm
Exemplul 7.6 Acelas, i rezultat se obt, ine dacă definim funct, ia f ca fiind de
tip anonymous (folosim un function handle):
x = fminbnd(functie,x1,x2)
unde:
[x,fval] = fminbnd(functie,x1,x2)
unde fval este valoarea funct, iei în punctul x de minim local găsit;
x = fminbnd(functie2,x1,x2)
Exemplul 7.7 Să determinăm punctele de minim s, i maxim local ale funct, i-
ei:
f (x) = x3 − 12x2 + 40.25x − 36.5 .
Mai întâi să schit, ăm graficul lui f :
>> x = -1:0.1:8;
>> y = x.^3-12*x.^2+40.25*x-36.5;
>> plot(x,y)
Acum avem o imagine asupra punctelor de extrem. Pentru a determina
punctele de minim local din intervalul [3, 8] scriem:
7.3. Integrarea numerică 93
>> [x_min,f_min]=fminbnd(’x^3-12*x^2+40.25*x-36.5’,3,8)
s, i se va afis, a
x_min =
5.6073
f_min =
-11.8043
Pentru a determina punctele de maxim local din intervalul [0, 4] scriem:
>> x_max=fminbnd(’-x^3+12*x^2-40.25*x+36.5’,0,4)
s, i se va afis, a
x_max =
2.3927
Pentru a determina punctele de minim local din intervalul [−1, 3] scriem:
>> [x_min2,f_min2]=fminbnd(’x^3-12*x^2+40.25*x-36.5’,
-1,3)
s, i se va afis, a
x_min2 =
-1.000
f_min2 =
-89.7458
pentru funct, ii care nu sunt date explicit ci doar prin puncte de tipul (x, y) )
cu structurile
quad(functie,a,b,tol)
quadl(functie,a,b)
trapz(x,y)
unde:
• tol este un argument opt, ional care indică eroarea cu care se dores, te
să se obt, ină rezultatul (valoarea implicită este 1.0e-6, adică 10−6 );
dblquad(functie,xmin,xmax,ymin,ymax,tol,method)
unde:
• tol este un argument opt, ional care indică eroarea cu care se dores, te
să se obt, ină rezultatul (valoarea implicită este 1.0e-6, adică 10−6 );
Deci
>> int6 = dblquad(’(1-6*x.^2*y).*(y-x >= 0)’,0,1,0,1)
A X = b,
X = A\b
rref
aplicată matricei extinse asociate unui sistem liniar. Această metodă constă
în rezolvarea sistemului folosind metoda de eliminare a lui Gauss prin care
matricea este redusă la forma triunghiulară.
Mai întâi scriem matrice extinsă obt, inută prin concatenarea celor două ma-
trice:
>> Aext = [A b];
Scriem comanda
>> sol = rref(Aext)
Rezultatul sol este o matrice de forma
sol = [C d]
unde C este o matrice superior triunghiulară obt, inută prin metoda lui Ga-
uss iar C s, i d sunt astfel încât vectorul solut, ie X verifică
C*X = d
• dacă matricea triunghiulară C este chiar matricea unitate (s, i este ma-
trice pătratică), atunci sistemul este compatibil determinat iar solut, ia
sistemului este dată chiar de coloana d
• dacă matricea triunghiulară C are ultima linie formată doar din zero-
uri iar matricea sol are s, i ea ultima linie formată din zero-uri16 , atunci
sistemul este compatibil nedeterminat iar solut, ia sistemului este dată
de rezolvarea sistemului C*X = d
Metoda 1:
>> A = [5 -3 2 ; -3 8 4 ; 2 4 -9]; b = [10 ; 20 ; 9];
>> X1 = A\b
>> proba1 = A*X1
3.4441
s, i obt, inem X1 = 3.1981 .
1.1867
Metoda 2:
scriem matrice extinsă obt, inută prin concatenarea celor două matrice:
>> Aext = [A b];
−3
1 0 −3 1 0 3.4
16
De exemplu, C =
0 1 −2 s i sol = 0 1 −2 3.1 .
,
0 0 0 0 0 0 0
−3
1 0 −3 1 0 3.4
17
De exemplu, C = 0 1 s, i sol =
−2 0 1 −2 3.1 .
0 0 0 0 0 0 1.1
98 7. Rezolvarea numerică a unor probleme
sol = [C d]
1 0 0 3.4441
În cazul nostru, obt, inem sol = 0 1 0 3.1981
0 0 1 1.1867
unde:
matricelor:
Comanda Semnificat, ia
MATLAB
factorizarea LU (lower-upper)
MATLAB returnează
[L,U] = lu(A) matricea inferior triunghiulară L
matricea superior triunghiulară U
astfel încât L*U = A
factorizarea QR (ortogonal-triunghiulară)
MATLAB returnează
[Q,R] = qr(A) matricea ortogonală18 Q
matricea superior triunghiulară R
astfel încât Q*R = A
factorizarea Cholesky
R = chol(A) MATLAB returnează
matricea superior triunghiulară R
astfel încât R’*R = A
factorizarea SVD (singular value decomposition)
MATLAB returnează
[U,D,V] = svd(A) matricea ortogonală U (de tip m × m)
matricea ortogonală V (de tip n × n)
matricea diagonală D (de tip m × n)
astfel încât U*D*V’ = A (de tip m × n)
18
Spunem că matricea Q este ortogonală dacă este matrice pătratică s, i are liniile (s, i
respectiv coloanele) vectori unitate s, i ortogonali între ei, adică
Qt Q = Q Qt = I
Comanda Semnificat, ia
MATLAB
pentru probleme nonstiff
ode45 rezolvare într-un singur pas
se foloses, te ca primă încercare
este bazată pe metoda explicită Runge-Kutta
pentru probleme nonstiff
ode23 rezolvare într-un singur pas
este bazată pe metoda explicită Runge-Kutta
mai rapidă dar mai put, in precisă ca ode45
[t , y] = ode45(functie,interval,y0)
unde:
• functie este funct, ia care apare în ecuat, ia diferent, ială; aceasta poate
fi introdusă în mai multe moduri (la fel ca în cazul comenzii fzero);
• interval este intervalul pe care vom obt, ine solut, ia; acesta cont, ine
cel put, in două puncte: dacă are două elemente, este de tipul [t0,T]
unde t0 este punctul init, ial s, i T este punctul final al domeniului
solut, iei s, i se vor afis, a valorile solut, iei x (t) în valori din intervalul
[t0,T] considerate de MATLAB; dacă are mai multe elemente (pu-
tem lua, de exemplu, interval=[t0:h:T] ), atunci se vor afis, a va-
lorile funct, iei în valorile indicate de noi;
• y0 este valoarea indicată a funct, iei date în punctul init, ial indicat t0;
• y este vectorul coloană cu toate valoarea solut, iei x (t) în punctele vec-
torului t în care s-a aproximat solut, ia de către MATLAB (primul s, i
ultimul sunt respectiv t0 s, i T);
Dacă dorim graficul solut, iei x (t) , atunci luăm mai multe valori în in-
tervalul [1, 3] :
>> [t , y] = ode45(@fct1_ODE,[1:0.01:3],4.2);
>> plot(t,y)
Dacă dorim să comparăm cu rezultatele comenzii ode23 scriem
>> [t , y] = ode45(@fct1_ODE,[1,3],4.2)
>> plot(t,y,’r’)
>> hold on
>> [u , z] = ode23(@fct1_ODE,[1,3],4.2)
>> plot(u,z,’b’)
>> hold off
Exemplul 7.14 Să se rezolve ecuat, ia diferent, ială de ordinul al doilea (ecu-
at, ia care descrie mis, carea pendulului neliniar):
θ̈ + ω 2 sin (θ) = 0 , t ≥ 0
θ (0) = 1, θ̇ (0) = 0 .
x0 (t) = f (t, x) ,
7.5. Ecuaţii diferenţiale 103
unde
def
x == [x1 , x2 ]t
def t
f (t, x) = f (t, x1 , x2 ) == x2 , −ω 2 sin (x1 )
def
x (0) = x0 == [1, 0]t .
Reprezentări grafice
8.1 Grafica 2D
În MATLAB reprezentarea grafică în două dimensiuni poate fi realizată
cu comanda plot care are structura
plot(x,y,’setare_linie’,’nume_setare’,valoare_setare)
unde:
105
106 8. Reprezentări grafice
Stilul liniei:
Culoarea liniei:
+ marcaj cu + s marcaj cu
(square)
o marcaj cu ◦ d marcaj cu 3
(diamond)
marcaj cu stea cu
* marcaj cu ∗ p cinci colt, uri
(pentagram)
marcaj cu stea cu
x marcaj cu × h s, ase colt, uri
(hexagram)
^ marcaj cu 4 < marcaj cu C
v marcaj cu 5 > marcaj cu B
8.1. Grafica 2D 107
Să ment, ionăm că dacă se specifică tipul de marcare al punctelor dar
nu se specifică tipul liniei, atunci comanda plot va desena doar punc-
tele indicate (s, i fără linia poligonală care le unes, te);
Comanda Comanda
MATLAB Semnificat, ia MATLAB
(nume_setare) (valoare_setare)
LineWidth grosimea liniei număr de puncte
(sau linewidth) (implicit este 0.5)
MarkerSize mărimea număr de puncte
(sau markersize) marcajului
MarkerEdgeColor culoarea
culoarea conform
(sau marginii
tabelului precedent
markeredgecolor) marcajului
MarkerFaceColor culoarea
culoarea conform
(sau cu care se
tabelului precedent
markerfacecolor) umple marcajul
Exemplul 8.2 Evident, pentru a crea graficul unei funct, ii y = f (x) putem
utiliza comanda plot
Astfel, comenzile:
>> x = -2:.01:4;
108 8. Reprezentări grafice
>> y = 3.5.^(-0.5*x).*cos(6*x);
>> plot(x,y,’g’)
vor crea graficul funct, iei f (x) = 3.5−0.5x cos (6x) în culoarea verde (g).
Exemplul 8.3 Dorim să reprezentăm doar punctele indicate (fără linia po-
ligonală care le unes, te); vom specifica tipul de marcare al punctelor s, i nu
vom preciza nimic despre tipul liniei.
Astfel, comenzile:
>> x = -2:.1:4;
>> y = 3.5.^(-0.5*x).*cos(4*x);
>> plot(x,y,’g*’)
vor crea graficul tuturor punctelor/perechilor (x, y) date de comenzile de
mai sus, în culoarea verde (g) s, i indicate prin semnul *.
Pentru reprezentarea grafică a unei funct, ii scalare avem la dispozit, ie s, i
comanda fplot care are structura
fplot(’functia’,limite,’setare_linie’)
unde:
plot(x,y,t,u,v,w)
va reprezenta trei grafice (unul dat de vectorii x,y, altul dat de vectorii
t,u iar al treilea dat de vectorii v,w) în acelas, i reper.
Evident, după fiecare pereche reprezentată se pot adăuga s, i setări legate
de tipul liniei s, i tipul marcajului.
Dacă avem mai multe comenzi plot, atunci, în urma primei aparit, iei
a comenzii plot, se deschide o fereastră cu imaginea comandată; apoi ur-
mătoarea comandă plot va înlocui graficul existent, în aceeas, i fereastră,
cu noul grafic, s, .a.m.d.
Pentru a avea câte o fereastră pentru fiecare imagine obt, inută este util
să folosim, înainte de fiecare grafic obt, inut, comanda
figure
8.1. Grafica 2D 111
(numerotarea va fi automată).
Dacă dorim atribuirea unui anume număr pentru o imagine obt, inută
putem să folosim comanda
figure(n)
figure(’Name’,’nume_figura’)
close(n)
close all
setează faptul că ambele axe vor avea aceas, i scală, iar comanda
axis square
ylabel(’text_ordonata’)
legend(’text_1’,’text_2’,pos)
fimplicit(’functia’,limite,’setare_linie’)
unde:
polar(theta,rho,’setare_linie’)
unde:
Mai există s, i alte comenzi care produc grafice (vectorii x,y sunt de
aceeas, i dimensiune s, i sunt reprezentat, i grafic):
• semilogy(x,y) axa Oy este scalată logaritmic (în baza 10) iar axa
Ox este liniară;
8.2. Grafica 3D 115
• semilogx(x,y) axa Ox este scalată logaritmic (în baza 10) iar axa
Oy este liniară;
8.2 Grafica 3D
În MATLAB reprezentarea grafică a unei curbe în spat, iu poate fi real-
izată cu comanda plot3 care are structura
plot3(x,y,z,’setare_linie’,’nume_setare’,valoare_setare)
unde:
Funct, ionează s, i celelalte setări s, i opt, iuni din cazul 2D: de exemplu,
comenzile figure, hold on, subplot, axis, xlabel, grid, close
Exemplul 8.13 Evident, dacă o curbă este dată de ecuat, iile parametrice
x = x (t) ,
y = y (t) ,
z = z (t) , t ∈ [a, b] ,
2
x (t) = 1 + t sin (20t) ,
vor crea graficul curbei y (t) = 1 + t2 cos (20t) ,
z (t) = t, t ∈ [−6π, 6π] .
Pentru reprezentarea grafică a unei curbe dată parametric avem la dis-
pozit, ie s, i comanda ezplot321 care are structura
ezplot3(functiax,functiay,functiaz,[tmin,tmax])
unde:
x = a:h1:b; y = c:h2:d;
21
Easy-to-use 3-D parametric curve plotter.
118 8. Reprezentări grafice
apoi, folosind vectorii de mai sus, se crează o ret, ea de puncte în plan X,Y
dată de comanda
[X,Y] = meshgrid(x,y)
Astfel vom obt, ine două matrice cont, inând coordonatele, abscisele s, i res-
pectiv ordonatele, unor puncte din plan care realizează o divizare a drep-
tunghiului [a, b] × [c, d] .
Apoi definim variabila Z conform funct, iei care dă suprafat, a prin
Z = f(X,Y);
Exemplul 8.16 Dacă lucrăm cu (x, y) ∈ [−1, 3] × [1, 3] , atunci să luăm, de
exemplu, divizarea cu pasul 1
>> x = -1:3; y = 1:3;
s, i apoi să scriem
>> [X,Y] = meshgrid(x,y)
Vom obt, ine
X =
-1 0 1 2 3
-1 0 1 2 3
-1 0 1 2 3
s, i
Y =
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
Aceste matrice reprezintă exact abscisele s, i respectiv ordonatele unor
puncte din plan care realizează o divizare a dreptunghiului [−1, 3] × [1, 3] ,
adică punctele (as, a cum arată ele în plan):
8.2. Grafica 3D 119
• bar3(Y) 3D Bar Plot; graficul este sub formă de bare verticale; fie-
care element din Y reprezintă înălt, imea unei bare;
>> subplot(2,4,1)
>> mesh(X,Y,Z)
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’mesh’)
>> subplot(2,4,2)
>> ezmesh(’1.8^(-1.5*sqrt(x^2+y^2))*sin(x)
*cos(0.5*y)’,[-3,3])
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’ezmesh’)
>> subplot(2,4,3)
>> meshz(X,Y,Z)
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’meshz’)
>> subplot(2,4,4)
>> meshc(X,Y,Z)
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’meshc’)
>> subplot(2,4,5)
>> surf(X,Y,Z)
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’surf’)
>> subplot(2,4,6)
8.2. Grafica 3D 121
>> ezsurf(’1.8^(-1.5*sqrt(x^2+y^2))*sin(x)
*cos(0.5*y)’,[-3,3])
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’ezsurf’)
>> subplot(2,4,7)
>> surfc(X,Y,Z)
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’surfc’)
>> subplot(2,4,8)
>> surfl(X,Y,Z)
>> xlabel(’Axa Ox’); ylabel(’Axa Oy’);
zlabel(’Axa Oz’)
>> legend(’surfl’)
vor deschide o fereastră (figure) cu un nume dat de noi, cu 2 × 4 = 8 regiuni
în care se vor amplasa opt repere cu graficul (făcut cu diverse comenzi)
suprafet, ei dată de
√
2 2
z = 1.8−1.5 x +y sin(x) cos(0.5 y), cu (x, y) ∈ [−3, 3] × [−3, 3] .
Calcul simbolic22
• derivarea;
• integrarea;
123
124 9. Calcul simbolic
nume_obiect = sym(’x’)
vor afis, a
f =
3.0808
va afis, a
ans =
x
Comanda expand este utilizată pentru a dezvolta o expresie care cont, ine
produse de paranteze de termeni s, i/sau funct, ii trigonometrice, exponent, iale
sau logaritmice (utilizând formule algebrice), s, i are structura:
expand(S)
unde S este expresia simbolică.
factor(S)
subs(S,{var1,var2},{val1,val2})
9.3. Calculul numeric al unei expresii simbolice 129
unde S este expresia simbolică, var1 s, i var2 sunt variabilele pe care vrem
să le substituim cu valorile date de valorile numerice val1 s, i respectiv
val2 (val1 s, i/sau val2 pot fi scalari dar s, i vectori sau matrice de valori).
Dacă dorim înlocuirea unei singure variabile, atunci pot lipsi acoladele
din structura comenzii.
Dacă expresia S cont, ine o singură variabilă simbolică, atunci acea vari-
abilă poate să nu mai fie ment, ionată în structura comenzii, ci doar valoarea
cu care se dores, te a fi înlocuită.
iar comanda
>> subs(S,a,1)
va afis, a
ans =
x^2 - 5*x + 1
iar comanda
>> subs(S,{a,x},{3,1})
va afis, a
ans =
-1
9.4 Sume
k=j
X
Comanda symsum este utilizată pentru a calcula sume de tipul xk ,
k=i
s, i are structura:
symsum(xk,k,i,j)
>> syms k n;
>> xk1 = k; xk2 = k^2; xk3 = k^3;
>> sum1 = symsum(xk1,1,n)
>> sum2 = symsum(xk1,k,1,n)
>> sum3 = symsum(xk2,1,n)
>> sum4 = symsum(xk3,1,n)
>> sum5 = symsum(1/k^2,1,inf)
9.5. Rezolvarea ecuaţiilor algebrice 131
vor afis, a diverse sume de termeni. Vom obt, ine, bineînt, eles,
Xk=n n (n + 1) Xk=n n (n + 1) (2n + 1)
k= k2 =
k=1 2 k=1 6
Xk=n n2 (n + 1)2
k3 =
k=1 4
Xk=∞ 1 π2
=
k=1 k 2 6
unde:
• sol1 este solut, ia pentru var1 iar sol2 este solut, ia pentru var2 ;
dacă nu avem un sistem de ecuat, ii, atunci pot lipsi parantezele pă-
trate din structura comenzii.
• dacă ecuat, ia admite mai mult de o solut, ie, atunci solut, ia este o coloa-
nă cu solut, iile simbolice.
>> f = 3*exp(x) - 5;
>> sol = solve(f)
vor afis, a
sol =
log(5/3)
iar comanda
>> sol2 = solve(3*exp(x) - 5)
va afis, a acelas, i lucru:
sol2 =
log(5/3)
iar comanda
>> sol3 = solve(3*exp(x) - 5,x)
va afis, a acelas, i lucru:
sol3 =
log(5/3)
iar comanda
>> sol4 = solve(’3*exp(x) - 5’,x)
va afis, a acelas, i lucru:
sol4 =
log(5/3)
9.7 Derivarea
Comanda diff este utilizată pentru a deriva o expresie simbolică, s, i
are structura:
diff(S,var,n)
unde S este expresia simbolică (definită anterior sau scrisă direct în co-
mandă, sub formă de s, ir de caractere), var este variabila în raport cu care
se calculează derivata (dacă S cont, ine o singură variabilă simbolică, atunci
acest argument poate lipsi) iar n este ordinul de derivare (dacă ordinul
dorit este 1, atunci acest argument poate lipsi).
Matricea jacobiană
∂f ∂f
D (f, g) ∂x ∂y
:=
D (x, y) ∂g ∂g
∂x ∂y
se calculează folosind comanda
jacobian([f;g],[x,y])
9.8 Integrarea
Comanda int este utilizată pentru a integra o expresie simbolică, s, i are
structura:
int(S,var,a,b)
9.8. Integrarea 137
unde:
• a,b sunt limitele de integrare; acestea pot fi numere sau variabile sim-
bolice (dacă nu se dores, te determinarea unei integrale definite ci a
unei primitive, atunci aceste argumente lipsesc).
>> syms x y;
>> S = 2*exp(4*x)-3*x*y;
>> int1 = int(S)
% integrarea se face in raport cu variabila implicita
>> int2 = int(S,x)
>> int3 = int(S,y)
>> int4 = int(2*exp(4*x)-3*x*y,x)
>> int5 = int(’2*exp(4*x)-3*x*y’,x)
>> int6 = int(S,x,0,1)
>> int7 = int(2*exp(4*x)-3*x*y,x,0,1)
>> int8 = int(’2*exp(4*x)-3*x*y’,x,0,1)
>> syms x;
>> f = exp(-x^2);
>> intGauss = int(f,-inf,inf)
√
Valoarea afis, ată va fi, bineînt, eles, π.
138 9. Calcul simbolic
dsolve(’eq1’,’eq2’,’cond1’,’cond2’,’var’)
unde:
• eq1 este ecuat, ia diferent, ială ce trebuie scrisă direct în comandă, sub
dy
formă de s, ir de caractere: derivata y 0 sau trebuie scrisă sub forma
0
dt
Dy; de exemplu, ecuat, ia diferent, ială y (t) + 3y (t) = 5 va fi scrisă sub
forma ’Dy+3y=5’; dacă este un sistem de ecuat, ii apare s, i eq2;
• var este variabila în raport cu care se calculează solut, ia ecuat, iei; dacă
eq cont, ine o singură variabilă simbolică, atunci acest argument poate
lipsi; dacă eq cont, ine mai multe variabile simbolice s, i nu indicăm
variabila în raport cu care să rezolvăm ecuat, ia, atunci se lucrează cu
variabila implicită (luată t).
d2 x dx
+2 + x = 0 (sau x00 + 2x0 + x = 0 )
dt2 dt
se va găsi scriind
9.9. Rezolvarea ecuaţiilor diferenţiale ordinare 139
>> dsolve(’D2x+2*Dx+x=0’)
% nu este necesar sa definim, in prealabil,
% variabile simbolice
s, i vom obt, ine
ans =
C1*exp(-t) + C2*t*exp(-t)
ds
= ax2 (sau s0 (t) = ax2 , cu x independent de t )
dt
se va găsi scriind
>> dsolve(’Ds=a*x^2’)
% nu este necesar sa definim, in prealabil,
% variabile simbolice
% nu am precizat variabila,
% deci se va considera t drept variabila implicita
s, i vom obt, ine
ans =
a*t*x^2 + C1
ds
= ax2 (sau s0 (x) = ax2 )
dx
se va găsi scriind
>> dsolve(’Ds=a*x^2’,’x’)
s, i vom obt, ine
ans =
(a*x^3)/3 + C1
ds
= ax2 (sau s0 (a) = ax2 )
da
se va găsi scriind
>> dsolve(’Ds=a*x^2’,’a’)
140 9. Calcul simbolic
Exemplul 9.34 Solut, ia ecuat, iei diferent, iale cu condit, ii init, iale
y 0 + 3y = 5
y (0) = 1
se va găsi scriind
>> dsolve(’Dy+3*y=5’,’y(0)=1’)
s, i vom obt, ine
ans =
5/3 - (2*exp(-3*t))/3
Exemplul 9.35 Solut, ia ecuat, iei diferent, iale cu condit, ii init, iale
y 00 − 2y 0 + 2y = 0
y (0) = 1, y 0 (0) = 0
se va găsi scriind
>> dsolve(’D2y-2*Dy+2*y’,’y(0)=1’,’Dy(0)=0’)
s, i vom obt, ine
ans =
exp(t)*cos(t) - exp(t)*sin(t)
Exemplul 9.36 Solut, ia sistemului de ecuat, ii diferent, iale cu condit, ii init, iale
x0 = x + y
y0 = t − x
x (0) = 1, y (0) = 2
se va găsi scriind
>> [solx soly] = dsolve(’Dx=x+y’,’Dy=t-x’,
’x(0)=1’,’y(0)=2’)
Astfel se va afis, a solut, ia solx s, i solut, ia soly
Bibliografie selectivă
141