52
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 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.

Cursuri 1,2,3,4,5,6,7

  • Upload
    dokhanh

  • View
    270

  • Download
    8

Embed Size (px)

Citation preview

Page 1: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

1

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.

Page 2: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

2

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/

ops Operators and special characters. all(), any, xor, or, transpose sau .’, 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/:

general General purpose commands. beep, delete, dir, rmdir, dos, echo, exit, import, 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.

Page 3: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

3

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)

elfun Elementary math functions. abs(),sin(),tan,sinh,exp, 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 Function functions and ODE solvers. ode23, ode45(), fzero, ...

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.

Page 4: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

4

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);

Page 5: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

5

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 . . . - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

>> A = [1 2 3-2i; ... 4 5 6 ; ... 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 save f1_var [–mat]

Salvează toate variabilele în fişierul matlab.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: 1 2 3 4 2 3 4 5

» load date.dat %incarca şi creaza variabila matrice [1 2 3 4; 2 3 4 5] creează o variabilă cu numele date în workspace.

Page 6: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

6

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 ans = 0.3333

>> sqrt(2) ans = 1.4142

>> e1=exp(1) e1 = 2.7183

>> tan(pi/4)^-1 ans = 1.0000

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

Page 7: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

7

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 = 123

>> a='qwer' a = qwer

>> a=[1 2 3; 2 3 4; 3 4 5] a = 1 2 3 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) ans = 0 + 1.4142 i

>> abs(3+4j) ans = 5

>> i ans = 0 + 1.0000i

>> j ans = 0 + 1.0000i

>> exp(i*pi/2) ans =

0.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) ans = 1.5708

>>rem(5,3) %rest ans = 2

>> sind(30) ans = 0.5000

>> atan2(-1,0) ans = -1.5708 % -pi<= ATAN2(Y,X)<=pi

Page 8: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

8

>>exp(2) % 2.7183^2 ans = 7.3891

>> log(2.72) ans = 1.0006 % f.logaritmica

>> atan2(1,0) ans = 1.5708

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 rho = 1.6180

» a = abs(3+4i) a = 5

>> exp(i*pi) ans =

-1.0000 + 0.0000i

» huge1 = exp(log(realmax)) huge1 = 1.7977e+308

» toobig = pi*huge1 toobig = Inf

3.5.Generarea unui VECTOR de VALORI: a) vector = val_initială : pas : val_finală

Page 9: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

9

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) r = 5

>> r1=abs (conj(z)) r1 = 5

>> z+conj(z) % rezultă număr real ans = 6 % Obs: conj(z) sau z’

% x + iy + x – iy = 2x

Faza:

Page 10: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

10

>> 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

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): ϕϕϕ jej =+ sincos (fun.exponential complexă, 1−=j )

% Exprimare z în coordonate carteziene

% yjxz += sau )sin(cos ϕϕ jzz +⋅=

unde φ =angle(z)

% Exprimare z în coordonate polare % ϕjezz ⋅=

Cod Matlab: ↨ ↨ >> abs(z)*( cos(fi) +i*sin(fi) ) ans = 3.0000 + 4.0000i

>> abs(z) * exp(j*fi) ans = 3.0000 - 4.0000i

Adunare şi scădere de numere complexe: ›› z = 3.0000 + 4.0000i ›› z2= -4.00 + 2i

% z+z2= )()( 22 yyjxx +++

% z-z2= )()( 22 yyjxx −+− >> z + z2 ans = -1.0000 + 6.0000i >> fi_sum=angle(z+z2) fi_sum= 1.7359 % radiani

% rezultat in Cadran II

>>angle(z+z2) > pi/2 ans = 1 >>plot(-1.0000+6.0000i, '*', … 'MarkerSize',20 , 'LineWidth',2 ) >> line... >> grid on

Variante de reprezentare grafică a numerelor complexe

Fig.1.Numărul complex z în planul complex

Page 11: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

11

>> 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= ))(( 2211 yjxyjx ++ = )()( 21212121 xyyxjyyxx ++−

Forme polare: z1*z2= )(

2121 ϕϕ +⋅⋅ jezz

= produsul modulelor şi suma fazelor

Cod Matlab: >>z = 3.0000 + 4.0000i >>z2= -4.00 + 2i >> z*z2 ans = -20.0000 -10.0000i

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

Impărţirea a două numere complexe Forma carteziană:

2222

22

)(

)()())(())((

vuxvyuj

vuyvxu

vuyuxvjyvxu

jvujvujvuyjx

jvuyjx

wz

+−

+++

=

++−++

=−+−+

=++

=

Forme polare:

)(

2

1

2

1

2

1 21

2

1ϕϕ

ϕ

ϕ−== j

j

j

ezz

ezez

zz

= câtul modulelor şi diferenţa fazelor

Cod Matlab: >>z = 3.0000 + 4.0000i >>z2= -4.00 + 2i >> z / z2 ans = -0.2000 - 1.1000i

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

Inmulţirea j*z= )( yjxj + = yjx − = jxy +−

Numărul complex jz se obţine prin rotirea lui z cu 90 grade în sens trigonometric.

Varianta polară: 21π⋅

⋅=j

ej => jz=)

2(

2 *1πϕϕ

π+

⋅=⋅jjj

ezeze

Impărţirea z/j= jxyyjxj

yjx−=

−−

=+

1

Varianta polară: Fig. 4. z şi z/ j=y-jx

Page 12: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

12

)2

()2

(*1)(

11 π

ϕπ

−⋅−⋅⋅=⋅⋅=−⋅=

−⋅=⋅

jjjeezezjzjz

jz =

)2

( πϕ−⋅

jez

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, '*') >> plot(z / j, 's') >> line([0 real(z)],[0 imag(z)]) >> line([0 real(z*j)],[0 imag(z*j)]) >> line([0 real(z / j)],[0 imag(z / j)]) >> grid on

Obs: Trasare linie poligonală >> line( [ 1 2 3], [2 5 -1] ) % vector abscise, vector ordonate similar cu plot

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

-3

-2

-1

0

1

2

3

4

3.7 CALCULE ELEMENTARE CU MATRICE >> A=[1 2 3; 3 4 5; 5 6 7] A = 1 2 3 3 4 5 5 6 7

>> B=[-1 0 1] ' % B 3x1 B = -1 %coloana 0 1

>> B' ans = %linie -1 0 1

Înmulţiri valide: >> A*B %3x3 3x1->3x1 ans = 2 2 2

>> A'*B % 3x3 3x1 -> 3x1 ans = 4 4 4

>> B'*A %1x3 3x3 -> 1x3 ans = 4 4 4

Page 13: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

13

Matricea 2D văzută ca Vector 1D:

A = 1 2 3 3 4 5 5 6 7

A(1:end) %elem. luate pe coloane ans = 1 3 5 2 4 6 3 5 7

>> A(1:end)*A(:) ans = % A(:) =vector 9x1 174 % suma pătratelor

>> A(:)’ * A(:) ans = % A(:) vector 9x1 174 % suma pătratelor

Să se ridice elem.: A(2), A(3), A(4) la pătrat: >> A(2:4) .* A(2:4) % sau A(2:4) .^2 ans = 9 25 4

%Elem. din 2 linii la pătrat: [A(1,:) A(2,:)] .^2 ans = 1 4 9 9 16 25

Preluare de zone din matrice: >> C1=A(2,:) % linia #2 C1 = 3 4 5

>> C2=A(:,3) % coloana #3 C2 = 3 5 7

››A(2,:)*A(:,3) ans = 64 %1x3 3x1->1x1

>> C2*C1 %3x1 1x3 ->3x3 ans = 9 12 15 15 20 25 21 28 35

>> A(1:2,:) % 2lin, toate col ans = 1 2 3 3 4 5

>> C1(2:3)*A(1:2,:) % 1x2 2x3 ans = 19 28 37

Produs scalar a doi vectori (de câte 4 valori fiecare): A = 1 2 3 3 4 5 5 6 7

Vezi şi funcţia dot() Vector dot product

OBS: prod. scalar a doi vectori perpendiculari este 0

>> A(1:4) %luate pe coloane ans = 1 3 5 2

>> V= 1:2:7 V = 1 3 5 7

>> A(1:4)* V' ans = %1x4 4x1->1x1 49

Produs vectorial a doi vectori v=[1 2 3]; u=[3 4 5]; >> pv=cross(u,v) >>pv= 2 -4 2

pv este ┴ pe v >> dot(pv,v) ans = 0 prod scalar este 0

pv este ┴ pe u >> dot(pv,u) ans = 0 prod scalar este 0

Inversa matricei

>> D(3,3)=7 % add 1 col D = 7.3891 1.0000 0 1.4142 5.0000 0 1.0000 0 7.0000

>> D^-1 %inversa 3x3 ans = 0.1407 -0.0281 0 -0.0398 0.2080 0 -0.0201 0.0040 0.1429

>>D=[exp(2) 1; ... sqrt(2) 5; ... 1 tan(0)] D = 7.3891 1.0000 %3 linii, 2col 1.4142 5.0000 1.0000 0

>> D*D^-1 ans = 1.0000 0 0 -0.0000 1.0000 0 0.0000 -0.0000 1.0000

>> D^-1 * D ans = 1.0000 0.0000 0 -0.0000 1.0000 0 -0.0000 -0.0000 1.0000

>> 2*D = = D+D %test >> D*D= =D^2 %la putere

Page 14: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

14

ans = 1 1 1 1 1 1 1 1 1

ans = 1 1 1 1 1 1 1 1 1

“Impărţiri” / şi \ >> M / D ans = 0.9654 0.0069 0.8571 0.0824 0.9835 1.0000 0.1645 1.7671 0.2857

>> M * D^-1 %=M / D ans = 0.9654 0.0069 0.8571 0.0824 0.9835 1.0000 0.1645 1.7671 0.2857

>> M=magic(3) ans = 8 1 6 3 5 7 4 9 2 % suma pe fiecare linie=15 suma pe fiec. col. = 15 suma DP =suma DS=15

>> M \ D ans = 0.9474 -0.5750 0.4472 -0.3146 0.0500 0.7389 0.0207 0.9250 -0.7194

>> M^-1 * D %=M \ D ans = 0.9474 -0.5750 0.4472 -0.3146 0.0500 0.7389 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 Tablou de întregi signed (int) şi unsigned (uint) O valoare ocupă 8, 16, 32 resp. 64 biţi în memorie tip data ce valori poate conţine:

Întreg: int8, uint8, int16, uint16, int32, uint32, int64, uint64

uint16(65000) ( conversie la uint16 )

int8 uint8 int16

uint16 int64

[de la -128 la 127] [de la 0 la 255] [-32768 la 32767] [ 0 la 65535] [ -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

Page 15: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

15

(4 octeţi)

single(5+6i) %conversie 16->8oct

memoriei: mai puţină decât tipul double având mai mică precizie şi domeniu de valori mai îngust. 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 (tip implicit) (8 octeţi)

3.4 * 10^300 5 + 6i [1 2; 3 4.1]

Tablou de numere în dublă precizie (este tipul implicit de dată). Tablourile 2D pot fi de tip sparse. Domeniul: -1.79769e+308 to -2.22507e-308 şi

2.22507e-308 to 1.79769e+308 Spaţierea(eps): 2.2204e-016 aprox (=2^-52)

Logical (1 octet)

x = [true, true, false, 1]; >> magic(2) => ans = 1 3 4 2 >> magic(2) > 2 ans = 0 1 1 0

Există două valori logice: 1 (true) şi 0 (false). Orice valoare diferită de 0 este considerată true (1) >> true & [0 1 4 -4 false true] ans = 0 1 1 1 0 1 Tablourile 2D de valori logice pot fi sparse (rare).

Char (2 octeţi/ caracter)

'Dati val. pt. vector: ' mesaj='Hello' >> mesaj(2:4) ans = ell length('Dati val. pt. vector: ') ans = 22

Tablou de tip caracter (sau şir de caractere–string); - fiecare caracter se memo. pe 16 biţi (2oct) lungime. Tablou de caractere. Şirurile sunt reprezentate ca vectori de caractere. Pentru tablouri ce conţin mai mult de un şir se preferă folosirea tipului cell arrays.

Structure str.numar = 124; str.color = 'alb'; str.matr = magic(3); str.logic=[true]; prin “.” se refera câmpul str(2).numar = -17;

Structura este un set de câmpuri; fiecare câmp are nume propriu (numar, color, matr, logic) şi memorează orice tip de dată. Structura are nume ex:”str” . O structură singulară este un tablou 1 x 1 de 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; a{1,2} = 'Red'; a{1,3} = magic(4); a{2,3}='a' b={5, 'e', [1 2;3 4]}

Tablou de celule indexate. Fiecare celulă poate memora un tablou de orice tip sau mărime. Celulele tabloului se referă prin acolade : ex: a{1,1} este tablou 1x1 de double, a{1,2}->tablou 1x3 caractere, a{1,3} -> matrice 4x4 cell2={12, 'asdf', [1 2;3 4]; 1:3,[],'aa'} (alt exemplu)

Function handle

ra2=@sqrt struct(2).a1=@sin cell2{4,1}=@cos

Pointer la o funcţie. Câmpul a1 al structurii struct memorează pointer la 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)

Page 16: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

16

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=

8 1 6 %=sume pe coloane= 3 5 7 %=suma pe DP si DS =15 4 9 2

>> d >= 5 ans = 1 0 1 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{1} ans = Marius Giurgiu cell_array1{1}(1) ans => M

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

Page 17: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

17

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)

Page 18: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

18

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.

[2 3] .* [10 20] -> [20 60] ' Transpusa + conjugate complexe a numerelor

complexe din matrice (dacă există) ./ Împărţire la dreapta: 1 ./ [1 2 3]

1.0000 0.5000 0.3333 >>[1 2] . / [2 3] 0.5000 0.6667

.' Transpusa fără conjugata complexă a numerelor complexe

.\ Împărţire la stânga: 2 .\ [1 2 3] 0.5000 1.0000 1.5000

* Înmulţire matriceală (| înm. două numere) 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

Page 19: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

19

*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) ans = 1

» pi ~= 3.14 ans = 1

» A = [2 7 6; 9 0 5; 3 0.5 6]; » B = [8 7 0; 3 2 5; 4 -1 7];

» A == B ans = 0 1 0 0 0 1 0 0 0

Rezultatele comparaţiilor sunt valori de tip logic: 0 sau 1

» A >= B 0 1 1 1 0 1 0 1 0

*Operatori logici & AND (ŞI) | OR (SAU) ~ NOT (Negatie)

1 & 1 -> 1 0 & 1 -> 0 1 & 0 -> 0 0 & 0 -> 0

1 I 1 -> 1 0 I 1 -> 1 1 I 0 -> 1 0 I 0 -> 0

XOR(0, 0) -> 0 XOR(0, 1) -> 1 XOR(1, 0) -> 1 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];

>> u | 0 v = 5 6 -1 0 0 7

>> v & 4

Page 20: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

20

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( ) or( )

Identic cu & Identic cu |

xor( ) Realizează sau exclusiv. Returnează logic adevărat dacă unul din operanzi este adevărat şi celălalt fals. În termeni numerici, returnează 1 dacă un operand este nenul şi celălalt este zero.

» a = 1; » b = 1; » xor(a,b) ans = 0

all( ) Parametrul este vector: returnează 1 dacă toate elementelevectorului sunt adevărate sau nenule (true). Parametrul este matrice (all() acţionează pe coloane):

» u = [0 1 2 0]; » all(u) ans = 0

» A = [0 1 2; …

9. 5 0]; » all(A) ans = 0 1 0

any( ) Parametrul vector: returnează 1 dacă cel puţin unul dintre elementele argumentului este adevărat (nenul); în caz contrar returnează 0. Parametrul matrice (any() acţionează pe coloane)

» v = [5 0 8]; » any(v) ans = 1 >> any([5 0 8 ; …

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,ζ)=…:

% unde r şi ζ iau următoarele valori: r=0 : 0.005 : 2.5 şi ζ=[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) );

2222

22

4)1(41),(

rrrrAζ

ζζ+−

+=

Page 21: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

21

plot(r,A) % transmisibilitate forţă asupra masei la suport fix

La numărător: prin ze*r se înmulţeşte: o matrice ze coloană (5 x 1) (‘ transpune) cu o matrice r linie (1 x 501) ; apoi se ridică la pătrat fiecare element din matrice.

>> ze=[0.03 0.05 0.1 0.20 0.50]' ze = 0.0300 0.0500 0.1000 0.2000 0.5000 >> r=0 : 0.005 : 0.03 r = 0 0.005 0.010 0.015 0.020 0.025 0.030

>> ze * r ans = 0 0.0001 0.0003 0.0004 0.0006 0.0007 0.0009 0 0.0003 0.0005 0.0008 0.0010 0.0013 0.0015 0 0.0005 0.0010 0.0015 0.0020 0.0025 0.0030 0 0.0010 0.0020 0.0030 0.0040 0.0050 0.0060 0 0.0025 0.0050 0.0075 0.0100 0.0125 0.0150

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

224 rζ 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)) ans = 1 1 1 1 1

>> [1 1 1]' * [4 5 6 7 8] ans =

4 5 6 7 8 4 5 6 7 8 4 5 6 7 8

ones(size(ze))*(1-r.*r).^2 Sunt generate 5 linii identice care vor fi adunate cu matricea (2*ze*r).^2 (în care fiecare linie (r) se înmulţeşte cu un alt zeta) ze*r => matrice 5x501 A => matrice 5x501 plot(r,A) => 5 curbe, pentru abscisa (vectorul) r se trasează fiecare linie din matricea X.

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

50155015

5015

......

..................

......

......

xx

xA

+

=

Page 22: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

22

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 if a>b disp('a>b') elseif a<b disp('a<b') else %a==b disp('egalitate') end

% se citesc 2 şiruri de caractere si se compară lungimile sir1=input('sir1= ','s'); sir2=input('sir2= ','s'); if length(sir1) > length(sir2) fprintf('sir1: %s are mai multe caractere\n',sir1); else 'sir2 are car. mai multe sau este egal cu sir1' 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? if a<-20 disp('a<-20') % afisaza tablou caractere elseif a<-10 disp('-20 <= a <-10') elseif a<0 disp('-10 <= a <0') elseif a<10 disp( '0<=a<10') else disp('a>=10') end

% else poate lipsi %test valoare a(2) a=input('dati valori vector a='); if a(2)<-5 | a(2)>5 disp(‘a(2)<-5 sau a(2)>5') elseif a(2)<0 disp('a(2)apartine [-5 0)’) end % pt. a(2) intre [0 si 5] nu se afiseaza mesaj

4. 2.switch, case … otherwise

Page 23: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

23

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 % singur caz prin folosirea acoladelor { } (cell array). var=input('var= '); switch var+1-1 % expresie case 1 disp('1'); case {2,3,4} disp('var este 2 sau 3 sau 4'); case 7 disp('7') otherwise disp('altã valoare'); end

% exemplul 2 switch var1 case -1 disp('minus unu'); case 0 disp('zero'); case 1 disp('unu, pozitiv'); otherwise disp('alta valoare'); 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:

Page 24: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

24

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) for n = 2 : 6 x(n) = 2 * x(n - 1); end % rezulta: 1 2 4 8 16 32

% pas=2 for k=1:2:n . . . end

n=100; %increment <0 for k=n:-1:1 . . . end

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

Page 25: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

25

∑ −===

n

inx iXVAR1

212 )][( µσ

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

Cod echivalent prin vectorizare: x=1:.1:10; y=sin(x); plot(x,y '-*') ----------- x=-5:0.1:25; y=x+sin(x); plot(x,y)

Calcul VARIANŢA:

% 1.Ciclul for x=[1 2 3 4] miu = sum(x)/length(x); %media suma=0; for i=1:length(x) suma=suma +(x(i)-miu)^2 end variance1=suma/length(x); % variance1 -> 1.25

% 2.Vectorizare miu = sum(x)/length(x); variance2=sum(( x-miu).^2)/length(x); sau: …sum((x-miu).*(x-miu))… sau: (x-miu)*(x-miu)’

Calcule cu matrice %Numărare elemente ai pozitive din vector a=input(`Tastati sir numeric= `); %exemplu [5 -3 1 -9 4 1]contor=0; for i=1:length(a) if a(i)>0 contor=contor+1 end end display(contor) ---------------------------

Suma elementelor aij de pe DP (i = j) folosind un ciclu for a= [2 -1 3; ... -9 4 1; ... 2 2 2] sum=0; nc= length(a(1,:)) %lin 1 şi toate coloanele for i=1:nc sum=sum + a(i,i); fprintf('i=%d j=%d a=%.3f\n',i,i,a(i,i)); 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)

Page 26: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

26

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

Produsul a două matrice a şi b

Dacă A este matrice: all(A) %AND pe fiecare coloană all(all(A)) AND pe col. apoi AND pe unica linie

a=input('matricea a='); 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 end display(c) if all(all(a*b == c)) %verificare '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

i=-2; while i<7 i=i+1; end i

%suma elementelor x(2)… x(5)din sirul x x=-3:7; suma=0; i=2; while i<=5 suma=suma+x(i); i=i+1;

Page 27: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

27

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:

x=6:-1:1; %sau x=[6 5 4 3 2 1]; suma=0; %initializam variabila suma i=1; %initializam „indicele” i n_e= length(x) while i <= n_e suma=suma + x(i)^2; i=i+1; %indicele incrementeaza end suma

%instructiune while in corpul while

m=input('linii m= '); n=input('coloane n= '); i=1; while i<=m %se repeta de m ori j=1; while j<=n %se repeta de m x n ori A(i,j) = 1/(i + j - 1); j=j+1; 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: 1

12ϕjelcup =

2. vector =vect precedent+vec lungime l2 şi unghi φ2: 2

223ϕjelcupcup +=

3. Vector de poziţie sarcină (varf) 3

33var ϕjelcupf += 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

Page 28: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

28

%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

Page 29: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

29

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 cu instrucţiunea switch-case ... for i=1:length(x) switch x(i)

Exemplul rescris folosind numai instrucţiunea if ... for i=1:length(x) if x(i)==1 v1=v1+1;

Page 30: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

30

case 1 v1=v1+1; case 2 v2=v2+1; case 3 v3=v3+1; otherwise v=v+1; end end …

end if x(i)==1 v2=v2+1; end if x(i)==3 v3=v3+1; end if (x(i)~=1 & x(i)~=2 & x(i)~=3) v=v+1; 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) % AVERAGE media elementelor vectorului y = sum(x) / length(x); end

x = parametrul de intrare este vector y = parametrul de ieşire este scalar Funcţia average este salvată în fişierul average.m

APELURI valide ale funcţiei:

Page 31: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

31

∑ −==

n

in meaniXstdev

1

21 )2][(

v=[1 2 3 -3 5]; ave=average(v)

v=[1 2 3 -3 5]; average(v) ans = 1.6000

average( [1 2 3 -3 5] ) ans = 1.6000

2) 2 parametri de intrare şi un (1) parametru de ieşire function z=xplusy(x, y); z=x+y; end

x,y doi parametri de intrare z un parametru de ieşire

Se salvează definiţia funcţiei într-un fisier cu numele xplusy.m APELURI valide ale funcţiei:

a=1 b=2 scal1=xplusy(a,b)

a=[1 2 3; 3 4 5] b=[7 8 9; 2 0 4] matr1=xplusy(a,b)

a=7 b=[7 8 9; 2 0 4] 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) fprintf('Nr par. actuali=%d\n',nargin) if nargin < 4 b=1; end if nargin < 3 a=1; end z=(x+y)*a*b; end

% se poate apela funcţia cu 2, 3 sau 4 parametri nargin conţine nr. de param. actuali folosiţi la apel Dacă nargin<4 se atribuie param. neglijat val. b=1 Dacă nargin<3 se atribuie param. neglijat val. a=1 Pentru param. >4 sau <2 => eroare

Apeluri valide: >> xplusy2(3,5) ans = 8 >> xplusy2(3,5,1) ans = 8

>> xplusy2(3,5,2) ans = 16 >> xplusy2(3,5,2,4) ans = 64

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

function compar(a,b) if a>b 'a>b' elseif a<b 'a<b' else %a==b 'egalitate' end

a,b parametri intrare; nu exista parametri de ieşire Salvăm definiţia în fişierul compar.m APELURI: >>compar(4,6) *Rezultatele sunt tiparite din functie

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]) Parametrii locali ai functiei

Page 32: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

32

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) i=1; while i < in x(i)=rand(1); if x(i)>0.95 'se executa break' break; % intrerupe ciclul while end i=i+1; end out=x; %salvare x in out i display('exemplu cu break') end %incheiere functie cu end optional

function out=fun_demo2(in) i=1; while i < in x(i)=rand(1); if x(i)>0.95 out=x; %salvam x in out i 'se executa return' return; %iesire din functie end i=i+1; end out=x; %salvare x in out display('exemplu cu return') i

Apel: a=fun_demo1(1.e2); Dacă x(i)>0.95 True, iese din ciclu, salvează x in out si iese din functie Altfel executa 1.e2 cicluri, salveaza x in out si iese

Apel: b=fun_demo2(1.e2); Dacă x(i)>0.95 True, salveaza x in out si iese din functie 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 y=x+sin(x)+x.^2; end

Ex1: un argument: x fun_ex=inline( 'x+sin(x)+x.^2' ); %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])

Page 33: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

33

c) Ex2: inline cu mai multe argumente: a, om, t

exp_comp=inline ( ’a*exp(j*om .* t)’ ) % tjea ω⋅ 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

% )]sin()[cos( tjtaea tj ωωω +=⋅

>> 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; b=2; c=5; re=fun_1(a,b,c);

functie y=fun_1(pa,pb,pc) …. y=pa+pb+pc; %variabile locale

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; b=2; global vgC; vgC=55; re=fun_2(a,b);

functie y=fun_2(pa,pb) …. global vgC; ….. 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

Page 34: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

34

- 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) y=sin(x)+x; end

function [y]=g(x) y=x*cos(x); end

function [F]=arie(pf1,a,b,n) F=pf1(a)+ pf1(b); ... %calcul arie intre a şi b end

In corpul funcţiei arie se apelează sub numele formal pf1 funcţia dorită = funcţia trimisă prin parametri actuali @f sau @g şi pentru aceasta se 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) a=1; b=2; n=10; rezultat1=arie( @f, a, b, n); rezultat2=arie( @g, a, b, n+100); disp(rezultat1); disp(rezultat2);

Obs: pf1 este parametru formal din def. functiei arie

@f, @g parametri actuali = =adrese de funcţii la apel funcţie arie

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))

Page 35: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

35

ze=0.04; r=0 : .01 : 3; 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

0 0.5 1 1.5 2 2.5 3-8

-6

-4

-2

0

2

4

6

8

0 0.5 1 1.5 2 2.5 3-14

-12

-10

-8

-6

-4

-2

0

0 0.5 1 1.5 2 2.5 3-15

-10

-5

0

5

10

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:

t2

+t+t2

=f(t) 00 04cos5.1cos3cos1 ω

ωω⋅

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);

r2j+r-11=A 2c ζ

Page 36: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

36

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); stairs(x, y) stem

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);

Page 37: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

37

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

Page 38: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

38

x=input('vector x= '); for i=1 : length(x) fprintf('element x(%3d)=%12.3f\n', i, x(i) ); fprintf('element x(%3d)=%12.3e\n', i, x(i) ); fprintf('element x(%3d)=%12.3g\n\n', i, x(i) ); end % s-a folosit \n pentru trecerea cursorului pe randul urmator la inceput după fiecare execuţie a funcţiei fprintf vector x= [1.01 0.00002] % s-a citit element x( 1)= 1.010 %f element x( 1)= 1.010e+000 %e element x( 1)= 1.01 %g 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.

Folosim descriptori de format: %d pentru tipărire valori întregi cu semn (decimal) %s pt. tipărire şiruri de caractere (string) %f pentru tipărire valori reale (float) %12.3f valoarea reală se tipăreşte într-un spaţiu de 12 caractere dintre care 3 sunt alocate zecimalelor iar restul punctului zecimal şi părţii întregi. %e tipărire format exponential %g mai compact decât %f sau %e şi fără 0 inutil

Î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

(scrie) la inceputul liniei următoare \t Tab (sare la dreapta un număr de

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

Page 39: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

39

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= '); 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 fişier fisdate.dat:

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

Conţinut cu Wordpad:

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

Val = VecArg .^ 2 + 2*VecArg + 3

Val = 1.0e+004 * 0.0003 0.0003 0.0123 0.0125 1.0002

VArg= 2: 0.5 : 4;

Val2= VArg .^ 2 +2 *VArg + 3

Val2 = 11.0000 14.2500 18.0000 22.2500 27.0000

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.

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

Evaluarea polinomului folosind VECTORUL coeficienţilor:

Page 40: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

40

p1=[1 2 3] ; %vector coeficienţi x=[-18: .2 : 22]; %vector abscise

y=polyval(p1,x);

plot(x, y, 'linewidth', 2.6);

Funcţia polyval evaluează un polinom (dat prin coeficienţii 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]; >> p_suma=p1+ p2 p_suma = 1 5 7

32)(1 2 ++= xxxp

43)(2 += xxp

)(2)(1)( xpxpxpsum +=

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

)1)(32()( 2 −++= xxxxprod 1

322)(

−++= x

xxximp

Exemplu Matlab: p1=[1 2 3]; p2=[1 -1]; prod=conv(p1, p2) prod = → 1 1 1 -3 [cat, rest]=deconv(prod, p2) cat = → 1 2 3 rest = → 0 0 0 0 [cat, rest]=deconv(prod, p1) cat = → 1 -1 rest = → 0 0 0 0

1322

)(−

++= xxxximp

[cat rest]=deconv([1 2 3], [1 -1])

cat = → 1 3 rest = → 0 0 6 p1_ini = conv(cat, [1 -1]) + rest

p1_ini = → 1 2 3

Înmulţirea a două polinoame date prin vectorii coeficienţilor: Comparaţi coeficienţii obţinuţi prin programul scris şi prin apelul funcţiei conv() - gradul polinoamelor p1,p2 scrise prin coeficienţi este:

length(p1)-1 respectiv length(p2)-1;

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

Să se calculeze determinantul matricei B:

=

4+2x+x52+x

2+x6+3x+x10B

2

2

Se înmulţesc polinoame şi se scad: ( pe DiagSecund se adaugă 0 pt. gradul superior) detB=conv([10 3 6], [5 2 4]) - conv([0 1 2],[0 1 2] ); 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)

Page 41: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

41

Opţional: Să se reprezinte grafic funcţia:

22

21

22

22

))(()(

kk+kwmk+kwmk+kwmwF

2132

32

−+−+−+−

=

pentru coeficienţii: k1=244.5; k2=244.5; k3=244.5; m1=1; m2=1; in intervalul: w=10 : 0.01 : 30;

14 16 18 20 22 24 26 28

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

% k1=2; k2=2; k3=4; m1=5; m2=10 detB=conv([-m2 0 k2+k3] , [-m1 0 k1+k2]) - [0 0 0 0 k2^2]; pZerouri=[-m2 0 k2+k3]; w=10:0.01:30;

FRF11=polyval(pZerouri,w) . / polyval(detB,w);

plot(w,FRF11, 'linewidth',1.7); grid on; zoom; z1=roots(pZerouri); f_z1=z1/(2*pi) % rad/s respectiv Hz r12=roots(detB); f_r12=r12/(2*pi) * 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) ):

1214)( 3

2

++++

=xxxxsG

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) pzmap([1 4 1],[1 0 2 1]) sau: [p z]=pzmap([1 4 1],[1 0 2 1]) %salvare în p, z , fără reprezentare grafică

-cu cerculeţ ○ sunt notate rădăcinile polinomului de la numărător “zerouri” - cu x sunt notate rădăcinile de la numitor “polii’.

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.

)(... )()(

)2()2(

)1()1(

)()( xknpx

nrpx

rpx

rxBxA ++++= −−−

Page 42: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

42

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 G=num/den : >> [r, p, k]=residue(num,den) 12

14)( 3

2

++++

=xxxxsG

num=[1 4 1]; den=[1 0 2 1];

Sirul reziduurilor r(1), r(2), r(3): r = 0.6162 – 1.2316i 0.6162 + 1.2316i -0.2324 Obs: 2 reziduuri complex con. + 1 real

Sirul polilor p(1), p(2), p(3): p = 0.2267 + 1.4677i 0.2267 – 1.4677i -0.4534 Obs: 2 poli complex conjugaţi + 1 real

Rest: k = [ ]

-0.4534)( 0.2324-

1.4677i) 0.2267(1.2316i 0.6162

1.4677i) 0.2267(1.2316i - 0.6162

)3()3(

)2()2(

)1()1(

1214

)()(

3

2

−−−+

+−−−−

++++

++=++=

==

xxxpxr

pxr

pxr

xxxx

xBxA

Diagrame Nyquist şi Bode Nyquist([1 4 1],[1 0 2 1])

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

-4

-2

0

2

4

6Nyquist Diagram

Real Axis

Imag

inar

y A

xis

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

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

Page 43: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

43

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) X = 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 Y = 6 6 6 6 6 8 8 8 8 8 10 10 10 10 10

Domeniu dreptunghiular: -primul vector 0:4 generează matricea X - liniile sunt identice şi conţin valorile vectorului 0:4 pe axa x -atâtea linii câte valori sunt în vectorul 6:2:10 (direcţia oy). -al doilea vector 6:2:10 generează matricea Y -coloanele sunt identice şi conţin valorile vect. 6:2:10 pe axa y -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 = 3 4 5 6 3 4 5 6 3 4 5 6 3 4 5 6 Y = 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6

Domeniul este pătrat. Perechile de puncte din plan sunt de forma ( X(i,j), Y(i,j) ): (3,3), (4,3), (5,3), (6,3), (3,4), (4,4) etc.

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):

Page 44: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

44

( ) 2222 /sin yxyxz ++=

sau: z=sin(ra)/ra, unde ra= 22 yx + . (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);

Page 45: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

45

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

syms f g y g1 g2 ;

whos % afisare tip variabile Name Size Bytes Class Attributes

f 1x1 126 sym g 1x1 126 sym . . . . . .

%defineşte un singur obiect simbolic x = sym('x') x = x

Derivare cu funcţia diff(): dxdf

, derivare ordin 1, 2, 3: 3

3

2

2

,,dx

fddx

fddxdf

syms x f0=3*x^3+5*x^2-6*x+2 % definire f0 pretty(f0) % vizualizare f0 3 2 3 x + 5 x - 6 x + 2 diff(f0) ans = 9*x^2+10*x-6 -------------------------------------------------------- >>f1 = 2*x^2*exp(3*x) % definire f1 >> diff(f1) ans = > 4*x*exp(3*x) + 6*x^2*exp(3*x) -------------------------------------------------------- Derivare, integrare >> diff(log(x)) % log= logaritm natural ans = 1/x >> int(1/x)

% defineste expresia f f= 12 + (x-1)*(x-1)*(x-2)*(x-3) f = 12+(x-1)^2*(x-2)*(x-3) diff(f) % prima derivata ans = 2*(x-1)*(x-2)*(x-3) + (x-1)^2*(x-3) + (x-1)^2*(x-2) diff(f, x, 2) % derivată de ordin 2 ans = 2*(x-2)*(x-3)+4*(x-1)*(x-3)+4*(x-1)*(x-2)+2*(x-1)^2 diff(f, x, 3) % derivată de ordin 3 ans = 24*x-42

Page 46: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

46

ans = log(x)

Derivare funcţii trigonometrice: >> diff(sin(5*x)) ans = 5*cos(5*x)

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

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

>> diff(exp(x) * cos(x)) ans = 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 = (2*x^2+3*x-1) / (x^2-x+3) fp=diff( RapPol ) => fp = (4*x+3)/(x^2-x+3) - (2*x^2+3*x-1)/(x^2-x+3)^2*(2*x-1) pretty(fp) 2 4 x + 3 (2 x + 3 x - 1) (2 x - 1) ---------- - -------------------------- → 2 2 2 x - x + 3 (x - x + 3)

fps=simplify(fp), - -> fps = -(5*x^2-14*x-8)/(x^2-x+3)^2 pretty(fps) 2 5 x - 14 x - 8 sau: - --------------- 2 2 (x - x + 3)

Derivate parţiale: Matrice Jacobiana: syms g1 g2 x y ; g1= 20*x^3 +15*y -30 ; g2 = 0.25*x + y -1; % g1,g2 pot avea derivate partiale diff(g1, x) % derivata parţială ans = 60*x^2

diff(g1, y) ans = 15

% Calcul matrice Jacobiană=derivatele parţiale ale vectorului [g1; g2] % în raport cu variabilele independente x şi y

),()2,1(

yxgg

J∂

∂=

J = jacobian([g1; g2], [x y]) % calcul Jacobian J = [ 60*x^2, 15] [ 1/4, 1 ]

Sau: jacobian([g1 g2], [x y]) sau: jacobian([g1; g2], [x; y])

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

Page 47: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

47

syms x f1 f2; % polinom; ecu. polinom. cu solutii simetrice fată de oy: f1=(x-2.16)*(x-12.7)*(x-38.3) * ... (x+2.16)*(x+12.7)*(x+38.3) subplot(211) ezplot(f1, [-40,40]) ; line([-40 40] , [0 0] , 'Color','r'); f2= (x-1)*(x-1)*(x-2)*(x-3)+4 subplot(212) ezplot(f2) % easy plot -2 pi < x < 2 pi ezplot(f2, [0,4]) % graficul fun. f pentru 0 <= x <= 4 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]);

-40 -20 0 20 40

-4

-3

-2

-1

0

1

2

3

x 108

x

(x-54/25) (x-127/10) (x-383/10) (x+54/25) (x+127/10) (x+383/10)

0 1 2 3 4

4

6

8

10

12

14

x

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

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;

f = x^2*y + 5*x*sqrt(y) subs(f, x, 3) ans = 9*y+15*y^(1/2)

subs(f, y, 3) ans = 3*x^2+5*x*3^(1/2)

>>aa=subs(f, x, x^2+y) ans = (x^2+y)^2*y + 5*(x^2+y)*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; g12 = [g1; g2]

% evaluare g12 pentru x = 1, y = 2.5

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') x12 = -1/2*( b - (b^2-4*a*c)^(1/2) )/a -1/2*( b + (b^2-4*a*c)^(1/2) )/a →

pretty(x12) [ 2 1/2 ] [ b – (b - 4 a c) ] [- 1/2 ------------------- ] [ a ] [ ] [ 2 1/2 ] [ b + (b - 4 a c) ] [- 1/2 ------------------- ]

Page 48: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

48

[ 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) % ex. suport vibratii ans = -1/(1-2*ze^2)^(1/2) 1/(1-2*ze^2)^(1/2) pretty(1/(1-2*ze^2)^(1/2))

>> solve('1-r^2+2*ze^2*r^2', ze) ans =

1/2*(-2+2*r^2)^(1/2)/r

-1/2*(-2+2*r^2)^(1/2)/r

Soluţii numerice: Expresie matriceală (se reia exemplul cu polyval): syms w; M=[5 0;0 10]; K=[4 -2;-2 6]; detB=det(eval(K-w^2*M)) detB = 20-70*w^2+50*w^4

solve(detB) %sau: 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)

% solutii numerice [sx sy] = solve(' x + y = 1 ' , ' x - 11*y = 5 ') sx = 4/3 sy = -1/3

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

Page 49: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

49

Funcţia int() Integrare simbolică syms x fin =2*x^2 >> int(fin) ans = 2/3*x^3

>> int(1/x) ans = log(x)

>> int(tan(x)) ans = -log(cos(x)) 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 >> f1 = 3*a*b+2*a*exp(a*x+b)

» int(f1, x) % integrare simbolica f1 în raport cu x ans = 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; M=[m1 0; 0 m2]; inv(M) %matrice diagonală ans = [ 1/m1, 0] [ 0, 1/m2]

syms a b c d A; A=[a b; c d]; pretty(inv(A)) [ d b ] [ --------- - --------- ] [ a d - b c a d - b c] [ ] [ c a ] [- --------- --------- ] [ a d - b c a d - b c ] det(A) ans = a*d - b*c

%Matrice coloana * matrice linie [a; b]2x1 * [c d]1x2 ans = [ a*c, a*d] [ b*c, b*d]

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

>> expand( cos(2*a) ) ans = 2*cos(a)^2 - 1 etc.

Limite: dx

xfdxxfxfdx

)()(lim)(0

−+=

→ = definiţia derivatei

dxxdxx

dx

)cos()cos(lim0

−+→

→ -sin(x)

Page 50: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

50

>> syms x, dx >> limit( (cos(x+dx)-cos(x) )/dx, dx, 0) ans = -sin(x)

sau: >> diff(cos(x)) ans = - sin(x)

dxxdxx

dx

)sin()sin(lim0

−+→

→ cos(x)

>> limit( (sin(x+dx) - sin(x) )/dx, dx, 0) ans = cos(x)

sau: >> diff(sin(x)) ans = cos(x)

enn

n

=→

+

→)1exp(11

inflim

>> limit( (1+1/n)^n, n, inf ) ans = exp(1) >> exp(1) ans = 2.7183

xn

exnx

n=→

+

→)exp(1

inflim

>> limit( (1+x/n)^n, n, inf ) ans = exp(x)

Dezvoltare în serie de funcţii Taylor Serie MacLaurin

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: (x)j+(x)=e jx sincos ⋅ (x)j-(x)=e-jx sincos ⋅ 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:

nn

nRx

n!xfx

!xf+x

!xf+x

!xfxf=xxf ++++

)(3

)(2

)(1

)()()( 0)(

30'''

20''

0'

00

nn

nRx

n!fx

!f+x

!f+x

!ff=xf ++++

)0(3

)0(2

)0(1

)0()0()0()(

3'''

2'''

Page 51: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

51

1)!+(2nx)(-1=(x)

12n+n

0=n∑∞

sin n0=nT∑=

∞ =>

)+2n)+(2nxT=T

2

nn 3(21−⋅+

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 2.1. Inversare matrice: A=[3 -1 0;-2 1 1;2 -1 4] B=[5 0 15].' sau B=[5; 0; 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; -2 1 1; 2 -1 4] B=[5 0 15]'

X=A^(-1)*B; X= ... %calcul direct A1=[5 -1 0; % Cramer 0 1 1; 15 -1 4] x1=det(A1)/det(A)

A3=[3 -1 5; -2 1 0; 2 -1 15]; 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

=+−=++−

=−

153421203212

5213

xxxxxx

xx

Page 52: Cursuri 1,2,3,4,5,6,7

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

52

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

tjea ω⋅