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 multiinputmultioutput MIMO cu incertitudini, Signal Processing toolbox - procesarea semnalelor, Spline toolbox – curbe spline, Statistics toolbox – funcţii statistice, Symbolic Math - calcule simbolice, System identification toolbox – identificarea sistemelor, Virtual reality toolbox – realitate virtuală, Wavelet toolbox – funcţii pentru reconstrucţia semnalelor, etc.
1 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
Sistemul MATLAB conţine: 1.Limbajul
MATLAB, 2.Mediul de lucru MATLAB, 3.Handle Graphics®, 4.Biblioteca de funcţii matematice, 5.Interfaţa de aplicaţii program a MATLAB-ului (API)
1.Limbajul MATLAB: - un limbaj de nivel înalt (gen.4), tipul de bază este matricea, există instrucţiuni de control, funcţii, structuri de date, intrări/ieşiri; permite programare orientată pe obiecte. Facilităţile de programare sunt organizate pe 6 directoare din …toolbox/matlab/ all(), any, xor, or, transpose sau .’, ops Operators and special characters. ctranspose (‘), ldivide sau .\ , rdivide sau ./ … lang Programming language constructs. if, for, while, case, function, persistent … strfun
Character strings.
char, ischar, strcat …
iofun
File input/output.
input, fscanf, fprintf, fopen, fseek …
timefun
Time and dates.
clock, date …
datatypes
Data types and structures.
cell, class, int8, double, logical, struct …
2.Mediul de lucru MATLAB: set de facilităţi care permit manevrarea variabilelor în spaţiul de lucru, importul/exportul de date, dezvoltarea, manipularea, editarea şi depanarea fişierelor MATLAB (.m) şi a aplicaţiilor MATLAB. Aceste facilităţi sunt în dir. general din toolbox/matlab/: beep, delete, dir, rmdir, dos, echo, exit, import, general General purpose commands. load, who, whos, ver, save, quit etc. 3.Handle Graphics® Reprezintă sistemul grafic al MATLAB-ului. Cuprinde comenzi de înalt nivel pentru vizualizarea datelor bi şi tri-dimensionale, procesarea imaginilor, animaţie, prezentări grafice. Permite de asemenea utilizarea unor comenzi de nivel scăzut pentru crearea unor interfeţe grafice GUI. Funcţiile grafice sunt organizate în 5 directoare din …toolbox/matlab/: graph2d
Two-dimensional graphs:
plot, grid, polar, subplot etc.
graph3d
Three-dimensional graphs:
plot3, surf, mesh, zlabel etc.
Specgraph
Specialized graphs: bar, bar3, stem, comet3, ezplot, voronoi etc.
graphics uitools
Handle Graphics: figure, hold, print, line, rectangle etc. Graphical user interface tools: menu etc.
2 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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: isempty(x),zeros(3)
elmat
Elementary matrices and matrix manipulation.
elfun
Elementary math functions.
specfun
Specialized math functions.
abs(),sin(),tan,sinh,exp, log, log2, log10, imag,real 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 clickand-drag realizate cu mouse-ul. Astfel, trasarea diagramelor este simplă şi intuitivă, aproape la fel de simplă ca trasarea acestor diagrame direct pe hârtie. În plus, se evită formularea matematică laborioasă (sistemele dinamice sunt de regulă descrise de ecuaţii diferenţiale). Real-time Workshop® este un program care permite generarea de cod C pentru schemele bloc create în SIMULINK şi astfel permite rularea de aplicaţii în timp real. 2. MEDIUL DE LUCRU MATLAB ¾ Lansare sub Windows: “shortcut” la programul executabil La pornire, MATLAB-ul execută automat fişierele: matlabrc.m rezervat pentru administratorul de sistem şi startup.m. (în directorul local) este destinat utilizatorilor; se pot defini setările implicite pentru instrumentele Handle Graphics şi se pot predefini variabile în spaţiul de lucru.
3 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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 previous line - comanda precedenta sau: Ctrl-p sau: Ctrl-n Ştergerea ferestrei de comandă:>> clc
next line – comanda urmatoare tastata % , 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 format long 15 zecimale: π: 3.141592653589793 etc.
sau
Suprimarea afişării rezultatelor unei linii comandă - dacă încheiem linia de comandă cu punct şi virgulă “;” rezultatele nu sunt afişate la ecran. Exemplu: >> magic(3) % fara ; ans = 8 1 6 3 5 7 4 9 2 A = magic(3);
4 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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: >> A = [1 2 3-2i; ... s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 . . . 4 5 6 ; ... - 1/8 + 1/9 - 1/10 + 1/11 - 1/12; 7 8 9]
Fereastra de comandă permite rularea comenzilor MATLAB, lansarea unor instrumente cum ar fi Editor/Debugger şi permite startarea toolbox-urilor.
Spaţiul de lucru (workspace) al MATLAB-ului -conţine setul de variabile (vectori, matrice, structuri, cells etc.) alocate în memorie şi pot fi editate din linia de comandă. comenzile >> who şi whos (mai detaliat) listează variabilele curente din workspace. comanda >> clear % ştergerea variabilelor din workspace >>clear v1 % şterge variabila v1 >>clear v* % şterge variabilele care încep cu caracterul v Citirea sau scrierea unor fişiere .mat (fişiere de date Matlab) din programe externe în C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API). Încărcarea şi salvarea din workspace Comenzile save şi load: - au rolul de a salva variabilele din spaţiul de lucru şi respectiv de a le reîncărca într-o sesiune ulterioară; aceste comenzi se pot folosi şi pentru a importa şi exporta date. Pe platformele Windows, operaţiile save, load sunt disponibile şi prin selectarea opţiunilor Save Workspace As, respectiv Load Workspace din meniul File. Formatul în care comanda save stochează datele poate fi controlat prin adăugarea unor flaguri (opţiuni) în lista de nume de fişiere sau variabile: -mat
Utilizează formatul binar tip .MAT (implicit).
-ascii -ascii -double
Utilizează formatul ASCII pe 8 digiţi. 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: 1234 2345 » load date.dat
%incarca şi creaza variabila matrice [1 2 3 4; 2 3 4 5]
creează o variabilă cu numele date în workspace. 5 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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 %salveaza variabilele var1 şi var2 în myfile.dat
» save('myfile','VAR1','VAR2') » 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. >> tan(pi/4)^-1 >> 1/3 >> e1=exp(1) >> sqrt(2) ans = e1 = ans = ans = 1.0000 2.7183 1.4142 0.3333 Expresia = înşiruire de operanzi şi operatori; 6 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
operanzii: nume de variabile, constante, nume (sau apel) de funcţii, operatorii: +, *, .*, ^, .^ etc. >> 4 * sin(pi/6) / sqrt(2) + 3^2 - exp(2) * tan(pi/4) ans = 3.0252 Matlab lucrează în mod linie având la bază un interpretor (şi nu compilator). Fiecare instrucţiune pe rând este trimisă interpretorului şi evaluată. 3.3. O variabilă MATLAB este: - un nume care se asignează (asociază) unei zone de memorie unde sunt stocate valori. - prin nume citim/scriem valoarea din/în memorie şi folosim valoarea în expresii. - de trei tipuri de variabile dispune Matlab: locale, globale şi persistente(locale funcţiei, nu se şterg la ieşire, valoarea lor este reţinută şi regăsită la un nou apel al aceleaşi funcţii). MATLAB-ul NU necesită declararea dimensiunii variabilelor, deoarece la întâlnirea unui nou nume de variabilă generează automat variabila respectivă şi alocă spaţiul necesar de memorie. Tipul de dată asociat numelui se poate schimba în acelaşi program: >> a=123
>> a='qwer'
a= 123
a=
>> a=[1 2 3; 2 3 4; 3 4 5] a= 1 2 3 2 3 4 3 4 5
qwer
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) >> j >> i >> abs(3+4j) ans = ans = ans = ans = 0 + 1.4142 i 0 + 1.0000i 0 + 1.0000i 5
>> 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
7 Calculatoarelor
>> atan2(-1,0) ans = -1.5708 % -pi<= ATAN2(Y,X)<=pi
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
>>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,
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
(sqrt(-1) )
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
» huge1 = exp(log(realmax)) huge1 = 1.7977e+308
>> exp(i*pi) ans = -1.0000 + 0.0000i
» toobig = pi*huge1 toobig = Inf
3.5.Generarea unui VECTOR de VALORI: a) vector = val_initială : pas : val_finală 8 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
t=2 : 10
Creează vectorul t = 2 3 4 5 6 7 8 9 10 t[1] t[2] t[3] ....... t[9]
t1=0 : 0.2 : 1.3
t1 =
t2=-2 : 3 : 11
t2 =
-2 1 t2[1]
Pas negativ: t3=5 : -1 : -1.1
t3 =
5 4 t3[1]
0 0.2000 0.4000 t1[1] ....... 4 7 10 t2[5]
3
2
1
(pas=1, implicit)
0.6000 0.8000 1.0000
1.2000 t[7]
0 -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 >> length(t3) -> ans =10
0 105
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) ans = 3.0000 - 4.0000i
% x - iy
>> z ' ans = 3.0000 - 4.0000i Modulul: >> r = abs(z) r= 5 >> z+conj(z) ans = 6
>> r1=abs (conj(z)) r1 = 5 % x + iy + x – iy = 2x
% rezultă număr real % Obs: conj(z) sau z’
Faza:
9 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
>> fi=angle(z) fi =
0.9273
% in cadran I % pi/2=1.57rad
>> fi1=angle(conj(z)) fi1= - 0.9273
% cadran IV
>> pi/2 ans = 1.5708 % radiani Fig.1.Numărul complex z în planul complex
Modul (continuare): >> z * conj(z) % (x + iy)(x - iy)=x^2 - (iy)^2= x^2+y^2 ans= 25 >>compass( [z, conj(z), z*conj(z)] ) % figura Æ % [vector valori complexe] >> sqrt( z * conj(z) ) ans = 5 % verificare egalitate/ expresie logică >> sqrt( z*conj(z)) == abs(z) ans = 1 (true) Obs:după % se inserează comentarii în Matlab Formula lui Euler (bijuterie):
cos ϕ + j sin ϕ = e jϕ %
Exprimare z în coordonate carteziene
%
% %
z = x + j y sau z = z ⋅ (cos ϕ + j sin ϕ )
(fun.exponential complexă, j = − 1 ) Exprimare z în coordonate polare
z = z ⋅ e jϕ
unde φ =angle(z) 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 % z+z2= ( x + x 2 ) + j ( y + y 2 ) ›› z2= -4.00 + 2i % z-z2= ( x − x 2 ) + j ( y − y 2 ) % rezultat in Cadran II >> z + z2 ans = -1.0000 + 6.0000i >>angle(z+z2) > pi/2 >> fi_sum=angle(z+z2) ans = 1 fi_sum= 1.7359 % radiani >>plot(-1.0000+6.0000i, '*', … 'MarkerSize',20 , 'LineWidth',2 ) >> line... >> grid on
Variante de reprezentare grafică a numerelor complexe
10 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
>> 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) ) >> hold
%continuă reprezentarea in fereastră %Current plot held
>> plot(z2,'s')
%z2= -4.00 + 2i
>> line([0 real(z2)],[0 imag(z2)]) % traseaza a doua linie Inmulţirea a două numere complexe Forme carteziene: z1*z2= ( x1 + j y1 )( x2 + j y 2 ) =
Forme polare: z1*z2= z1 ⋅ z2 ⋅ e j (ϕ1 +ϕ 2 )
( x1 x2 − y1 y 2 ) + j ( x1 y 2 + y1 x2 )
= produsul modulelor şi suma fazelor
Cod Matlab:
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
>>z = 3.0000 + 4.0000i >>z2= -4.00 + 2i >> z*z2 ans = -20.0000 -10.0000i
Impărţirea a două numere complexe Forma carteziană: z x + j y ( x + j y )(u − jv ) ( xu + yv ) + j ( − xv + yu ) = = = w u + jv (u + jv )(u − jv ) u2 + v2 xu + yv j ( yu − xv ) = 2 + 2 u + v2 u + v2
Forme polare:
z e jϕ 1 z z1 = 1 jϕ = 1 e j (ϕ1 −ϕ 2 ) z2 z2 e 2 z2 = câtul modulelor şi diferenţa fazelor
Cod Matlab:
Impărţire în forme polare (explicit):
>>z = 3.0000 + 4.0000i >>z2= -4.00 + 2i >> z / z2 ans = -0.2000 - 1.1000i
>> abs(z)/abs(z2)* exp(fi*i)/ exp(fi2*i) ans = -0.2000 - 1.1000i
Inmulţirea j*z= j ( x + j y ) = jx − y = − y + jx Numărul complex jz se obţine prin rotirea lui z cu 90 grade în sens trigonometric. Varianta polară: j = 1 ⋅ e Impărţirea z/j=
j⋅
π
2
=> jz= 1e
j
π
2
* z ⋅e
π
= z
j (ϕ + ) 2 ⋅e
x + j y jx − y = = y − jx −1 j
Varianta polară:
11 Calculatoarelor
jϕ
Fig. 4.Iulian z şiLupea z/ j=y-jx Prof.dr.ing. Programarea şi Utilizarea
π
π
π
j (ϕ − ) j ⋅( − ) j ⋅( − ) 1 j 2 z⋅ = z⋅ = z ⋅ ( − j ) = z ⋅ 1 ⋅ e 2 = z ⋅ e jϕ * e 2 = z ⋅ e j −1
Numărul complex z/j se obţine prin rotirea lui z cu 90 grade în sens orar
Curs 2 Reprezentare vectori cu originea în (0,0): z = 3.0000 + 4.0000i
compass([z, z/i, z*i]) % fig. stanga .............. %Ridicare număr complex la puterea n:
z=exp(.3i) % modul =1, unghi=0,3rad compass( [z, z^2, z^3, z^4] , '-*r') % fig. dreapta
compass([exp(j*pi/2) , 2*exp(pi/6*j) , 2*exp(pi/6*j) / j], '-*')
% vector de valori complexe date prin functia exp de variabila complexă
Grafic z, z*j, z/j >> plot(z, 's') % sau plot( real(z),imag(z), 's' ) >> hold % Current plot held >> plot(z * j, '*') >> 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ă
4
3
2
1
0
-1
-2
>> line( [ 1 2 3], [2 5 -1] ) % vector abscise, vector
-3 -4
-3
-2
-1
0
1
2
3
4
ordonate similar cu plot
3.7 CALCULE ELEMENTARE CU MATRICE >> B=[-1 0 1] ' % B 3x1 >> A=[1 2 3; 3 4 5; 5 6 7] A= B= 1 2 3 -1 %coloana 3 4 5 0 5 6 7 1 Înmulţiri valide: >> A*B %3x3 3x1->3x1 >> A'*B % 3x3 3x1 -> 3x1 ans = ans = 2 4 2 4 2 4
12 Calculatoarelor
>> B' ans = -1 0 >> B'*A ans = 4
4
%linie 1 %1x3 3x3 -> 1x3 4
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
Matricea 2D văzută ca Vector 1D: A(1:end)
A= 1 3 5
2 4 6
3 5 7
%elem. luate pe >> A(1:end)*A(:) ans = % A(:) =vector 9x1 174 % suma pătratelor
coloane ans =
1 3 5 2 4 6 3 5 7 Să se ridice elem.: A(2), A(3), A(4) la pătrat:
>> A(2:4) .* A(2:4) ans = 9 25 4
% sau A(2:4) .^2
2 4 6
Produs scalar a doi vectori (de câte 4 valori fiecare): Vezi şi funcţia dot()
3 5 7
>> A(1:4) %luate pe coloane ans = 1 3 5 2
Vector dot product
>> V= 1:2:7 V= 1 3 5
7
Produs vectorial a doi vectori v=[1 2 3]; u=[3 4 5]; pv este ┴ pe v >> pv=cross(u,v) >> dot(pv,v) >>pv= ans = 2 -4 2 0 prod scalar este 0 Inversa matricei >>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
9
9
16 25
››A(2,:)*A(:,3) ans = 64 %1x3 3x1->1x1 >> C1(2:3)*A(1:2,:) % 1x2 2x3
ans = 19 28 37
OBS: prod. scalar a doi vectori perpendiculari este 0 >> A(1:4)* V' ans = >1x1 49
%1x4 4x1-
pv este ┴ pe u >> dot(pv,u) ans = 0 prod scalar este 0
>> D(3,3)=7 % add 1 col D= 7.3891 1.0000 0 1.4142 5.0000 0 1.0000 0 7.0000 >> D*D^-1 ans = 1.0000 0 0 -0.0000 1.0000 0 0.0000 -0.0000 1.0000 >> 2*D = = D+D %test
13 Calculatoarelor
%Elem. din 2 linii la pătrat: [A(1,:) A(2,:)] .^2 ans = 1 4
Preluare de zone din matrice: >> C1=A(2,:) % linia #2 >> C2=A(:,3) % coloana #3 C1 = C2 = 3 4 5 3 5 7 >> C2*C1 %3x1 1x3 ->3x3 >> A(1:2,:) % 2lin, toate col ans = ans = 9 12 15 1 2 3 15 20 25 3 4 5 21 28 35 A= 1 3 5
>> A(:)’ * A(:) ans = % A(:) vector 9x1 174 % suma pătratelor
>> D^-1 %inversa 3x3 ans = 0.1407 -0.0281 0 -0.0398 0.2080 0 -0.0201 0.0040 0.1429 >> D^-1 * D ans = 1.0000 0.0000 0 -0.0000 1.0000 0 -0.0000 -0.0000 1.0000 >> D*D= =D^2 %la putere Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
ans = 1 1 1 1 1 1 “Impărţiri” / şi \ >> 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
1 1 1
ans = 1 1 1 1 1 1
1 1 1
>> M / D ans = 0.9654 0.0069 0.8571 0.0824 0.9835 1.0000 0.1645 1.7671 0.2857
>> M * D^-1 ans = 0.9654 0.0069 0.0824 0.9835 0.1645 1.7671
%=M / D
>> M \ D ans = 0.9474 -0.5750 0.4472 -0.3146 0.0500 0.7389 0.0207 0.9250 -0.7194
>> M^-1 * D ans = 0.9474 -0.5750 -0.3146 0.0500 0.0207 0.9250
%=M \ D
0.8571 1.0000 0.2857
0.4472 0.7389 -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ă Întreg:
int8, int16, int32, int64,
Exemple uint16(65000) ( conversie la uint16 )
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: [de la -128 la 127] int8 [de la 0 la 255] uint8 [-32768 la 32767] int16 [ 0 la 65535] uint16 [ -2^63 la (2^63)-1 ] sau: int64
single(3.1 * 10^38)
Tablou de numere în simplă precizie. Dpdv al
uint8, uint16, uint32, uint64
[ -9.2234e+018 la 9.2234e+018]
Single
14 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
(4 octeţi)
single(5+6i) %conversie 16->8oct
Double (tip implicit)
3.4 * 10^300 5 + 6i
(8 octeţi)
[1 2; 3 4.1]
Logical
x = [true, true, false, 1];
(1 octet)
>> magic(2) => ans = 1 3 4 2 >> magic(2) > 2 ans = 0 1 1 0 'Dati val. pt. vector: ' mesaj='Hello' >> mesaj(2:4) ans = ell
Char (2 octeţi/ caracter)
Structure
length('Dati val. pt. vector: ') ans = 22 str.numar = 124; str.color = 'alb'; str.matr = magic(3); str.logic=[true];
prin “.” se refera câmpul str(2).numar = -17;
Cell array
a{1,1} = 12; a{1,2} = 'Red'; a{1,3} = magic(4); a{2,3}='a'
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) 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) 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).
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. 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. 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
b={5, 'e', [1 2;3 4]} Function handle
ra2=@sqrt struct(2).a1=@sin cell2{4,1}=@cos
User class Java class
polynom([0 -2 -5]) java.awt.Frame
cell2={12, 'asdf', [1 2;3 4]; 1:3,[],'aa'} (alt exemplu) 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 Obiecte construite dintr-o clasă definită de utilizator Obiecte construite dintr-o clasă Java (vezi clase Java)
15 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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 val_log =
% este un tablou 1x1 de valori logice 1
>> a = [true, true, false, true, false]
% a este tablou 1 x 5 de val. logice
a= 1 >>b = [2.5 6 .7 >>isfinite(b) ans => 1 1 >>d=magic(3) 8 1 3 5 4 9
1
0
9.2 inf 1 6 7 2
1
0
4.8];
% testeaza daca valorile sunt finite 0 1 % 15=sume pe linii= >> d >= 5 %=sume pe coloane= ans = %=suma pe DP si DS =15 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 16
Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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 8 9 9 8
10 10 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 !!salt.....
%Se şterge A şi se initializează din nou)
Ex2: “Celule în celule”
*se iniţializează:
» A{1,1} = { [1 4 3; 0 5 8; 7 2 9] } % se obţine un cell array pentru A{1,1} » A{1,3} = {'abc', 'de'} şi >>A{2,2} = [1 2 3] Î
Extragem caracterul ‘b’: A{1,3}{1,1}(2)
17 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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
.*
Scădere
'
Transpusa unei matrice reale
Înmulţire element cu elem.
'
Transpusa + conjugate complexe a numerelor complexe din matrice (dacă există)
.'
Transpusa fără conjugata complexă a
[2 3] .* [10 20] -> [20 60]
./
Împărţire la dreapta: 1 ./ [1 2 3] 1.0000 0.5000 0.3333 >>[1 2] . / [2 3] 0.5000 0.6667
.\
9 16]
Împărţire la stânga: 2 .\ [1 2 3]
numerelor complexe
*
Înmulţire matriceală (| înm. două numere) Amxn * Bnxp => Cmxp
0.5000 1.0000 1.5000
+
Plus unar
A/B
Împărţire matriceală la dreapta A*B^-1
-
Minus unar
A\B
Împărţire matriceală la stânga A^-1 *B
:
Operatorul două puncte
^
Matrice pătratică la o putere
Operatorii aritmetici pe element (.*, ./, .^) lucrează cu elementele corespondente ale unor tablouri de dimensiuni egale. Unii operatori binari lucrează cu un operand matrice şi celălalt scalar. În acest caz MATLAB-ul aplică scalarul fiecărui element al matricei, ex: [2 3] – 1 Æ [1 2] sau: [2 3] ./ 2
18 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
*Operatori relaţionali < Mai mic <= Mai mic sau egal > Mai mare
>= == ~=
Mai mare sau egal Egal cu 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 » A = [2 7 6; 9 0 5; 3 0.5 6]; » B = [8 7 0; 3 2 5; 4 -1 7];
» pi ~= 3.14 ans = 1 » A == B ans = 0 1 0 0 0 0 » A >= B 0 1 1 0 0 1
Rezultatele comparaţiilor sunt valori de tip logic: 0 sau 1
0 1 0 1 1 0
*Operatori logici & | ~
1 & 1 -> 1 AND (ŞI) 0 & 1 -> 0 OR (SAU) NOT (Negatie) 1 & 0 -> 0 0 & 0 -> 0
1 0 1 0
I I I I
1 1 0 0
XOR(0, 0) -> 0 XOR(0, 1) -> 1 XOR(1, 0) -> 1 XOR(1, 1) -> 0 % EXCLUSIVE OR
-> 1 -> 1 -> 1 -> 0
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 » ~u ans= 0 1 0 » ~~u ans= 1 0 1
3 0 -5]; 0 1
0
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 >> v & 4
19 Calculatoarelor
6 -1
0
0
7 Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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 and( ) or( ) xor( )
all( )
Descriere Exemple Identic cu & Identic cu | Realizează sau exclusiv. Returnează logic adevărat dacă » a = 1; unul din operanzi este adevărat şi celălalt fals. În termeni » b = 1; numerici, returnează 1 dacă un operand este nenul şi celălalt » xor(a,b) ans = 0 este zero. » u = [0 1 2 0]; Parametrul este vector: returnează 1 dacă toate elementele » all(u) vectorului sunt adevărate sau nenule (true). ans = 0 Parametrul este matrice (all() acţionează pe coloane):
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)
» A = [0 1 2; … 9. 5 0]; » all(A) ans = 0 1 0 » 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: 1 + 4ζ 2 r 2 A( r , ζ ) = r=0 : 0.005 : 2.5 şi (1 − r 2 ) 2 + 4ζ 2 r 2 ζ=[0.03, 0.05, 0.1, 0.2, 0.5] % ze Cod Matlab: % cu fiecare linie din A se trasează o curbă ze=[0.03 0.05 0.1 0.20 0.50]'; r=0 : 0.005 : 2.5; % ze este transpus A=sqrt( ((2*ze*r).^2+1) ./ ( (ones(size(ze))*(1-r.*r).^2) + (2*ze*r).^2) );
20 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
% transmisibilitate forţă asupra masei la suport fix
plot(r,A)
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.
A=
... ... ... ... 5 x 501 ... ... ... ... + ... ... 5 x 501 ... ... 5 x 501
>> ze=[0.03 0.05 0.1 0.20 0.50]' ze = 0.0300 0.0500 0.1000 0.2000 0.5000
>> ze * r
>> r=0 : 0.005 : 0.03 r= 0 0.005 0.010 0.015 0.020
0.025 0.030
ans = 0 0.0001 0 0.0003 0 0.0005 0 0.0010 0 0.0025
0.0003 0.0005 0.0010 0.0020 0.0050
0.0004 0.0008 0.0015 0.0030 0.0075
0.0006 0.0010 0.0020 0.0040 0.0100
0.0007 0.0013 0.0025 0.0050 0.0125
0.0009 0.0015 0.0030 0.0060 0.0150
La numitor: primul termen (1 − r 2 ) 2 rezultă vector iar al doilea
4ζ 2 r 2 matrice => avem nevoie de matrice şi în primul termen. size(ze) returnează perechea de valori (5,1); acesta este argument pentru funcţia ones() care crează matricea cu 5 linii şi o coloană de valori unitare.
>> ones(size(ze)) 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
21 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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
% 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
22 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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:
23 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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)
% pas=2 for k=1:2:n . . . end
x(1)=1; %se adaugă valori in vect. x(i) for n = 2 : 6 x(n) = 2 * x(n - 1); end 2 4 8 16 32 % rezulta: 1
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 x=0.1047 sin(x)= 0.1045 0.994522+ 0.104528i x=0.2094 sin(x)= 0.2079 0.978148+ 0.207912i x=0.3142 sin(x)= 0.3090 0.951057+ 0.309017i 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):
% Relaţia lui Euler: e^(ix) = cos(x) + i*sin(x) % Observăm: x ≈ sin(x)
pentru x=mic 0,1rad; 0,2 rad
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); B5x12 end end plot(1:lin,B,'-*') %sau plot(B)= fiecare coloana o curbă % abscisa are 5 valori 1:lin
plot(1:col, B, '-*') % o linie=o curba abscisa are 12 valori 1:col
Matricea generată B5x12=
2 variante pt. Sinus din vector x de valori: 1.Ciclul for
versus
2.vectorizare
24 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
x=1:.1:10; %Cod scalar: for k=1:length(x) y(k)=sin(x(k)); end plot(x,y)
Cod echivalent prin vectorizare:
--------------
----------x=-5:0.1:25; y=x+sin(x); plot(x,y)
x=1:.1:10; y=sin(x); 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)
Calcul VARIANŢA: % 1.Ciclul for % 2.Vectorizare x=[1 2 3 4] miu = sum(x)/length(x); variance2=sum(( x-miu).^2)/length(x); miu = sum(x)/length(x); %media suma=0; sau: …sum((x-miu).*(x-miu))… for i=1:length(x) sau: (x-miu)*(x-miu)’ suma=suma +(x(i)-miu)^2 end 2 = 1 n ( X [i ] − µ ) 2 = VAR σ ∑ x variance1=suma/length(x); n i =1 % variance1 -> 1.25 Calcule cu matrice %Numărare elemente ai pozitive din vector Suma elementelor aij de pe DP (i = j) folosind un ciclu for a=input(`Tastati sir numeric= `); %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)
---------------------------
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 Condiţia de valoare este:
2) i+j
0
selectează elem. deasupra DS
Varianta 1: se parcurge întreaga matrice a=input(`Intr. Matrice patratica=`) % tastati: [1 8 3 ;-9 4 1; 2 2 2] n=length(a(:,1)); % (toate liniile, coloana 1)
25 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
sum=0; for i=1:n %ciclu exterior: ciclarea liniilor for j=1:n %ciclu interior: ciclarea coloanelor if i<j & i+j0 %expresie logica sum=sum+a(i,j); fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j)); end end end sum Varianta 2: parcurgerea numai a zonei de interes for i=1: floor(n/2) %ciclu exter.=ciclarea liniilor for j=i+1 : n-i %ciclu interior=cicl. coloane DS:j=n+1-i if a(i,j)>0 %expresie logica sum=sum+a(i,j); fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j)); end end end a=input('matricea a='); Produsul a două matrice a şi b b=input('matricea b='); [aL aC]=size(a); [bL bC]=size(b); c=zeros(aL,bC); if(aC ~= bL) 'nu se pot inmulti matricele' else for i=1:aL for j=1:bC for k=1:aC c(i,j)=c(i,j)+a(i,k)*b(k,j); end end end Dacă A este matrice: display(c) all(A) %AND pe fiecare coloană if all(all(a*b == c)) %verificare all(all(A)) AND pe col. apoi 'corect' AND pe unica linie 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;
26 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
end suma x(1) -3 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
amplasare elemente in sir: x(2) x(3) x(4) x(5) -2 -1 0 1
... ...
%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:
cup2 = l1e jϕ1 2. vector =vect precedent+vec lungime l2 şi unghi φ2:
cup3 = cup2 + l2 e jϕ2 3. Vector de poziţie sarcină (varf)
var f = cup3 + l3e jϕ3 Apelând la formula lui Euler se poate afirma: - abscisele celor 3 pozitii sunt proiecţiile pe axa reală a celor 3 vectori complecşi. - ordonatele celor 3 pozitii sunt proiecţiile pe axa imaginară a celor 3 vectori complecşi. Aplicaţie: rotire in cupla 3 si vectori de pozitie j=sqrt(-1); l1=3;l2=3;l3=2; fi1=pi/3;fi2=pi/6; for fi3=pi/3:pi/30:3*pi/3 %elementul 3 se roteste cup2=l1*exp(j*(fi1)); cup3=cup2+l2*exp(j*(fi2)); line([0,real(cup3)], [0 imag(cup3)]) %vec. pozitie cupla3 varf=cup3+l3*exp(j*(fi3)); line([0,real(varf)], [0 imag(varf)]) % vec. poz. varf
27 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
%se traseaza o configuratie a bratului cu line() lc=line([0 real(cup2) real(cup3) real(varf)], [0 imag(cup2) imag(cup3) imag(varf)],... 'linewidth',3,'Color',[0 0 0] ) %negru pause(1); %se sterge configuratia curenta a bratului cu line() lc=line([0 real(cup2) real(cup3) real(varf)], [0 imag(cup2) imag(cup3) imag(varf)],... 'linewidth',3,'Color',[1 1 1] ) %alb end
Temă: să se pună în mişcare simultan două elemente şi apoi 3 elemente ale braţului
CURS 4
5. Scheme logice asociate instrucţiunilor de decizie şi de ciclare Schemele logice conţin: Blocul de start, B.de stop, B. intrare date, B. ieşire date (paralelograme), B. de decizii logice (romb), B. de atribuiri şi calcul (dreptunghi) Blocurile sunt interconectate prin săgeţi orientate. if expresie_logica grup de instructiuni end
….. if expresie_logica grup1 de instructiuni else grup2 de instructiuni end …..
for index = start:increment:end grup de instructiuni
end
while expresie logica bloc de instructiuni
end
28 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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;
29 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
end
case 1 v1=v1+1; case 2 v2=v2+1; case 3 v3=v3+1; otherwise v=v+1;
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) x = parametrul de intrare este vector % AVERAGE media elementelor vectorului y = parametrul de ieşire este scalar y = sum(x) / length(x); Funcţia average este salvată în fişierul end average.m APELURI valide ale funcţiei: Prof.dr.ing. Iulian Lupea 30 Programarea şi Utilizarea Calculatoarelor
v=[1 2 3 -3 5]; ave=average(v)
average( [1 2 3 -3 5] ) ans = 1.6000
v=[1 2 3 -3 5]; average(v) ans = 1.6000
2) 2 parametri de intrare şi un (1) parametru de ieşire function z=xplusy(x, y); x,y doi parametri de intrare z=x+y; z un parametru de ieşire Se salvează definiţia funcţiei într-un fisier cu numele xplusy.m end APELURI valide ale funcţiei: a=1 a=[1 2 3; 3 4 5] a=7 b=2 b=[7 8 9; 2 0 4] b=[7 8 9; 2 0 4] scal1=xplusy(a,b) matr1=xplusy(a,b) matr2=xplusy(a,b) * b' % 2x3*3x2 % apel în expresie
scal2=xplusy(1,2)
matr1=xplusy([1 2 3; 3 4 5] , b)
matr2=xplusy(7, [7 8 9; 2 0 4])
3) Parametri de intrare (2,3 sau 4)<= nr. param.formali (4) function z = xplusy2(x,y, a, b) 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
Apeluri valide:
>> xplusy2(3,5) ans = 8 >> xplusy2(3,5,1) ans = 8
% 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
>> 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
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
31 Calculatoarelor
stdev =
1 n
n
∑ ( X [i ] − mean 2)
2
i =1
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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
Apel: a=fun_demo1(1.e2);
Apel: b=fun_demo2(1.e2);
Dacă x(i)>0.95 True, iese din ciclu, salvează x in out si iese din functie Altfel executa 1.e2 cicluri, salveaza x in out si iese
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
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
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 Sunt permise apelurile: Rez1=f_expresie(2.2) Rez2=f_expresie([2.2 3 5])
32 Calculatoarelor
Ex1: un argument: x fun_ex=inline( 'x+sin(x)+x.^2' ); %parametrul este şir de caractere Rez_1=fun_ex (2.2) Rez_2=fun_ex ([2.2 3 5]) Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
c) Ex2: inline cu mai multe argumente: a, om, t exp_comp=inline ( ’a*exp(j*om .* t)’ ) % a ⋅ e jω t la apel parametrii sunt luaţi in ordinea din definitia inline >> exp_comp(1, 3, 0 : .1 : 0.4) % 1->a, 3->om, 0:.1:0.4 ->t ans = 1.0000
0.9553 + 0.2955i
0.8253 + 0.5646i
0.6216 + 0.7833i
0.3624 + 0.9320i
% a ⋅ e jω t = a [cos(ωt ) + j sin(ωt )] >> x=0: .1 :2*pi >> plot( x , exp_comp(3, pi, x) )
Ægraficul:
*partea imaginară a ordonatelor a fost neglijată în grafic Æ *abscisa de la 0 la 2pi; 3,1415 perioade de cosinus deoarece om=pi; 3 este amplitudinea
3.Variabile globale VG permit folosirea unor variabile în corpul funcţiilor fără ca acele variabile să fie pasate prin parametri în acele funcţii. Comunicare numai prin parametri Fereastra de comenzi Definiţie fun_1 a=1; functie y=fun_1(pa,pb,pc) b=2; …. c=5; y=pa+pb+pc; %variabile locale re=fun_1(a,b,c); Variabilele a,b,c şi-au transferat valorile parametrilor formali pa, pb respectiv pc. Valoarea calculată y transferă valoarea variabilei re Comunicare prin parametri şi variabilă globală functie y=fun_2(pa,pb) a=1; …. b=2; global vgC; global vgC; vgC=55; ….. re=fun_2(a,b); y=pa+pb+ vgC; Variabilele a,b şi-au transferat valorile parametrilor formali pa respectiv pb. Variabila vgC este declarată globală în funcţia apelantă şi apelată (fun_2) deci poate fi folosită în expresii în funcţia apelată fun_2( ) Variabile persistente – sunt locale funcţiei, nu se şterg la ieşirea din funcţie, valoarea lor este reţinută şi regăsită la un nou apel al aceleaşi funcţii; nu pot fi accesate dinafara funcţiei. persistent var_persist; CURS 5
4. Fişiere script Matlab sau macrouri Scriptul Matlab este un segment de program Matlab salvat într-un fişier numefis.m. Execuţia fişierului script se obţine prin apelul numelui fişierului numefis (fără extensie) în linia de comandă, în funcţii sau în alte fişiere script. După execuţia fişierului script variabilele locale rămân în spaţiul de lucru al aplicaţiei spre deosebire de funcţie în care variabilele locale se dealocă din memorie. Un program Matlab are forma fişierelor: nume_script.m
şi/sau:
nume_functie.m
Din fişierele de funcţii sau fişierele script se pot apela alte funcţii sau fişiere script. Se pot face de asemenea apeluri recursive: - din funcţie se apelează aceeaşi funcţie sau
33 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
- dintr-un fişier script să se apeleze acelaşi fişier script. Funcţii transmise ca parametru altei funcţii: Sunt definite trei funcţii apelate: f(), g() şi arie() function [y]=f(x) function [y]=g(x) y=sin(x)+x; y=x*cos(x); end end function [F]=arie(pf1,a,b,n) 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))
34 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
ze=0.04; r=0 : .01 : 3; j=sqrt(-1)
Ac =
1 1 - r 2 + 2jζ r
%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 %trasează real(Ac) vs. imag(Ac) plot(Ac, ' - +' ) subplot(122); % 1=linie, 2=col., % pozitia 2 devine curenta
plot(real(Ac), imag(Ac), '-+' ) % identic cu plot(Ac) plot(x, y) % acelaşi număr de valori în vectorii: x şi y a) reprezintă grafic vectorul y (ordonate) în funcţie de vectorul x (abscise) primul punct din grafic: x(1), y(1) punctul al doilea din grafic: x(2), y(2) … ultimul punct: x(end), y(end) b) x vector, y matrice => coloanele / liniile matricei y vor fi reprezentate în funcţie de vectorul x subplot(131); plot(r, real(Ac)) subplot(132); plot(r, imag(Ac)) subplot(133); plot(r, [real(Ac); imag(Ac)]); % r=vector, % [real(Ac); imag(Ac)]= matrice 2 linii 8
10
0
6
-2 5
4 -4 2
0 -6
0 -8
-5
-2 -10
-4
-10 -12
-6
-8
0
0.5
1
1.5
2
2.5
3
-14
0
0.5
1
1.5
2
2.5
3
-15 0
0.5
1
1.5
2
2.5
3
c) plot(x1,y1, x2,y2) => în acelaşi grafic sunt reprezentate curbele (x1, y1) şi (x2, y2) x1, y1 = 2 vectori; x2, y2 = 2 vectori plot(r, real(Ac), r, imag(Ac) );% sau plot( r, [real(Ac); imag(Ac)] ); identice % fiecare linie din matrice în funcţie de r
2. Exemplu cu funcţia FFT + module de numere complexe Profilul unei forţe periodice este de forma:
f(t) = 1 ⋅ cos
ω0 t + 3 cos
ω0 t +1.5 cos
4ω0 t 2
2 Se trasează grafic forţa şi se pun în evidenţă componentele armonice ale profilului (amplitudinea şi argumentul fiecărui cosinus): t=0:0.01:5; w0=10; % 501 valori f1=1*cos(w0/2*t)+3*cos(w0*t)+1.5*cos(4*w0/2*t); subplot(211); plot(t,f1) %se observa graficul periodic % fft() → Fast Fourier Transform % par. actual: f1= vec.501 valori reale → returnează vec.501 val. complexe subplot(212);
Y1 = fft(f1);
35 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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);
36 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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; return
% salvam functia f2() in fisierul f2.m
% apel:
fplot('f2', [-22 44], 1000); % reprezintă grafic funcţia f2 definită în fişierul f2 Æ sau: [x,y]=fplot('f2', [-22 44], 1000); % NU reprezită functia ci numai returneaza vectori % 1000 abscise şi 1000 ordonate în [x, y] plot(x,y); grid; % apelăm plot(x,y) pentru reprezentare grafică. 8. comet(y) şi comet(x,y) %realizează reprezentare dinamică a unei curbe 2D printr-un punct care se deplasează şi trasează curba. 9. Trasare poligoane pline colorate
subplot(121) fill([1 2 4],[1 6 8],'r') % un poligon, [lista abscise], [lista ordonate] subplot(122) fill([1 2 4],[1 6 8],'r', [2 4 8],[6 8 9], 'g') % doua poligoane 10. Reprezentare vectori complecşi cu originea în (0,0): z = 3.0000 + 4.0000i
compass([z, z/i, z*i]) % vector în forma exponenţial complex: compass([ 3*exp(j*pi/3), 2*exp(j*pi/2), 3-1*j]) % unde j=sqrt(-1) 11. Setare grosime şi culoare curbă în grafic *Setează grosimea (1.6) a liniei plot(r,T, 'LineWidth' , 1.6); *Setează culoarea (red) şi grosimea liniei line(X,Y,Z, 'Color', 'r', 'LineWidth', 4) 12. Funcţia text() → scrie text pe figură *Se va scrie relatia lui Euler la poziţia dorită (x,y)= (.1, .22) >>figure
% se creează o nouă fereastră pentru figuri
>> text(.1, .22, '\ite^{(i\omega\tau)} = cos(\omega\tau) + i sin(\omega\tau)')
↑ pozitie text ↑ it pentru a interpreta şir text ↑ acolade {} pentru gruparea scrisă la exponent Alfabet grecesc: … \omega
\tau
\…
» gtext('ze=0.1') %permite interactiv scrierea textului la pozitia dorita pe figura curenta % pozitia curenta este indicata de axele perpendiculare; acestea sunt poziţionate la deplasare mouse
1. Tipărire cu format %d, %f, %e, %g la folosirea funcţiei fprintf
37 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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
Folosim descriptori de format:
% s-a folosit \n pentru trecerea cursorului pe randul urmator la inceput după fiecare execuţie a funcţiei fprintf
%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.
vector x=
[1.01
0.00002]
element x( element x( element x(
1)= 1)= 1)=
1.010 1.010e+000 1.01
element x( element x( element x(
2)= 2)= 2)=
0.000 %f lipsă cifre utile 2.000e-005 %e 2e-005 %g a ales f.
%d pentru tipărire valori întregi cu semn (decimal) %s pt. tipărire şiruri de caractere (string)
% s-a citit
%e tipărire format exponential
%f %e %g
%g mai compact decât %f sau %e şi fără 0 inutil
expon.
În cadrul parametrului actual de tip ‘şir de caractere’ a funcţiei fprintf, pot fi folosite caractere de formatare a textului (caractere de evitare): Linefeed LF + carriage return CR = se trece \n \t Tab (sare la dreapta un număr de (scrie) la inceputul liniei următoare caractere/pozitii de scriere) carriage return \r \b Backspace (inapoi un caracter) Folosim: \\ pentru a tipări un caracter backslash %% pentru tipărirea unui caracter procent. ’’ pentru a tipări un caracter apostrof 2. Tipărire în formă tabelară la ecran: x=input('sir de medii x= '); s=0; m=0; ma=0; nivel={'slab', 'mediu', 'bun'}; %cell array conţine 3 şiruri de caractere de lungimi diferite fprintf(' \t\tNote studenti\n'); %două taburi (\t) şi trecere la inceputul rândului următor (\n) fprintf(' \t\t----------------\n'); %realizeaza subliniere titlu for i=1:length(x) if x(i)<=6 s=s+1; % %s este descriptor pentru şir de caractere fprintf('student #%d nivel %s =%12.3f s=%d\n', i, nivel{1}, x(i), s) elseif x(i)<=8 m=m+1; fprintf('student #%d nivel %s =%12.3f m=%d\n', i, nivel{2}, x(i), m ) else ma=ma+1; fprintf('student #%d nivel %s =%12.3f ma=%d\n', i, nivel{3}, x(i), ma) end end Exemplu rulare: sir de medii x= [4.33 10 6.25 7 9.66] Note studenti ---------------student #1 nivel slab = 4.330 s=1 student #2 nivel bun = 10.000 ma=1 student #3 nivel mediu = 6.250 m=1 student #4 nivel mediu = 7.000 m=2 student #5 nivel bun = 9.660 ma=2
38 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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:
Conţinut cu Wordpad:
fid2 = fopen('c:/fis33.bin', 'wb'); % write binar x=fwrite(fid2, 3:300); %return o val.: 298 (val. scrise in fisier) x2=fclose(fid2); %returneaza 0 pentru succes şi -1 altfel Sintaxa de scriere: fid = fopen(cale_numefisier, mod) deschide fişierul în modul specificat prin mod care poate fi: 'r' read 'w' write (se generează fişierul dacă este necesar) 'a' append (se generează fişierul dacă nu există) 'r+' read and write (nu se generează) 'w+' trunchează sau crează pentru read şi write 'a+' read şi append (crează fişierul dacă este necesar) Fişierul poate fi deschis (pentru citire din fişier sau scriere în fişier): în mod text (exemple 'rt' şi 'w+t') sau binar (implicit). Obs.: funcţiile fscanf este folosită pentru citire text cu format din fişiere. fread = citeşte date binare din fişier. CURS 6 2. Calcule cu polinoame 2.1.Evaluarea polinomului pentru un vector de argumente (scriind expresia polinomială şi operatorul .^ ): VecArg=[ -2 0 10 10.1 99] % 5 argumente
VArg= 2: 0.5 : 4;
Val = VecArg .^ 2 + 2*VecArg + 3
Val2= VArg .^ 2 +2 *VArg + 3
Val = 1.0e+004 * 0.0003 0.0003
Val2 = 11.0000 14.2500 18.0000 22.2500 27.0000 0.0123
0.0125
1.0002
Operatorul .^ indică ridicarea la putere a fiecărei valori din vectorul de argumente
2.2. Polinoamele sunt reprezentate prin vectorul coeficienţilor polinomului luaţi în ordine descrescătoare a puterilor. p( x) = x 2 + 2 x + 3
=> p1=[1 2 3] ;
%vectorul linie al coeficienţilor
Evaluarea polinomului folosind VECTORUL coeficienţilor:
39 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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]; p1( x ) = x 2 + 2 x + 3 p2= [0 3 4];
p 2( x ) = 3 x + 4
>> p_suma=p1+ p2 p_suma = 1 5 7
psum ( x ) = p1( x ) + p 2 ( x )
2.4.Inmulţire şi împărţire de polinoame cu funcţiile conv şi deconv: prod ( x ) = ( x 2 + 2 x + 3)( x − 1)
2 imp ( x ) = x + 2 x + 3
Exemplu Matlab: p1=[1 2 3]; p2=[1 -1]; prod=conv(p1, p2) prod = →
1
1
x −1
Î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;
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
- 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);
2 imp ( x ) = x + 2 x + 3 x −1
end
%produsul de pe poziţiile i,j intră în poz. p12(i+j-1) %ex:i=1,j=1=> p12(2-1) inmultire puteri maxime %ex:i=3,j=2=>p12(4) inmultire termeni liberi %afisare coef. determinati prin program
[cat rest]=deconv([1 2 3], [1 -1])
end
cat = → 1 3 rest = → 0 0 6 p1_ini = conv(cat, [1 -1]) + rest
prod=conv(p1,p2) %afisare coef. determ prin functia conv()
p1_ini = → 1
2
p12
%pt. comparaţie:
3
Să se calculeze determinantul matricei B:
x+2 10 x2 + 3x + 6 B= x+2 5 x2 + 2x + 4
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)
40 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
Opţional: Să se reprezinte grafic funcţia:
F ( w) =
% 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];
2
− m2 w + k 2 + k 3 ( −m2 w 2 + k 2 + k 3)( −m1w 2 + k 1 + k 2) − k 22
pentru coeficienţii:
k1=244.5; k2=244.5; k3=244.5; m1=1; m2=1; in intervalul: w=10 : 0.01 : 30;
w=10:0.01:30; FRF11=polyval(pZerouri,w) . / polyval(detB,w); plot(w,FRF11, 'linewidth',1.7); grid on; zoom;
0.3
0.2
0.1
z1=roots(pZerouri); f_z1=z1/(2*pi) % rad/s respectiv Hz r12=roots(detB); f_r12=r12/(2*pi)
0
-0.1
-0.2
-0.3
14
16
18
20
22
24
26
28
* observăm două asimptote verticale la rădăcinile numitorului Funcţiile roots() şi pzmap(): Analizaţi următorul raport de polinoame (reprezintă funcţia de transfer G(s) ):
G( s) =
x2 + 4x + 1 x3 + 2x + 1
num=[1 4 1]; den=[1 0 2 1];
>> roots(num) % rădăcini ec.polinom (zerouri) ans = -3.7321 reale -0.2679 >> roots(den) % radacini numitor (poli) ans = 0.2267 + 1.4677i complex conjugate 0.2267 – 1.4677i -0.4534 Calcul poli, zerouri + trasare figură alăturată (poziţie poli şi zerouri)
-cu cerculeţ ○ sunt notate rădăcinile polinomului de la numărător “zerouri” - cu x sunt notate rădăcinile de la numitor “polii’.
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ă
Descompunerea în sumă de fracţii simple a raportului a două polinoame A(x) şi B(x) Fracţiile conţin la numitor polinoame de ordinul unu. A( x ) B( x)
=
r (1) x − p (1)
+
r (2) x− p(2)
+ ... +
41 Calculatoarelor
r(n) x− p(n)
+ k ( x) Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
unde numim r(1) ,…, r(n) reziduuri iar p(1) ,…, p(n) poli. Se foloseşte funcţia Matlab: [r, p, k]=residue(A, B) Funcţia se poate apela şi cu efect invers, în forma: [A,B]=residue(r, p, k) caz în care sunt returnaţi coeficienţii polinoamelor A şi B. Descompunere în fracţii simple a funcţiei x2 + 4x + 1 G ( s ) = G=num/den : x3 + 2x + 1 >> [r, p, k]=residue(num,den) 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
Sirul polilor p(1), p(2), p(3): p= 0.2267 + 1.4677i 0.2267 – 1.4677i -0.4534
Obs: 2 reziduuri complex con. + 1 real
Obs: 2 poli complex conjugaţi + 1 real
A( x ) B( x )
=
x 2 + 4 x +1 x 3 + 2 x +1
=
Rest: k= []
=
r (1) x − p (1)
r (2) x − p ( 2)
+
+
r ( 3) x − p ( 3)
=
0.6162 - 1.2316i x −( 0.2267 + 1.4677i)
+
0.6162 + 1.2316i x −( 0.2267 − 1.4677i)
+
-0.2324 x −( -0.4534)
Diagrame Nyquist şi Bode Bode([1 4 1],[1 0 2 1]); grid on
Nyquist([1 4 1],[1 0 2 1]) Nyquist Diagram 6
4
Imaginary Axis
2
0
-2
-4
-6 -5
-4
-3
-2
-1
0
1
2
3
Real Axis
3. GRAFICE 3D 1. Curbe spaţiale (3D) – sintaxa funcţiei plot3() plot3(x,y,z) % x, y, z = vectori de coordonate ale punctelor plot3(x,y,z, ‘tip-linie’); plot3(x1,y1,z1, ‘tip-linie1’, x2,y2,z2, ‘tip-linie2’, …) plot3(X,Y,Z) Exemplu: t=0 : pi/40 : 10*pi; plot3(sin(t), sin(t) .*cos(t), 2*t); grid on; Două curbe spaţiale: plot3(sin(t), sin(t).*cos(t), 2*t, sin(t), cos(t), 2*t); sau:
plot3(sin(t), sin(t).*cos(t), 2*t, '+' , sin(t), cos(t), 2*t, '-' ); % prima curba trasata din `+`, a doua din `-` Grafic spaţial dinamic - un punct trasează dinamic curba
42 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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)./(2w.^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 0 0 Y= 6 8 10
1 1 1
2 2 2
3 3 3
4 4 4
6 6 6 6 8 8 8 8 10 10 10 10
>> [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
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) 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):
43 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
(
)
z = sin x 2 + y 2 / x 2 + y 2 sau:
z=sin(ra)/ra, unde ra= x 2 + y 2 .
(sau direct: Z=sin( sqrt(X .^2+Y.^2) ) . / sqrt( X .^2+Y.^2);) Etapa#1: se generează reţeaua de puncte din planul x-y [X,Y]=meshgrid(-12:.4:12, -12:.4:12); %sau meshgrid(-12: .4: 12); Etapa#2: calcul matricea ra de valori intermediare ra=sqrt(X .^2+Y.^2); %matricele X şi Y sunt ridicate la pătrat element cu element, %adunate, apoi radicalii din fiecare element salvaţi în matricea ra Etapa#3: calcul valori finale funcţie cu salvare în matricea Z Z=sin(ra) ./ ra; Etapa#4: reprezentarea grafică subplot(211); h=mesh(X,Y,Z); % h este handle la grafic grid on; subplot(212); s2=surf(X,Y,Z); % vezi figura alăturată -> %fiecare matrice X,Y,Z conţine coordonatele x, y resp. z ale tuturor punctelor din grafic.
Etapa#5: editare grafic: get(h) % listează pe ecran setul de proprietăţi ale graficului asociat set(h, 'LineWidth', 1.7) %set(h, …) se impune lăţimea liniei de trasare a graficului sau alte proprietăţi ale graficului asociat. title('Functia sinc cu surf'); xlabel('axa x'); ylabel('axa y');
text(0, 0, 0.5 ,’vârf’); Exemplul #2:
[X,Y]=meshgrid(-10:16); Z=sqrt(X .^2+Y .^2); surf(X,Y,Z);
44 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
5.3. Animaţie vibraţie robot în jurul unei configuraţii pentru condiţii initiale de pornire specificate %Animatie=continuare program precedent %Recuperare şiruri de valori în cuple sircup1=X(:,1)';sircup2=X(:,2)';sircup3=X(:,3)'; %Poziţionare succesivă a braţului conform cu unghiuri cuple rotatie for t=1:length(sircup1) %se repetă pt fiecare triplet fi1=sircup1(t);fi2=sircup2(t);fi3=sircup3(t) cup1=l1*exp(j*(fi1c+fi1)); cup2=cup1+l2*exp(j*(fi2c+fi2)); cup3=cup2+l3*exp(j*(fi3c+fi3)); %se traseaza o configuratie a braţului cu line() lc=line([0 real(cup1) real(cup2) real(cup3)],... [0 imag(cup1) imag(cup2) imag(cup3)],... 'linewidth',1.5,'Color',[0 0 0] ) %negru pause(.001); %se şterge configuratia curenta a braţului cu line() lc=line([0 real(cup1) real(cup2) real(cup3)], ... [0 imag(cup1) imag(cup2) imag(cup3)],... 'linewidth',1.5,'Color',[1 1 1] ) %alb end
4. Elemente de CALCUL SIMBOLIC Variabila simbolică se memorează în forma unui şir de caractere % defineste mai multe obiecte simbolice
%defineşte un singur obiect simbolic x = sym('x') x= x
syms f g y g1 g2 ; whos % afisare tip variabile Name Size Bytes Class f g ......
1x1 1x1
Attributes
126 sym 126 sym
Derivare cu funcţia diff():
df , dx
syms x f0=3*x^3+5*x^2-6*x+2 % definire f0 pretty(f0) % vizualizare f0 3 2 3x +5x -6x+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)) ans = 1/x >> int(1/x)
% log= logaritm natural
derivare ordin 1, 2, 3:
% 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*(x1)^2 diff(f, x, 3) % derivată de ordin 3 ans = 24*x-42
45 Calculatoarelor
df d 2 f d 3 f , , dx dx 2 dx 3
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
ans = log(x)
Derivare funcţii trigonometrice: >> diff(sin(5*x)) >> diff(sin(x)^2) ans = ans = 5*cos(5*x) 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 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)
2. simplificare = se aduce la numitor comun+calcule:
fp=diff( RapPol ) =>
fps =
fps=simplify(fp),
fp = (4*x+3)/(x^2-x+3) - (2*x^2+3*x-1)/(x^2-x+3)^2*(2*x-1)
-(5*x^2-14*x-8)/(x^2-x+3)^2
pretty(fps)
pretty(fp) 2 4 x + 3 (2 x + 3 x - 1) (2 x - 1) ---------- - -------------------------2 2 2 x -x+3 (x - x + 3)
Derivate parţiale: 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
Funcţia ezplot():
2 5 x - 14 x - 8 - --------------2 2 (x - x + 3)
sau:
→
Matrice Jacobiana: % Calcul matrice Jacobiană=derivatele parţiale ale vectorului [g1; g2] % în raport cu variabilele independente x şi y
J =
∂ ( g1, g 2) ∂ ( x, y )
J = jacobian([g1; g2], [x y]) J = [ 60*x^2, 15] [ 1/4, 1]
% calcul Jacobian
Sau: jacobian([g1 g2], [x y]) sau: jacobian([g1; g2], [x; y]) “easy plot” ;
curbe 2D şi 3D
Grafice cu ezplot( )
46 Calculatoarelor
- ->
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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'); Æ
8 (x-54/25) (x-127/10) (x-383/10) (x+54/25) (x+127/10) (x+383/10) x 10
3 2 1 0 -1 -2 -3 -4 -40
-20
0 x
20
40
(x-1)2 (x-2) (x-3)+4
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
14 12 10 8
Æ
6 4 0
1
2 x
3
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]); Substituţii + simplificare (calculele numerice şi simbolice pot fi combinate): Substituie expresie simbolică într-o variabilă Substituie valoare numerică într-o variabilă syms x y; subs(f, y, 3) f = x^2*y + 5*x*sqrt(y) >>aa=subs(f, x, x^2+y) ans = subs(f, x, 3) ans = ans = (x^2+y)^2*y + 5*(x^2+y)*y^(1/2) 3*x^2+5*x*3^(1/2) >> simplify(aa) ans = x^4*y + 2*x^2*y^2 + y^3 + 5*x^2*y^(1/2) + 5*y^(3/2)
9*y+15*y^(1/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}) subs( [g1 g2], {x, y}, {1 , 2.5}) ans = 27.5000 1.750
sau:
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 ’ pretty(x12)
>> 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
[ 2 1/2 [ b – (b - 4 a c) [- 1/2 ------------------[ a [ [ 2 1/2 [ b + (b - 4 a c) [- 1/2 -------------------
→
47 Calculatoarelor
] ] ] ] ] ] ] ]
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
[
Sistem 2 ec. cu 2 necunoscute >> [sx sy] = solve( ' x + y = a ', ' x - 11*y = b ') sx = 11/12*a+1/12*b sy =
a
]
% solutie simbolica
1/12*a-1/12*b Soluţie ecuatie în raport de r apoi syms r, ze; >> solve( '1-r^2+2*ze^2*r^2 ' , r) % ex. suport vibratii
în raport de ze: >> solve('1-r^2+2*ze^2*r^2', ze) ans =
ans = -1/(1-2*ze^2)^(1/2) 1/(1-2*ze^2)^(1/2)
1/2*(-2+2*r^2)^(1/2)/r -1/2*(-2+2*r^2)^(1/2)/r
pretty(1/(1-2*ze^2)^(1/2)) Soluţii numerice: Expresie matriceală (se reia exemplul cu polyval): syms w; 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
% solutii numerice [sx sy] = solve(' x + y = 1 ' , ' x - 11*y = 5 ') sx = 4/3 sy = -1/3
solve(detB) %sau: solve( '20 - 70*w^2 + 50*w^4' ) ans = -1 1 1/5*10^(1/2) -1/5*10^(1/2)
% 4 solutii w1,w2,w3,w4 % (2/5)^(1/2)
Sistem 3 ecuaţii liniare (solutii numerice): [sx1 sx2 sx3] = solve(' 3*x1-x2=5 ' , ' -2*x1+x2+x3', ' 2*x1-x2+4*x3=15' ) %a doua ec. implicit=0 sx1 = 2 sx2 = 1 sx3 = 3
Rezolvare sistem două ecuaţii neliniare (solutii numerice): clear syms x1 x2 % definire funcţii h1 = x1*x1 + x2*x2 - 2; h2 = 0.25*x1*x1 +0.75*x2*x2 -1; [x1 x2] = solve(h1, h2); %rezolva sist. pt. x1 şi x2 x1 = -1 1 -1 1 x2 = -1 -1 1 1
% -1 - 1 sol#1 % 1 -1 sol#2 % -1 1 sol#3 % 1 1 sol#4
48 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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 ] [ --------- - --------- ] [ad-bc a d - b c] [ ] [ c a ] [- --------- --------- ] [ ad-bc ad-bc ]
%Matrice coloana * matrice linie [a; b]2x1 * [c d]1x2 ans = [ a*c, a*d] [ b*c, b*d]
det(A) ans = a*d - b*c Funcţia expand(): syms a b c ; c=sin(a+b) expand(c)
>> expand( cos(2*a) ) ans = 2*cos(a)^2 - 1
ans = sin(a)*cos(b)+cos(a)*sin(b)
etc.
expand(cos(a+b))
ans = cos(a)*cos(b)-sin(a)*sin(b)
f ( x + dx) − f ( x) = definiţia derivatei dx cos( x + dx) − cos( x) lim → -sin(x) dx →0 dx
Limite: f ( x) = lim
dx →0
49 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
>> syms x, dx >> limit( (cos(x+dx)-cos(x) )/dx, dx, 0) ans = -sin(x)
lim
dx →0
sau: >> diff(cos(x)) ans = - sin(x)
sin( x + dx) − sin( x) → cos(x) dx
sau: >> diff(sin(x)) ans = cos(x)
>> limit( (sin(x+dx) - sin(x) )/dx, dx, 0) ans = cos(x)
>> limit( (1+1/n)^n, n, inf ) ans = exp(1)
n
1 lim 1 + → exp(1) = e n → inf n
>> exp(1) ans = 2.7183 >> limit( (1+x/n)^n, n, inf ) ans = exp(x)
n
x lim 1 + → exp( x) = e x n → inf n
Dezvoltare în serie de funcţii Taylor
f ( x 0 + x ) = f ( x0 ) +
Serie MacLaurin
f ( 0 + x ) = f ( 0) +
syms x f1 = sin(x); T1 = taylor(f1,10)
f '' ( x 0 ) 2 f ''' ( x 0 ) 3 f ( n ) ( x 0 ) n f ' ( x0 ) x + Rn x + x + x+ n! 1! 2! 3!
f ' ( 0) f ' ' ( 0 ) 2 f ' '' ( 0) 3 f ( n ) ( 0 ) n x+ x + x + x + Rn 1! 2! 3! n!
% functie trigonometrică % primii 10 termeni
T1 = > x -1/6*x^3 +1/120*x^5 -1/5040*x^7 +1/362880*x^9 f2=cos(x); T2=taylor(f2,10)
% sunt afisati termenii nenuli
% functie trigonometrică
T2 = > 1 - 1/2*x^2 + 1/24*x^4 - 1/720*x^6 + 1/40320*x^8 Să se verifice relaţiile: e jx = cos(x) + j ⋅ sin(x)
e -jx = cos(x) - j ⋅ sin(x)
f3 =exp(j*x); T3 = taylor(f3,10) T3 = 1+ i*x- 1/2*x^2 - 1/6*i*x^3+ 1/24*x^4+ 1/120*i*x^5- 1/720*x^6 -1/5040*i*x^7+ 1/40320*x^8+ 1/362880*i*x^9
Diverse 1. Calculul funcţiei sin(x) folosind dezvoltarea în serie Taylor:
50 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
∞
sin(x) = ∑ (-1 )n n=0
∞ x 2n+1 = ∑ Tn (2n + 1)! n=0
=> Tn +1 = Tn ⋅
− x2 (2n + 2 )( 2n + 3 )
x=input('Dati valoarea lui x [radiani] pt calcul sin(x)\n') n=input('Numar iteratii n= \n') suma=x; T=x; %suma partiala si termenul curent for i=0:n T=-T*x^2/(2*i+2)/(2*i+3); suma=suma+T; end fprintf('Valoare calc= %20.15f \nVal calc Matlab=%20.15f\n',suma,sin(x) );
Rulare: x =0.4 Numar iteratii n= 23 Valoare calc= 0.389418342308650 Val calc Matlab= 0.389418342308651 2. Rezolvare sistem de ecuaţii liniare de forma: AX=B
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
3 x1 − x 2 = 5 − 2 x1 + x 2 + x3 = 0 2 x1 − x 2 + 4 x3 = 15
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= ... A1=[5 -1 0; 0 1 1; 15 -1 4]
%calcul direct % Cramer
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, 2. (A*B)-1=B-1 * A-1
3. 4.
(A-1)T=(AT)-1 det(A) * det(A-1)=1
5. (A+B)*C=A*C+B*C
det(AB)= det(BA)=det(A)*det(B)
4. Sortare prin metoda selecţiei a=input('Va sorta in ord. descresc.\nIntroduceti un sir: ') asort=sort(a,'descend'); n=length(a); for i=1:n-1 poz_max=i; for j=i+1:n if a(j)>a(poz_max) poz_max=j;%retine pozitie element maxim end end aux=a(i);a(i)=a(poz_max);a(poz_max)=aux; %interschimba
51 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea
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)
6. Integrare function y = myfun(x) %definitie functie y = 1./(x.^3-2*x-5);
quad('myfun',1,2) %integrare ans = -0.2860 rel="nofollow">> quad('myfun',-1,7) Warning: Minimum step size reached; singularity possible. > In quad at 103 ans = -0.3811
a ⋅ e jω t
52 Calculatoarelor
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea