Sunteți pe pagina 1din 52

MEDIUL DE PROGRAMARE MATLAB

Curs 1 cont.
1. PREZENTARE GENERALĂ

MATLAB® = Matrix laboratory este un limbaj de programare şi un sistem de dezvoltare a aplicaţiilor


din diverse domenii
Matlab este dezvoltat de The MathWorks, Inc., SUA

Domenii de utilizare:
• Matematică, calcul numeric şi simbolic
• Dezvoltarea algoritmilor
• Modelare, simulare şi testarea prototipurilor
• Achiziţii date de la senzori, analiza şi vizualizarea datelor
• Grafica inginerească şi din ştiinţele aplicate
• Dezvoltarea de aplicaţii, inclusiv GUI

MATLAB - s-a dezvoltata în:


1. mediul universitar -este pachetul standard pt. cursurile de inginerie, matematică şi ştiinţe
aplicate
2. industrie - pentru cercetarea, dezvoltare şi producţie.
S-a dezvoltat prin toolbox-uri - familii/colecţii de aplicaţii (funcţii .m) specializate:
SimBiology - modelarea proceselor biologice,
Aerospace Toolbox - extinde calculele tehnice în domeniul ingineriei aerospatiale,
Bioinformatics Toolbox - mediu pentru analiza genomului, inginerie genetică, cercetări în biologie,
Communications Toolbox,
Control System toolbox - controlul sistemelor,
Data Acquisition Toolbox – funcţii pentru achiziţii de date şi adaptori pentru interfaţare cu hardware
specific (plăci de achiziţii ale diferitelor firme),
Database toolbox – funcţii MATLAB pentru import şi export de date cu baze de date relaţionale
Distributed Computing Toolbox coordonarea şi execuţia operaţiilor aplicaţiilor Matlab simultan într-un
cluster de calculatoare crescând viteza de execuţie a aplicaţiilor mari,
Financial toolbox - calcule financiare,
Fuzzy logic toolbox – logica fuzzy,
Genetic algorithm - algoritmi genetici,
Image acquisition toolbox - achiziţii de imagini,
Image processing toolbox – procesarea imaginilor,
Neural network toolbox – reţele neuronale,
Optimization toolbox – optimizări de sisteme,
Partial Differential Equation Toolbox – ecuaţii diferenţiale cu derivate parţiale,
Robust Control Toolbox – funcţii pentru analiza şi proiectarea sistemelor de control multiinput-
multioutput MIMO cu incertitudini,
Signal Processing toolbox - procesarea semnalelor,
Spline toolbox – curbe spline,
Statistics toolbox – funcţii statistice,
Symbolic Math - calcule simbolice,
System identification toolbox – identificarea sistemelor,
Virtual reality toolbox – realitate virtuală,
Wavelet toolbox – funcţii pentru reconstrucţia semnalelor,
etc.

1 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
Sistemul MATLAB conţine: 1.Limbajul MATLAB, 2.Mediul de lucru MATLAB,
3.Handle Graphics®, 4.Biblioteca de funcţii matematice, 5.Interfaţa de aplicaţii program a
MATLAB-ului (API)
1.Limbajul MATLAB: - un limbaj de nivel înalt (gen.4), tipul de bază este matricea,
există instrucţiuni de control, funcţii, structuri de date, intrări/ieşiri; permite programare orientată
pe obiecte.
Facilităţile de programare sunt organizate pe 6 directoare din …toolbox/matlab/
all(), any, xor, or, transpose sau .’,
ops Operators and special characters. ctranspose (‘), ldivide sau .\ , rdivide sau
./ …
lang Programming language constructs. if, for, while, case, function, persistent …
strfun Character strings. char, ischar, strcat …
iofun File input/output. input, fscanf, fprintf, fopen, fseek …
timefun Time and dates. clock, date …
datatypes Data types and structures. cell, class, int8, double, logical, struct …

2.Mediul de lucru MATLAB: set de facilităţi care permit manevrarea variabilelor în


spaţiul de lucru, importul/exportul de date, dezvoltarea, manipularea, editarea şi depanarea
fişierelor MATLAB (.m) şi a aplicaţiilor MATLAB.
Aceste facilităţi sunt în dir. general din toolbox/matlab/:
beep, delete, dir, rmdir, dos, echo, exit, import,
general General purpose commands.
load, who, whos, ver, save, quit etc.

3.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 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 din …toolbox/matlab/:
graph2d Two-dimensional graphs: plot, grid, polar, subplot etc.
graph3d Three-dimensional graphs: plot3, surf, mesh, zlabel etc.
Specgraph Specialized graphs: bar, bar3, stem, comet3, ezplot, voronoi etc.
graphics Handle Graphics: figure, hold, print, line, rectangle etc.
uitools Graphical user interface tools: menu etc.

2 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
4.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:
elmat Elementary matrices and matrix manipulation. isempty(x),zeros(3)
abs(),sin(),tan,sinh,exp,
elfun Elementary math functions. log, log2, log10, imag,real
specfun Specialized math functions. bessel,cross,dot,factorial

matfun Matrix functions – numerical linear algebra. trace,lu,rank,svd,eig ...

datafun Data analysis and Fourier transforms. fft,ifft, mean,var,std,lscov

polyfun Interpolation and polynomials. residue, Legendre, convhull

funfun ode23, ode45(), fzero, ...


Function functions and ODE solvers.
sparfun Sparse matrices. full(), sparse() …

5.Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite


scrierea de programe în C/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 . Interfaţare cu Java, Python.

SIMULINK =pachet software pt. modelarea, simularea şi analiza sistemelor dinamice.


Pot fi modelate sisteme (mecanice, electrice) liniare, neliniare, continue, discrete, hibride.
‰ SIMULINK are interfaţă grafică utilizator (GUI)
pentru crearea modelelor sub forma unor diagrame
construite din blocuri, pe baza unor tehnici de tip click-
and-drag realizate cu mouse-ul. Astfel, trasarea
diagramelor este simplă şi intuitivă, aproape la fel de
simplă ca trasarea acestor diagrame direct pe hârtie. În
plus, se evită formularea matematică laborioasă (sistemele dinamice sunt de regulă descrise de
ecuaţii diferenţiale).
ƒ Real-time Workshop® este un program care permite generarea de cod C pentru
schemele bloc create în SIMULINK şi astfel permite rularea de aplicaţii în timp real.

2. MEDIUL DE LUCRU MATLAB


¾ Lansare sub Windows: “shortcut” la programul executabil

La pornire, MATLAB-ul execută automat fişierele:


matlabrc.m rezervat pentru administratorul de sistem şi
startup.m. (în directorul local) este destinat utilizatorilor; se pot defini setările implicite
pentru instrumentele Handle Graphics şi se pot predefini variabile în spaţiul de lucru.

3 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
Terminarea sesiunii de lucru: comanda >>quit la prompterul MATLAB sau exit din meniul File
Fereastra de comandă (fereastra principală) unde Interpretorul MATLAB afişează un prompter (>>).
De exemplu, pentru introducerea unei matrice 3 x 3 se poate tasta:
» A = [1 2 3-2i; 4 5 6; 7 8 10]
şi la apăsarea tastelor Enter sau Return, MATLAB-ul răspunde cu:
A =
1 2 3-2.0i
4 5 6
7 8 10

Editarea liniilor de comandă în fereastra principală


Arrow Key Control Key efect
sau: Ctrl-p previous line - comanda precedenta
sau: Ctrl-n next line – comanda urmatoare tastata

Ştergerea ferestrei de comandă:>> clc % , nu şterge variabile din spaţiul de lucru.


Controlul afişării paginilor ecran în fereastra de comandă
Controlul afişării paginilor în fereastra de comandă: more off şi more on.
Întreruperea unui program care rulează : Ctrl-c

Comanda format controlează formatul numeric (numărul de zecimale) al valorilor afişate


pe ecran (dar nu reprezentarea în memorie): File/ Preferences/Comand Window sau comanda:
format short 4 zecimale (implicit), π: 3.1416 sau
format long 15 zecimale: π: 3.141592653589793 etc.
Suprimarea afişării rezultatelor unei linii comandă
- dacă încheiem linia de comandă cu punct şi virgulă “;” rezultatele nu sunt afişate la ecran.
Exemplu:
>> magic(3) % fara ;
ans =
8 1 6
3 5 7
4 9 2
A = magic(3);

4 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
Linii de comandă lungi: întrerupere prin trei puncte urmate de Return sau Enter pentru a indica
faptul că expresia continuă pe linia următoare. Exemplu:
s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 . . . >> A = [1 2 3-2i; ...
4 5 6 ; ...
- 1/8 + 1/9 - 1/10 + 1/11 - 1/12;
7 8 9]

Fereastra de comandă permite rularea comenzilor MATLAB, lansarea unor instrumente cum
ar fi Editor/Debugger şi permite startarea toolbox-urilor.

Spaţiul de lucru (workspace) al MATLAB-ului


-conţine setul de variabile (vectori, matrice, structuri, cells etc.) alocate în memorie şi pot fi
editate din linia de comandă.
comenzile >> who şi whos (mai detaliat) listează variabilele curente din workspace.
comanda >> clear % ştergerea variabilelor din workspace
>>clear v1 % şterge variabila v1
>>clear v* % şterge variabilele care încep cu caracterul v

Citirea sau scrierea unor fişiere .mat (fişiere de date Matlab) din programe externe în C sau
Fortran se poate face cu Interfaţa de Aplicaţii Program (API).

Încărcarea şi salvarea din workspace


Comenzile save şi load:
- au rolul de a salva variabilele din spaţiul de lucru şi respectiv de a le reîncărca într-o
sesiune ulterioară; aceste comenzi se pot folosi şi pentru a importa şi exporta date.
Pe platformele Windows, operaţiile save, load sunt disponibile şi prin selectarea
opţiunilor Save Workspace As, respectiv Load Workspace din meniul File.
Formatul în care comanda save stochează datele poate fi controlat prin adăugarea unor flag-
uri (opţiuni) în lista de nume de fişiere sau variabile:

-mat Utilizează formatul binar tip .MAT (implicit).


-ascii Utilizează formatul ASCII pe 8 digiţi.
-ascii -double Utilizează formatul ASCII pe 16 digiţi.
-ascii -double –tabs Delimitează elementele tablourilor cu tab-uri.
-append Adaugă datele într-un fişier .MAT existent.
Exemple:
save Salvează toate variabilele în fişierul matlab.mat
save f1_var [–mat] Salvează toate variabilele în fişierul fi_var.mat

Încărcarea unor fişiere cu date ASCII (format text)


Comanda load importă fişiere de date ASCII. Exemplu: scriem fisierul date.dat conţinând:
1234
2345
» load date.dat %incarca şi creaza variabila matrice [1 2 3 4; 2 3 4 5]

creează o variabilă cu numele date în workspace.


5 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
Nume de fişiere ca şiruri de caractere
Dacă numele fişierelor sau variabilelor cu care se lucrează sunt stocate în variabile de tip şir
de caractere, se poate folosi dualitatea comandă/funcţie pentru a apela load şi save ca funcţii.
De exemplu
» save('myfile','VAR1','VAR2') %salveaza variabilele var1 şi var2 în myfile.dat
» A = 'myfile';
» load(A)
au acelaşi efect cu:
» save myfile VAR1 VAR2
» load myfile
Wildcards Comenzile load şi save permit specificarea unui caracter special de tip wildcard
(*). Exemplu: » save rundata x* %salvează toate variabilele din workspace care încep cu x în fişierul
rundata.mat.
Browser-ul Workspace (varianta grafică a comenzii whos) permite vizualizarea conţinutului
spaţiului de lucru curent.
Exemplu: vizualizarea datelor incărcate cu load

Directorul curent al MATLAB-ul pentru lucrul cu fişiere de tip .m şi .mat.

3. FUNDAMENTE DE PROGRAMARE ÎN MATLAB

3.1. Cuvinte rezervate (Keywords) ale limbajului MATLAB: 'break' , 'case', 'continue'
'if ' 'else' 'elseif' 'end' 'for' 'function' ‘global' 'otherwise' 'persistent' 'return'
'switch' 'try' ‘catch’ 'while'. Pentru listarea lor se tastează funcţia: iskeyword

3.2. Expresii
MATLAB-ul lucrează cu expresii matematice ca şi celelalte limbaje de programare
Instrucţiunile Matlab sunt adesea de forma:
variabila=expresie
sau numai:
expresie
Se evaluează valoarea expresiei din dreapta semnului = iar valoarea obţinută se atribuie
variabilei din stânga semnului =.
Pentru forma simplificată (a doua) valoarea expresiei se atribuie unei variabile `ans` (answer)
create imediat de Matlab.
>> 1/3 >> sqrt(2) >> e1=exp(1) >> tan(pi/4)^-1
ans = ans = e1 = ans =
0.3333 1.4142 2.7183 1.0000

Expresia = înşiruire de operanzi şi operatori;


6 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
operanzii: nume de variabile, constante, nume (sau apel) de funcţii,
operatorii: +, *, .*, ^, .^ etc.
>> 4 * sin(pi/6) / sqrt(2) + 3^2 - exp(2) * tan(pi/4)
ans =
3.0252
Matlab lucrează în mod linie având la bază un interpretor (şi nu compilator). Fiecare
instrucţiune pe rând este trimisă interpretorului şi evaluată.

3.3. O variabilă MATLAB este:


- un nume care se asignează (asociază) unei zone de memorie unde sunt stocate valori.
- prin nume citim/scriem valoarea din/în memorie şi folosim valoarea în expresii.
- de trei tipuri de variabile dispune Matlab:
locale, globale şi persistente(locale funcţiei, nu se şterg la ieşire, valoarea lor este reţinută şi
regăsită la un nou apel al aceleaşi funcţii).
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.
Tipul de dată asociat numelui se poate schimba în acelaşi program:
>> a=123 >> a='qwer' >> a=[1 2 3; 2 3 4; 3 4 5]
a= a= a=
1 2 3
123 qwer 2 3 4
3 4 5
Numele unei variabile este o literă, urmată de un număr “oricât” de mare de litere, cifre sau
simboluri. Din nume numai primele 31 de caractere sunt folosite pentru identificare.
MATLAB-ul este case sensitive - face distincţie între literele mici şi cele mari (în nume).
Exemplu:
» a = 30 » A=30 % alta variabila diferita de a
creează o matrice 1 x 1 cu numele a şi stochează (memorează) valoarea 30
Reprezentarea numerelor imaginare este realizată cu litera i sau j.
¾ Exemple:
>> sqrt(-2) >> abs(3+4j) >> i >> j >> exp(i*pi/2)
ans = ans = ans = ans = ans =
0 + 1.4142 i 0.0 + 1.0000i
5 0 + 1.0000i 0 + 1.0000i
Aplicăm rel. Euler:
cos(pi/2) + i*sin(pi/2)

Operatori elementari
Operatori aritmetici în cadrul expresiilor:
+ adunare - scădere \ împărţire la stânga
* multiplicare / împărţire ^ ridicare la putere
` transpusa unei matrice sau complex conjugata unui număr complex
( ) operatorul de specificare a ordinii de evaluare (cu prioritate maximă)
3.4.Funcţii matematice
MATLAB-ul furnizează un mare număr de funcţii matematice elementare standard:
abs, angle, sqrt, exp, log,log10,log2, sin(argument în radiani), asin,
sind(argument grade), asind, atan2, sinh, imag, real, rem, sign …
>> angle(i) >>rem(5,3) %rest >> sind(30) >> atan2(-1,0)
ans = ans = ans = ans =
1.5708 2 0.5000 -1.5708
% -pi<= ATAN2(Y,X)<=pi

7 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
>>exp(2) % 2.7183^2 >> log(2.72) >> atan2(1,0)
ans = ans = ans =
7.3891 1.0006 1.5708
% f.logaritmica

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 sau » help elmat
♦ O parte din funcţii sunt de tip built-in (cum sunt sqrt, sin)şi
- fac parte din nucleul Matlab, fiind compilate;
- oferă viteză de execuţie sporită (accesul la structura funcţiei nefiind permis).
♦ Alte funcţii sunt implementate ca fişiere MATLAB (M-files) şi pot fi modificate.
Pentru a găsi calea spre codul sursă a unei funcţii MATLAB M-file folosim funcţia which:
>> which exp … => built-in (D:\MATLAB\toolbox\matlab\elfun\@double\exp)
>> which pascal …=> D:\MATLAB\toolbox\matlab\elmat\pascal.m

Sunt două tipuri de fişiere M-files: script şi


function (pot primi şi returna valori).

♦ Câteva funcţii furnizează valorile unor constante:


pi 3.14159265

i şi j Imaginary unit, (sqrt(-1) )


eps
Precizia Floating-point 2-52 (2.2204e-016)

realmin Cel mai mic număr real floating-point, 2-1022 (2.2251e-308)

realmax Cel mai mare număr real floating-point, 21023 (1.7977e+308)

Inf Infinit
NaN Not a Number

• Numele funcţiilor NU sunt rezervate şi deci este posibilă suprascrierea lor.


Exemplu:
» eps = 1.e-6 » true=0 (implicit true=1)
Funcţia originală este reconstituită (ştergând variabilele noi) prin comanda:
» clear eps » clear true
Alte exemple de expresii
Exemple de expresii şi rezultatele evaluării acestor expresii:
» rho = (1+sqrt(5))/2 » a = abs(3+4i) >> exp(i*pi)
rho = a = ans =
1.6180 5 -1.0000 + 0.0000i
» huge1 = exp(log(realmax)) » toobig = pi*huge1
huge1 = toobig =
1.7977e+308 Inf

3.5.Generarea unui VECTOR de VALORI:


a) vector = val_initială : pas : val_finală
8 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
t=2 : 10 Creează vectorul t = 2 3 4 5 6 7 8 9 10 (pas=1, implicit)
t[1] t[2] t[3] ....... t[9]
t1=0 : 0.2 : 1.3 t1 = 0 0.2000 0.4000 0.6000 0.8000 1.0000 1.2000
t1[1] ....... t[7]
t2=-2 : 3 : 11 t2 = -2 1 4 7 10
t2[1] t2[5]
Pas negativ:
t3=5 : -1 : -1.1 t3 = 5 4 3 2 1 0 -1
t3[1] t3[7]
length(t3) -> ans= 7
>> t3(10)=105 %se adauga un element pe pozitia 10
t3 = 5 4 3 2 1 0 -1 0 0 105
>> length(t3) -> ans =10

b) Vector cu spaţiere liniară


val initială, val finală, numar valori (inclusiv prima şi ultima):
›› x=linspace(-300, 100, 5) Æ rezultă: x = -300 -200 -100 0 100

c) Vector cu valori spaţiate logaritmic:


›› x1= logspace(2, 4, 3) Æ generează 3 valori 10^2 10^3 10^4
x1 = 100 1000 10000
›› x2= logspace(-1, 2, 5) Æ gen. 5 valori 10^-1 … 10^2 (inclusiv capetele)
=> x2 = 0.1000 0.5623 3.1623 17.7828 100.

3.6. NUMERE COMPLEXE (coordonate carteziene şi polare):


>>z = 3.0000 + 4.0000i % x + iy

>>conj(z) % x - iy
ans = 3.0000 - 4.0000i

>> z '
ans = 3.0000 - 4.0000i

Modulul:
>> r = abs(z) >> r1=abs (conj(z))
r= 5 r1 = 5
>> z+conj(z) % rezultă număr real % x + iy + x – iy = 2x
ans = 6 % Obs: conj(z) sau z’
Faza:

9 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
>> fi=angle(z)
fi = 0.9273 % in cadran I
% pi/2=1.57rad
>> fi1=angle(conj(z))
fi1= - 0.9273 % cadran IV

>> pi/2
ans = 1.5708 % radiani
Fig.1.Numărul complex z
în planul complex

Modul (continuare):
>> z * conj(z) % (x + iy)(x - iy)=x^2 - (iy)^2= x^2+y^2
ans= 25
>>compass( [z, conj(z), z*conj(z)] ) % figura Æ
% [vector valori complexe]
>> sqrt( z * conj(z) )
ans = 5
% verificare egalitate/ expresie logică
>> sqrt( z*conj(z)) == abs(z)
ans = 1 (true)
Obs:după % se inserează comentarii în Matlab

Formula lui Euler (bijuterie):


cos ϕ + j sin ϕ = e jϕ (fun.exponential complexă, j = − 1 )
% Exprimare z în coordonate carteziene % Exprimare z în coordonate polare
% z = x + j y sau z = z ⋅ (cos ϕ + j sin ϕ ) % z = z ⋅ e jϕ
unde φ =angle(z)
Cod Matlab: ↨ ↨
>> abs(z)*( cos(fi) +i*sin(fi) ) >> abs(z) * exp(j*fi)
ans = ans =
3.0000 + 4.0000i 3.0000 - 4.0000i

Adunare şi scădere de numere complexe:


›› z = 3.0000 + 4.0000i % z+z2= ( x + x 2 ) + j ( y + y 2 )
›› z2= -4.00 + 2i % z-z2= ( x − x 2 ) + j ( y − y 2 )
>> z + z2 % rezultat in Cadran II
ans = -1.0000 + 6.0000i >>angle(z+z2) > pi/2
>> fi_sum=angle(z+z2) ans = 1
fi_sum= 1.7359 % radiani >>plot(-1.0000+6.0000i, '*', …
'MarkerSize',20 , 'LineWidth',2 )
>> line...
>> grid on

Variante de reprezentare grafică a numerelor complexe

10 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
>> plot(z,'s') % s=square, d=diamond etc.

>> line([0 real(z)], [0 imag(z)])

% line( lista abscise, listă ordonate)


% linie din (0,0) în ( real(z), imag(z) )

%continuă reprezentarea in fereastră


>> hold %Current plot held

>> plot(z2,'s') %z2= -4.00 + 2i

>> line([0 real(z2)],[0 imag(z2)])


% traseaza a doua linie

Inmulţirea a două numere complexe


Forme carteziene:
z1*z2= ( x1 + j y1 )( x2 + j y 2 ) = Forme polare: z1*z2= z1 ⋅ z2 ⋅ e j (ϕ1 +ϕ 2 )
( x1 x2 − y1 y 2 ) + j ( x1 y 2 + y1 x2 ) = produsul modulelor şi suma fazelor

Cod Matlab:
>>z = 3.0000 + 4.0000i Inmulţire în forme polare:
>>z2= -4.00 + 2i >> abs(z)*abs(z2)*exp(i*fi)*exp(i*fi2) %sau
>> z*z2 >> abs(z)*abs(z2) * exp( i*(fi+fi2) ) % idem
ans = ans =
-20.0000 -10.0000i -20.0000 -10.0000i

Impărţirea a două numere complexe


Forma carteziană: Forme polare:
z x + j y ( x + j y )(u − jv ) ( xu + yv ) + j ( − xv + yu ) z1 z e jϕ 1 z
= = = = 1 jϕ = 1 e j (ϕ1 −ϕ 2 )
w u + jv (u + jv )(u − jv ) u2 + v2 z2 z2 e 2 z2
xu + yv j ( yu − xv )
= 2 + 2 = câtul modulelor şi diferenţa fazelor
u + v2 u + v2

Cod Matlab:
>>z = 3.0000 + 4.0000i Impărţire în forme polare (explicit):
>>z2= -4.00 + 2i
>> z / z2 >> abs(z)/abs(z2)* exp(fi*i)/ exp(fi2*i)
ans = ans =
-0.2000 - 1.1000i -0.2000 - 1.1000i

Inmulţirea j*z= j ( x + j y ) = jx − y = − y + jx
Numărul complex jz se obţine prin rotirea lui z cu 90 grade în sens
trigonometric.
π π π
j⋅ j j (ϕ + )

Varianta polară: j = 1 ⋅ e 2 => jz= 1e 2 * z ⋅e = z ⋅e 2

x + j y jx − y
Impărţirea z/j= = = y − jx
j −1
Varianta polară:
Fig. 4.Iulian
Prof.dr.ing. z şiLupea
z/ j=y-jx
11 Programarea şi Utilizarea
Calculatoarelor
π π π
1 j j ⋅( − ) j ⋅( − ) j (ϕ − )
z⋅ = z⋅ = z ⋅ ( − j ) = z ⋅ 1 ⋅ e 2 = z ⋅ e jϕ * e 2 = z ⋅ e 2
j −1
Numărul complex z/j se obţine prin rotirea lui z cu 90 grade în sens orar

Curs 2
Reprezentare vectori cu originea în (0,0):
z = 3.0000 + 4.0000i
compass([z, z/i, z*i]) % fig. stanga
..............
%Ridicare număr complex la puterea n:
z=exp(.3i) % modul =1, unghi=0,3rad
compass( [z, z^2, z^3, z^4] , '-*r') % fig.
dreapta

compass([exp(j*pi/2) , 2*exp(pi/6*j) ,
2*exp(pi/6*j) / j], '-*')

% vector de valori complexe date prin functia


exp de variabila complexă

Grafic z, z*j, z/j


>> plot(z, 's') % sau plot( real(z),imag(z), 's' )
>> hold % Current plot held
>> plot(z * j, '*') 4

>> plot(z / j, 's') 3

>> line([0 real(z)],[0 imag(z)]) 2

>> line([0 real(z*j)],[0 imag(z*j)]) 1

>> line([0 real(z / j)],[0 imag(z / j)]) 0

>> grid on -1

Obs: Trasare linie poligonală


-2

>> line( [ 1 2 3], [2 5 -1] ) % vector abscise, vector


-3
-4 -3 -2 -1 0 1 2 3 4

ordonate similar cu plot

3.7 CALCULE ELEMENTARE CU MATRICE


>> A=[1 2 3; 3 4 5; 5 6 7] >> B=[-1 0 1] ' % B 3x1
A= B= >> B'
1 2 3 -1 %coloana ans = %linie
3 4 5 0 -1 0 1
5 6 7 1
Înmulţiri valide:
>> A*B %3x3 3x1->3x1 >> A'*B % 3x3 3x1 -> 3x1 >> B'*A %1x3 3x3 -> 1x3
ans = ans = ans =
2 4
2 4 4 4 4
2 4
12 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
A=
1 2 3
3 4 5
Matricea 2D văzută ca Vector 1D: 5 6 7
A(1:end) %elem. luate pe >> A(1:end)*A(:) >> A(:)’ * A(:)
coloane ans = % A(:) =vector 9x1 ans = % A(:) vector 9x1
ans = 174 % suma pătratelor 174 % suma pătratelor
1 3 5 2 4 6 3 5 7
Să se ridice elem.: A(2), A(3), A(4) la pătrat: %Elem. din 2 linii la pătrat:
>> A(2:4) .* A(2:4) % sau A(2:4) .^2 [A(1,:) A(2,:)] .^2
ans = ans =
9 25 4 1 4 9 9 16 25

Preluare de zone din matrice:


>> C1=A(2,:) % linia #2 >> C2=A(:,3) % coloana #3
C1 = C2 = ››A(2,:)*A(:,3)
3 4 5 3 ans =
5 64 %1x3 3x1->1x1
7
>> C2*C1 %3x1 1x3 ->3x3 >> A(1:2,:) % 2lin, toate col >> C1(2:3)*A(1:2,:)
ans = ans = % 1x2 2x3
9 12 15 1 2 3 ans =
15 20 25 3 4 5 19 28 37
21 28 35

Produs scalar a doi vectori (de câte 4 valori fiecare):


A= Vezi şi funcţia dot() OBS: prod. scalar a doi
1 2 3 Vector dot product vectori perpendiculari este 0
3 4 5
5 6 7
>> A(1:4) %luate pe coloane >> V= 1:2:7 >> A(1:4)* V'
ans = V= ans = %1x4 4x1-
1 3 5 2 1 3 5 7 >1x1
49
Produs vectorial a doi vectori
v=[1 2 3]; u=[3 4 5]; pv este ┴ pe v pv este ┴ pe u
>> pv=cross(u,v) >> dot(pv,v) >> dot(pv,u)
>>pv= ans = ans =
2 -4 2 0 prod scalar este 0 0 prod scalar este 0

Inversa matricei
>>D=[exp(2) 1; ... >> D(3,3)=7 % add 1 col >> D^-1 %inversa 3x3
sqrt(2) 5; ... D= ans =
1 tan(0)] 7.3891 1.0000 0 0.1407 -0.0281 0
D= 1.4142 5.0000 0 -0.0398 0.2080 0
7.3891 1.0000 %3 linii, 2col 1.0000 0 7.0000 -0.0201 0.0040 0.1429
1.4142 5.0000 >> D*D^-1 >> D^-1 * D
1.0000 0 ans = ans =
1.0000 0 0 1.0000 0.0000 0
-0.0000 1.0000 0 -0.0000 1.0000 0
0.0000 -0.0000 1.0000 -0.0000 -0.0000 1.0000
>> 2*D = = D+D %test >> D*D= =D^2 %la putere
13 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
ans = ans =
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
“Impărţiri” / şi \
>> M=magic(3) >> M / D >> M * D^-1 %=M / D
ans = ans = ans =
8 1 6 0.9654 0.0069 0.8571 0.9654 0.0069 0.8571
3 5 7 0.0824 0.9835 1.0000 0.0824 0.9835 1.0000
4 9 2 0.1645 1.7671 0.2857 0.1645 1.7671 0.2857

% suma pe fiecare linie=15 >> M \ D >> M^-1 * D %=M \ D


suma pe fiec. col. = 15 ans = ans =
suma DP =suma DS=15 0.9474 -0.5750 0.4472 0.9474 -0.5750 0.4472
-0.3146 0.0500 0.7389 -0.3146 0.0500 0.7389
0.0207 0.9250 -0.7194 0.0207 0.9250 -0.7194

3.8.Tipuri de date in Matlab


Tipul fundamental de dată la baza produsului Matlab este matricea.
Elementele matricei sunt de acelaşi tip de dată: întreg sau real, logic, caracter, structură
etc.
Tipurile structură şi tablouri de celule stochează tipuri diferite de date în câmpurile
lor.
Pot fi de asemenea dezvoltate tipuri noi de date proprii utilizatorului folosind clase Matlab
(user classes şi Java classes). Sunt 15 tipuri fundamentale de date (matrice sau tablou) variind de
la minim 0 x 0 elemente la n dimensionale.
Cuvintele cheie asociate
tipurilor fundamentale sunt
scrise cu litere mici (Figura->).
Pot fi create matrice 2D
de tip double şi logical fiecare
putând fi în format FULL sau
SPARSE (pentru matrice cu
marea majoritate a elementelor
nule pentru economie de
memorie).

Tipul de dată Exemple Descriere


uint16(65000) Tablou de întregi signed (int) şi unsigned (uint)
Întreg: ( conversie la uint16 ) O valoare ocupă 8, 16, 32 resp. 64 biţi în memorie
tip data ce valori poate conţine:
int8, uint8, int8 [de la -128 la 127]
int16, uint16, uint8 [de la 0 la 255]
int32, uint32, int16 [-32768 la 32767]
int64, uint64 uint16 [ 0 la 65535]
int64 [ -2^63 la (2^63)-1 ] sau:
[ -9.2234e+018 la 9.2234e+018]
Single single(3.1 * 10^38) Tablou de numere în simplă precizie. Dpdv al

14 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
memoriei: mai puţină decât tipul double având mai
(4 octeţi) single(5+6i) mică precizie şi domeniu de valori mai îngust.
%conversie 16->8oct Domeniul <0:[ -3.40282e+038 to -1.17549e-038] şi
>0: [1.17549e-038 to 3.40282e+038 ]
Spaţierea:Eps(1)=4.7684e-007 aprox. (=2^-
21)
Double 3.4 * 10^300 Tablou de numere în dublă precizie (este tipul
(tip implicit) implicit de dată). Tablourile 2D pot fi de tip sparse.
5 + 6i Domeniul: -1.79769e+308 to -2.22507e-308 şi
(8 octeţi) [1 2; 3 4.1] 2.22507e-308 to 1.79769e+308
Spaţierea(eps): 2.2204e-016 aprox (=2^-52)
Logical x = [true, true, false, 1]; Există două valori logice: 1 (true) şi 0 (false).
Orice valoare diferită de 0 este considerată true (1)
(1 octet) >> magic(2) => ans =
1 3 >> true & [0 1 4 -4 false true]
4 2 ans =
>> magic(2) > 2 0 1 1 1 0 1
ans =
0 1 Tablourile 2D de valori logice pot fi sparse (rare).
1 0
Char 'Dati val. pt. vector: ' Tablou de tip caracter (sau şir de caractere–string);
mesaj='Hello' - fiecare caracter se memo. pe 16 biţi (2oct) lungime.
(2 octeţi/ >> mesaj(2:4) Tablou de caractere. Şirurile sunt reprezentate ca
caracter) ans = vectori de caractere.
ell Pentru tablouri ce conţin mai mult de un şir se
length('Dati val. pt. vector: ') preferă folosirea tipului cell arrays.
ans = 22
Structure str.numar = 124; Structura este un set de câmpuri; fiecare câmp are
str.color = 'alb';
nume propriu (numar, color, matr, logic) şi
str.matr = magic(3);
str.logic=[true]; memorează orice tip de dată. Structura are nume
prin “.” se refera câmpul ex:”str” .
O structură singulară este un tablou 1 x 1 de
str(2).numar = -17; structuri aşa cum un scalar numeric (ex:7) este o
matrice 1 x 1. Se pot forma tablouri de structuri.
Cell array a{1,1} = 12; Tablou de celule indexate. Fiecare celulă poate
a{1,2} = 'Red'; memora un tablou de orice tip sau mărime.
a{1,3} = magic(4); Celulele tabloului se referă prin acolade :
a{2,3}='a' ex: a{1,1} este tablou 1x1 de double, a{1,2}->tablou 1x3
caractere, a{1,3} -> matrice 4x4
b={5, 'e', [1 2;3 4]} cell2={12, 'asdf', [1 2;3 4]; 1:3,[],'aa'} (alt
exemplu)
Function ra2=@sqrt Pointer la o funcţie.
handle struct(2).a1=@sin Câmpul a1 al structurii struct memorează pointer la
cell2{4,1}=@cos funcţie.
>> ra2(2) Æ ans = 1.4142
>> cell2{4,1}(pi) >> struct(2).a1(pi/2)
ans = > -1 ans= > 1
User class polynom([0 -2 -5]) Obiecte construite dintr-o clasă definită de utilizator
Java class java.awt.Frame Obiecte construite dintr-o clasă Java (vezi clase Java)

15 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
Valorile numerice sunt stocate intern, implicit în format virgulă mobilă double-precision.
Pentru a stoca un întreg trebuie realizată conversie (vezi funcţii de conversie) de la tipul double la
tipul întreg dorit.
Ex.1. Conversie la întreg pentru a memora val. 325 într-o variabilă întreagă cu semn pe 16-bit:
x = int16(325); % x este un tablou 1 x 1 de întregi cu semn
x1=int32(500.499) % se va memora 500 (partea fracţionară este neglijată)
x2=int32(500.500) % se va memora 501 (rotunjire la întregul mai mare)

Ex.2.Tablou de valori logice


>> val_log = true % este un tablou 1x1 de valori logice
val_log =
1
>> a = [true, true, false, true, false] % a este tablou 1 x 5 de val. logice
a=
1 1 0 1 0
>>b = [2.5 6 .7 9.2 inf 4.8];
>>isfinite(b) % testeaza daca valorile sunt finite
ans => 1 1 1 0 1
>>d=magic(3) % 15=sume pe linii= >> d >= 5
8 1 6 %=sume pe coloane= ans =
3 5 7 %=suma pe DP si DS =15 1 0 1
4 9 2 0 1 1
0 1 0
Ex.3.Tablou 1D - şir de caractere, 1 x 14 numit: pr_nu
>> pr_nu =’Marius Giurgiu’ >> length('Marius Giurgiu')
ans =
14 % 14 x 2 -> 28 octeti in memorie
- în workspace apare:
Name Size Bytes Class
pr_nu 1x14 28 char

Tablou 2D de caractere <2 x 15 char> sau tablou de şiruri de caractere de lungimi egale:
>>nume = ['Marius Giurgiu ' ; 'Mircea Bolboaca'] % s-a adăugat un blank după Giurgiu pentru a avea
nume = % siruri de lungimi egale pe fiecare linie
Marius Giurgiu
Mircea Bolboaca
>> nume(2, 7:15) % linia 2 coloanele 7:15
ans =
Bolboaca
!Facultativ cell array:
Este incomod de a lucra cu şiruri de lungimi egale în tablouri de caractere. Se poate trece
la tipul cell array care permite şiruri de lungimi oarecare. Conversia se face cu funcţia cellstr:
>> cell_array1=cellstr(nume)

cell_array1 = { 'Marius Giurgiu' , ...


'Mircea Bolboaca' } >> cell_array1{2}
>> cell_array1{1} ans =
ans = Mircea Bolboaca
Marius Giurgiu >> cell_array1{2}(2:4) % identific cell cu { }
cell_array1{1}(1) ans = % apoi in tablou refer cu (
ans => M )
irc

16 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
Ex.4. Structuri (tablou de câmpuri cu nume)
Construirea unui tablou de structuri 1x1 (structură singulară) prin asignare de date fiecărui
câmp în parte:
student.nume = 'Giurgiu';
student.prenume = 'Marius';
student.note = [9 7 10; 8 9 10; 9 8 4];
In continuare se poate adăuga a doua structură din tablou => tablou de structuri:
student(2).nume='Botean'
student(2).prenume='Tudor'
student(2).note=[5 8; 9 9; 10 9]
Accesarea datelor în structură:
Pentru afişare în fereastra de comenzi tastăm:
» student(1) % sau student(2)
ans =
nume: 'Giurgiu'
prenume: 'Mircea'
note: [3x2 double]
» student(1).note
ans =
9 7 10
8 9 10
9 8 4
» student(2).note(3,1)
ans =
10
Stergera unei stucturi din tabel:
» student(2)=[ ]

!Facultativ cell array:


Exemple: Cell arrays
Tabloul(matricea) de celule este folosit la stocarea indexată a datelor de tipuri diferite.
În celulele tabloului pot fi stocate date de tipuri şi mărimi diverse. Putem spune că celulele sunt
câmpuri fără nume (dar indexate pentru a putea fi referite).
Ex1: Următoarea instrucţiune creează un tablou A de 2 x 2 celule:
>>A = {[1 4 3; 0 5 8; 7 2 9], 'Marius Giurgiu' ; 3+7i, -pi : pi/4 : pi};

Se poate iniţializa individual fiecare celulă:


»A(1,1) = {[1 4 3; 0 5 8; 7 2 9]}; %sau A{1,1} = [1 4 3; 0 5 8; 7 2 9];
% Obs: paranteze rotunde ( ) şi acolade {} NU: A3{1,1} = {[1 4 3; 0 5 8; 7 2 9]}
»A(1,2) = {'Marius Giurgiu'}; %sau A{1,2} = 'Marius Giurgiu';
»A(2,1) = {3+7i}; % A{2,1} = 3+7i;
»A(2,2) = {-pi:pi/4:pi}; % A{2,2} = [-pi:pi/4:pi];
Dacă introducem >A(3,3) = {5}; se va extinde tabloul
de celule cu 4 celule vide.
(clear A %Se şterge A şi se initializează din nou)
!!salt.....
Ex2: “Celule în celule” *se iniţializează:
» A{1,1} = { [1 4 3; 0 5 8; 7 2 9] } % se obţine un cell array pentru A{1,1}
» A{1,3} = {'abc', 'de'} şi >>A{2,2} = [1 2 3] Î
Extragem caracterul ‘b’: A{1,3}{1,1}(2)
17 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
Ex3: În figura alăturată observăm un tablou de
celule cu următoarele componente (celule):
aa{1,1} conţine tablou de întregi fără semn,
aa{1,2} conţine tablou de şiruri de caractere (şirurile
sunt de lungimi egale),
aa{1,3} conţine tablou de numere complexe
aa{2,1} conţine şir (1D) de numere în virgulă mobilă
aa{2,2} conţine tablou 2D de întregi cu semn
aa{2,3} conţine tablou de celule de tipuri variate

Ex.4: Observaţi alte exemple:


aa{1,1}={1 2 3; 2 3 4; 3 4 5} %9celule num.
aa{1,2}={'11'; 'qwe'; 'wd45'}
aa{1,3}={'11' 'qwe' 'wd45'}
aa{1,4}={'11', 'qwe', 'wd45'}
aa{2,3}={'text', [4 2;1 5]; [1.2 2.3;1.22 1.3], .2+5i}
Exemplu - referire elemente:
aa{2,3}{1,1}(2)='a' % s-a schimbat ‘e’ cu ‘a’
aa{1,1}{2,2}='abc' % numar 3 înlocuit de şir ‘abc’
Ex.5:
WIREFRAME. Stack{1,1}(1,1)
Structura WIREFRAME cu câmpul Stack de tip cell array; se referă celula {1,1} care este
un şir de caractere => este referit primul caracter din şir.

2.Operatori
Operatorii MATLAB pot fi clasificaţi în trei categorii:
• Operatori aritmetici
• Operatori relaţionali (compară operanzii cantitativ)
• Operatori logici

*Operatori aritmetici
+ Adunare .^ Fiecare element din matrice la putere
[2 3 4] .^ 2 => [4 9 16]
- Scădere ' Transpusa unei matrice reale
.* Înmulţire element cu elem. ' Transpusa + conjugate complexe a numerelor
[2 3] .* [10 20] -> [20 60] complexe din matrice (dacă există)
./ Împărţire la dreapta: 1 ./ [1 2 3] .' Transpusa fără conjugata complexă a
1.0000 0.5000 0.3333 numerelor complexe
>>[1 2] . / [2 3]
0.5000 0.6667
.\ Împărţire la stânga: 2 .\ [1 2 3] * Înmulţire matriceală (| înm. două numere)
0.5000 1.0000 1.5000 Amxn * Bnxp => Cmxp
+ Plus unar A/B Împărţire matriceală la dreapta A*B^-1
- Minus unar A\B Împărţire matriceală la stânga A^-1 *B
: Operatorul două puncte ^ Matrice pătratică la o putere
Operatorii aritmetici pe element (.*, ./, .^) lucrează cu elementele corespondente ale unor tablouri de
dimensiuni egale.
Unii operatori binari lucrează cu un operand matrice şi celălalt scalar. În acest caz MATLAB-ul
aplică scalarul fiecărui element al matricei,
ex: [2 3] – 1 Æ [1 2] sau: [2 3] ./ 2

18 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
*Operatori relaţionali
< Mai mic >= Mai mare sau egal
<= Mai mic sau egal == Egal cu
> Mai mare ~= Diferit de

Operatorii relaţionali compară elementele corespondente ale unor tablouri de dimensiune


egală. Operatorii relaţionali lucrează totdeauna element cu element. Exemplu:
1 < sqrt(2) » pi ~= 3.14
ans = ans =
1 1
» A = [2 7 6; 9 0 5; 3 0.5 6]; » A == B
» B = [8 7 0; 3 2 5; 4 -1 7]; ans =
0 1 0
0 0 1
0 0 0
Rezultatele comparaţiilor sunt valori de tip » A >= B
logic: 0 sau 1 0 1 1
1 0 1
0 1 0

*Operatori logici
& AND (ŞI) 1 & 1 -> 1 1 I 1 -> 1 XOR(0, 0) -> 0
| OR (SAU) 0 & 1 -> 0 0 I 1 -> 1 XOR(0, 1) -> 1
~ NOT (Negatie) 1 & 0 -> 0 1 I 0 -> 1 XOR(1, 0) -> 1
0 & 0 -> 0 0 I 0 -> 0 XOR(1, 1) -> 0
% EXCLUSIVE OR

Operatorii logici aplicaţi elementelor corespondente ale unor tablouri de dimensiuni egale.
Pentru vectori şi tablouri dreptunghiulare ambii operanzi trebuie să aibă aceeaşi dimensiune
• O expresie care utilizează operatorul & (ŞI) este adevărată dacă ambii operanzi sunt
adevăraţi. În termeni numerici, expresia este adevărată dacă ambii operanzi sunt nenuli.
Exemplu:
» u = [1 0 -2 3 0 -5];
» v = [5 6 -1 0 0 7];
» u & v
ans= 1 0 1 0 0 1
• O expresie care utilizează operatorul | (SAU) este adevărată dacă cel puţin unul dintre
operanzi este logic adevărat. Pentru operanzi numerici, expresia este falsă dacă ambii
operanzi sunt nuli. Exemplu:
» u | v
ans = 1 1 1 1 0 1
• O expresie care utilizează operatorul ~ (NOT)neagă logic operandul. În termeni numerici,
orice operand nenul devine nul şi orice operand nul devine unu. Exemplu:
» u = [1 0 -2 3 0 -5];
» ~u
ans= 0 1 0 0 1 0
» ~~u
ans= 1 0 1 1 0 1 % numai 0 şi 1
Un operand este scalar şi celălalt vector: în acest caz, ca şi la operatorii aritmetici,
MATLAB-ul aplică scalarul fiecărui element al celuilalt operand.
u = [1 0 -2 3 0 -5]; v= 5 6 -1 0 0 7
>> u | 0 >> v & 4
19 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
ans = 1 0 1 1 0 1 % valorile True devin 1 ans =1 1 1 0 0 1

Funcţii logice
În plus (paralel) faţă de operatorii logici MATLAB-ul furnizează şi funcţii logice:
Funcţie Descriere Exemple
and( ) Identic cu &
or( ) Identic cu |
xor( ) Realizează sau exclusiv. Returnează logic adevărat dacă » a = 1;
unul din operanzi este adevărat şi celălalt fals. În termeni » b = 1;
numerici, returnează 1 dacă un operand este nenul şi celălalt » xor(a,b)
este zero. ans = 0
all( ) Parametrul este vector: returnează 1 dacă toate elementele » u = [0 1 2 0];
vectorului sunt adevărate sau nenule (true). » all(u)
ans = 0
» A = [0 1 2; …
Parametrul este matrice (all() acţionează pe coloane):
9. 5 0];
» all(A)
ans = 0 1 0
any( ) Parametrul vector: returnează 1 dacă cel puţin unul dintre » v = [5 0 8];
elementele argumentului este adevărat (nenul); în caz » any(v)
contrar returnează 0. ans = 1
>> any([5 0 8 ; …
Parametrul matrice (any() acţionează pe coloane) 9. 0 0 ])
ans = 1 0 1
Alte funcţii: isnan, isinf, find.

3.Prioritatea operatorilor
Se pot scrie expresii care folosesc orice combinaţie de operatori aritmetici, relaţionali şi
logici.
a) ordinea de evaluare a expresiei este dată de nivelele de precedenţa/prioritate
b) în cadrul fiecărui nivel de precedenţă operatorii au aceeaşi prioritate şi se evaluează de
la stânga la dreapta.
c) prioritatea maximă o au parantezele:
1. Paranteze ( )
2. Transpusa (.’), putere (.^), transpusa cu complex conjugate ( ‘ ), matrice la putere ( ^ )
3. plus unar (+), minus unar (-), negare logică (~)
4. înmulţire (.*), împărţire la dreapta (./), la stânga (.\), înmulţire de matrice (*),
împărţire matrice dreapta ( / ), Împărţire matrice stânga ( \ )
5. adunare ( + ), scădere ( - )
6. operatorul două puncte ( : ) % A(1+2: 9)
7. mai mic (<), mai mic sau egal (<=), mai mare (>), mai mare sau egal (>=),
test egalitate (= =), test diferit (~ =)
8. şi (&)
9. sau (|)
CURS 3
Exemplu de scriere compactă şi eficientă / puterea operatorilor în Matlab:
Să se evalueze (fără ciclări) expresia A(r,ζ)=…:
1 + 4ζ 2 r 2 % unde r şi ζ iau următoarele valori:
A( r , ζ ) = r=0 : 0.005 : 2.5 şi
(1 − r 2 ) 2 + 4ζ 2 r 2
ζ=[0.03, 0.05, 0.1, 0.2, 0.5] % ze
Cod Matlab: % cu fiecare linie din A se trasează o curbă
ze=[0.03 0.05 0.1 0.20 0.50]'; r=0 : 0.005 : 2.5; % ze este transpus
A=sqrt( ((2*ze*r).^2+1) ./ ( (ones(size(ze))*(1-r.*r).^2) + (2*ze*r).^2) );
20 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
plot(r,A) % transmisibilitate forţă asupra masei la suport fix
La numărător: ... ...
prin ze*r se înmulţeşte: ... ...
  5 x 501
o matrice ze coloană (5 x 1) (‘ transpune) cu A=
o matrice r linie (1 x 501) ; ... ... ... ...
apoi se ridică la pătrat fiecare element din matrice. ... ... + 
  5 x 501 ... ... 5 x 501
>> ze=[0.03 0.05 0.1 0.20 0.50]'
ze = 0.0300 >> ze * r
0.0500
0.1000 ans =
0.2000 0 0.0001 0.0003 0.0004 0.0006 0.0007 0.0009
0.5000 0 0.0003 0.0005 0.0008 0.0010 0.0013 0.0015
>> r=0 : 0.005 : 0.03 0 0.0005 0.0010 0.0015 0.0020 0.0025 0.0030
r= 0 0.0010 0.0020 0.0030 0.0040 0.0050 0.0060
0 0.005 0.010 0.015 0.020 0.025 0.030 0 0.0025 0.0050 0.0075 0.0100 0.0125 0.0150

La numitor: primul termen (1 − r 2 ) 2 rezultă vector iar al doilea


4ζ 2 r 2 matrice => avem nevoie de matrice şi în primul termen.
size(ze) returnează perechea de valori (5,1); acesta este argument
pentru funcţia ones() care crează matricea cu 5 linii şi o coloană de
valori unitare.

>> ones(size(ze)) ones(size(ze))*(1-r.*r).^2


ans =
1 Sunt generate 5 linii identice care vor fi adunate cu
1 matricea (2*ze*r).^2 (în care fiecare linie (r) se
1 înmulţeşte cu un alt zeta)
1 ze*r => matrice 5x501
1 A => matrice 5x501

>> [1 1 1]' * [4 5 6 7 8] plot(r,A) => 5 curbe, pentru abscisa (vectorul) r se


ans = trasează fiecare linie din matricea X.
4 5 6 7 8
4 5 6 7 8
4 5 6 7 8

4. Instrucţiuni pentru controlul derulării unui program


4.1 . if - end, if – else - end, if - elseif – else - end, if – elseif - end
- execută un grup de instrucţiuni pe baza unei condiţii logice.
- după elseif poate să nu mai existe un else
if expresie_logica
grup de instructiuni
end
...
i=2;
j=input('j= ');
if i+j>0
fprintf('i+j=%7.2f\n',(i+j)^2 );
end

21 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
if expresie_logica
grup1 de instructiuni
else
grup2 de instructiuni
end
---------
if x>0
fprintf('x este numar pozitiv\n')
else
fprintf('x negativ sau zero\n')
end
% compara val. numerice % se citesc 2 şiruri de caractere si se compară lungimile
if a>b sir1=input('sir1= ','s');
disp('a>b') sir2=input('sir2= ','s');
elseif a<b if length(sir1) > length(sir2)
disp('a<b') fprintf('sir1: %s are mai multe caractere\n',sir1);
else %a==b else
disp('egalitate') 'sir2 are car. mai multe sau este egal cu sir1'
end fprintf('Ultimul car. din sir2: %s\n',sir2(end));
end
% n este pozitiv, par sau impar
n=input('n= ');
if n <= 0 %Daca n este negativ sau zero afiseaza un mesaj de eroare.
disp('valoarea furnizata trebuie sa fie pozitiva');
elseif rem(n,2)==0 %Daca n este pozitiv si par, imparte n la 2 si afiseaza.
% remainder (~= reminder)
A1 = n/2; disp('n par si pozitiv');
else %Daca n este pozitiv si impar imparte la 2 si afiseaza
A2 = n/2; disp('n impar si pozitiv');
end
% a aparţine itervalelor: … -20… -10… 0… 10
a=input('a= '); %carui interval apartine a? % else poate lipsi
if a<-20 %test valoare a(2)
disp('a<-20') % afisaza tablou caractere a=input('dati valori vector a=');
elseif a<-10 if a(2)<-5 | a(2)>5
disp('-20 <= a <-10') disp(‘a(2)<-5 sau a(2)>5')
elseif a<0 elseif a(2)<0
disp('-10 <= a <0') disp('a(2)apartine [-5 0)’)
elseif a<10 end
disp( '0<=a<10') % pt. a(2) intre [0 si 5] nu se afiseaza mesaj
else
disp('a>=10')
end

¾ 4. 2.switch, case … otherwise

22 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
switch expresie %scalar sau sir de caractere/string
case valoare_1
grup 1 instructiuni
% se execută dacă: expresie == valoare_1 =>true
case valoare_2
grup 2 instructiuni
% se execută dacă: expresie == valoare_2 =>true
case valoare_n
grup n instructiuni
otherwise
grup n+1 instructiuni
% se execută dacă expresie nu egalează nici un caz
end

% switch poate rezolva mai multe condiţii într-un % exemplul 2


% singur caz prin folosirea acoladelor { } (cell array). switch var1
var=input('var= '); case -1
switch var+1-1 % expresie disp('minus unu');
case 1 case 0
disp('1');
case {2,3,4}
disp('zero');
disp('var este 2 sau 3 sau 4'); case 1
case 7 disp('unu, pozitiv');
disp('7') otherwise
otherwise disp('alta valoare');
disp('altã valoare'); end
end …
% selectare caz prin tablou caractere
sircar = input('Tastati o culoare: ','s'); % descriptor s pentru citire sir car.
switch sircar % valoarea citita este tablou de caractere
case 'rosu'
disp('ati tastat rosu');
case 'galben'
fprintf('ati tastat %s\n', sircar);
case {'albastru','violet'}
disp('ati tastat albastru sau violet');
otherwise
disp('ati tastat altceva decat rosu, galben, albastru, violet');
fprintf('sir %s,primul,ultimul car:%s, %s, total: %2.0f \n', sircar(:), sircar(1), sircar(end), length(sircar))
end

Spre deosebire de limbajul C, daca un caz este adevărat şi acesta se execută, se sare după end fără
a folosi instrucţiune break. In C se execută implicit şi cazurile următoare (daca nu există instr. break).

4.3. Instrucţiunea de ciclare for


- Execută o instrucţiune sau un grup de instrucţiuni de un număr cunoscut dinainte de ori:

23 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
for index = start:increment:end
grup de instructiuni
end

x=3:8; %sau x=[3 4 5 6 7 8];


suma=0; %initializam variabila suma
for i=1:length(x)
suma=suma + x(i);
end
suma % se afiseaza 33
% acelaşi rezultat cu: sum(3:8), sum([3:8])
sau sum(x)

x(1)=1; %se adaugă valori in vect. x(i) % pas=2 n=100; %increment <0
for n = 2 : 6 for k=1:2:n for k=n:-1:1
x(n) = 2 * x(n - 1); . . . . . .
end end end
% rezulta: 1 2 4 8 16 32
Comparaţie sin(x) şi x , Relaţia lui Euler
i=sqrt(-1); %valoarea implicita a lui i
for x=0: pi/30 : 2*pi %pas real de 3grade
fprintf('x=%6.4f sin(x)=%7.4f %g+ %gi\n', x, sin(x), real(exp(i*x)), imag(exp(i*x)) );
end
... programul afişează:
x=0.0000 sin(x)= 0.0000 1+ 0i % Relaţia lui Euler: e^(ix) = cos(x) + i*sin(x)
x=0.1047 sin(x)= 0.1045 0.994522+ 0.104528i
x=0.2094 sin(x)= 0.2079 0.978148+ 0.207912i % Observăm: x ≈ sin(x) pentru x=mic
x=0.3142 sin(x)= 0.3090 0.951057+ 0.309017i 0,1rad; 0,2 rad
x=0.4189 sin(x)= 0.4067 0.913545+ 0.406737i
x=0.5236 sin(x)= 0.5000 0.866025+ 0.5i
x=0.6283 sin(x)= 0.5878 0.809017+ 0.587785i
x=0.7330 sin(x)= 0.6691 0.743145+ 0.669131i
……..
Instrucţiune for în corpul unei alte instr. for
(for imbricat):

lin=5; col=12;
for i =1:lin %se repeta de lin ori
for j =1:col %repeta de lin x col ori
B(i,j) = 1/(i+j-1);
end B5x12
end
plot(1:lin,B,'-*') %sau plot(B)= fiecare coloana o curbă plot(1:col, B, '-*') % o linie=o curba
% abscisa are 5 valori 1:lin abscisa are 12 valori 1:col

Matricea generată B5x12=

2 variante pt. Sinus din vector x de valori:


1.Ciclul for versus 2.vectorizare

24 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
x=1:.1:10; %Cod scalar: Cod echivalent prin vectorizare:
for k=1:length(x)
y(k)=sin(x(k)); x=1:.1:10;
end y=sin(x);
plot(x,y) plot(x,y '-*')

-------------- -----------
x=-5:0.1:25; %Cod scalar: x=-5:0.1:25;
for k=1:length(x) y=x+sin(x);
y(k)=x(k)+sin(x(k)); plot(x,y)
end
plot(x,y)

Calcul VARIANŢA:
% 1.Ciclul for % 2.Vectorizare
x=[1 2 3 4] miu = sum(x)/length(x);
miu = sum(x)/length(x); %media variance2=sum(( x-miu).^2)/length(x);
suma=0; sau: …sum((x-miu).*(x-miu))…
for i=1:length(x) sau: (x-miu)*(x-miu)’
suma=suma +(x(i)-miu)^2
end
= σ 2 = 1 n ( X [i ] − µ ) 2
variance1=suma/length(x);
VAR x n

i =1
% variance1 -> 1.25
Calcule cu matrice
%Numărare elemente ai pozitive din vector Suma elementelor aij de pe DP (i = j) folosind un ciclu for

a=input(`Tastati sir numeric= `); a= [2 -1 3; ...


%exemplu [5 -3 1 -9 4 1] -9 4 1; ...
contor=0; 2 2 2]
for i=1:length(a) sum=0;
if a(i)>0 nc= length(a(1,:)) %lin 1 şi toate coloanele
contor=contor+1 for i=1:nc
end sum=sum + a(i,i);
end fprintf('i=%d j=%d a=%.3f\n',i,i,a(i,i));
display(contor) end
--------------------------- sum

Suma elem. aij de pe DS (i+j=n+1) folosind un ciclu for


sumDS=0; n=nc;
for i=1:n
sumDS=sumDS + a(i,n+1-i);
end
sumDS
Se citeşte matricea pătratică a=[1 2 3 4;
2 3 4 5;
3 4 5 6;
4 5 6 7].
Se parcurg elementele matricei unu câte unu pe linii şi se calculează suma elementelor pozitive
situate deasupra DP şi deasupra DS.
Fiecare element însumat va îndeplini simultan trei condiţii:
Condiţii de poziţie în matrice: 1) i<j selectează elementele aij situate deasupra DP
2) i+j<n+1 selectează elem. deasupra DS
Condiţia de valoare este: 3) a(i, j)>0

Varianta 1: se parcurge întreaga matrice


a=input(`Intr. Matrice patratica=`) % tastati: [1 8 3 ;-9 4 1; 2 2 2]
n=length(a(:,1)); % (toate liniile, coloana 1)
25 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
sum=0;
for i=1:n %ciclu exterior: ciclarea liniilor
for j=1:n %ciclu interior: ciclarea coloanelor
if i<j & i+j<n+1 & a(i,j)>0 %expresie logica
sum=sum+a(i,j);
fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j));
end
end
end
sum
Varianta 2: parcurgerea numai a zonei de interes
for i=1: floor(n/2) %ciclu exter.=ciclarea liniilor
for j=i+1 : n-i %ciclu interior=cicl. coloane DS:j=n+1-i
if a(i,j)>0 %expresie logica
sum=sum+a(i,j);
fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j));
end
end
end
a=input('matricea a=');
Produsul a două matrice a şi b b=input('matricea b=');
[aL aC]=size(a);
[bL bC]=size(b);
c=zeros(aL,bC);
if(aC ~= bL)
'nu se pot inmulti matricele'
else
for i=1:aL
for j=1:bC
for k=1:aC
c(i,j)=c(i,j)+a(i,k)*b(k,j);
end
end
Dacă A este matrice: end
all(A) %AND pe fiecare coloană display(c)
all(all(A)) AND pe col. apoi if all(all(a*b == c)) %verificare
AND pe unica linie 'corect'
end
end

4.4. Instrucţiunea de ciclare while cu condiţionare anterioară


-execută un grup de instrucţiuni de un număr nedefinit de ori, sub controlul unei condiţii
logice.
while expresie logica
bloc de instructiuni
end
(1) Se evaluează expresie logica (E_L).
(2) Daca E_L este True se executa bloc de
instructiuni si se trece iar la (1)
(3)Dacă E_L este False se trece direct după
end
%suma elementelor x(2)… x(5)din sirul x
i=-2;
x=-3:7;
while i<7
suma=0; i=2;
i=i+1;
while i<=5
end
suma=suma+x(i);
i
i=i+1;

26 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
end
suma
amplasare elemente in sir:
x(1) x(2) x(3) x(4) x(5) ...
-3 -2 -1 0 1 ...
Suma patratelor elem. din şir: %instructiune while in corpul while
x=6:-1:1; %sau x=[6 5 4 3 2 1]; m=input('linii m= ');
suma=0; %initializam variabila suma n=input('coloane n= ');
i=1; %initializam „indicele” i i=1;
n_e= length(x) while i<=m %se repeta de m ori
while i <= n_e j=1;
suma=suma + x(i)^2; while j<=n %se repeta de m x n ori
i=i+1; %indicele incrementeaza A(i,j) = 1/(i + j - 1);
end j=j+1;
suma end
i=i+1;
end
i, j %afişează i şi j
plot(A);
% este mai dificila gestionarea indicilor
%decât în cazul folosirii ciclului for
sirC=input('sir=','s' );
j=length(sirC);
for i=i:length(sirC)
sirB(j)=sirC(i); %se copiaza in ordine inversă caracterele
j=j-1;
end
sirB

Poziţionare braţ robot cu trei cuple

Implementare animaţie. Coordonatele cuplelor 2 , 3 şi a


vârfului sunt date de trei vectori de poziţie în planul complex.
O poziţie în planul complex este dată de modul şi funcţia
exponenţial complexă:
1. vector de lungime l1 şi unghi φ1:
cup2 = l1e jϕ1
2. vector =vect precedent+vec lungime l2 şi unghi φ2:
cup3 = cup2 + l2 e jϕ2
3. Vector de poziţie sarcină (varf)
var f = cup3 + l3e jϕ3
Apelând la formula lui Euler se poate afirma:
- abscisele celor 3 pozitii sunt proiecţiile pe axa reală a celor
3 vectori complecşi.
- ordonatele celor 3 pozitii sunt proiecţiile pe axa imaginară
a celor 3 vectori complecşi.

Aplicaţie: rotire in cupla 3 si vectori de pozitie


j=sqrt(-1);
l1=3;l2=3;l3=2;
fi1=pi/3;fi2=pi/6;
for fi3=pi/3:pi/30:3*pi/3 %elementul 3 se roteste
cup2=l1*exp(j*(fi1));
cup3=cup2+l2*exp(j*(fi2));
line([0,real(cup3)], [0 imag(cup3)]) %vec. pozitie cupla3
varf=cup3+l3*exp(j*(fi3));
line([0,real(varf)], [0 imag(varf)]) % vec. poz. varf
27 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
%se traseaza o configuratie a bratului cu line()
lc=line([0 real(cup2) real(cup3) real(varf)], [0 imag(cup2)
imag(cup3) imag(varf)],...
'linewidth',3,'Color',[0 0 0] ) %negru
pause(1);
%se sterge configuratia curenta a bratului cu line()
lc=line([0 real(cup2) real(cup3) real(varf)], [0 imag(cup2) imag(cup3)
imag(varf)],...
'linewidth',3,'Color',[1 1 1] ) %alb
end

Temă: să se pună în mişcare simultan două elemente şi apoi 3 elemente ale


braţului

CURS 4
5. Scheme logice asociate instrucţiunilor de decizie şi de ciclare
Schemele logice conţin: Blocul de start, B.de stop,
B. intrare date, B. ieşire date (paralelograme),
B. de decizii logice (romb), B. de atribuiri şi calcul (dreptunghi)
Blocurile sunt interconectate prin săgeţi orientate.

if expresie_logica
grup de instructiuni
end

…..
if expresie_logica
grup1 de instructiuni
else
grup2 de instructiuni
end
…..

for index = start:increment:end


grup de instructiuni
end

while expresie logica


bloc de instructiuni
end

28 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
switch expresie
% scalar sau sir de caractere/string
case valoare1
grup1 instructiuni
case {valoare21, valoare22, valoare23} %cell array
grup2 instructiuni
...
case valoare n
grupn instructiuni
otherwise
grup n+1 instructiuni
end

Să se traseze schema logică asociată programului de mai jos: conţine decizii multiple în corpul ciclului for

Programul contorizează numărul de


apariţii în şirul x a valorilor 1, 2, 3 şi restul
de valori.

x=input('Tastati un sir de valori x=[...] ');


v1=0; v2=0; v3=0; v=0;
for i=1:length(x)
if x(i) ==1
v1=v1+1;
elseif x(i) == 2
v2=v2+1;
elseif x(i) == 3
v3=v3+1;
else
v=v+1;
end
end
fprintf('v1=%d v2=%d v3=%d
v=%d\n', v1, v2, v3, v);

Observaţi:
1.Asemănarea deciziei multiple realizate
cu if-elseif şi cea realizată cu switch-case
2. S-au compus schemele logice pentru for
şi if-elseif (sau switch)
3.Linia întreruptă mărgineşte corpul
instrucţiunii de ciclare for şi conţine
deciziile multiple

Exemplul rescris Exemplul rescris folosind numai instrucţiunea if


cu instrucţiunea switch-case ...
... for i=1:length(x)
for i=1:length(x) if x(i)==1
switch x(i) v1=v1+1;
29 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
case 1 end
v1=v1+1; if x(i)==1
case 2 v2=v2+1;
v2=v2+1; end
case 3 if x(i)==3
v3=v3+1; v3=v3+1;
otherwise end
v=v+1; if (x(i)~=1 & x(i)~=2 & x(i)~=3)
end v=v+1;
end end
… end

5. Definirea unei funcţii în Matlab


5.1. Sintaxa definirii unei funcţii:
in1, in2,…inn sunt argumente de intrare
(parametri formali)
ou1,out2,…outm sunt argumente de ieşire
in1, in2,… ou1,out2,… sunt variabile locale
ai sunt parametri actuali sau efectivi care au
valori concrete la momentul apelului funcţiei
ri primesc valorile de la outi

1. Funcţiile sunt subprograme (apelate) care folosesc parametri de intrare (in1, in2,…) şi
parametri de ieşire/calculaţi (ou1,out2,…) pentru a comunica cu programul apelant, cu alte
funcţii sau cu fereastra de comenzi.
2. Definiţia funcţiei este salvată într-un fişier ce poartă acelaşi nume cu cel al funcţiei sau altă
denumire şi extensia .m In cazul în care numele funcţiei este diferit de al fişierului se foloseşte
numele fişierului la apel. Calea spre fişier trebuie setată “Set Path…” dacă fişierul nu se află în
directorul curent sau în lista de căi spre directoare.
3. Apelul funcţiei este: nume_fun(a1, a2,…,an) unde a1, a2, …,an sunt parametri efectivi
(actuali) având valori concrete/cunoscute (la momentul apelului).
4.Valorile parametrilor efectivi sunt transferate parametrilor formali în ordine de la stânga la
dreapta.
5. O funcţie poate fi apelată de mai multe ori; la fiecare apel, prin parametri de intrare, se aplică
acelaşi algoritm de calcul unor date de intrare diferite.
6. Folosirea funcţiilor permite modularizarea programului (anumite sarcini de calcul să fie
încapsulate)
7. Funcţiile folosesc variabile locale funcţiei, variabile care există numai pe timpul execuţiei
funcţiei: în fun_demo1: i, x; la ieşirea din funcţie variabilele locale se pierd (eliberează
memoria).
8. Variabilele locale sunt independente de variabilele cu acelaşi nume din programul principal
(apelant) sau din alte funcţii.
9. Funcţia poate fi apelată din linia de comandă, dintr-o altă funcţie sau dintr-un fişier script.
10. Funcţiile pot să nu aibă argumente de intrare sau argumente de ieşire.
11. Pentru funcţia apelată dintr-o expresie, apelul se înlocuieşte cu valoarea (valorile) returnată.

5.2. EXEMPLE - definiţii şi apeluri de funcţii


1) Un parametru de intrare şi unul de ieşire
function y = average(x) x = parametrul de intrare este vector
% AVERAGE media elementelor vectorului y = parametrul de ieşire este scalar
y = sum(x) / length(x); Funcţia average este salvată în fişierul
end average.m
APELURI valide ale funcţiei:
30 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
v=[1 2 3 -3 5]; v=[1 2 3 -3 5]; average( [1 2 3 -3 5] )
ave=average(v) average(v) ans =
ans = 1.6000 1.6000

2) 2 parametri de intrare şi un (1) parametru de ieşire


function z=xplusy(x, y); x,y doi parametri de intrare
z=x+y; z un parametru de ieşire
end Se salvează definiţia funcţiei într-un fisier cu numele xplusy.m
APELURI valide ale funcţiei:
a=1 a=[1 2 3; 3 4 5] a=7
b=2 b=[7 8 9; 2 0 4] b=[7 8 9; 2 0 4]
scal1=xplusy(a,b) matr1=xplusy(a,b) matr2=xplusy(a,b) * b' % 2x3*3x2
% apel în expresie
scal2=xplusy(1,2) matr1=xplusy([1 2 3; 3 4 5] , b) matr2=xplusy(7, [7 8 9; 2 0 4])

3) Parametri de intrare (2,3 sau 4)<= nr. param.formali (4)


function z = xplusy2(x,y, a, b) % se poate apela funcţia cu 2, 3 sau 4 parametri
fprintf('Nr par. actuali=%d\n',nargin)
if nargin < 4
nargin conţine nr. de param. actuali
b=1;
end folosiţi la apel
if nargin < 3 Dacă nargin<4 se atribuie param. neglijat val. b=1
a=1;
end Dacă nargin<3 se atribuie param. neglijat val. a=1
z=(x+y)*a*b;
end Pentru param. >4 sau <2 => eroare

Apeluri valide:
>> xplusy2(3,5) >> xplusy2(3,5,2)
ans = 8 ans = 16
>> xplusy2(3,5,1) >> xplusy2(3,5,2,4)
ans = 8 ans = 64

4) 2 parametri de intrare, nu sunt parametri de ieşire


function compar(a,b) a,b parametri intrare; nu exista parametri de ieşire
if a>b
'a>b' Salvăm definiţia în fişierul compar.m
elseif a<b APELURI:
'a<b' >>compar(4,6)
else %a==b *Rezultatele sunt tiparite din functie
'egalitate'
end

5) un parametru intrare, 2 parametri de ieşire


function [s,sp]=sumapoz(x)
%returneaza suma si suma elem >0
s=0;sp=0;
for i=1:length(x)
s=s+x(i);
if x(i)>0
sp=sp+x(i);%insumare
%x(i)>0
end
end
end
Apel:
[suma, sp]=sumapoz([1 5 -3]) n
2
stdev = 1
n ∑ ( X [i ] − mean 2)
i =1
Parametrii locali ai functiei
31 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
pot avea acelasi nume (sp) cu
variabilele din secţiunea care
apelează

6. Instrucţiunea break determină întreruperea ciclării for sau while


şi salt la prima instrucţiune după instrucţiunea end a ciclării.
7. Instrucţiunea continue trece controlul sau realizează salt la prima instrucţiune din
următoarea iteraţie în cadrul ciclărilor for sau while.
8. Instrucţiunea return determină ieşirea forţată din funcţie (funcţia apelată f_A) şi întoarcerea după
punctul de apel din funcţia apelantă f_An (care a apelat funcţia f_A) (funcţia returnează valorile de la
acel moment din parametrul de ieşire).
function out=fun_demo1(in) function out=fun_demo2(in)
i=1; i=1;
while i < in while i < in
x(i)=rand(1); x(i)=rand(1);
if x(i)>0.95 if x(i)>0.95
'se executa break' out=x; %salvam x in out
break; % intrerupe ciclul while i
end 'se executa return'
i=i+1; return; %iesire din functie
end end
out=x; %salvare x in out i=i+1;
i end
display('exemplu cu break') out=x; %salvare x in out
end %incheiere functie cu end optional display('exemplu cu return')
i
Apel: a=fun_demo1(1.e2); Apel: b=fun_demo2(1.e2);
Dacă x(i)>0.95 True, iese din ciclu, salvează x in out Dacă x(i)>0.95 True, salveaza x in out si iese din
si iese din functie functie
Altfel executa 1.e2 cicluri, salveaza x in out si iese Altfel executa 1.e2 cicluri, salveaza x in out si iese

1. Se apelează o funcţie din corpul altei funcţii - ambele definite în acelaşi fişier:

Bulina roşie => breakpoint


Săgeata albă => punct de apel funcţie
Săgeata verde => poziţie curentă de rulare

>> stat3([1 2 3 4]) % apel functie stat3


% media se calc. în altă funcţie (avg)

3. Evaluarea repetată a unei formule


a) definirea unei funcţii b)folosirea funcţii inline evită definirea funcţiei
function y=f_expresie(x) % se creaza un nou fisier Ex1: un argument: x
y=x+sin(x)+x.^2; fun_ex=inline( 'x+sin(x)+x.^2' );
end %parametrul este şir de caractere
Sunt permise apelurile:
Rez1=f_expresie(2.2) Rez_1=fun_ex (2.2)
Rez2=f_expresie([2.2 3 5]) Rez_2=fun_ex ([2.2 3 5])

32 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
c) Ex2: inline cu mai multe argumente: a, om, t
exp_comp=inline ( ’a*exp(j*om .* t)’ ) % a ⋅ e jω t
la apel parametrii sunt luaţi in ordinea din definitia inline
>> exp_comp(1, 3, 0 : .1 : 0.4) % 1->a, 3->om, 0:.1:0.4 ->t
ans = 1.0000 0.9553 + 0.2955i 0.8253 + 0.5646i 0.6216 + 0.7833i 0.3624 + 0.9320i
% a ⋅ e jω t = a [cos(ωt ) + j sin(ωt )]
>> x=0: .1 :2*pi
>> plot( x , exp_comp(3, pi, x) ) Ægraficul:

*partea imaginară a ordonatelor a fost neglijată în grafic Æ

*abscisa de la 0 la 2pi; 3,1415 perioade de cosinus deoarece om=pi; 3 este amplitudinea

3.Variabile globale
VG permit folosirea unor variabile în corpul funcţiilor fără ca acele variabile să fie pasate
prin parametri în acele funcţii.
Comunicare numai prin parametri
Fereastra de comenzi Definiţie fun_1
a=1; functie y=fun_1(pa,pb,pc)
b=2; ….
c=5; y=pa+pb+pc; %variabile locale
re=fun_1(a,b,c);
Variabilele a,b,c şi-au transferat valorile parametrilor formali pa, pb respectiv pc.
Valoarea calculată y transferă valoarea variabilei re

Comunicare prin parametri şi variabilă globală


a=1; functie y=fun_2(pa,pb)
b=2; ….
global vgC; global vgC;
vgC=55; …..
re=fun_2(a,b); y=pa+pb+ vgC;
Variabilele a,b şi-au transferat valorile parametrilor formali pa respectiv pb.
Variabila vgC este declarată globală în funcţia apelantă şi apelată (fun_2) deci poate fi folosită în
expresii în funcţia apelată fun_2( )
Variabile persistente – sunt locale funcţiei, nu se şterg la ieşirea din funcţie, valoarea lor
este reţinută şi regăsită la un nou apel al aceleaşi funcţii; nu pot fi accesate dinafara funcţiei.
persistent var_persist;

CURS 5
4. Fişiere script Matlab sau macrouri
Scriptul Matlab este un segment de program Matlab salvat într-un fişier numefis.m.
Execuţia fişierului script se obţine prin apelul numelui fişierului numefis (fără extensie) în linia
de comandă, în funcţii sau în alte fişiere script.
După execuţia fişierului script variabilele locale rămân în spaţiul de lucru al aplicaţiei spre
deosebire de funcţie în care variabilele locale se dealocă din memorie.
Un program Matlab are forma fişierelor:
nume_script.m şi/sau: nume_functie.m
Din fişierele de funcţii sau fişierele script se pot apela alte funcţii sau fişiere script.
Se pot face de asemenea apeluri recursive:
- din funcţie se apelează aceeaşi funcţie sau

33 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
- dintr-un fişier script să se apeleze acelaşi fişier script.

Funcţii transmise ca parametru altei funcţii:


Sunt definite trei funcţii apelate: f(), g() şi arie()
function [y]=f(x) function [y]=g(x)
y=sin(x)+x; y=x*cos(x);
end end
function [F]=arie(pf1,a,b,n) In corpul funcţiei arie se apelează sub numele
F=pf1(a)+ pf1(b); formal pf1 funcţia dorită = funcţia trimisă prin
... %calcul arie intre a şi b parametri actuali @f sau @g şi pentru aceasta se
end calculează integrala aprox. dintre abscisele a şi b

pf1(a) calculează valoarea funcţiei pentru abscisa a


oricare ar fi funcţia apelată
Apeluri ale funcţiei arie(...):
%Programul principal sau script (apelant) Obs:
a=1; b=2; n=10; pf1 este parametru formal din def. functiei arie
rezultat1=arie( @f, a, b, n); @f, @g parametri actuali =
rezultat2=arie( @g, a, b, n+100); =adrese de funcţii la apel funcţie arie
disp(rezultat1);
disp(rezultat2);

Grafică 2D în MATLAB

1. Funcţii pentru reprezentări grafice 2D în MATLAB


subplot(abc) sau subplot(a,b,c) divizează fereastra în grafice aşezate matriceal:
a=număr linii,
b=număr coloane,
c=stabileşte poziţia curentă în matrice numărând pe linii: a11, a12… a21…

plot(y) realizează reprezentări grafice în coordonate liniare


a) y este vector =>
reprezintă valorile lui y în funcţie de numărul de ordine al fiecărui element din vector
b) y este matrice m x n =>
plot(y) reprezintă n curbe câte o curbă pentru fiecare coloană a matricei
Exemplul #1 vector
x=0 : pi/100 : 4*pi
%vector real de 401 elemente
y=sin(x);
plot(y)

Exemplu #2 matrice
x=0 : pi/100 : 3*pi
ma(:,1)= sin(x); %generare coloana 1
ma(:,2)= sin(x+pi/3); %generare coloana 2
% faza pi/3 translatează curba
% în lungul abscisei
plot(ma); % ma este matrice 301 x 2
% 2 coloane → 2 curbe

c) y este un vector de valori complexe -> va reprezenta plot(real(y), imag(y))

34 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
ze=0.04; 1
r=0 : .01 : 3; Ac =
1 - r 2 + 2jζ r
j=sqrt(-1)
%factor complex amplific. depl. 1gdl
Ac=1./ (1- r.^2+2*j*ze*r); %vector val. complexe
subplot(121); % 1=linie, 2=col.,
% pozitia 1 devine curenta
plot(Ac, ' - +' ) %trasează real(Ac) vs. imag(Ac)
subplot(122); % 1=linie, 2=col.,
% pozitia 2 devine curenta
plot(real(Ac), imag(Ac), '-+' ) % identic cu plot(Ac)

plot(x, y) % acelaşi număr de valori în vectorii: x şi y


a) reprezintă grafic vectorul y (ordonate) în funcţie de vectorul x (abscise)
primul punct din grafic: x(1), y(1)
punctul al doilea din grafic: x(2), y(2) …
ultimul punct: x(end), y(end)

b) x vector, y matrice => coloanele / liniile matricei y vor fi reprezentate în funcţie de vectorul x
subplot(131); plot(r, real(Ac))
subplot(132); plot(r, imag(Ac))
subplot(133); plot(r, [real(Ac); imag(Ac)]); % r=vector,
% [real(Ac); imag(Ac)]= matrice 2 linii
8 0 10

6
-2
5
4
-4

2
0
-6
0

-8
-5
-2

-10
-4
-10

-6 -12

-8 -14 -15
0 0.5 1 1.5 2 2.5 3 0 0.5 1 1.5 2 2.5 3 0 0.5 1 1.5 2 2.5 3

c) plot(x1,y1, x2,y2) => în acelaşi grafic sunt reprezentate curbele (x1, y1) şi (x2, y2)
x1, y1 = 2 vectori; x2, y2 = 2 vectori
plot(r, real(Ac), r, imag(Ac) );% sau plot( r, [real(Ac); imag(Ac)] ); identice
% fiecare linie din matrice în funcţie de r

2. Exemplu cu funcţia FFT + module de numere complexe

Profilul unei forţe periodice este de forma:


ω0 t + 3 cos 4ω0
f(t) = 1 ⋅ cos ω0 t +1.5 cos t
2 2
Se trasează grafic forţa şi
se pun în evidenţă componentele armonice ale profilului
(amplitudinea şi argumentul fiecărui cosinus):
t=0:0.01:5; w0=10; % 501 valori
f1=1*cos(w0/2*t)+3*cos(w0*t)+1.5*cos(4*w0/2*t);
subplot(211);
plot(t,f1) %se observa graficul periodic
Y1 = fft(f1); % fft() → Fast Fourier Transform
% par. actual: f1= vec.501 valori reale → returnează vec.501 val. complexe
subplot(212);
35 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
plot( abs(Y1(1:length(Y1)/4)));grafic module pentru primele 501/4 din Y1 vs. indici

Y1 = vector de numere complexe returnat:


Y1:

3. Reprezentare în coordonate logaritmice şi semilogaritmice


loglog(x,y) scalează ambele axe folosind logaritmul în baza 10
* valorile 10-1 , 100 , 101 , 102 ,… sunt echidistante pe abscise şi ordonate
semilogx(x, y) scalează logaritmic axa x (…10-1 , 100 , 101 , 102 ,…sunt echidistante pe x=abscisa)
semilogy(x, y) scalează logaritmic axa y (…10-1 , 100 , 101 , 102 ,…sunt echidistante pe y=ordonata)

x=0 : pi/100 : 10*pi %5 perioade


%vector real de 1001 elemente
y=sin(x);
semilogx(x, y)

subplot(312);
semilogx(abs(Y1(1:length(Y1)/4) ));
% scalare log după x

subplot(313);
semilogy(abs(Y1(1:length(Y1)/4) ));
% scalare log după y

4. Funcţia STEM: reprezentarea discretă prin “tulpini”

x=0 : pi/10 : 3*pi %vector real de elemente


y=sin(x);
stem(x, y)

Reprezentare în trepte
x=0 : pi/10 : 3*pi %vector real
y=sin(x);
stem
stairs(x, y)
stairs

5. Grafic de bare verticale


x=0 : pi/5 : pi %vector real de 6 valori
y=sin(x);
subplot(1,2,1)
bar (x,y)
subplot(1,2,2)
bar (y) %y în funcţie de indici

6. Reprezentare în coordonate polare (u,R)


u=0 : pi/10 : 2*pi; % unghi
R=sin(u) .* cos(u); % Raze cu interpolare liniară între ele
polar(u,R);

36 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
7. fplot(‘nume_fun’, limite, n)
% reprezintă grafic o funcţie în limitele specificate, n valori de calcul
% definitie functie
function y=f2(x)
y=sin(x) .* x; % salvam functia f2() in fisierul f2.m
return
% apel:
fplot('f2', [-22 44], 1000);
% reprezintă grafic funcţia f2 definită în fişierul f2 Æ
sau:
[x,y]=fplot('f2', [-22 44], 1000);
% NU reprezită functia ci numai returneaza vectori
% 1000 abscise şi 1000 ordonate în [x, y]
plot(x,y); grid; % apelăm plot(x,y) pentru reprezentare grafică.

8. comet(y) şi comet(x,y) %realizează reprezentare dinamică a unei curbe 2D


printr-un punct care se deplasează şi trasează curba.

9. Trasare poligoane pline colorate


subplot(121)
fill([1 2 4],[1 6 8],'r') % un poligon, [lista abscise], [lista ordonate]
subplot(122)
fill([1 2 4],[1 6 8],'r', [2 4 8],[6 8 9], 'g') % doua poligoane

10. Reprezentare vectori complecşi cu originea în (0,0):


z = 3.0000 + 4.0000i
compass([z, z/i, z*i])
% vector în forma exponenţial complex:
compass([ 3*exp(j*pi/3), 2*exp(j*pi/2), 3-1*j])
% unde j=sqrt(-1)

11. Setare grosime şi culoare curbă în grafic


*Setează grosimea (1.6) a liniei
plot(r,T, 'LineWidth' , 1.6);
*Setează culoarea (red) şi grosimea liniei
line(X,Y,Z, 'Color', 'r', 'LineWidth', 4)

12. Funcţia text() → scrie text pe figură


*Se va scrie relatia lui Euler la poziţia dorită (x,y)= (.1, .22)
>>figure % se creează o nouă fereastră pentru figuri
>> text(.1, .22, '\ite^{(i\omega\tau)} = cos(\omega\tau) + i sin(\omega\tau)')
↑ pozitie text
↑ it pentru a interpreta şir text
↑ acolade {} pentru gruparea scrisă la exponent
Alfabet grecesc: … \omega \tau \…

» gtext('ze=0.1') %permite interactiv scrierea textului la pozitia dorita pe figura curenta


% pozitia curenta este indicata de axele perpendiculare; acestea sunt poziţionate la deplasare mouse

1. Tipărire cu format %d, %f, %e, %g la folosirea funcţiei fprintf

37 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
x=input('vector x= '); Folosim descriptori de format:
for i=1 : length(x)
fprintf('element x(%3d)=%12.3f\n', i, x(i) ); %d pentru tipărire valori întregi cu semn (decimal)
fprintf('element x(%3d)=%12.3e\n', i, x(i) );
fprintf('element x(%3d)=%12.3g\n\n', i, x(i) ); %s pt. tipărire şiruri de caractere (string)
end
% s-a folosit \n pentru trecerea cursorului pe randul %f pentru tipărire valori reale (float)
urmator la inceput după fiecare execuţie a funcţiei fprintf %12.3f valoarea reală se tipăreşte într-un spaţiu de
12 caractere dintre care 3 sunt alocate zecimalelor
vector x=
[1.01 0.00002] % s-a citit iar restul punctului zecimal şi părţii întregi.

element x( 1)= 1.010 %f %e tipărire format exponential


element x( 1)= 1.010e+000 %e
element x( 1)= 1.01 %g
%g mai compact decât %f sau %e şi fără 0 inutil
element x( 2)= 0.000 %f lipsă cifre utile
element x( 2)= 2.000e-005 %e
element x( 2)= 2e-005 %g a ales f.
expon.

În cadrul parametrului actual de tip ‘şir de caractere’ a funcţiei fprintf, pot fi folosite caractere de
formatare a textului (caractere de evitare):
\n Linefeed LF + carriage return CR = se trece \t Tab (sare la dreapta un număr de
(scrie) la inceputul liniei următoare caractere/pozitii de scriere)
\r carriage return \b Backspace (inapoi un caracter)
Folosim: \\ pentru a tipări un caracter backslash
%% pentru tipărirea unui caracter procent.
’’ pentru a tipări un caracter apostrof

2. Tipărire în formă tabelară la ecran:


x=input('sir de medii x= ');
s=0; m=0; ma=0;
nivel={'slab', 'mediu', 'bun'}; %cell array conţine 3 şiruri de caractere de lungimi diferite
fprintf(' \t\tNote studenti\n'); %două taburi (\t) şi trecere la inceputul rândului următor (\n)
fprintf(' \t\t----------------\n'); %realizeaza subliniere titlu
for i=1:length(x)
if x(i)<=6
s=s+1; % %s este descriptor pentru şir de caractere
fprintf('student #%d nivel %s =%12.3f s=%d\n', i, nivel{1}, x(i), s)
elseif x(i)<=8
m=m+1;
fprintf('student #%d nivel %s =%12.3f m=%d\n', i, nivel{2}, x(i), m )
else
ma=ma+1;
fprintf('student #%d nivel %s =%12.3f ma=%d\n', i, nivel{3}, x(i), ma)
end
end
Exemplu rulare:
sir de medii x= [4.33 10 6.25 7 9.66]
Note studenti
----------------
student #1 nivel slab = 4.330 s=1
student #2 nivel bun = 10.000 ma=1
student #3 nivel mediu = 6.250 m=1
student #4 nivel mediu = 7.000 m=2
student #5 nivel bun = 9.660 ma=2

38 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
3. Funcţiile: fopen, fprintf , fwrite, fclose
Scriere în fişier (în locul ecranului) - folosim o secvenţă de forma următoare:
x=input('vector x= '); Conţinut fişier fisdate.dat:
fid=fopen('c:\fisdate.dat', 'wt'); % write text
if fid == -1
display('Nu s-a deschis fisierul\n ') % ex. cale eronată
else
for i=1:length(x)
fprintf( fid, 'element x(%3d)=%12.3f\n', i, x(i) )
end
st = fclose(fid) % închide fişier cu ID=fid
if st = = 0
'fisier inchis cu success\n'
end
end
Conţinut cu Wordpad:
fid2 = fopen('c:/fis33.bin', 'wb'); % write binar
x=fwrite(fid2, 3:300); %return o val.: 298 (val. scrise in fisier)
x2=fclose(fid2); %returneaza 0 pentru succes şi -1 altfel

Sintaxa de scriere:
fid = fopen(cale_numefisier, mod) deschide fişierul în modul specificat prin mod care poate fi:
'r' read
'w' write (se generează fişierul dacă este necesar)
'a' append (se generează fişierul dacă nu există)
'r+' read and write (nu se generează)
'w+' trunchează sau crează pentru read şi write
'a+' read şi append (crează fişierul dacă este necesar)
Fişierul poate fi deschis (pentru citire din fişier sau scriere în fişier):
în mod text (exemple 'rt' şi 'w+t') sau binar (implicit).
Obs.: funcţiile fscanf este folosită pentru citire text cu format din fişiere.
fread = citeşte date binare din fişier.

CURS 6
2. Calcule cu polinoame
2.1.Evaluarea polinomului pentru un vector de argumente
(scriind expresia polinomială şi operatorul .^ ):
VecArg=[ -2 0 10 10.1 99] % 5 argumente VArg= 2: 0.5 : 4;
Val = VecArg .^ 2 + 2*VecArg + 3 Val2= VArg .^ 2 +2 *VArg + 3
Val = Val2 =
1.0e+004 * 11.0000 14.2500 18.0000 22.2500 27.0000
0.0003 0.0003 0.0123 0.0125 1.0002
Operatorul .^ indică ridicarea la putere a fiecărei
valori din vectorul de argumente

2.2. Polinoamele sunt reprezentate prin vectorul coeficienţilor polinomului luaţi în ordine descrescătoare
a puterilor.

p( x) = x 2 + 2 x + 3 => p1=[1 2 3] ; %vectorul linie al coeficienţilor


Evaluarea polinomului folosind VECTORUL coeficienţilor:

39 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
p1=[1 2 3] ; %vector coeficienţi
x=[-18: .2 : 22]; %vector abscise
Funcţia polyval evaluează un
y=polyval(p1,x); polinom (dat prin coeficienţii
plot(x, y, 'linewidth', 2.6); polinomului p1) la abscisele din x
(parametrul al doilea).

2.3.Adunare şi scădere de polinoame


Se adună/scad element cu element coeficienţii de acelaşi ordin.
Vectorii coeficienţilor trebuie să aibă acelaşi număr de elemente:
p1= [1 2 3];
p2= [0 3 4]; p1( x ) = x 2 + 2 x + 3
p 2( x ) = 3 x + 4
>> p_suma=p1+ p2
p_suma = psum ( x ) = p1( x ) + p 2 ( x )
1 5 7

2.4.Inmulţire şi împărţire de polinoame cu funcţiile conv şi deconv:


2
prod ( x ) = ( x 2 + 2 x + 3)( x − 1) imp ( x ) = x + 2 x + 3
x −1
Exemplu Matlab: Înmulţirea a două polinoame date prin vectorii coeficienţilor:
p1=[1 2 3]; Comparaţi coeficienţii obţinuţi prin programul scris şi prin apelul
p2=[1 -1]; funcţiei conv()
prod=conv(p1, p2) - gradul polinoamelor p1,p2 scrise prin coeficienţi este:

prod = → 1 1 1 -3 length(p1)-1 respectiv length(p2)-1;


- gradul polin. produs p12 este:
[cat, rest]=deconv(prod, p2) length(p1)+length(p2) - 2
cat = → 1 2 3 - se alocă length(p1)+length(p2) -1 pozitii în p12.
rest = → 0 0 0 0
P1=[1 2 3];
p2=[1 -1];
[cat, rest]=deconv(prod, p1) p12= zeros(1,length(p1)+length(p2)-1)
cat = → 1 -1 for i=1:length(p1)
rest = → 0 0 0 0 for j=1:length(p2)
p12(i+j-1)= p12(i+j-1)+ p1(i)* p2(j);
2
imp ( x ) = x + 2 x + 3 %produsul de pe poziţiile i,j intră în poz. p12(i+j-1)
x −1 end %ex:i=1,j=1=> p12(2-1) inmultire puteri maxime
[cat rest]=deconv([1 2 3], [1 -1]) end %ex:i=3,j=2=>p12(4) inmultire termeni liberi
p12 %afisare coef. determinati prin program
cat = → 1 3 %pt. comparaţie:
rest = → 0 0 6 prod=conv(p1,p2) %afisare coef. determ prin functia conv()
p1_ini = conv(cat, [1 -1]) + rest
p1_ini = → 1 2 3

Să se calculeze determinantul matricei B: Se înmulţesc polinoame şi se scad:


( pe DiagSecund se adaugă 0 pt. gradul superior)
10 x2 + 3x + 6 x+2 
B=  detB=conv([10 3 6], [5 2 4]) - conv([0 1 2],[0 1 2] );
 x+2 5 x2 + 2x + 4  detB =
50 35 75 20 20

% Polinomul rezultat se reprezintă grafic pe un interval:


x=-2 : 0.1 : 2;
plot(x, polyval(detB,x), 'linewidth',1.4)

40 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
Opţional:
Să se reprezinte grafic funcţia: % k1=2; k2=2; k3=4; m1=5; m2=10
2 detB=conv([-m2 0 k2+k3] , [-m1 0 k1+k2]) - [0 0 0 0
− m2 w + k 2 + k 3
F ( w) = k2^2];
( −m2 w 2 + k 2 + k 3)( −m1w 2 + k 1 + k 2) − k 22
pZerouri=[-m2 0 k2+k3];
pentru coeficienţii:
k1=244.5; k2=244.5; k3=244.5; m1=1; m2=1; w=10:0.01:30;
in intervalul: w=10 : 0.01 : 30;
FRF11=polyval(pZerouri,w) . / polyval(detB,w);
0.3
plot(w,FRF11, 'linewidth',1.7);
0.2
grid on; zoom;
0.1

0
z1=roots(pZerouri);
-0.1
f_z1=z1/(2*pi) % rad/s respectiv Hz
-0.2
r12=roots(detB);
-0.3
f_r12=r12/(2*pi)
14 16 18 20 22 24 26 28

* observăm două asimptote verticale la rădăcinile


numitorului

Funcţiile roots() şi pzmap():


Analizaţi următorul raport de polinoame
(reprezintă funcţia de transfer G(s) ):
x2 + 4x + 1
G( s) =
x3 + 2x + 1
num=[1 4 1];
den=[1 0 2 1];

>> roots(num) % rădăcini ec.polinom (zerouri)


ans = -3.7321 reale
-0.2679
>> roots(den) % radacini numitor (poli)
ans = 0.2267 + 1.4677i complex conjugate
0.2267 – 1.4677i
-0.4534

Calcul poli, zerouri + trasare figură alăturată


(poziţie poli şi zerouri)
-cu cerculeţ ○ sunt notate rădăcinile polinomului
de la numărător “zerouri”
pzmap([1 4 1],[1 0 2 1]) sau:
- cu x sunt notate rădăcinile de la numitor “polii’.
[p z]=pzmap([1 4 1],[1 0 2 1])
%salvare în p, z , fără reprezentare grafică

Descompunerea în sumă de fracţii simple


a raportului a două polinoame A(x) şi B(x)
Fracţiile conţin la numitor polinoame de ordinul unu.
A( x ) r (1) r (2) r(n)
B( x)
= x − p (1)
+ x− p(2)
+ ... + x− p(n)
+ k ( x)
41 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
unde numim r(1) ,…, r(n) reziduuri iar p(1) ,…, p(n) poli.
Se foloseşte funcţia Matlab:
[r, p, k]=residue(A, B)
Funcţia se poate apela şi cu efect invers, în forma:
[A,B]=residue(r, p, k)
caz în care sunt returnaţi coeficienţii polinoamelor A şi B.
Descompunere în fracţii simple a funcţiei x2 + 4x + 1
G=num/den : G ( s ) =
>> [r, p, k]=residue(num,den) x3 + 2x + 1
num=[1 4 1];
den=[1 0 2 1];
Sirul reziduurilor r(1), r(2), r(3): Sirul polilor p(1), p(2), p(3): Rest:
r= p= k=
0.6162 – 1.2316i 0.2267 + 1.4677i []
0.6162 + 1.2316i 0.2267 – 1.4677i
-0.2324 -0.4534
Obs: 2 reziduuri complex con. + 1 real Obs: 2 poli complex conjugaţi + 1 real
A( x ) x 2 + 4 x +1
B( x )
= x 3 + 2 x +1
=
r (1) r (2) r ( 3) 0.6162 + 1.2316i
= x − p (1)
+ x − p ( 2)
+ x − p ( 3)
= 0.6162 - 1.2316i
x −( 0.2267 + 1.4677i)
+ x −( 0.2267 − 1.4677i)
+ -0.2324
x −( -0.4534)

Diagrame Nyquist şi Bode


Nyquist([1 4 1],[1 0 2 1]) Bode([1 4 1],[1 0 2 1]); grid on
Nyquist Diagram
6

2
Imaginary Axis

-2

-4

-6
-5 -4 -3 -2 -1 0 1 2 3
Real Axis

3. GRAFICE 3D

1. Curbe spaţiale (3D) – sintaxa funcţiei plot3()


plot3(x,y,z) % x, y, z = vectori de coordonate ale punctelor
plot3(x,y,z, ‘tip-linie’);
plot3(x1,y1,z1, ‘tip-linie1’, x2,y2,z2, ‘tip-linie2’, …)
plot3(X,Y,Z)

Exemplu:
t=0 : pi/40 : 10*pi;
plot3(sin(t), sin(t) .*cos(t), 2*t); grid on;
Două curbe spaţiale:
plot3(sin(t), sin(t).*cos(t), 2*t, sin(t), cos(t), 2*t);
sau:
plot3(sin(t), sin(t).*cos(t), 2*t, '+' , sin(t), cos(t), 2*t, '-' );
% prima curba trasata din `+`, a doua din `-`

Grafic spaţial dinamic - un punct trasează dinamic curba

42 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
comet3(sin(t), sin(t).*cos(t), 2*t);

Curbă spaţială - reprezentare funcţie complexă:


ze=0.1; r=0: .01 :3;
Ac=1./(1-r.^2+2*j*ze*r); %factor complex amplific. depl. statică
plot3(r, real(Ac), imag(Ac), 'LineWidth', 1.5); grid on;

Curbă spaţială - fun. complexă- două bucle:


j=sqrt(-1);
w=0: 0.001 :2;
H11=(1/5)./(0.4-w.^2+j*0.01*w) + (1/2)./(2-
w.^2+j*0.02*w);
h=plot3(w, real(H11), imag(H11));
set(h, 'LineWidth', 2.7)
grid on;

2.Generarea unei REŢELE – MESH, ÎN PLAN


[X, Y]=meshgrid(x,y) sau [X, Y]=meshgrid(x)
% X – linii identice, fiecare linie conţine valorile vectorului x
%Y - coloane identice fiecare coloană conţine valorile vectorului y
Funcţia meshgrid foloseşte domeniile 1D specificate prin vectorii x şi y pentru generarea tablourilor X şi
Y . Aceste tablouri sunt folosite la evaluarea funcţiilor de două variabile z=f(x,y) prin funcţiile Matlab
mesh şi surf cu reprezentare 3D.

>> [X,Y]=meshgrid(0:4, 6:2:10) Domeniu dreptunghiular:


X= -primul vector 0:4 generează matricea X
0 1 2 3 4 - liniile sunt identice şi conţin valorile vectorului 0:4 pe axa x
0 1 2 3 4 -atâtea linii câte valori sunt în vectorul 6:2:10 (direcţia oy).
0 1 2 3 4 -al doilea vector 6:2:10 generează matricea Y
Y=
-coloanele sunt identice şi conţin valorile vect. 6:2:10 pe axa
6 6 6 6 6
8 8 8 8 8 y
10 10 10 10 10 -atâtea coloane câte valori sunt în vect. 0:4 (pe direcţia ox).
Cele două matrice X şi Y au acelaşi număr de lin. şi col.
PERECHILE (X(i,j), Y(i,j) ) formează reţeaua de puncte din
domeniul 2D oxy, dreptunghiular, de definiţie al funcţiei z=f(x,y)
>> [X,Y]=meshgrid(3:6)
X= Domeniul este pătrat.
3 4 5 6
3 4 5 6
3 4 5 6 Perechile de puncte din plan sunt de forma ( X(i,j), Y(i,j) ):
3 4 5 6 (3,3), (4,3), (5,3), (6,3), (3,4), (4,4) etc.
Y=
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6

2. Reprezentare suprafeţe
funcţia mesh - reprezentare wireframe
funcţia surf - suprafeţe netede.
Matlab reprezintă suprafeţe prin cote z = valori ale funcţiei
pentru o reţea de puncte din planul ox-y. Punctele de cotă z adiacente
sunt conectate prin segmente colorate de dreaptă (wireframe) în cazul
funcţiei mesh şi colorează faţete pentru comanda surf.
Fie o funcţie de forma z=f(x,y):

43 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
( )
z = sin x 2 + y 2 / x 2 + y 2
sau: z=sin(ra)/ra, unde ra= x 2 + y 2 .
(sau direct: Z=sin( sqrt(X .^2+Y.^2) ) . / sqrt( X .^2+Y.^2);)

Etapa#1: se generează reţeaua de puncte din planul x-y


[X,Y]=meshgrid(-12:.4:12, -12:.4:12); %sau meshgrid(-12: .4: 12);
Etapa#2: calcul matricea ra de valori intermediare
ra=sqrt(X .^2+Y.^2);
%matricele X şi Y sunt ridicate la pătrat element cu
element,
%adunate, apoi radicalii din fiecare element salvaţi în
matricea ra

Etapa#3: calcul valori finale funcţie cu salvare în


matricea Z
Z=sin(ra) ./ ra;

Etapa#4: reprezentarea grafică


subplot(211);
h=mesh(X,Y,Z); % h este handle la grafic
grid on;
subplot(212);
s2=surf(X,Y,Z); % vezi figura alăturată ->
%fiecare matrice X,Y,Z conţine coordonatele x, y resp. z ale
tuturor punctelor din grafic.

Etapa#5: editare grafic:


get(h)
% listează pe ecran setul de proprietăţi ale graficului asociat

set(h, 'LineWidth', 1.7)


%set(h, …) se impune lăţimea liniei de trasare a graficului sau alte proprietăţi ale graficului asociat.

title('Functia sinc cu surf');


xlabel('axa x');
ylabel('axa y');
text(0, 0, 0.5 ,’vârf’);

Exemplul #2:

[X,Y]=meshgrid(-10:16);
Z=sqrt(X .^2+Y .^2);
surf(X,Y,Z);

44 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
5.3. Animaţie vibraţie robot în jurul unei configuraţii pentru condiţii initiale de pornire
specificate

%Animatie=continuare program precedent


%Recuperare şiruri de valori în cuple
sircup1=X(:,1)';sircup2=X(:,2)';sircup3=X(:,3)';
%Poziţionare succesivă a braţului conform cu unghiuri cuple rotatie
for t=1:length(sircup1) %se repetă pt fiecare triplet
fi1=sircup1(t);fi2=sircup2(t);fi3=sircup3(t)
cup1=l1*exp(j*(fi1c+fi1));
cup2=cup1+l2*exp(j*(fi2c+fi2));
cup3=cup2+l3*exp(j*(fi3c+fi3));
%se traseaza o configuratie a braţului cu line()
lc=line([0 real(cup1) real(cup2) real(cup3)],...
[0 imag(cup1) imag(cup2) imag(cup3)],...
'linewidth',1.5,'Color',[0 0 0] ) %negru
pause(.001);
%se şterge configuratia curenta a braţului cu line()
lc=line([0 real(cup1) real(cup2) real(cup3)], ...
[0 imag(cup1) imag(cup2) imag(cup3)],...
'linewidth',1.5,'Color',[1 1 1] ) %alb
end

4. Elemente de CALCUL SIMBOLIC


Variabila simbolică se memorează în forma unui şir de caractere
% defineste mai multe obiecte simbolice %defineşte un singur obiect simbolic
x = sym('x')
syms f g y g1 g2 ;
x=
whos % afisare tip variabile x
Name Size Bytes Class Attributes

f 1x1 126 sym


g 1x1 126 sym
......

df df d 2 f d 3 f
Derivare cu funcţia diff(): , derivare ordin 1, 2, 3: , ,
dx dx dx 2 dx 3
syms x % defineste expresia f
f0=3*x^3+5*x^2-6*x+2 % definire f0 f= 12 + (x-1)*(x-1)*(x-2)*(x-3)
pretty(f0) % vizualizare f0 f=
3 2 12+(x-1)^2*(x-2)*(x-3)
3x +5x -6x+2
diff(f0) diff(f) % prima derivata
ans = 9*x^2+10*x-6 ans =
-------------------------------------------------------- 2*(x-1)*(x-2)*(x-3) + (x-1)^2*(x-3) + (x-1)^2*(x-2)
>>f1 = 2*x^2*exp(3*x) % definire f1
>> diff(f1) diff(f, x, 2) % derivată de ordin 2
ans = > 4*x*exp(3*x) + 6*x^2*exp(3*x) ans =
-------------------------------------------------------- 2*(x-2)*(x-3)+4*(x-1)*(x-3)+4*(x-1)*(x-2)+2*(x-
Derivare, integrare 1)^2
>> diff(log(x)) % log= logaritm natural
ans = diff(f, x, 3) % derivată de ordin 3
1/x ans =
>> int(1/x) 24*x-42

45 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
ans =
log(x)

Derivare funcţii trigonometrice:


>> diff(sin(5*x)) >> diff(sin(x)^2) >> diff( sin(x) * cos(x) ) >> diff(exp(x) * cos(x))
ans = ans = ans = ans =
5*cos(5*x) 2*sin(x)*cos(x) cos(x)^2 - sin(x)^2 exp(x)*cos(x) - exp(x)*sin(x)

Simplificare expresie Æ simplify()


1. derivare raport polinoame 2. simplificare = se aduce la numitor comun+calcule:
syms x %derivare fractie + simplificare forma
num = 2*x^2 + 3*x -1;
denom = x^2 - x + 3;
RapPol = num/denom
RapPol = fps=simplify(fp), - ->
(2*x^2+3*x-1) / (x^2-x+3)

fp=diff( RapPol ) => fps =


fp = -(5*x^2-14*x-8)/(x^2-x+3)^2
(4*x+3)/(x^2-x+3) - (2*x^2+3*x-1)/(x^2-x+3)^2*(2*x-1)
pretty(fps)
pretty(fp) 2
2 5 x - 14 x - 8
4 x + 3 (2 x + 3 x - 1) (2 x - 1) sau: - ---------------
---------- - -------------------------- → 2 2
2 2 2 (x - x + 3)
x -x+3 (x - x + 3)

Derivate parţiale: Matrice Jacobiana:


syms g1 g2 x y ;
g1= 20*x^3 +15*y -30 ; % Calcul matrice Jacobiană=derivatele parţiale ale vectorului [g1; g2]
g2 = 0.25*x + y -1; % în raport cu variabilele independente x şi y
% g1,g2 pot avea derivate partiale ∂ ( g1, g 2)
J =
diff(g1, x) % derivata parţială ∂ ( x, y )
ans = J = jacobian([g1; g2], [x y]) % calcul Jacobian
60*x^2 J = [ 60*x^2, 15]
diff(g1, y) [ 1/4, 1]
ans =
15
Sau: jacobian([g1 g2], [x y]) sau: jacobian([g1; g2], [x; y])

Funcţia ezplot(): “easy plot” ; curbe 2D şi 3D Grafice cu ezplot( )

46 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
syms x f1 f2; 8
(x-54/25)
x 10 (x-127/10) (x-383/10) (x+54/25) (x+127/10) (x+383/10)

% polinom; ecu. polinom. cu solutii simetrice fată de oy: 3

f1=(x-2.16)*(x-12.7)*(x-38.3) * ...
2

(x+2.16)*(x+12.7)*(x+38.3) 0

-1

subplot(211) -2

ezplot(f1, [-40,40]) ; line([-40 40] , [0 0] , 'Color','r'); Æ


-3

-4
-40 -20 0 20 40
x

(x-1)2 (x-2) (x-3)+4

f2= (x-1)*(x-1)*(x-2)*(x-3)+4 14

subplot(212)
12

10

ezplot(f2) % easy plot -2 pi < x < 2 pi 8

ezplot(f2, [0,4]) % graficul fun. f pentru 0 <= x <= 4 Æ 6

0 1 2 3 4
x

df1 = diff(f1); % derivare + grafic derivata


ezplot(df1,[0,4])
line([0 4],[0 0],'Color','r')

---------

Grafic spaţial 3D / fără parametru simbolic


% trei expresii şi intervalul parametrului t
(t nu-i simbolic)
ezplot3('sin(t)' , 'sin(t).*cos(t)' , ' 2*t' , [0,6*pi]);

Substituţii + simplificare (calculele numerice şi simbolice pot fi combinate):


Substituie valoare numerică într-o variabilă Substituie expresie simbolică într-o variabilă
syms x y;
subs(f, y, 3)
f = x^2*y + 5*x*sqrt(y) >>aa=subs(f, x, x^2+y)
ans =
subs(f, x, 3) ans =
ans = (x^2+y)^2*y + 5*(x^2+y)*y^(1/2)
3*x^2+5*x*3^(1/2)
9*y+15*y^(1/2) >> simplify(aa)
ans =
x^4*y + 2*x^2*y^2 + y^3 + 5*x^2*y^(1/2) + 5*y^(3/2)
syms g1 g2 x y ;
g1= 20*x^3 +15*y -30 ;
g2 = 0.25*x + y -1; % evaluare g12 pentru x = 1, y = 2.5
g12 = [g1; g2] Æ
subs( g12, {x, y}, {1 , 2.5}) sau:
subs( [g1 g2], {x, y}, {1 , 2.5})
ans = 27.5000
1.750

Funcţia solve() : soluţii simbolice pentru ecuaţii şi sisteme de ecuaţii algebrice


Soluţie simbolică ecuaţie gradul 2 Parametrul este ‘ şir de caractere ’
>> x12=solve('a*x^2 + b*x + c') pretty(x12)
[ 2 1/2 ]
[ b – (b - 4 a c) ]
x12 =
[- 1/2 ------------------- ]
-1/2*( b - (b^2-4*a*c)^(1/2) )/a [ a ]
-1/2*( b + (b^2-4*a*c)^(1/2) )/a → [ ]
[ 2 1/2 ]
[ b + (b - 4 a c) ]
[- 1/2 ------------------- ]
47 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
[ a ]
Sistem 2 ec. cu 2 necunoscute
>> [sx sy] = solve( ' x + y = a ', ' x - 11*y = b ') % solutie simbolica
sx =
11/12*a+1/12*b
sy =
1/12*a-1/12*b
Soluţie ecuatie în raport de r apoi în raport de ze:
syms r, ze;
>> solve( '1-r^2+2*ze^2*r^2 ' , r) >> solve('1-r^2+2*ze^2*r^2', ze)
% ex. suport vibratii ans =
ans =
-1/(1-2*ze^2)^(1/2) 1/2*(-2+2*r^2)^(1/2)/r
1/(1-2*ze^2)^(1/2)
-1/2*(-2+2*r^2)^(1/2)/r
pretty(1/(1-2*ze^2)^(1/2))
Soluţii numerice:
Expresie matriceală (se reia exemplul cu polyval):
syms w; % solutii numerice
M=[5 0;0 10]; K=[4 -2;-2 6]; [sx sy] = solve(' x + y = 1 ' , ' x - 11*y = 5 ')
detB=det(eval(K-w^2*M))
sx =
detB =
20-70*w^2+50*w^4 4/3
sy =
solve(detB) %sau: -1/3
solve( '20 - 70*w^2 + 50*w^4' )
ans =
-1 % 4 solutii w1,w2,w3,w4
1
1/5*10^(1/2) % (2/5)^(1/2)
-1/5*10^(1/2)

Sistem 3 ecuaţii liniare (solutii numerice):


[sx1 sx2 sx3] = solve(' 3*x1-x2=5 ' , ' -2*x1+x2+x3', ' 2*x1-x2+4*x3=15' ) %a doua ec. implicit=0
sx1 =
2
sx2 =
1
sx3 =
3

Rezolvare sistem două ecuaţii neliniare (solutii numerice):


clear
syms x1 x2 % definire funcţii
h1 = x1*x1 + x2*x2 - 2;
h2 = 0.25*x1*x1 +0.75*x2*x2 -1;
[x1 x2] = solve(h1, h2); %rezolva sist. pt. x1 şi x2
x1 =
-1
1
-1
1
x2 = % -1 - 1 sol#1
-1 % 1 -1 sol#2
-1 % -1 1 sol#3
1 % 1 1 sol#4
1

48 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
Funcţia int() Æ Integrare simbolică
syms x
fin =2*x^2 >> int(1/x) >> int(tan(x))
>> int(fin) ans = ans =
ans = log(x) -log(cos(x))
2/3*x^3
diff( -log(cos(x)) )
ans =
sin(x)/cos(x)

syms a b x % variabile simbolice


f = 3*a*b*x + 2*exp(a*x + b); % definitie f
f1 = diff(f, x) % derivata functiei f in rap. cu x » int(f1, x) % integrare simbolica f1 în raport cu x
>> f1 = ans =
3*a*b+2*a*exp(a*x+b) 3*a*b*x+2*exp(a*x+b) % s-a obţinut f din nou
Integrala definită:

» int(f, x, 0, pi/2) % integrare în raport cu variabila x între 0 şi pi/2


ans = > 1/8*(3*a^2*b*pi^2+16*exp(1/2*pi*a+b)-16*exp(b))/a

» f2 = int(f, b, 0, pi/2) % integrare în raport cu b între 0 şi pi/2


f2 = > 3/8*a*pi^2*x+2*exp(a*x+1/2*pi)-2*exp(a*x)

Matrice
Funcţia inv() Æ inversare matrice, simbolic
syms m1 m2 M; syms a b c d A; %Matrice coloana * matrice linie
M=[m1 0; 0 m2]; A=[a b; c d];
pretty(inv(A)) [a; b]2x1 * [c d]1x2
inv(M) [ d b ]
%matrice diagonală [ --------- - --------- ] ans =
ans = [ad-bc a d - b c]
[ 1/m1, 0] [ ]
[ a*c, a*d]
[ 0, 1/m2] [ c a ] [ b*c, b*d]
[- --------- --------- ]
[ ad-bc ad-bc ]
det(A)
ans = a*d - b*c

Funcţia expand():
syms a b c ;
c=sin(a+b)
>> expand( cos(2*a) )
expand(c)
ans =
ans =
2*cos(a)^2 - 1
sin(a)*cos(b)+cos(a)*sin(b)

expand(cos(a+b)) etc.
ans =
cos(a)*cos(b)-sin(a)*sin(b)

f ( x + dx) − f ( x)
Limite: f ( x) = lim = definiţia derivatei
dx →0 dx
cos( x + dx) − cos( x)
lim → -sin(x)
dx →0 dx
49 Prof.dr.ing. Iulian Lupea
Programarea şi Utilizarea
Calculatoarelor
>> syms x, dx
>> limit( (cos(x+dx)-cos(x) )/dx, dx, 0) sau:
ans = >> diff(cos(x))
-sin(x) ans =
- sin(x)

sin( x + dx) − sin( x)


lim → cos(x) sau:
dx →0 dx
>> diff(sin(x))
ans =
>> limit( (sin(x+dx) - sin(x) )/dx, dx, 0)
cos(x)
ans =
cos(x)

n >> limit( (1+1/n)^n, n, inf )


 1
lim 1 +  → exp(1) = e ans =
n → inf  n  exp(1)

>> exp(1)
ans =
2.7183
n >> limit( (1+x/n)^n, n, inf )
 x
lim 1 +  → exp( x) = e x ans =
n → inf  n  exp(x)

Dezvoltare în serie f ' ( x0 ) f '' ( x 0 ) 2 f ''' ( x 0 ) 3 f ( n ) ( x 0 ) n


de funcţii Taylor f ( x 0 + x ) = f ( x0 ) + x+ x + x + x + Rn
1! 2! 3! n!

Serie MacLaurin f ' ( 0) f ' ' ( 0 ) 2 f ' '' ( 0) 3 f ( n ) ( 0 ) n


f ( 0 + x ) = f ( 0) + x+ x + x + x + Rn
1! 2! 3! n!
syms x
f1 = sin(x); % functie trigonometrică
T1 = taylor(f1,10) % primii 10 termeni

T1 = > x -1/6*x^3 +1/120*x^5 -1/5040*x^7 +1/362880*x^9 % sunt afisati termenii nenuli

f2=cos(x); % functie trigonometrică


T2=taylor(f2,10)
T2 = > 1 - 1/2*x^2 + 1/24*x^4 - 1/720*x^6 + 1/40320*x^8

Să se verifice relaţiile: e jx = cos(x) + j ⋅ sin(x) e -jx = cos(x) - j ⋅ sin(x)


f3 =exp(j*x);
T3 = taylor(f3,10)
T3 = 1+ i*x- 1/2*x^2 - 1/6*i*x^3+ 1/24*x^4+ 1/120*i*x^5- 1/720*x^6 -1/5040*i*x^7+ 1/40320*x^8+ 1/362880*i*x^9

Diverse

1. Calculul funcţiei sin(x) folosind dezvoltarea în serie Taylor:

50 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor

x 2n+1 ∞ − x2
sin(x) = ∑ (-1 )n = ∑ Tn => Tn +1 = Tn ⋅
n=0 (2n + 1)! n=0 (2n + 2 )( 2n + 3 )

x=input('Dati valoarea lui x [radiani] pt calcul sin(x)\n')


n=input('Numar iteratii n= \n')
suma=x; T=x; %suma partiala si termenul curent
for i=0:n
T=-T*x^2/(2*i+2)/(2*i+3);
suma=suma+T;
end
fprintf('Valoare calc= %20.15f \nVal calc Matlab=%20.15f\n',suma,sin(x) );

Rulare:
x =0.4
Numar iteratii n= 23
Valoare calc= 0.389418342308650
Val calc Matlab= 0.389418342308651

2. Rezolvare sistem de ecuaţii liniare de forma: AX=B  3 x1 − x 2 = 5



2.1. Inversare matrice:  − 2 x1 + x 2 + x3 = 0
A=[3 -1 0;-2 1 1;2 -1 4] B=[5 0 15].' sau B=[5; 0; 15;] 2 x1 − x 2 + 4 x3 = 15

X1=A^-1 * B sau: X1=A \ B

X1 =
2.0000
1.0000
3.0000

2.1. Metoda lui Cramer: x1= ∆1 / ∆ , x2= ∆ 2 / ∆ , x3= ∆ 3 / ∆ unde ∆ este determinantul sistemului iar ∆ i este
determinantul matricei coeficienţilor (A) în care coloana “i” a fost înlocuită cu coloana termenilor liberi (B).
A=[3 -1 0; X=A^(-1)*B;
-2 1 1; X= ... %calcul direct
2 -1 4]
A1=[5 -1 0; % Cramer A3=[3 -1 5;
B=[5 0 15]' 0 1 1; -2 1 0;
15 -1 4] 2 -1 15];

x1=det(A1)/det(A) x3=det(A3)/det(A)

3. Calcul matriceal, verificarea unor relaţii:


1. (A*B)T=BT* AT, 3. (A-1)T=(AT)-1 5. (A+B)*C=A*C+B*C
2. (A*B)-1=B-1 * A-1 4. det(A) * det(A-1)=1 det(AB)= det(BA)=det(A)*det(B)

4. Sortare prin metoda selecţiei


a=input('Va sorta in ord. descresc.\nIntroduceti un
sir: ')
asort=sort(a,'descend');
n=length(a);
for i=1:n-1
poz_max=i;
for j=i+1:n
if a(j)>a(poz_max)
poz_max=j;%retine pozitie element maxim
end
end
aux=a(i);a(i)=a(poz_max);a(poz_max)=aux; %interschimba

51 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor
end
a
asort

5. Sortare prin metoda bulelor


a=input('Va sorta in ord. descresc.\nIntroduceti un sir: ')
asort=sort(a,'descend');
n=length(a);
for i=n-1:-1:0
for j=1:i
%elem. cel mai mare este plasat ultimul in subsirul de indici 1,...,i
if a(j)<a(j+1)
aux=a(j); a(j)=a(j+1); a(j+1)=aux;
end
end
end
a
asort

6. Integrare
function y = myfun(x) %definitie functie
y = 1./(x.^3-2*x-5);

quad('myfun',1,2) %integrare
ans = -0.2860

>> quad('myfun',-1,7)
Warning: Minimum step size reached; singularity possible.
> In quad at 103
ans =
-0.3811

a ⋅ e jω t

52 Prof.dr.ing. Iulian Lupea


Programarea şi Utilizarea
Calculatoarelor

S-ar putea să vă placă și