Upload
dokhanh
View
270
Download
8
Embed Size (px)
Citation preview
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
1
MEDIUL DE PROGRAMARE MATLAB Curs 1 cont.
1. PREZENTARE GENERALĂ MATLAB® = Matrix laboratory este un limbaj de programare şi un sistem de dezvoltare a aplicaţiilor
din diverse domenii Matlab este dezvoltat de The MathWorks, Inc., SUA
Domenii de utilizare:
• Matematică, calcul numeric şi simbolic • Dezvoltarea algoritmilor • Modelare, simulare şi testarea prototipurilor • Achiziţii date de la senzori, analiza şi vizualizarea datelor • Grafica inginerească şi din ştiinţele aplicate • Dezvoltarea de aplicaţii, inclusiv GUI
MATLAB - s-a dezvoltata în: 1. mediul universitar -este pachetul standard pt. cursurile de inginerie, matematică şi ştiinţe aplicate 2. industrie - pentru cercetarea, dezvoltare şi producţie. S-a dezvoltat prin toolbox-uri - familii/colecţii de aplicaţii (funcţii .m) specializate: SimBiology - modelarea proceselor biologice, Aerospace Toolbox - extinde calculele tehnice în domeniul ingineriei aerospatiale, Bioinformatics Toolbox - mediu pentru analiza genomului, inginerie genetică, cercetări în biologie, Communications Toolbox, Control System toolbox - controlul sistemelor, Data Acquisition Toolbox – funcţii pentru achiziţii de date şi adaptori pentru interfaţare cu hardware specific (plăci de achiziţii ale diferitelor firme), Database toolbox – funcţii MATLAB pentru import şi export de date cu baze de date relaţionale Distributed Computing Toolbox coordonarea şi execuţia operaţiilor aplicaţiilor Matlab simultan într-un cluster de calculatoare crescând viteza de execuţie a aplicaţiilor mari, Financial toolbox - calcule financiare, Fuzzy logic toolbox – logica fuzzy, Genetic algorithm - algoritmi genetici, Image acquisition toolbox - achiziţii de imagini, Image processing toolbox – procesarea imaginilor, Neural network toolbox – reţele neuronale, Optimization toolbox – optimizări de sisteme, Partial Differential Equation Toolbox – ecuaţii diferenţiale cu derivate parţiale, Robust Control Toolbox – funcţii pentru analiza şi proiectarea sistemelor de control multiinput-multioutput MIMO cu incertitudini, Signal Processing toolbox - procesarea semnalelor, Spline toolbox – curbe spline, Statistics toolbox – funcţii statistice, Symbolic Math - calcule simbolice, System identification toolbox – identificarea sistemelor, Virtual reality toolbox – realitate virtuală, Wavelet toolbox – funcţii pentru reconstrucţia semnalelor, etc.
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
2
Sistemul MATLAB conţine: 1.Limbajul MATLAB, 2.Mediul de lucru MATLAB, 3.Handle Graphics®, 4.Biblioteca de funcţii matematice, 5.Interfaţa de aplicaţii program a MATLAB-ului (API)
1.Limbajul MATLAB: - un limbaj de nivel înalt (gen.4), tipul de bază este matricea, există instrucţiuni de control, funcţii, structuri de date, intrări/ieşiri; permite programare orientată pe obiecte.
Facilităţile de programare sunt organizate pe 6 directoare din …toolbox/matlab/
ops Operators and special characters. all(), any, xor, or, transpose sau .’, ctranspose (‘), ldivide sau .\ , rdivide sau. / …
lang Programming language constructs. if, for, while, case, function, persistent …
strfun Character strings. char, ischar, strcat …
iofun File input/output. input, fscanf, fprintf, fopen, fseek …
timefun Time and dates. clock, date …
datatypes Data types and structures. cell, class, int8, double, logical, struct …
2.Mediul de lucru MATLAB: set de facilităţi care permit manevrarea variabilelor în
spaţiul de lucru, importul/exportul de date, dezvoltarea, manipularea, editarea şi depanarea fişierelor MATLAB (.m) şi a aplicaţiilor MATLAB.
Aceste facilităţi sunt în dir. general din toolbox/matlab/:
general General purpose commands. beep, delete, dir, rmdir, dos, echo, exit, import, load, who, whos, ver, save, quit etc.
3.Handle Graphics® Reprezintă sistemul grafic al MATLAB-ului. Cuprinde comenzi de
înalt nivel pentru vizualizarea datelor bi şi tri-dimensionale, procesarea imaginilor, animaţie, prezentări grafice. Permite de asemenea utilizarea unor comenzi de nivel scăzut pentru crearea unor interfeţe grafice GUI. Funcţiile grafice sunt organizate în 5 directoare din …toolbox/matlab/:
graph2d Two-dimensional graphs: plot, grid, polar, subplot etc.
graph3d Three-dimensional graphs: plot3, surf, mesh, zlabel etc.
Specgraph Specialized graphs: bar, bar3, stem, comet3, ezplot, voronoi etc. graphics Handle Graphics: figure, hold, print, line, rectangle etc. uitools Graphical user interface tools: menu etc.
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
3
4.Biblioteca de funcţii matematice a MATLAB-ului Reprezintă o colecţie complexă de algoritmi de calcul pornind de la funcţii elementare (sinus, cosinus etc.) până la funcţii sofisticate (inversarea de matrice, valori proprii, funcţii Bessel, FFT etc.). Funcţiile matematice sunt organizate în 8 directoare: elmat Elementary matrices and matrix manipulation. isempty(x),zeros(3)
elfun Elementary math functions. abs(),sin(),tan,sinh,exp, log, log2, log10, imag,real
specfun Specialized math functions. bessel,cross,dot,factorial
matfun Matrix functions – numerical linear algebra. trace,lu,rank,svd,eig ...
datafun Data analysis and Fourier transforms. fft,ifft, mean,var,std,lscov
polyfun Interpolation and polynomials. residue, Legendre, convhull
funfun Function functions and ODE solvers. ode23, ode45(), fzero, ...
sparfun Sparse matrices. full(), sparse() …
5.Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite
scrierea de programe în C/C++ sau Fortran care interacţionează cu MATLAB-ul. Include facilităţi pentru apelarea rutinelor din MATLAB, apelarea MATLAB-ului ca maşină de calcul, scrierea şi citirea fişierelor de tip MAT . Interfaţare cu Java, Python.
SIMULINK =pachet software pt. modelarea, simularea şi analiza sistemelor dinamice. Pot fi modelate sisteme (mecanice, electrice) liniare, neliniare, continue, discrete, hibride.
SIMULINK are interfaţă grafică utilizator (GUI) pentru crearea modelelor sub forma unor diagrame construite din blocuri, pe baza unor tehnici de tip click-and-drag realizate cu mouse-ul. Astfel, trasarea diagramelor este simplă şi intuitivă, aproape la fel de simplă ca trasarea acestor diagrame direct pe hârtie. În plus, se evită formularea matematică laborioasă (sistemele dinamice sunt de regulă descrise de ecuaţii diferenţiale).
Real-time Workshop® este un program care permite generarea de cod C pentru schemele bloc create în SIMULINK şi astfel permite rularea de aplicaţii în timp real.
2. MEDIUL DE LUCRU MATLAB
Lansare sub Windows: “shortcut” la programul executabil
La pornire, MATLAB-ul execută automat fişierele: matlabrc.m rezervat pentru administratorul de sistem şi startup.m. (în directorul local) este destinat utilizatorilor; se pot defini setările implicite
pentru instrumentele Handle Graphics şi se pot predefini variabile în spaţiul de lucru.
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
4
Terminarea sesiunii de lucru: comanda >>quit la prompterul MATLAB sau exit din meniul File
Fereastra de comandă (fereastra principală) unde Interpretorul MATLAB afişează un prompter (>>).
De exemplu, pentru introducerea unei matrice 3 x 3 se poate tasta: » A = [1 2 3-2i; 4 5 6; 7 8 10]
şi la apăsarea tastelor Enter sau Return, MATLAB-ul răspunde cu: A = 1 2 3-2.0i 4 5 6 7 8 10
Editarea liniilor de comandă în fereastra principală
Arrow Key Control Key efect
sau: Ctrl-p previous line - comanda precedenta
sau: Ctrl-n next line – comanda urmatoare tastata
Ştergerea ferestrei de comandă:>> clc % , nu şterge variabile din spaţiul de lucru.
Controlul afişării paginilor ecran în fereastra de comandă
Controlul afişării paginilor în fereastra de comandă: more off şi more on.
Întreruperea unui program care rulează : Ctrl-c
Comanda format controlează formatul numeric (numărul de zecimale) al valorilor afişate pe ecran (dar nu reprezentarea în memorie): File/ Preferences/Comand Window sau comanda:
format short 4 zecimale (implicit), π: 3.1416 sau format long 15 zecimale: π: 3.141592653589793 etc.
Suprimarea afişării rezultatelor unei linii comandă - dacă încheiem linia de comandă cu punct şi virgulă “;” rezultatele nu sunt afişate la ecran. Exemplu: >> magic(3) % fara ; ans = 8 1 6 3 5 7 4 9 2 A = magic(3);
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
5
Linii de comandă lungi: întrerupere prin trei puncte urmate de Return sau Enter pentru a indica faptul că expresia continuă pe linia următoare. Exemplu:
s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 . . . - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;
>> A = [1 2 3-2i; ... 4 5 6 ; ... 7 8 9 ]
Fereastra de comandă permite rularea comenzilor MATLAB, lansarea unor instrumente cum ar fi Editor/Debugger şi permite startarea toolbox-urilor.
Spaţiul de lucru (workspace) al MATLAB-ului -conţine setul de variabile (vectori, matrice, structuri, cells etc.) alocate în memorie şi pot fi
editate din linia de comandă. comenzile >> who şi whos (mai detaliat) listează variabilele curente din workspace. comanda >> clear % ştergerea variabilelor din workspace
>>clear v1 % şterge variabila v1 >>clear v* % şterge variabilele care încep cu caracterul v
Citirea sau scrierea unor fişiere .mat (fişiere de date Matlab) din programe externe în C sau
Fortran se poate face cu Interfaţa de Aplicaţii Program (API). Încărcarea şi salvarea din workspace Comenzile save şi load: - au rolul de a salva variabilele din spaţiul de lucru şi respectiv de a le reîncărca într-o
sesiune ulterioară; aceste comenzi se pot folosi şi pentru a importa şi exporta date. Pe platformele Windows, operaţiile save, load sunt disponibile şi prin selectarea opţiunilor Save Workspace As, respectiv Load Workspace din meniul File.
Formatul în care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri (opţiuni) în lista de nume de fişiere sau variabile:
-mat Utilizează formatul binar tip .MAT (implicit). -ascii Utilizează formatul ASCII pe 8 digiţi. -ascii -double Utilizează formatul ASCII pe 16 digiţi. -ascii -double –tabs Delimitează elementele tablourilor cu tab-uri. -append Adaugă datele într-un fişier .MAT existent. Exemple: save save f1_var [–mat]
Salvează toate variabilele în fişierul matlab.mat Salvează toate variabilele în fişierul fi_var.mat
Încărcarea unor fişiere cu date ASCII (format text) Comanda load importă fişiere de date ASCII. Exemplu: scriem fisierul date.dat conţinând: 1 2 3 4 2 3 4 5
» load date.dat %incarca şi creaza variabila matrice [1 2 3 4; 2 3 4 5] creează o variabilă cu numele date în workspace.
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
6
Nume de fişiere ca şiruri de caractere Dacă numele fişierelor sau variabilelor cu care se lucrează sunt stocate în variabile de tip şir
de caractere, se poate folosi dualitatea comandă/funcţie pentru a apela load şi save ca funcţii. De exemplu
» save('myfile','VAR1','VAR2') %salveaza variabilele var1 şi var2 în myfile.dat » A = 'myfile'; » load(A)
au acelaşi efect cu: » save myfile VAR1 VAR2 » load myfile
Wildcards Comenzile load şi save permit specificarea unui caracter special de tip wildcard
(*). Exemplu: » save rundata x* %salvează toate variabilele din workspace care încep cu x în fişierul rundata.mat.
Browser-ul Workspace (varianta grafică a comenzii whos) permite vizualizarea conţinutului spaţiului de lucru curent.
Exemplu: vizualizarea datelor incărcate cu load
Directorul curent al MATLAB-ul pentru lucrul cu fişiere de tip .m şi .mat.
3. FUNDAMENTE DE PROGRAMARE ÎN MATLAB 3.1. Cuvinte rezervate (Keywords) ale limbajului MATLAB: 'break' , 'case', 'continue' 'if ' 'else' 'elseif' 'end' 'for' 'function' ‘global' 'otherwise' 'persistent' 'return' 'switch' 'try' ‘catch’ 'while'. Pentru listarea lor se tastează funcţia: iskeyword 3.2. Expresii
MATLAB-ul lucrează cu expresii matematice ca şi celelalte limbaje de programare Instrucţiunile Matlab sunt adesea de forma: variabila=expresie sau numai: expresie Se evaluează valoarea expresiei din dreapta semnului = iar valoarea obţinută se atribuie
variabilei din stânga semnului =. Pentru forma simplificată (a doua) valoarea expresiei se atribuie unei variabile `ans` (answer)
create imediat de Matlab. >> 1/3 ans = 0.3333
>> sqrt(2) ans = 1.4142
>> e1=exp(1) e1 = 2.7183
>> tan(pi/4)^-1 ans = 1.0000
Expresia = înşiruire de operanzi şi operatori;
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
7
operanzii: nume de variabile, constante, nume (sau apel) de funcţii, operatorii: +, *, .*, ^, .^ etc.
>> 4 * sin(pi/6) / sqrt(2) + 3^2 - exp(2) * tan(pi/4) ans = 3.0252
Matlab lucrează în mod linie având la bază un interpretor (şi nu compilator). Fiecare instrucţiune pe rând este trimisă interpretorului şi evaluată.
3.3. O variabilă MATLAB este: - un nume care se asignează (asociază) unei zone de memorie unde sunt stocate valori. - prin nume citim/scriem valoarea din/în memorie şi folosim valoarea în expresii. - de trei tipuri de variabile dispune Matlab: locale, globale şi persistente(locale funcţiei, nu se şterg la ieşire, valoarea lor este reţinută şi regăsită la un nou apel al aceleaşi funcţii). MATLAB-ul NU necesită declararea dimensiunii variabilelor, deoarece la întâlnirea unui
nou nume de variabilă generează automat variabila respectivă şi alocă spaţiul necesar de memorie. Tipul de dată asociat numelui se poate schimba în acelaşi program:
>> a=123 a = 123
>> a='qwer' a = qwer
>> a=[1 2 3; 2 3 4; 3 4 5] a = 1 2 3 2 3 4 3 4 5
Numele unei variabile este o literă, urmată de un număr “oricât” de mare de litere, cifre sau simboluri. Din nume numai primele 31 de caractere sunt folosite pentru identificare.
MATLAB-ul este case sensitive - face distincţie între literele mici şi cele mari (în nume). Exemplu:
» a = 30 » A=30 % alta variabila diferita de a creează o matrice 1 x 1 cu numele a şi stochează (memorează) valoarea 30
Reprezentarea numerelor imaginare este realizată cu litera i sau j. Exemple: >> sqrt(-2) ans = 0 + 1.4142 i
>> abs(3+4j) ans = 5
>> i ans = 0 + 1.0000i
>> j ans = 0 + 1.0000i
>> exp(i*pi/2) ans =
0.0 + 1.0000i Aplicăm rel. Euler:
cos(pi/2) + i*sin(pi/2) Operatori elementari Operatori aritmetici în cadrul expresiilor: + adunare - scădere \ împărţire la stânga * multiplicare / împărţire ^ ridicare la putere ` transpusa unei matrice sau complex conjugata unui număr complex ( ) operatorul de specificare a ordinii de evaluare (cu prioritate maximă)
3.4.Funcţii matematice MATLAB-ul furnizează un mare număr de funcţii matematice elementare standard: abs, angle, sqrt, exp, log,log10,log2, sin(argument în radiani), asin,
sind(argument grade), asind, atan2, sinh, imag, real, rem, sign … >> angle(i) ans = 1.5708
>>rem(5,3) %rest ans = 2
>> sind(30) ans = 0.5000
>> atan2(-1,0) ans = -1.5708 % -pi<= ATAN2(Y,X)<=pi
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
8
>>exp(2) % 2.7183^2 ans = 7.3891
>> log(2.72) ans = 1.0006 % f.logaritmica
>> atan2(1,0) ans = 1.5708
Există şi funcţii matematice avansate (funcţii Bessel, gama etc.),
multe dintre acestea acceptând argumente complexe. Pentru vizualizarea funcţiilor elementare se poate tasta: » help elfun Pentru a vedea lista funcţiilor avansate se poate tasta:
» help specfun sau » help elmat ♦ O parte din funcţii sunt de tip built-in (cum sunt sqrt, sin)şi - fac parte din nucleul Matlab, fiind compilate; - oferă viteză de execuţie sporită (accesul la structura funcţiei nefiind permis). ♦ Alte funcţii sunt implementate ca fişiere MATLAB (M-files) şi pot fi modificate. Pentru a găsi calea spre codul sursă a unei funcţii MATLAB M-file folosim funcţia which: >> which exp … => built-in (D:\MATLAB\toolbox\matlab\elfun\@double\exp) >> which pascal …=> D:\MATLAB\toolbox\matlab\elmat\pascal.m Sunt două tipuri de fişiere M-files: script şi function (pot primi şi returna valori). ♦ Câteva funcţii furnizează valorile unor constante:
pi 3.14159265
i şi j Imaginary unit, (sqrt(-1) )
eps Precizia Floating-point 2-52 (2.2204e-016)
realmin Cel mai mic număr real floating-point, 2-1022 (2.2251e-308)
realmax Cel mai mare număr real floating-point, 21023 (1.7977e+308)
Inf Infinit
NaN Not a Number • Numele funcţiilor NU sunt rezervate şi deci este posibilă suprascrierea lor.
Exemplu: » eps = 1.e-6 » true=0 (implicit true=1) Funcţia originală este reconstituită (ştergând variabilele noi) prin comanda: » clear eps » clear true
Alte exemple de expresii Exemple de expresii şi rezultatele evaluării acestor expresii:
» rho = (1+sqrt(5))/2 rho = 1.6180
» a = abs(3+4i) a = 5
>> exp(i*pi) ans =
-1.0000 + 0.0000i
» huge1 = exp(log(realmax)) huge1 = 1.7977e+308
» toobig = pi*huge1 toobig = Inf
3.5.Generarea unui VECTOR de VALORI: a) vector = val_initială : pas : val_finală
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
9
t=2 : 10 Creează vectorul t = 2 3 4 5 6 7 8 9 10 (pas=1, implicit) t[1] t[2] t[3] ....... t[9]
t1=0 : 0.2 : 1.3 t1 = 0 0.2000 0.4000 0.6000 0.8000 1.0000 1.2000 t1[1] ....... t[7]
t2=-2 : 3 : 11 t2 = -2 1 4 7 10 t2[1] t2[5]
Pas negativ: t3=5 : -1 : -1.1 t3 = 5 4 3 2 1 0 -1 t3[1] t3[7] length(t3) -> ans= 7 >> t3(10)=105 %se adauga un element pe pozitia 10 t3 = 5 4 3 2 1 0 -1 0 0 105 >> length(t3) -> ans =10 b) Vector cu spaţiere liniară val initială, val finală, numar valori (inclusiv prima şi ultima):
›› x=linspace(-300, 100, 5) rezultă: x = -300 -200 -100 0 100
c) Vector cu valori spaţiate logaritmic: ›› x1= logspace(2, 4, 3) generează 3 valori 10^2 10^3 10^4 x1 = 100 1000 10000 ›› x2= logspace(-1, 2, 5) gen. 5 valori 10^-1 … 10^2 (inclusiv capetele) => x2 = 0.1000 0.5623 3.1623 17.7828 100. 3.6. NUMERE COMPLEXE (coordonate carteziene şi polare): >>z = 3.0000 + 4.0000i % x + iy >>conj(z) % x - iy ans = 3.0000 - 4.0000i >> z ' ans = 3.0000 - 4.0000i
Modulul: >> r = abs(z) r = 5
>> r1=abs (conj(z)) r1 = 5
>> z+conj(z) % rezultă număr real ans = 6 % Obs: conj(z) sau z’
% x + iy + x – iy = 2x
Faza:
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
10
>> fi=angle(z) fi = 0.9273 % in cadran I % pi/2=1.57rad >> fi1=angle(conj(z)) fi1= - 0.9273 % cadran IV >> pi/2 ans = 1.5708 % radiani
Modul (continuare): >> z * conj(z) % (x + iy)(x - iy)=x^2 - (iy)^2= x^2+y^2 ans= 25 >>compass( [z, conj(z), z*conj(z)] ) % figura % [vector valori complexe] >> sqrt( z * conj(z) ) ans = 5 % verificare egalitate/ expresie logică >> sqrt( z*conj(z)) == abs(z) ans = 1 (true)
Obs:după % se inserează comentarii în Matlab
Formula lui Euler (bijuterie): ϕϕϕ jej =+ sincos (fun.exponential complexă, 1−=j )
% Exprimare z în coordonate carteziene
% yjxz += sau )sin(cos ϕϕ jzz +⋅=
unde φ =angle(z)
% Exprimare z în coordonate polare % ϕjezz ⋅=
Cod Matlab: ↨ ↨ >> abs(z)*( cos(fi) +i*sin(fi) ) ans = 3.0000 + 4.0000i
>> abs(z) * exp(j*fi) ans = 3.0000 - 4.0000i
Adunare şi scădere de numere complexe: ›› z = 3.0000 + 4.0000i ›› z2= -4.00 + 2i
% z+z2= )()( 22 yyjxx +++
% z-z2= )()( 22 yyjxx −+− >> z + z2 ans = -1.0000 + 6.0000i >> fi_sum=angle(z+z2) fi_sum= 1.7359 % radiani
% rezultat in Cadran II
>>angle(z+z2) > pi/2 ans = 1 >>plot(-1.0000+6.0000i, '*', … 'MarkerSize',20 , 'LineWidth',2 ) >> line... >> grid on
Variante de reprezentare grafică a numerelor complexe
Fig.1.Numărul complex z în planul complex
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
11
>> plot(z,'s') % s=square, d=diamond etc. >> line([0 real(z)], [0 imag(z)]) % line( lista abscise, listă ordonate) % linie din (0,0) în ( real(z), imag(z) ) %continuă reprezentarea in fereastră >> hold %Current plot held >> plot(z2,'s') %z2= -4.00 + 2i >> line([0 real(z2)],[0 imag(z2)]) % traseaza a doua linie
Inmulţirea a două numere complexe Forme carteziene: z1*z2= ))(( 2211 yjxyjx ++ = )()( 21212121 xyyxjyyxx ++−
Forme polare: z1*z2= )(
2121 ϕϕ +⋅⋅ jezz
= produsul modulelor şi suma fazelor
Cod Matlab: >>z = 3.0000 + 4.0000i >>z2= -4.00 + 2i >> z*z2 ans = -20.0000 -10.0000i
Inmulţire în forme polare: >> abs(z)*abs(z2)*exp(i*fi)*exp(i*fi2) %sau >> abs(z)*abs(z2) * exp( i*(fi+fi2) ) % idem ans = -20.0000 -10.0000i
Impărţirea a două numere complexe Forma carteziană:
2222
22
)(
)()())(())((
vuxvyuj
vuyvxu
vuyuxvjyvxu
jvujvujvuyjx
jvuyjx
wz
+−
+++
=
++−++
=−+−+
=++
=
Forme polare:
)(
2
1
2
1
2
1 21
2
1ϕϕ
ϕ
ϕ−== j
j
j
ezz
ezez
zz
= câtul modulelor şi diferenţa fazelor
Cod Matlab: >>z = 3.0000 + 4.0000i >>z2= -4.00 + 2i >> z / z2 ans = -0.2000 - 1.1000i
Impărţire în forme polare (explicit): >> abs(z)/abs(z2)* exp(fi*i)/ exp(fi2*i) ans = -0.2000 - 1.1000i
Inmulţirea j*z= )( yjxj + = yjx − = jxy +−
Numărul complex jz se obţine prin rotirea lui z cu 90 grade în sens trigonometric.
Varianta polară: 21π⋅
⋅=j
ej => jz=)
2(
2 *1πϕϕ
π+
⋅=⋅jjj
ezeze
Impărţirea z/j= jxyyjxj
yjx−=
−−
=+
1
Varianta polară: Fig. 4. z şi z/ j=y-jx
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
12
)2
()2
(*1)(
11 π
ϕπ
−⋅−⋅⋅=⋅⋅=−⋅=
−⋅=⋅
jjjeezezjzjz
jz =
)2
( πϕ−⋅
jez
Numărul complex z/j se obţine prin rotirea lui z cu 90 grade în sens orar
Curs 2 Reprezentare vectori cu originea în (0,0): z = 3.0000 + 4.0000i compass([z, z/i, z*i]) % fig. stanga .............. %Ridicare număr complex la puterea n: z=exp(.3i) % modul =1, unghi=0,3rad compass( [z, z^2, z^3, z^4] , '-*r') % fig. dreapta
compass([exp(j*pi/2) , 2*exp(pi/6*j) , 2*exp(pi/6*j) / j], '-*') % vector de valori complexe date prin functia exp de variabila complexă
Grafic z, z*j, z/j >> plot(z, 's') % sau plot( real(z),imag(z), 's' ) >> hold % Current plot held >> plot(z * j, '*') >> plot(z / j, 's') >> line([0 real(z)],[0 imag(z)]) >> line([0 real(z*j)],[0 imag(z*j)]) >> line([0 real(z / j)],[0 imag(z / j)]) >> grid on
Obs: Trasare linie poligonală >> line( [ 1 2 3], [2 5 -1] ) % vector abscise, vector ordonate similar cu plot
-4 -3 -2 -1 0 1 2 3 4
-3
-2
-1
0
1
2
3
4
3.7 CALCULE ELEMENTARE CU MATRICE >> A=[1 2 3; 3 4 5; 5 6 7] A = 1 2 3 3 4 5 5 6 7
>> B=[-1 0 1] ' % B 3x1 B = -1 %coloana 0 1
>> B' ans = %linie -1 0 1
Înmulţiri valide: >> A*B %3x3 3x1->3x1 ans = 2 2 2
>> A'*B % 3x3 3x1 -> 3x1 ans = 4 4 4
>> B'*A %1x3 3x3 -> 1x3 ans = 4 4 4
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
13
Matricea 2D văzută ca Vector 1D:
A = 1 2 3 3 4 5 5 6 7
A(1:end) %elem. luate pe coloane ans = 1 3 5 2 4 6 3 5 7
>> A(1:end)*A(:) ans = % A(:) =vector 9x1 174 % suma pătratelor
>> A(:)’ * A(:) ans = % A(:) vector 9x1 174 % suma pătratelor
Să se ridice elem.: A(2), A(3), A(4) la pătrat: >> A(2:4) .* A(2:4) % sau A(2:4) .^2 ans = 9 25 4
%Elem. din 2 linii la pătrat: [A(1,:) A(2,:)] .^2 ans = 1 4 9 9 16 25
Preluare de zone din matrice: >> C1=A(2,:) % linia #2 C1 = 3 4 5
>> C2=A(:,3) % coloana #3 C2 = 3 5 7
››A(2,:)*A(:,3) ans = 64 %1x3 3x1->1x1
>> C2*C1 %3x1 1x3 ->3x3 ans = 9 12 15 15 20 25 21 28 35
>> A(1:2,:) % 2lin, toate col ans = 1 2 3 3 4 5
>> C1(2:3)*A(1:2,:) % 1x2 2x3 ans = 19 28 37
Produs scalar a doi vectori (de câte 4 valori fiecare): A = 1 2 3 3 4 5 5 6 7
Vezi şi funcţia dot() Vector dot product
OBS: prod. scalar a doi vectori perpendiculari este 0
>> A(1:4) %luate pe coloane ans = 1 3 5 2
>> V= 1:2:7 V = 1 3 5 7
>> A(1:4)* V' ans = %1x4 4x1->1x1 49
Produs vectorial a doi vectori v=[1 2 3]; u=[3 4 5]; >> pv=cross(u,v) >>pv= 2 -4 2
pv este ┴ pe v >> dot(pv,v) ans = 0 prod scalar este 0
pv este ┴ pe u >> dot(pv,u) ans = 0 prod scalar este 0
Inversa matricei
>> D(3,3)=7 % add 1 col D = 7.3891 1.0000 0 1.4142 5.0000 0 1.0000 0 7.0000
>> D^-1 %inversa 3x3 ans = 0.1407 -0.0281 0 -0.0398 0.2080 0 -0.0201 0.0040 0.1429
>>D=[exp(2) 1; ... sqrt(2) 5; ... 1 tan(0)] D = 7.3891 1.0000 %3 linii, 2col 1.4142 5.0000 1.0000 0
>> D*D^-1 ans = 1.0000 0 0 -0.0000 1.0000 0 0.0000 -0.0000 1.0000
>> D^-1 * D ans = 1.0000 0.0000 0 -0.0000 1.0000 0 -0.0000 -0.0000 1.0000
>> 2*D = = D+D %test >> D*D= =D^2 %la putere
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
14
ans = 1 1 1 1 1 1 1 1 1
ans = 1 1 1 1 1 1 1 1 1
“Impărţiri” / şi \ >> M / D ans = 0.9654 0.0069 0.8571 0.0824 0.9835 1.0000 0.1645 1.7671 0.2857
>> M * D^-1 %=M / D ans = 0.9654 0.0069 0.8571 0.0824 0.9835 1.0000 0.1645 1.7671 0.2857
>> M=magic(3) ans = 8 1 6 3 5 7 4 9 2 % suma pe fiecare linie=15 suma pe fiec. col. = 15 suma DP =suma DS=15
>> M \ D ans = 0.9474 -0.5750 0.4472 -0.3146 0.0500 0.7389 0.0207 0.9250 -0.7194
>> M^-1 * D %=M \ D ans = 0.9474 -0.5750 0.4472 -0.3146 0.0500 0.7389 0.0207 0.9250 -0.7194
3.8.Tipuri de date in Matlab Tipul fundamental de dată la baza produsului Matlab este matricea. Elementele matricei sunt de acelaşi tip de dată: întreg sau real, logic, caracter, structură
etc. Tipurile structură şi tablouri de celule stochează tipuri diferite de date în câmpurile
lor. Pot fi de asemenea dezvoltate tipuri noi de date proprii utilizatorului folosind clase Matlab
(user classes şi Java classes). Sunt 15 tipuri fundamentale de date (matrice sau tablou) variind de la minim 0 x 0 elemente la n dimensionale.
Cuvintele cheie asociate tipurilor fundamentale sunt scrise cu litere mici (Figura->).
Pot fi create matrice 2D de tip double şi logical fiecare putând fi în format FULL sau SPARSE (pentru matrice cu marea majoritate a elementelor nule pentru economie de memorie).
Tipul de dată Exemple Descriere Tablou de întregi signed (int) şi unsigned (uint) O valoare ocupă 8, 16, 32 resp. 64 biţi în memorie tip data ce valori poate conţine:
Întreg: int8, uint8, int16, uint16, int32, uint32, int64, uint64
uint16(65000) ( conversie la uint16 )
int8 uint8 int16
uint16 int64
[de la -128 la 127] [de la 0 la 255] [-32768 la 32767] [ 0 la 65535] [ -2^63 la (2^63)-1 ] sau: [ -9.2234e+018 la 9.2234e+018]
Single single(3.1 * 10^38) Tablou de numere în simplă precizie. Dpdv al
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
15
(4 octeţi)
single(5+6i) %conversie 16->8oct
memoriei: mai puţină decât tipul double având mai mică precizie şi domeniu de valori mai îngust. Domeniul <0:[ -3.40282e+038 to -1.17549e-038] şi
>0: [1.17549e-038 to 3.40282e+038 ] Spaţierea:Eps(1)=4.7684e-007 aprox. (=2^-
21) Double (tip implicit) (8 octeţi)
3.4 * 10^300 5 + 6i [1 2; 3 4.1]
Tablou de numere în dublă precizie (este tipul implicit de dată). Tablourile 2D pot fi de tip sparse. Domeniul: -1.79769e+308 to -2.22507e-308 şi
2.22507e-308 to 1.79769e+308 Spaţierea(eps): 2.2204e-016 aprox (=2^-52)
Logical (1 octet)
x = [true, true, false, 1]; >> magic(2) => ans = 1 3 4 2 >> magic(2) > 2 ans = 0 1 1 0
Există două valori logice: 1 (true) şi 0 (false). Orice valoare diferită de 0 este considerată true (1) >> true & [0 1 4 -4 false true] ans = 0 1 1 1 0 1 Tablourile 2D de valori logice pot fi sparse (rare).
Char (2 octeţi/ caracter)
'Dati val. pt. vector: ' mesaj='Hello' >> mesaj(2:4) ans = ell length('Dati val. pt. vector: ') ans = 22
Tablou de tip caracter (sau şir de caractere–string); - fiecare caracter se memo. pe 16 biţi (2oct) lungime. Tablou de caractere. Şirurile sunt reprezentate ca vectori de caractere. Pentru tablouri ce conţin mai mult de un şir se preferă folosirea tipului cell arrays.
Structure str.numar = 124; str.color = 'alb'; str.matr = magic(3); str.logic=[true]; prin “.” se refera câmpul str(2).numar = -17;
Structura este un set de câmpuri; fiecare câmp are nume propriu (numar, color, matr, logic) şi memorează orice tip de dată. Structura are nume ex:”str” . O structură singulară este un tablou 1 x 1 de structuri aşa cum un scalar numeric (ex:7) este o matrice 1 x 1. Se pot forma tablouri de structuri.
Cell array a{1,1} = 12; a{1,2} = 'Red'; a{1,3} = magic(4); a{2,3}='a' b={5, 'e', [1 2;3 4]}
Tablou de celule indexate. Fiecare celulă poate memora un tablou de orice tip sau mărime. Celulele tabloului se referă prin acolade : ex: a{1,1} este tablou 1x1 de double, a{1,2}->tablou 1x3 caractere, a{1,3} -> matrice 4x4 cell2={12, 'asdf', [1 2;3 4]; 1:3,[],'aa'} (alt exemplu)
Function handle
ra2=@sqrt struct(2).a1=@sin cell2{4,1}=@cos
Pointer la o funcţie. Câmpul a1 al structurii struct memorează pointer la funcţie. >> ra2(2) ans = 1.4142 >> cell2{4,1}(pi) >> struct(2).a1(pi/2) ans = > -1 ans= > 1
User class polynom([0 -2 -5]) Obiecte construite dintr-o clasă definită de utilizator Java class java.awt.Frame Obiecte construite dintr-o clasă Java (vezi clase Java)
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
16
Valorile numerice sunt stocate intern, implicit în format virgulă mobilă double-precision. Pentru a stoca un întreg trebuie realizată conversie (vezi funcţii de conversie) de la tipul double la tipul întreg dorit. Ex.1. Conversie la întreg pentru a memora val. 325 într-o variabilă întreagă cu semn pe 16-bit:
x = int16(325); % x este un tablou 1 x 1 de întregi cu semn x1=int32(500.499) % se va memora 500 (partea fracţionară este neglijată) x2=int32(500.500) % se va memora 501 (rotunjire la întregul mai mare)
Ex.2.Tablou de valori logice >> val_log = true % este un tablou 1x1 de valori logice val_log = 1
>> a = [true, true, false, true, false] % a este tablou 1 x 5 de val. logice a = 1 1 0 1 0 >>b = [2.5 6 .7 9.2 inf 4.8]; >>isfinite(b) % testeaza daca valorile sunt finite ans => 1 1 1 0 1 >>d=magic(3) % 15=sume pe linii=
8 1 6 %=sume pe coloane= 3 5 7 %=suma pe DP si DS =15 4 9 2
>> d >= 5 ans = 1 0 1 0 1 1 0 1 0
Ex.3.Tablou 1D - şir de caractere, 1 x 14 numit: pr_nu >> pr_nu =’Marius Giurgiu’
>> length('Marius Giurgiu') ans = 14 % 14 x 2 -> 28 octeti in memorie
- în workspace apare: Name Size Bytes Class pr_nu 1x14 28 char
Tablou 2D de caractere <2 x 15 char> sau tablou de şiruri de caractere de lungimi egale:
>>nume = ['Marius Giurgiu ' ; 'Mircea Bolboaca'] % s-a adăugat un blank după Giurgiu pentru a avea nume = % siruri de lungimi egale pe fiecare linie Marius Giurgiu Mircea Bolboaca
>> nume(2, 7:15) % linia 2 coloanele 7:15 ans = Bolboaca !Facultativ cell array: Este incomod de a lucra cu şiruri de lungimi egale în tablouri de caractere. Se poate trece la tipul cell array care permite şiruri de lungimi oarecare. Conversia se face cu funcţia cellstr: >> cell_array1=cellstr(nume) cell_array1 = { 'Marius Giurgiu' , ... 'Mircea Bolboaca' } >> cell_array1{1} ans = Marius Giurgiu cell_array1{1}(1) ans => M
>> cell_array1{2} ans = Mircea Bolboaca >> cell_array1{2}(2:4) % identific cell cu { } ans = % apoi in tablou refer cu ( ) irc
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
17
Ex.4. Structuri (tablou de câmpuri cu nume) Construirea unui tablou de structuri 1x1 (structură singulară) prin asignare de date fiecărui
câmp în parte: student.nume = 'Giurgiu'; student.prenume = 'Marius'; student.note = [9 7 10; 8 9 10; 9 8 4];
In continuare se poate adăuga a doua structură din tablou => tablou de structuri: student(2).nume='Botean' student(2).prenume='Tudor' student(2).note=[5 8; 9 9; 10 9]
Accesarea datelor în structură: Pentru afişare în fereastra de comenzi tastăm: » student(1) % sau student(2) ans = nume: 'Giurgiu' prenume: 'Mircea' note: [3x2 double] » student(1).note ans = 9 7 10 8 9 10 9 8 4 » student(2).note(3,1) ans = 10
Stergera unei stucturi din tabel: » student(2)=[ ]
!Facultativ cell array:
Exemple: Cell arrays Tabloul(matricea) de celule este folosit la stocarea indexată a datelor de tipuri diferite.
În celulele tabloului pot fi stocate date de tipuri şi mărimi diverse. Putem spune că celulele sunt câmpuri fără nume (dar indexate pentru a putea fi referite).
Ex1: Următoarea instrucţiune creează un tablou A de 2 x 2 celule: >>A = {[1 4 3; 0 5 8; 7 2 9], 'Marius Giurgiu' ; 3+7i, -pi : pi/4 : pi};
Se poate iniţializa individual fiecare celulă: »A(1,1) = {[1 4 3; 0 5 8; 7 2 9]}; %sau A{1,1} = [1 4 3; 0 5 8; 7 2 9];
% Obs: paranteze rotunde ( ) şi acolade {} NU: A3{1,1} = {[1 4 3; 0 5 8; 7 2 9]} »A(1,2) = {'Marius Giurgiu'}; %sau A{1,2} = 'Marius Giurgiu'; »A(2,1) = {3+7i}; % A{2,1} = 3+7i; »A(2,2) = {-pi:pi/4:pi}; % A{2,2} = [-pi:pi/4:pi];
Dacă introducem >A(3,3) = {5}; se va extinde tabloul de celule cu 4 celule vide.
(clear A %Se şterge A şi se initializează din nou) !!salt..... Ex2: “Celule în celule” *se iniţializează: » A{1,1} = { [1 4 3; 0 5 8; 7 2 9] } % se obţine un cell array pentru A{1,1} » A{1,3} = {'abc', 'de'} şi >>A{2,2} = [1 2 3]
Extragem caracterul ‘b’: A{1,3}{1,1}(2)
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
18
Ex3: În figura alăturată observăm un tablou de
celule cu următoarele componente (celule): aa{1,1} conţine tablou de întregi fără semn, aa{1,2} conţine tablou de şiruri de caractere (şirurile
sunt de lungimi egale), aa{1,3} conţine tablou de numere complexe aa{2,1} conţine şir (1D) de numere în virgulă mobilă aa{2,2} conţine tablou 2D de întregi cu semn aa{2,3} conţine tablou de celule de tipuri variate
Ex.4: Observaţi alte exemple:
aa{1,1}={1 2 3; 2 3 4; 3 4 5} %9celule num. aa{1,2}={'11'; 'qwe'; 'wd45'} aa{1,3}={'11' 'qwe' 'wd45'} aa{1,4}={'11', 'qwe', 'wd45'} aa{2,3}={'text', [4 2;1 5]; [1.2 2.3;1.22 1.3], .2+5i} Exemplu - referire elemente:
aa{2,3}{1,1}(2)='a' % s-a schimbat ‘e’ cu ‘a’ aa{1,1}{2,2}='abc' % numar 3 înlocuit de şir ‘abc’ Ex.5: WIREFRAME. Stack{1,1}(1,1)
Structura WIREFRAME cu câmpul Stack de tip cell array; se referă celula {1,1} care este un şir de caractere => este referit primul caracter din şir.
2.Operatori Operatorii MATLAB pot fi clasificaţi în trei categorii: • Operatori aritmetici • Operatori relaţionali (compară operanzii cantitativ) • Operatori logici
*Operatori aritmetici
+ Adunare .^ Fiecare element din matrice la putere [2 3 4] .^ 2 => [4 9 16]
- Scădere ' Transpusa unei matrice reale .* Înmulţire element cu elem.
[2 3] .* [10 20] -> [20 60] ' Transpusa + conjugate complexe a numerelor
complexe din matrice (dacă există) ./ Împărţire la dreapta: 1 ./ [1 2 3]
1.0000 0.5000 0.3333 >>[1 2] . / [2 3] 0.5000 0.6667
.' Transpusa fără conjugata complexă a numerelor complexe
.\ Împărţire la stânga: 2 .\ [1 2 3] 0.5000 1.0000 1.5000
* Înmulţire matriceală (| înm. două numere) Amxn * Bnxp => Cmxp
+ Plus unar A/B Împărţire matriceală la dreapta A*B^-1 - Minus unar A\B Împărţire matriceală la stânga A^-1 *B : Operatorul două puncte ^ Matrice pătratică la o putere
Operatorii aritmetici pe element (.*, ./, .^) lucrează cu elementele corespondente ale unor tablouri de dimensiuni egale.
Unii operatori binari lucrează cu un operand matrice şi celălalt scalar. În acest caz MATLAB-ul aplică scalarul fiecărui element al matricei,
ex: [2 3] – 1 [1 2] sau: [2 3] ./ 2
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
19
*Operatori relaţionali
< Mai mic >= Mai mare sau egal <= Mai mic sau egal == Egal cu > Mai mare ~= Diferit de
Operatorii relaţionali compară elementele corespondente ale unor tablouri de dimensiune
egală. Operatorii relaţionali lucrează totdeauna element cu element. Exemplu:
1 < sqrt(2) ans = 1
» pi ~= 3.14 ans = 1
» A = [2 7 6; 9 0 5; 3 0.5 6]; » B = [8 7 0; 3 2 5; 4 -1 7];
» A == B ans = 0 1 0 0 0 1 0 0 0
Rezultatele comparaţiilor sunt valori de tip logic: 0 sau 1
» A >= B 0 1 1 1 0 1 0 1 0
*Operatori logici & AND (ŞI) | OR (SAU) ~ NOT (Negatie)
1 & 1 -> 1 0 & 1 -> 0 1 & 0 -> 0 0 & 0 -> 0
1 I 1 -> 1 0 I 1 -> 1 1 I 0 -> 1 0 I 0 -> 0
XOR(0, 0) -> 0 XOR(0, 1) -> 1 XOR(1, 0) -> 1 XOR(1, 1) -> 0 % EXCLUSIVE OR
Operatorii logici aplicaţi elementelor corespondente ale unor tablouri de dimensiuni egale. Pentru vectori şi tablouri dreptunghiulare ambii operanzi trebuie să aibă aceeaşi dimensiune
• O expresie care utilizează operatorul & (ŞI) este adevărată dacă ambii operanzi sunt adevăraţi. În termeni numerici, expresia este adevărată dacă ambii operanzi sunt nenuli. Exemplu:
» u = [1 0 -2 3 0 -5]; » v = [5 6 -1 0 0 7]; » u & v
ans= 1 0 1 0 0 1
• O expresie care utilizează operatorul | (SAU) este adevărată dacă cel puţin unul dintre operanzi este logic adevărat. Pentru operanzi numerici, expresia este falsă dacă ambii operanzi sunt nuli. Exemplu:
» u | v ans = 1 1 1 1 0 1
• O expresie care utilizează operatorul ~ (NOT)neagă logic operandul. În termeni numerici, orice operand nenul devine nul şi orice operand nul devine unu. Exemplu:
» u = [1 0 -2 3 0 -5]; » ~u ans= 0 1 0 0 1 0 » ~~u ans= 1 0 1 1 0 1 % numai 0 şi 1
Un operand este scalar şi celălalt vector: în acest caz, ca şi la operatorii aritmetici, MATLAB-ul aplică scalarul fiecărui element al celuilalt operand. u = [1 0 -2 3 0 -5];
>> u | 0 v = 5 6 -1 0 0 7
>> v & 4
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
20
ans = 1 0 1 1 0 1 % valorile True devin 1 ans =1 1 1 0 0 1
Funcţii logice În plus (paralel) faţă de operatorii logici MATLAB-ul furnizează şi funcţii logice:
Funcţie Descriere Exemple and( ) or( )
Identic cu & Identic cu |
xor( ) Realizează sau exclusiv. Returnează logic adevărat dacă unul din operanzi este adevărat şi celălalt fals. În termeni numerici, returnează 1 dacă un operand este nenul şi celălalt este zero.
» a = 1; » b = 1; » xor(a,b) ans = 0
all( ) Parametrul este vector: returnează 1 dacă toate elementelevectorului sunt adevărate sau nenule (true). Parametrul este matrice (all() acţionează pe coloane):
» u = [0 1 2 0]; » all(u) ans = 0
» A = [0 1 2; …
9. 5 0]; » all(A) ans = 0 1 0
any( ) Parametrul vector: returnează 1 dacă cel puţin unul dintre elementele argumentului este adevărat (nenul); în caz contrar returnează 0. Parametrul matrice (any() acţionează pe coloane)
» v = [5 0 8]; » any(v) ans = 1 >> any([5 0 8 ; …
9. 0 0 ]) ans = 1 0 1
Alte funcţii: isnan, isinf, find.
3.Prioritatea operatorilor Se pot scrie expresii care folosesc orice combinaţie de operatori aritmetici, relaţionali şi
logici. a) ordinea de evaluare a expresiei este dată de nivelele de precedenţa/prioritate b) în cadrul fiecărui nivel de precedenţă operatorii au aceeaşi prioritate şi se evaluează de
la stânga la dreapta. c) prioritatea maximă o au parantezele:
1. Paranteze ( ) 2. Transpusa (.’), putere (.^), transpusa cu complex conjugate ( ‘ ), matrice la putere ( ^ ) 3. plus unar (+), minus unar (-), negare logică (~) 4. înmulţire (.*), împărţire la dreapta (./), la stânga (.\), înmulţire de matrice (*), împărţire matrice dreapta ( / ), Împărţire matrice stânga ( \ ) 5. adunare ( + ), scădere ( - ) 6. operatorul două puncte ( : ) % A(1+2: 9) 7. mai mic (<), mai mic sau egal (<=), mai mare (>), mai mare sau egal (>=), test egalitate (= =), test diferit (~ =) 8. şi (&) 9. sau (|)
CURS 3 Exemplu de scriere compactă şi eficientă / puterea operatorilor în Matlab: Să se evalueze (fără ciclări) expresia A(r,ζ)=…:
% unde r şi ζ iau următoarele valori: r=0 : 0.005 : 2.5 şi ζ=[0.03, 0.05, 0.1, 0.2, 0.5] % ze
Cod Matlab: % cu fiecare linie din A se trasează o curbă ze=[0.03 0.05 0.1 0.20 0.50]'; r=0 : 0.005 : 2.5; % ze este transpus A=sqrt( ((2*ze*r).^2+1) ./ ( (ones(size(ze))*(1-r.*r).^2) + (2*ze*r).^2) );
2222
22
4)1(41),(
rrrrAζ
ζζ+−
+=
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
21
plot(r,A) % transmisibilitate forţă asupra masei la suport fix
La numărător: prin ze*r se înmulţeşte: o matrice ze coloană (5 x 1) (‘ transpune) cu o matrice r linie (1 x 501) ; apoi se ridică la pătrat fiecare element din matrice.
>> ze=[0.03 0.05 0.1 0.20 0.50]' ze = 0.0300 0.0500 0.1000 0.2000 0.5000 >> r=0 : 0.005 : 0.03 r = 0 0.005 0.010 0.015 0.020 0.025 0.030
>> ze * r ans = 0 0.0001 0.0003 0.0004 0.0006 0.0007 0.0009 0 0.0003 0.0005 0.0008 0.0010 0.0013 0.0015 0 0.0005 0.0010 0.0015 0.0020 0.0025 0.0030 0 0.0010 0.0020 0.0030 0.0040 0.0050 0.0060 0 0.0025 0.0050 0.0075 0.0100 0.0125 0.0150
La numitor: primul termen 22 )1( r− rezultă vector iar al doilea
224 rζ matrice => avem nevoie de matrice şi în primul termen. size(ze) returnează perechea de valori (5,1); acesta este argument
pentru funcţia ones() care crează matricea cu 5 linii şi o coloană de valori unitare.
>> ones(size(ze)) ans = 1 1 1 1 1
>> [1 1 1]' * [4 5 6 7 8] ans =
4 5 6 7 8 4 5 6 7 8 4 5 6 7 8
ones(size(ze))*(1-r.*r).^2 Sunt generate 5 linii identice care vor fi adunate cu matricea (2*ze*r).^2 (în care fiecare linie (r) se înmulţeşte cu un alt zeta) ze*r => matrice 5x501 A => matrice 5x501 plot(r,A) => 5 curbe, pentru abscisa (vectorul) r se trasează fiecare linie din matricea X.
4. Instrucţiuni pentru controlul derulării unui program 4.1 . if - end, if – else - end, if - elseif – else - end, if – elseif - end - execută un grup de instrucţiuni pe baza unei condiţii logice. - după elseif poate să nu mai existe un else
if expresie_logica grup de instructiuni end ... i=2; j=input('j= '); if i+j>0 fprintf('i+j=%7.2f\n',(i+j)^2 );end
50155015
5015
......
..................
......
......
xx
xA
+
=
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
22
if expresie_logica grup1 de instructiuni else grup2 de instructiuni end - - - - - - - - - if x>0 fprintf('x este numar pozitiv\n')else fprintf('x negativ sau zero\n') end
% compara val. numerice if a>b disp('a>b') elseif a<b disp('a<b') else %a==b disp('egalitate') end
% se citesc 2 şiruri de caractere si se compară lungimile sir1=input('sir1= ','s'); sir2=input('sir2= ','s'); if length(sir1) > length(sir2) fprintf('sir1: %s are mai multe caractere\n',sir1); else 'sir2 are car. mai multe sau este egal cu sir1' fprintf('Ultimul car. din sir2: %s\n',sir2(end)); end
% n este pozitiv, par sau impar n=input('n= '); if n <= 0 %Daca n este negativ sau zero afiseaza un mesaj de eroare. disp('valoarea furnizata trebuie sa fie pozitiva'); elseif rem(n,2)==0 %Daca n este pozitiv si par, imparte n la 2 si afiseaza. % remainder (~= reminder) A1 = n/2; disp('n par si pozitiv'); else %Daca n este pozitiv si impar imparte la 2 si afiseaza A2 = n/2; disp('n impar si pozitiv'); end % a aparţine itervalelor: … -20… -10… 0… 10 a=input('a= '); %carui interval apartine a? if a<-20 disp('a<-20') % afisaza tablou caractere elseif a<-10 disp('-20 <= a <-10') elseif a<0 disp('-10 <= a <0') elseif a<10 disp( '0<=a<10') else disp('a>=10') end
% else poate lipsi %test valoare a(2) a=input('dati valori vector a='); if a(2)<-5 | a(2)>5 disp(‘a(2)<-5 sau a(2)>5') elseif a(2)<0 disp('a(2)apartine [-5 0)’) end % pt. a(2) intre [0 si 5] nu se afiseaza mesaj
4. 2.switch, case … otherwise
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
23
switch expresie %scalar sau sir de caractere/string case valoare_1 grup 1 instructiuni % se execută dacă: expresie == valoare_1 =>true case valoare_2 grup 2 instructiuni % se execută dacă: expresie == valoare_2 =>true case valoare_n grup n instructiuni otherwise grup n+1 instructiuni % se execută dacă expresie nu egalează nici un caz end
% switch poate rezolva mai multe condiţii într-un % singur caz prin folosirea acoladelor { } (cell array). var=input('var= '); switch var+1-1 % expresie case 1 disp('1'); case {2,3,4} disp('var este 2 sau 3 sau 4'); case 7 disp('7') otherwise disp('altã valoare'); end
% exemplul 2 switch var1 case -1 disp('minus unu'); case 0 disp('zero'); case 1 disp('unu, pozitiv'); otherwise disp('alta valoare'); end …
% selectare caz prin tablou caractere sircar = input('Tastati o culoare: ','s'); % descriptor s pentru citire sir car.switch sircar % valoarea citita este tablou de caractere case 'rosu' disp('ati tastat rosu'); case 'galben' fprintf('ati tastat %s\n', sircar); case {'albastru','violet'} disp('ati tastat albastru sau violet'); otherwise disp('ati tastat altceva decat rosu, galben, albastru, violet'); fprintf('sir %s,primul,ultimul car:%s, %s, total: %2.0f \n', sircar(:), sircar(1), sircar(end), length(sircar)) end Spre deosebire de limbajul C, daca un caz este adevărat şi acesta se execută, se sare după end fără a folosi instrucţiune break. In C se execută implicit şi cazurile următoare (daca nu există instr. break). 4.3. Instrucţiunea de ciclare for
- Execută o instrucţiune sau un grup de instrucţiuni de un număr cunoscut dinainte de ori:
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
24
for index = start:increment:end grup de instructiuni end
x=3:8; %sau x=[3 4 5 6 7 8]; suma=0; %initializam variabila suma for i=1:length(x) suma=suma + x(i); end
suma % se afiseaza 33 % acelaşi rezultat cu: sum(3:8), sum([3:8]) sau sum(x)
x(1)=1; %se adaugă valori in vect. x(i) for n = 2 : 6 x(n) = 2 * x(n - 1); end % rezulta: 1 2 4 8 16 32
% pas=2 for k=1:2:n . . . end
n=100; %increment <0 for k=n:-1:1 . . . end
Comparaţie sin(x) şi x , Relaţia lui Euler
i=sqrt(-1); %valoarea implicita a lui i
for x=0: pi/30 : 2*pi %pas real de 3grade fprintf('x=%6.4f sin(x)=%7.4f %g+ %gi\n', x, sin(x), real(exp(i*x)), imag(exp(i*x)) ); end ... programul afişează: x=0.0000 sin(x)= 0.0000 1+ 0i % Relaţia lui Euler: e^(ix) = cos(x) + i*sin(x) x=0.1047 sin(x)= 0.1045 0.994522+ 0.104528i x=0.2094 sin(x)= 0.2079 0.978148+ 0.207912i % Observăm: x ≈ sin(x) pentru x=mic x=0.3142 sin(x)= 0.3090 0.951057+ 0.309017i 0,1rad; 0,2 rad x=0.4189 sin(x)= 0.4067 0.913545+ 0.406737i x=0.5236 sin(x)= 0.5000 0.866025+ 0.5i x=0.6283 sin(x)= 0.5878 0.809017+ 0.587785i x=0.7330 sin(x)= 0.6691 0.743145+ 0.669131i ……..
Instrucţiune for în corpul unei alte instr. for (for imbricat): lin=5; col=12;
for i =1:lin %se repeta de lin ori for j =1:col %repeta de lin x col ori B(i,j) = 1/(i+j-1); end B5x12 end plot(1:lin,B,'-*') %sau plot(B)= fiecare coloana o curbă plot(1:col, B, '-*') % o linie=o curba % abscisa are 5 valori 1:lin abscisa are 12 valori 1:col
Matricea generată B5x12=
2 variante pt. Sinus din vector x de valori:
1.Ciclul for versus 2.vectorizare
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
25
∑ −===
n
inx iXVAR1
212 )][( µσ
x=1:.1:10; %Cod scalar: for k=1:length(x) y(k)=sin(x(k)); end plot(x,y) -------------- x=-5:0.1:25; %Cod scalar: for k=1:length(x) y(k)=x(k)+sin(x(k)); end plot(x,y)
Cod echivalent prin vectorizare: x=1:.1:10; y=sin(x); plot(x,y '-*') ----------- x=-5:0.1:25; y=x+sin(x); plot(x,y)
Calcul VARIANŢA:
% 1.Ciclul for x=[1 2 3 4] miu = sum(x)/length(x); %media suma=0; for i=1:length(x) suma=suma +(x(i)-miu)^2 end variance1=suma/length(x); % variance1 -> 1.25
% 2.Vectorizare miu = sum(x)/length(x); variance2=sum(( x-miu).^2)/length(x); sau: …sum((x-miu).*(x-miu))… sau: (x-miu)*(x-miu)’
Calcule cu matrice %Numărare elemente ai pozitive din vector a=input(`Tastati sir numeric= `); %exemplu [5 -3 1 -9 4 1]contor=0; for i=1:length(a) if a(i)>0 contor=contor+1 end end display(contor) ---------------------------
Suma elementelor aij de pe DP (i = j) folosind un ciclu for a= [2 -1 3; ... -9 4 1; ... 2 2 2] sum=0; nc= length(a(1,:)) %lin 1 şi toate coloanele for i=1:nc sum=sum + a(i,i); fprintf('i=%d j=%d a=%.3f\n',i,i,a(i,i)); end sum Suma elem. aij de pe DS (i+j=n+1) folosind un ciclu for sumDS=0; n=nc; for i=1:n sumDS=sumDS + a(i,n+1-i); end sumDS
Se citeşte matricea pătratică a=[1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7]. Se parcurg elementele matricei unu câte unu pe linii şi se calculează suma elementelor pozitive
situate deasupra DP şi deasupra DS. Fiecare element însumat va îndeplini simultan trei condiţii: Condiţii de poziţie în matrice: 1) i<j selectează elementele aij situate deasupra DP 2) i+j<n+1 selectează elem. deasupra DS Condiţia de valoare este: 3) a(i, j)>0
Varianta 1: se parcurge întreaga matrice a=input(`Intr. Matrice patratica=`) % tastati: [1 8 3 ;-9 4 1; 2 2 2] n=length(a(:,1)); % (toate liniile, coloana 1)
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
26
sum=0; for i=1:n %ciclu exterior: ciclarea liniilor for j=1:n %ciclu interior: ciclarea coloanelor if i<j & i+j<n+1 & a(i,j)>0 %expresie logica sum=sum+a(i,j); fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j)); end end end sum Varianta 2: parcurgerea numai a zonei de interes for i=1: floor(n/2) %ciclu exter.=ciclarea liniilor for j=i+1 : n-i %ciclu interior=cicl. coloane DS:j=n+1-i if a(i,j)>0 %expresie logica sum=sum+a(i,j); fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j)); end end end
Produsul a două matrice a şi b
Dacă A este matrice: all(A) %AND pe fiecare coloană all(all(A)) AND pe col. apoi AND pe unica linie
a=input('matricea a='); b=input('matricea b='); [aL aC]=size(a); [bL bC]=size(b); c=zeros(aL,bC); if(aC ~= bL) 'nu se pot inmulti matricele' else for i=1:aL for j=1:bC for k=1:aC c(i,j)=c(i,j)+a(i,k)*b(k,j); end end end display(c) if all(all(a*b == c)) %verificare 'corect' end end
4.4. Instrucţiunea de ciclare while cu condiţionare anterioară
-execută un grup de instrucţiuni de un număr nedefinit de ori, sub controlul unei condiţii logice.
while expresie logica bloc de instructiuni end (1) Se evaluează expresie logica (E_L). (2) Daca E_L este True se executa bloc de instructiuni si se trece iar la (1) (3)Dacă E_L este False se trece direct după end
i=-2; while i<7 i=i+1; end i
%suma elementelor x(2)… x(5)din sirul x x=-3:7; suma=0; i=2; while i<=5 suma=suma+x(i); i=i+1;
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
27
end suma amplasare elemente in sir:
x(1) x(2) x(3) x(4) x(5) ... -3 -2 -1 0 1 ...
Suma patratelor elem. din şir:
x=6:-1:1; %sau x=[6 5 4 3 2 1]; suma=0; %initializam variabila suma i=1; %initializam „indicele” i n_e= length(x) while i <= n_e suma=suma + x(i)^2; i=i+1; %indicele incrementeaza end suma
%instructiune while in corpul while
m=input('linii m= '); n=input('coloane n= '); i=1; while i<=m %se repeta de m ori j=1; while j<=n %se repeta de m x n ori A(i,j) = 1/(i + j - 1); j=j+1; end i=i+1; end i, j %afişează i şi j plot(A); % este mai dificila gestionarea indicilor %decât în cazul folosirii ciclului for
sirC=input('sir=','s' ); j=length(sirC); for i=i:length(sirC) sirB(j)=sirC(i); %se copiaza in ordine inversă caracterele j=j-1; end sirB Poziţionare braţ robot cu trei cuple Implementare animaţie. Coordonatele cuplelor 2 , 3 şi a vârfului sunt date de trei vectori de poziţie în planul complex. O poziţie în planul complex este dată de modul şi funcţia exponenţial complexă:
1. vector de lungime l1 şi unghi φ1: 1
12ϕjelcup =
2. vector =vect precedent+vec lungime l2 şi unghi φ2: 2
223ϕjelcupcup +=
3. Vector de poziţie sarcină (varf) 3
33var ϕjelcupf += Apelând la formula lui Euler se poate afirma: - abscisele celor 3 pozitii sunt proiecţiile pe axa reală a celor 3 vectori complecşi. - ordonatele celor 3 pozitii sunt proiecţiile pe axa imaginară a celor 3 vectori complecşi. Aplicaţie: rotire in cupla 3 si vectori de pozitie j=sqrt(-1); l1=3;l2=3;l3=2; fi1=pi/3;fi2=pi/6; for fi3=pi/3:pi/30:3*pi/3 %elementul 3 se roteste cup2=l1*exp(j*(fi1)); cup3=cup2+l2*exp(j*(fi2)); line([0,real(cup3)], [0 imag(cup3)]) %vec. pozitie cupla3 varf=cup3+l3*exp(j*(fi3)); line([0,real(varf)], [0 imag(varf)]) % vec. poz. varf
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
28
%se traseaza o configuratie a bratului cu line() lc=line([0 real(cup2) real(cup3) real(varf)], [0 imag(cup2) imag(cup3) imag(varf)],... 'linewidth',3,'Color',[0 0 0] ) %negru pause(1); %se sterge configuratia curenta a bratului cu line() lc=line([0 real(cup2) real(cup3) real(varf)], [0 imag(cup2) imag(cup3) imag(varf)],... 'linewidth',3,'Color',[1 1 1] ) %alb end Temă: să se pună în mişcare simultan două elemente şi apoi 3 elemente ale braţului
CURS 4 5. Scheme logice asociate instrucţiunilor de decizie şi de ciclare
Schemele logice conţin: Blocul de start, B.de stop, B. intrare date, B. ieşire date (paralelograme), B. de decizii logice (romb), B. de atribuiri şi calcul (dreptunghi) Blocurile sunt interconectate prin săgeţi orientate.
if expresie_logica grup de instructiuni end
….. if expresie_logica grup1 de instructiuni else grup2 de instructiuni end …..
for index = start:increment:end
grup de instructiuni end
while expresie logica
bloc de instructiuni end
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
29
switch expresie % scalar sau sir de caractere/string case valoare1 grup1 instructiuni case {valoare21, valoare22, valoare23} %cell array grup2 instructiuni . . . case valoare n grupn instructiuni otherwise grup n+1 instructiuni end
Să se traseze schema logică asociată programului de mai jos: conţine decizii multiple în corpul ciclului for Programul contorizează numărul de apariţii în şirul x a valorilor 1, 2, 3 şi restul de valori. x=input('Tastati un sir de valori x=[...] '); v1=0; v2=0; v3=0; v=0; for i=1:length(x) if x(i) ==1 v1=v1+1; elseif x(i) == 2 v2=v2+1; elseif x(i) == 3 v3=v3+1; else v=v+1; end end fprintf('v1=%d v2=%d v3=%d v=%d\n', v1, v2, v3, v); Observaţi: 1.Asemănarea deciziei multiple realizate cu if-elseif şi cea realizată cu switch-case 2. S-au compus schemele logice pentru for şi if-elseif (sau switch) 3.Linia întreruptă mărgineşte corpul instrucţiunii de ciclare for şi conţine deciziile multiple
Exemplul rescris cu instrucţiunea switch-case ... for i=1:length(x) switch x(i)
Exemplul rescris folosind numai instrucţiunea if ... for i=1:length(x) if x(i)==1 v1=v1+1;
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
30
case 1 v1=v1+1; case 2 v2=v2+1; case 3 v3=v3+1; otherwise v=v+1; end end …
end if x(i)==1 v2=v2+1; end if x(i)==3 v3=v3+1; end if (x(i)~=1 & x(i)~=2 & x(i)~=3) v=v+1; end end …
5. Definirea unei funcţii în Matlab
5.1. Sintaxa definirii unei funcţii: in1, in2,…inn sunt argumente de intrare (parametri formali) ou1,out2,…outm sunt argumente de ieşire in1, in2,… ou1,out2,… sunt variabile locale
ai sunt parametri actuali sau efectivi care au valori concrete la momentul apelului funcţiei ri primesc valorile de la outi
1. Funcţiile sunt subprograme (apelate) care folosesc parametri de intrare (in1, in2,…) şi parametri de ieşire/calculaţi (ou1,out2,…) pentru a comunica cu programul apelant, cu alte funcţii sau cu fereastra de comenzi. 2. Definiţia funcţiei este salvată într-un fişier ce poartă acelaşi nume cu cel al funcţiei sau altă denumire şi extensia .m In cazul în care numele funcţiei este diferit de al fişierului se foloseşte numele fişierului la apel. Calea spre fişier trebuie setată “Set Path…” dacă fişierul nu se află în directorul curent sau în lista de căi spre directoare. 3. Apelul funcţiei este: nume_fun(a1, a2,…,an) unde a1, a2, …,an sunt parametri efectivi (actuali) având valori concrete/cunoscute (la momentul apelului). 4.Valorile parametrilor efectivi sunt transferate parametrilor formali în ordine de la stânga la dreapta. 5. O funcţie poate fi apelată de mai multe ori; la fiecare apel, prin parametri de intrare, se aplică acelaşi algoritm de calcul unor date de intrare diferite. 6. Folosirea funcţiilor permite modularizarea programului (anumite sarcini de calcul să fie încapsulate) 7. Funcţiile folosesc variabile locale funcţiei, variabile care există numai pe timpul execuţiei funcţiei: în fun_demo1: i, x; la ieşirea din funcţie variabilele locale se pierd (eliberează memoria). 8. Variabilele locale sunt independente de variabilele cu acelaşi nume din programul principal (apelant) sau din alte funcţii. 9. Funcţia poate fi apelată din linia de comandă, dintr-o altă funcţie sau dintr-un fişier script. 10. Funcţiile pot să nu aibă argumente de intrare sau argumente de ieşire. 11. Pentru funcţia apelată dintr-o expresie, apelul se înlocuieşte cu valoarea (valorile) returnată.
5.2. EXEMPLE - definiţii şi apeluri de funcţii 1) Un parametru de intrare şi unul de ieşire function y = average(x) % AVERAGE media elementelor vectorului y = sum(x) / length(x); end
x = parametrul de intrare este vector y = parametrul de ieşire este scalar Funcţia average este salvată în fişierul average.m
APELURI valide ale funcţiei:
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
31
∑ −==
n
in meaniXstdev
1
21 )2][(
v=[1 2 3 -3 5]; ave=average(v)
v=[1 2 3 -3 5]; average(v) ans = 1.6000
average( [1 2 3 -3 5] ) ans = 1.6000
2) 2 parametri de intrare şi un (1) parametru de ieşire function z=xplusy(x, y); z=x+y; end
x,y doi parametri de intrare z un parametru de ieşire
Se salvează definiţia funcţiei într-un fisier cu numele xplusy.m APELURI valide ale funcţiei:
a=1 b=2 scal1=xplusy(a,b)
a=[1 2 3; 3 4 5] b=[7 8 9; 2 0 4] matr1=xplusy(a,b)
a=7 b=[7 8 9; 2 0 4] matr2=xplusy(a,b) * b' % 2x3*3x2 % apel în expresie
scal2=xplusy(1,2) matr1=xplusy([1 2 3; 3 4 5] , b) matr2=xplusy(7, [7 8 9; 2 0 4]) 3) Parametri de intrare (2,3 sau 4)<= nr. param.formali (4)
function z = xplusy2(x,y, a, b) fprintf('Nr par. actuali=%d\n',nargin) if nargin < 4 b=1; end if nargin < 3 a=1; end z=(x+y)*a*b; end
% se poate apela funcţia cu 2, 3 sau 4 parametri nargin conţine nr. de param. actuali folosiţi la apel Dacă nargin<4 se atribuie param. neglijat val. b=1 Dacă nargin<3 se atribuie param. neglijat val. a=1 Pentru param. >4 sau <2 => eroare
Apeluri valide: >> xplusy2(3,5) ans = 8 >> xplusy2(3,5,1) ans = 8
>> xplusy2(3,5,2) ans = 16 >> xplusy2(3,5,2,4) ans = 64
4) 2 parametri de intrare, nu sunt parametri de ieşire
function compar(a,b) if a>b 'a>b' elseif a<b 'a<b' else %a==b 'egalitate' end
a,b parametri intrare; nu exista parametri de ieşire Salvăm definiţia în fişierul compar.m APELURI: >>compar(4,6) *Rezultatele sunt tiparite din functie
5) un parametru intrare, 2 parametri de ieşire function [s,sp]=sumapoz(x) %returneaza suma si suma elem >0 s=0;sp=0; for i=1:length(x) s=s+x(i); if x(i)>0 sp=sp+x(i);%insumare %x(i)>0 end end end Apel: [suma, sp]=sumapoz([1 5 -3]) Parametrii locali ai functiei
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
32
pot avea acelasi nume (sp) cu variabilele din secţiunea care apelează
6. Instrucţiunea break determină întreruperea ciclării for sau while şi salt la prima instrucţiune după instrucţiunea end a ciclării. 7. Instrucţiunea continue trece controlul sau realizează salt la prima instrucţiune din următoarea iteraţie în cadrul ciclărilor for sau while. 8. Instrucţiunea return determină ieşirea forţată din funcţie (funcţia apelată f_A) şi întoarcerea după punctul de apel din funcţia apelantă f_An (care a apelat funcţia f_A) (funcţia returnează valorile de la acel moment din parametrul de ieşire). function out=fun_demo1(in) i=1; while i < in x(i)=rand(1); if x(i)>0.95 'se executa break' break; % intrerupe ciclul while end i=i+1; end out=x; %salvare x in out i display('exemplu cu break') end %incheiere functie cu end optional
function out=fun_demo2(in) i=1; while i < in x(i)=rand(1); if x(i)>0.95 out=x; %salvam x in out i 'se executa return' return; %iesire din functie end i=i+1; end out=x; %salvare x in out display('exemplu cu return') i
Apel: a=fun_demo1(1.e2); Dacă x(i)>0.95 True, iese din ciclu, salvează x in out si iese din functie Altfel executa 1.e2 cicluri, salveaza x in out si iese
Apel: b=fun_demo2(1.e2); Dacă x(i)>0.95 True, salveaza x in out si iese din functie Altfel executa 1.e2 cicluri, salveaza x in out si iese
1. Se apelează o funcţie din corpul altei funcţii - ambele definite în acelaşi fişier:
Bulina roşie => breakpoint Săgeata albă => punct de apel funcţie Săgeata verde => poziţie curentă de rulare
>> stat3([1 2 3 4]) % apel functie stat3 % media se calc. în altă funcţie (avg)
3. Evaluarea repetată a unei formule a) definirea unei funcţii b)folosirea funcţii inline evită definirea funcţiei
function y=f_expresie(x) % se creaza un nou fisier y=x+sin(x)+x.^2; end
Ex1: un argument: x fun_ex=inline( 'x+sin(x)+x.^2' ); %parametrul este şir de caractere
Sunt permise apelurile: Rez1=f_expresie(2.2) Rez_1=fun_ex (2.2) Rez2=f_expresie([2.2 3 5]) Rez_2=fun_ex ([2.2 3 5])
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
33
c) Ex2: inline cu mai multe argumente: a, om, t
exp_comp=inline ( ’a*exp(j*om .* t)’ ) % tjea ω⋅ la apel parametrii sunt luaţi in ordinea din definitia inline >> exp_comp(1, 3, 0 : .1 : 0.4) % 1->a, 3->om, 0:.1:0.4 ->t
ans = 1.0000 0.9553 + 0.2955i 0.8253 + 0.5646i 0.6216 + 0.7833i 0.3624 + 0.9320i
% )]sin()[cos( tjtaea tj ωωω +=⋅
>> x=0: .1 :2*pi >> plot( x , exp_comp(3, pi, x) ) graficul: *partea imaginară a ordonatelor a fost neglijată în grafic *abscisa de la 0 la 2pi; 3,1415 perioade de cosinus deoarece om=pi; 3 este amplitudinea
3.Variabile globale VG permit folosirea unor variabile în corpul funcţiilor fără ca acele variabile să fie pasate prin parametri în acele funcţii. Comunicare numai prin parametri Fereastra de comenzi Definiţie fun_1 a=1; b=2; c=5; re=fun_1(a,b,c);
functie y=fun_1(pa,pb,pc) …. y=pa+pb+pc; %variabile locale
Variabilele a,b,c şi-au transferat valorile parametrilor formali pa, pb respectiv pc. Valoarea calculată y transferă valoarea variabilei re
Comunicare prin parametri şi variabilă globală a=1; b=2; global vgC; vgC=55; re=fun_2(a,b);
functie y=fun_2(pa,pb) …. global vgC; ….. y=pa+pb+ vgC;
Variabilele a,b şi-au transferat valorile parametrilor formali pa respectiv pb. Variabila vgC este declarată globală în funcţia apelantă şi apelată (fun_2) deci poate fi folosită în expresii în funcţia apelată fun_2( ) Variabile persistente – sunt locale funcţiei, nu se şterg la ieşirea din funcţie, valoarea lor este reţinută şi regăsită la un nou apel al aceleaşi funcţii; nu pot fi accesate dinafara funcţiei. persistent var_persist;
CURS 5
4. Fişiere script Matlab sau macrouri Scriptul Matlab este un segment de program Matlab salvat într-un fişier numefis.m. Execuţia fişierului script se obţine prin apelul numelui fişierului numefis (fără extensie) în linia de comandă, în funcţii sau în alte fişiere script. După execuţia fişierului script variabilele locale rămân în spaţiul de lucru al aplicaţiei spre deosebire de funcţie în care variabilele locale se dealocă din memorie.
Un program Matlab are forma fişierelor: nume_script.m şi/sau: nume_functie.m
Din fişierele de funcţii sau fişierele script se pot apela alte funcţii sau fişiere script. Se pot face de asemenea apeluri recursive: - din funcţie se apelează aceeaşi funcţie sau
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
34
- dintr-un fişier script să se apeleze acelaşi fişier script. Funcţii transmise ca parametru altei funcţii:
Sunt definite trei funcţii apelate: f(), g() şi arie() function [y]=f(x) y=sin(x)+x; end
function [y]=g(x) y=x*cos(x); end
function [F]=arie(pf1,a,b,n) F=pf1(a)+ pf1(b); ... %calcul arie intre a şi b end
In corpul funcţiei arie se apelează sub numele formal pf1 funcţia dorită = funcţia trimisă prin parametri actuali @f sau @g şi pentru aceasta se calculează integrala aprox. dintre abscisele a şi b pf1(a) calculează valoarea funcţiei pentru abscisa a oricare ar fi funcţia apelată
Apeluri ale funcţiei arie(...): %Programul principal sau script (apelant) a=1; b=2; n=10; rezultat1=arie( @f, a, b, n); rezultat2=arie( @g, a, b, n+100); disp(rezultat1); disp(rezultat2);
Obs: pf1 este parametru formal din def. functiei arie
@f, @g parametri actuali = =adrese de funcţii la apel funcţie arie
Grafică 2D în MATLAB
1. Funcţii pentru reprezentări grafice 2D în MATLAB subplot(abc) sau subplot(a,b,c) divizează fereastra în grafice aşezate matriceal:
a=număr linii, b=număr coloane, c=stabileşte poziţia curentă în matrice numărând pe linii: a11, a12… a21…
plot(y) realizează reprezentări grafice în coordonate liniare a) y este vector => reprezintă valorile lui y în funcţie de numărul de ordine al fiecărui element din vector
b) y este matrice m x n => plot(y) reprezintă n curbe câte o curbă pentru fiecare coloană a matricei
Exemplul #1 vector x=0 : pi/100 : 4*pi %vector real de 401 elemente y=sin(x); plot(y) Exemplu #2 matrice x=0 : pi/100 : 3*pi ma(:,1)= sin(x); %generare coloana 1 ma(:,2)= sin(x+pi/3); %generare coloana 2 % faza pi/3 translatează curba % în lungul abscisei plot(ma); % ma este matrice 301 x 2 % 2 coloane → 2 curbe
c) y este un vector de valori complexe -> va reprezenta plot(real(y), imag(y))
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
35
ze=0.04; r=0 : .01 : 3; j=sqrt(-1) %factor complex amplific. depl. 1gdl Ac=1./ (1- r.^2+2*j*ze*r); %vector val. complexe subplot(121); % 1=linie, 2=col., % pozitia 1 devine curenta plot(Ac, ' - +' ) %trasează real(Ac) vs. imag(Ac) subplot(122); % 1=linie, 2=col., % pozitia 2 devine curenta plot(real(Ac), imag(Ac), '-+' ) % identic cu plot(Ac) plot(x, y) % acelaşi număr de valori în vectorii: x şi y
a) reprezintă grafic vectorul y (ordonate) în funcţie de vectorul x (abscise) primul punct din grafic: x(1), y(1) punctul al doilea din grafic: x(2), y(2) … ultimul punct: x(end), y(end) b) x vector, y matrice => coloanele / liniile matricei y vor fi reprezentate în funcţie de vectorul x
subplot(131); plot(r, real(Ac)) subplot(132); plot(r, imag(Ac)) subplot(133); plot(r, [real(Ac); imag(Ac)]); % r=vector, % [real(Ac); imag(Ac)]= matrice 2 linii
0 0.5 1 1.5 2 2.5 3-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3-14
-12
-10
-8
-6
-4
-2
0
0 0.5 1 1.5 2 2.5 3-15
-10
-5
0
5
10
c) plot(x1,y1, x2,y2) => în acelaşi grafic sunt reprezentate curbele (x1, y1) şi (x2, y2) x1, y1 = 2 vectori; x2, y2 = 2 vectori
plot(r, real(Ac), r, imag(Ac) );% sau plot( r, [real(Ac); imag(Ac)] ); identice % fiecare linie din matrice în funcţie de r 2. Exemplu cu funcţia FFT + module de numere complexe Profilul unei forţe periodice este de forma:
t2
+t+t2
=f(t) 00 04cos5.1cos3cos1 ω
ωω⋅
Se trasează grafic forţa şi se pun în evidenţă componentele armonice ale profilului (amplitudinea şi argumentul fiecărui cosinus):
t=0:0.01:5; w0=10; % 501 valori f1=1*cos(w0/2*t)+3*cos(w0*t)+1.5*cos(4*w0/2*t); subplot(211); plot(t,f1) %se observa graficul periodic
Y1 = fft(f1); % fft() → Fast Fourier Transform % par. actual: f1= vec.501 valori reale → returnează vec.501 val. complexe subplot(212);
r2j+r-11=A 2c ζ
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
36
plot( abs(Y1(1:length(Y1)/4)));grafic module pentru primele 501/4 din Y1 vs. indici Y1 = vector de numere complexe returnat: Y1: 3. Reprezentare în coordonate logaritmice şi semilogaritmice loglog(x,y) scalează ambele axe folosind logaritmul în baza 10 * valorile 10-1 , 100 , 101 , 102 ,… sunt echidistante pe abscise şi ordonate semilogx(x, y) scalează logaritmic axa x (…10-1 , 100 , 101 , 102 ,…sunt echidistante pe x=abscisa) semilogy(x, y) scalează logaritmic axa y (…10-1 , 100 , 101 , 102 ,…sunt echidistante pe y=ordonata) x=0 : pi/100 : 10*pi %5 perioade %vector real de 1001 elemente y=sin(x); semilogx(x, y)
subplot(312); semilogx(abs(Y1(1:length(Y1)/4) )); % scalare log după x subplot(313); semilogy(abs(Y1(1:length(Y1)/4) )); % scalare log după y 4. Funcţia STEM: reprezentarea discretă prin “tulpini” x=0 : pi/10 : 3*pi %vector real de elemente y=sin(x); stem(x, y) Reprezentare în trepte x=0 : pi/10 : 3*pi %vector real y=sin(x); stairs(x, y) stem
stairs 5. Grafic de bare verticale x=0 : pi/5 : pi %vector real de 6 valori y=sin(x); subplot(1,2,1) bar (x,y) subplot(1,2,2) bar (y) %y în funcţie de indici 6. Reprezentare în coordonate polare (u,R) u=0 : pi/10 : 2*pi; % unghi R=sin(u) .* cos(u); % Raze cu interpolare liniară între ele polar(u,R);
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
37
7. fplot(‘nume_fun’, limite, n) % reprezintă grafic o funcţie în limitele specificate, n valori de calcul % definitie functie function y=f2(x) y=sin(x) .* x; % salvam functia f2() in fisierul f2.m return % apel: fplot('f2', [-22 44], 1000); % reprezintă grafic funcţia f2 definită în fişierul f2 sau: [x,y]=fplot('f2', [-22 44], 1000); % NU reprezită functia ci numai returneaza vectori % 1000 abscise şi 1000 ordonate în [x, y] plot(x,y); grid; % apelăm plot(x,y) pentru reprezentare grafică. 8. comet(y) şi comet(x,y) %realizează reprezentare dinamică a unei curbe 2D printr-un punct care se deplasează şi trasează curba. 9. Trasare poligoane pline colorate
subplot(121) fill([1 2 4],[1 6 8],'r') % un poligon, [lista abscise], [lista ordonate] subplot(122) fill([1 2 4],[1 6 8],'r', [2 4 8],[6 8 9], 'g') % doua poligoane 10. Reprezentare vectori complecşi cu originea în (0,0): z = 3.0000 + 4.0000i compass([z, z/i, z*i]) % vector în forma exponenţial complex: compass([ 3*exp(j*pi/3), 2*exp(j*pi/2), 3-1*j]) % unde j=sqrt(-1) 11. Setare grosime şi culoare curbă în grafic *Setează grosimea (1.6) a liniei plot(r,T, 'LineWidth' , 1.6); *Setează culoarea (red) şi grosimea liniei line(X,Y,Z, 'Color', 'r', 'LineWidth', 4) 12. Funcţia text() → scrie text pe figură
*Se va scrie relatia lui Euler la poziţia dorită (x,y)= (.1, .22)
>>figure % se creează o nouă fereastră pentru figuri >> text(.1, .22, '\ite^{(i\omega\tau)} = cos(\omega\tau) + i sin(\omega\tau)') ↑ pozitie text ↑ it pentru a interpreta şir text ↑ acolade {} pentru gruparea scrisă la exponent Alfabet grecesc: … \omega \tau \ … » gtext('ze=0.1') %permite interactiv scrierea textului la pozitia dorita pe figura curenta % pozitia curenta este indicata de axele perpendiculare; acestea sunt poziţionate la deplasare mouse 1. Tipărire cu format %d, %f, %e, %g la folosirea funcţiei fprintf
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
38
x=input('vector x= '); for i=1 : length(x) fprintf('element x(%3d)=%12.3f\n', i, x(i) ); fprintf('element x(%3d)=%12.3e\n', i, x(i) ); fprintf('element x(%3d)=%12.3g\n\n', i, x(i) ); end % s-a folosit \n pentru trecerea cursorului pe randul urmator la inceput după fiecare execuţie a funcţiei fprintf vector x= [1.01 0.00002] % s-a citit element x( 1)= 1.010 %f element x( 1)= 1.010e+000 %e element x( 1)= 1.01 %g element x( 2)= 0.000 %f lipsă cifre utile element x( 2)= 2.000e-005 %e element x( 2)= 2e-005 %g a ales f. expon.
Folosim descriptori de format: %d pentru tipărire valori întregi cu semn (decimal) %s pt. tipărire şiruri de caractere (string) %f pentru tipărire valori reale (float) %12.3f valoarea reală se tipăreşte într-un spaţiu de 12 caractere dintre care 3 sunt alocate zecimalelor iar restul punctului zecimal şi părţii întregi. %e tipărire format exponential %g mai compact decât %f sau %e şi fără 0 inutil
În cadrul parametrului actual de tip ‘şir de caractere’ a funcţiei fprintf, pot fi folosite caractere de formatare a textului (caractere de evitare): \n Linefeed LF + carriage return CR = se trece
(scrie) la inceputul liniei următoare \t Tab (sare la dreapta un număr de
caractere/pozitii de scriere) \r carriage return \b Backspace (inapoi un caracter) Folosim: \\ pentru a tipări un caracter backslash %% pentru tipărirea unui caracter procent. ’’ pentru a tipări un caracter apostrof 2. Tipărire în formă tabelară la ecran: x=input('sir de medii x= '); s=0; m=0; ma=0; nivel={'slab', 'mediu', 'bun'}; %cell array conţine 3 şiruri de caractere de lungimi diferite fprintf(' \t\tNote studenti\n'); %două taburi (\t) şi trecere la inceputul rândului următor (\n) fprintf(' \t\t----------------\n'); %realizeaza subliniere titlu for i=1:length(x) if x(i)<=6 s=s+1; % %s este descriptor pentru şir de caractere fprintf('student #%d nivel %s =%12.3f s=%d\n', i, nivel{1}, x(i), s) elseif x(i)<=8 m=m+1; fprintf('student #%d nivel %s =%12.3f m=%d\n', i, nivel{2}, x(i), m ) else ma=ma+1; fprintf('student #%d nivel %s =%12.3f ma=%d\n', i, nivel{3}, x(i), ma) end end Exemplu rulare: sir de medii x= [4.33 10 6.25 7 9.66] Note studenti ---------------- student #1 nivel slab = 4.330 s=1 student #2 nivel bun = 10.000 ma=1 student #3 nivel mediu = 6.250 m=1 student #4 nivel mediu = 7.000 m=2 student #5 nivel bun = 9.660 ma=2
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
39
3. Funcţiile: fopen, fprintf , fwrite, fclose Scriere în fişier (în locul ecranului) - folosim o secvenţă de forma următoare:
x=input('vector x= '); fid=fopen('c:\fisdate.dat', 'wt'); % write text if fid == -1 display('Nu s-a deschis fisierul\n ') % ex. cale eronată else for i=1:length(x) fprintf( fid, 'element x(%3d)=%12.3f\n', i, x(i) ) end st = fclose(fid) % închide fişier cu ID=fid if st = = 0 'fisier inchis cu success\n' end end
Conţinut fişier fisdate.dat:
fid2 = fopen('c:/fis33.bin', 'wb'); % write binar x=fwrite(fid2, 3:300); %return o val.: 298 (val. scrise in fisier) x2=fclose(fid2); %returneaza 0 pentru succes şi -1 altfel
Conţinut cu Wordpad:
Sintaxa de scriere: fid = fopen(cale_numefisier, mod) deschide fişierul în modul specificat prin mod care poate fi: 'r' read 'w' write (se generează fişierul dacă este necesar) 'a' append (se generează fişierul dacă nu există) 'r+' read and write (nu se generează) 'w+' trunchează sau crează pentru read şi write 'a+' read şi append (crează fişierul dacă este necesar) Fişierul poate fi deschis (pentru citire din fişier sau scriere în fişier): în mod text (exemple 'rt' şi 'w+t') sau binar (implicit). Obs.: funcţiile fscanf este folosită pentru citire text cu format din fişiere. fread = citeşte date binare din fişier.
CURS 6 2. Calcule cu polinoame 2.1.Evaluarea polinomului pentru un vector de argumente (scriind expresia polinomială şi operatorul .^ ):
VecArg=[ -2 0 10 10.1 99] % 5 argumente
Val = VecArg .^ 2 + 2*VecArg + 3
Val = 1.0e+004 * 0.0003 0.0003 0.0123 0.0125 1.0002
VArg= 2: 0.5 : 4;
Val2= VArg .^ 2 +2 *VArg + 3
Val2 = 11.0000 14.2500 18.0000 22.2500 27.0000
Operatorul .^ indică ridicarea la putere a fiecărei valori din vectorul de argumente
2.2. Polinoamele sunt reprezentate prin vectorul coeficienţilor polinomului luaţi în ordine descrescătoare a puterilor.
32)( 2 ++= xxxp => p1=[1 2 3] ; %vectorul linie al coeficienţilor
Evaluarea polinomului folosind VECTORUL coeficienţilor:
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
40
p1=[1 2 3] ; %vector coeficienţi x=[-18: .2 : 22]; %vector abscise
y=polyval(p1,x);
plot(x, y, 'linewidth', 2.6);
Funcţia polyval evaluează un polinom (dat prin coeficienţii polinomului p1) la abscisele din x (parametrul al doilea).
2.3.Adunare şi scădere de polinoame Se adună/scad element cu element coeficienţii de acelaşi ordin. Vectorii coeficienţilor trebuie să aibă acelaşi număr de elemente:
p1= [1 2 3]; p2= [0 3 4]; >> p_suma=p1+ p2 p_suma = 1 5 7
32)(1 2 ++= xxxp
43)(2 += xxp
)(2)(1)( xpxpxpsum +=
2.4.Inmulţire şi împărţire de polinoame cu funcţiile conv şi deconv:
)1)(32()( 2 −++= xxxxprod 1
322)(
−++= x
xxximp
Exemplu Matlab: p1=[1 2 3]; p2=[1 -1]; prod=conv(p1, p2) prod = → 1 1 1 -3 [cat, rest]=deconv(prod, p2) cat = → 1 2 3 rest = → 0 0 0 0 [cat, rest]=deconv(prod, p1) cat = → 1 -1 rest = → 0 0 0 0
1322
)(−
++= xxxximp
[cat rest]=deconv([1 2 3], [1 -1])
cat = → 1 3 rest = → 0 0 6 p1_ini = conv(cat, [1 -1]) + rest
p1_ini = → 1 2 3
Înmulţirea a două polinoame date prin vectorii coeficienţilor: Comparaţi coeficienţii obţinuţi prin programul scris şi prin apelul funcţiei conv() - gradul polinoamelor p1,p2 scrise prin coeficienţi este:
length(p1)-1 respectiv length(p2)-1;
- gradul polin. produs p12 este: length(p1)+length(p2) - 2 - se alocă length(p1)+length(p2) -1 pozitii în p12. P1=[1 2 3]; p2=[1 -1]; p12= zeros(1,length(p1)+length(p2)-1) for i=1:length(p1) for j=1:length(p2) p12(i+j-1)= p12(i+j-1)+ p1(i)* p2(j); %produsul de pe poziţiile i,j intră în poz. p12(i+j-1) end %ex:i=1,j=1=> p12(2-1) inmultire puteri maxime end %ex:i=3,j=2=>p12(4) inmultire termeni liberi p12 %afisare coef. determinati prin program %pt. comparaţie: prod=conv(p1,p2) %afisare coef. determ prin functia conv()
Să se calculeze determinantul matricei B:
=
4+2x+x52+x
2+x6+3x+x10B
2
2
Se înmulţesc polinoame şi se scad: ( pe DiagSecund se adaugă 0 pt. gradul superior) detB=conv([10 3 6], [5 2 4]) - conv([0 1 2],[0 1 2] ); detB = 50 35 75 20 20 % Polinomul rezultat se reprezintă grafic pe un interval: x=-2 : 0.1 : 2; plot(x, polyval(detB,x), 'linewidth',1.4)
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
41
Opţional: Să se reprezinte grafic funcţia:
22
21
22
22
))(()(
kk+kwmk+kwmk+kwmwF
2132
32
−+−+−+−
=
pentru coeficienţii: k1=244.5; k2=244.5; k3=244.5; m1=1; m2=1; in intervalul: w=10 : 0.01 : 30;
14 16 18 20 22 24 26 28
-0.3
-0.2
-0.1
0
0.1
0.2
0.3
% k1=2; k2=2; k3=4; m1=5; m2=10 detB=conv([-m2 0 k2+k3] , [-m1 0 k1+k2]) - [0 0 0 0 k2^2]; pZerouri=[-m2 0 k2+k3]; w=10:0.01:30;
FRF11=polyval(pZerouri,w) . / polyval(detB,w);
plot(w,FRF11, 'linewidth',1.7); grid on; zoom; z1=roots(pZerouri); f_z1=z1/(2*pi) % rad/s respectiv Hz r12=roots(detB); f_r12=r12/(2*pi) * observăm două asimptote verticale la rădăcinile numitorului
Funcţiile roots() şi pzmap(): Analizaţi următorul raport de polinoame (reprezintă funcţia de transfer G(s) ):
1214)( 3
2
++++
=xxxxsG
num=[1 4 1]; den=[1 0 2 1]; >> roots(num) % rădăcini ec.polinom (zerouri) ans = -3.7321 reale -0.2679 >> roots(den) % radacini numitor (poli) ans = 0.2267 + 1.4677i complex conjugate 0.2267 – 1.4677i -0.4534 Calcul poli, zerouri + trasare figură alăturată (poziţie poli şi zerouri) pzmap([1 4 1],[1 0 2 1]) sau: [p z]=pzmap([1 4 1],[1 0 2 1]) %salvare în p, z , fără reprezentare grafică
-cu cerculeţ ○ sunt notate rădăcinile polinomului de la numărător “zerouri” - cu x sunt notate rădăcinile de la numitor “polii’.
Descompunerea în sumă de fracţii simple a raportului a două polinoame A(x) şi B(x) Fracţiile conţin la numitor polinoame de ordinul unu.
)(... )()(
)2()2(
)1()1(
)()( xknpx
nrpx
rpx
rxBxA ++++= −−−
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
42
unde numim r(1) ,…, r(n) reziduuri iar p(1) ,…, p(n) poli.
Se foloseşte funcţia Matlab: [r, p, k]=residue(A, B) Funcţia se poate apela şi cu efect invers, în forma: [A,B]=residue(r, p, k) caz în care sunt returnaţi coeficienţii polinoamelor A şi B. Descompunere în fracţii simple a funcţiei G=num/den : >> [r, p, k]=residue(num,den) 12
14)( 3
2
++++
=xxxxsG
num=[1 4 1]; den=[1 0 2 1];
Sirul reziduurilor r(1), r(2), r(3): r = 0.6162 – 1.2316i 0.6162 + 1.2316i -0.2324 Obs: 2 reziduuri complex con. + 1 real
Sirul polilor p(1), p(2), p(3): p = 0.2267 + 1.4677i 0.2267 – 1.4677i -0.4534 Obs: 2 poli complex conjugaţi + 1 real
Rest: k = [ ]
-0.4534)( 0.2324-
1.4677i) 0.2267(1.2316i 0.6162
1.4677i) 0.2267(1.2316i - 0.6162
)3()3(
)2()2(
)1()1(
1214
)()(
3
2
−−−+
+−−−−
++++
++=++=
==
xxxpxr
pxr
pxr
xxxx
xBxA
Diagrame Nyquist şi Bode Nyquist([1 4 1],[1 0 2 1])
-5 -4 -3 -2 -1 0 1 2 3-6
-4
-2
0
2
4
6Nyquist Diagram
Real Axis
Imag
inar
y A
xis
Bode([1 4 1],[1 0 2 1]); grid on
3. GRAFICE 3D 1. Curbe spaţiale (3D) – sintaxa funcţiei plot3() plot3(x,y,z) % x, y, z = vectori de coordonate ale punctelor plot3(x,y,z, ‘tip-linie’); plot3(x1,y1,z1, ‘tip-linie1’, x2,y2,z2, ‘tip-linie2’, …) plot3(X,Y,Z) Exemplu: t=0 : pi/40 : 10*pi; plot3(sin(t), sin(t) .*cos(t), 2*t); grid on; Două curbe spaţiale: plot3(sin(t), sin(t).*cos(t), 2*t, sin(t), cos(t), 2*t); sau: plot3(sin(t), sin(t).*cos(t), 2*t, '+' , sin(t), cos(t), 2*t, '-' ); % prima curba trasata din `+`, a doua din `-` Grafic spaţial dinamic - un punct trasează dinamic curba
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
43
comet3(sin(t), sin(t).*cos(t), 2*t); Curbă spaţială - reprezentare funcţie complexă: ze=0.1; r=0: .01 :3; Ac=1./(1-r.^2+2*j*ze*r); %factor complex amplific. depl. statică plot3(r, real(Ac), imag(Ac), 'LineWidth', 1.5); grid on; Curbă spaţială - fun. complexă- două bucle: j=sqrt(-1); w=0: 0.001 :2; H11=(1/5)./(0.4-w.^2+j*0.01*w) + (1/2)./(2-w.^2+j*0.02*w); h=plot3(w, real(H11), imag(H11)); set(h, 'LineWidth', 2.7) grid on; 2.Generarea unei REŢELE – MESH, ÎN PLAN [X, Y]=meshgrid(x,y) sau [X, Y]=meshgrid(x) % X – linii identice, fiecare linie conţine valorile vectorului x %Y - coloane identice fiecare coloană conţine valorile vectorului y Funcţia meshgrid foloseşte domeniile 1D specificate prin vectorii x şi y pentru generarea tablourilor X şi Y . Aceste tablouri sunt folosite la evaluarea funcţiilor de două variabile z=f(x,y) prin funcţiile Matlab mesh şi surf cu reprezentare 3D. >> [X,Y]=meshgrid(0:4, 6:2:10) X = 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 Y = 6 6 6 6 6 8 8 8 8 8 10 10 10 10 10
Domeniu dreptunghiular: -primul vector 0:4 generează matricea X - liniile sunt identice şi conţin valorile vectorului 0:4 pe axa x -atâtea linii câte valori sunt în vectorul 6:2:10 (direcţia oy). -al doilea vector 6:2:10 generează matricea Y -coloanele sunt identice şi conţin valorile vect. 6:2:10 pe axa y -atâtea coloane câte valori sunt în vect. 0:4 (pe direcţia ox). Cele două matrice X şi Y au acelaşi număr de lin. şi col. PERECHILE (X(i,j), Y(i,j) ) formează reţeaua de puncte din domeniul 2D oxy, dreptunghiular, de definiţie al funcţiei z=f(x,y)
>> [X,Y]=meshgrid(3:6) X = 3 4 5 6 3 4 5 6 3 4 5 6 3 4 5 6 Y = 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6
Domeniul este pătrat. Perechile de puncte din plan sunt de forma ( X(i,j), Y(i,j) ): (3,3), (4,3), (5,3), (6,3), (3,4), (4,4) etc.
2. Reprezentare suprafeţe funcţia mesh - reprezentare wireframe funcţia surf - suprafeţe netede.
Matlab reprezintă suprafeţe prin cote z = valori ale funcţiei pentru o reţea de puncte din planul ox-y. Punctele de cotă z adiacente sunt conectate prin segmente colorate de dreaptă (wireframe) în cazul funcţiei mesh şi colorează faţete pentru comanda surf.
Fie o funcţie de forma z=f(x,y):
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
44
( ) 2222 /sin yxyxz ++=
sau: z=sin(ra)/ra, unde ra= 22 yx + . (sau direct: Z=sin( sqrt(X .^2+Y.^2) ) . / sqrt( X .^2+Y.^2);) Etapa#1: se generează reţeaua de puncte din planul x-y [X,Y]=meshgrid(-12:.4:12, -12:.4:12); %sau meshgrid(-12: .4: 12);
Etapa#2: calcul matricea ra de valori intermediare
ra=sqrt(X .^2+Y.^2);
%matricele X şi Y sunt ridicate la pătrat element cu element, %adunate, apoi radicalii din fiecare element salvaţi în matricea ra Etapa#3: calcul valori finale funcţie cu salvare în matricea Z
Z=sin(ra) ./ ra;
Etapa#4: reprezentarea grafică subplot(211); h=mesh(X,Y,Z); % h este handle la grafic grid on; subplot(212); s2=surf(X,Y,Z); % vezi figura alăturată -> %fiecare matrice X,Y,Z conţine coordonatele x, y resp. z ale tuturor punctelor din grafic. Etapa#5: editare grafic: get(h) % listează pe ecran setul de proprietăţi ale graficului asociat set(h, 'LineWidth', 1.7) %set(h, …) se impune lăţimea liniei de trasare a graficului sau alte proprietăţi ale graficului asociat. title('Functia sinc cu surf'); xlabel('axa x'); ylabel('axa y'); text(0, 0, 0.5 ,’vârf’); Exemplul #2: [X,Y]=meshgrid(-10:16); Z=sqrt(X .^2+Y .^2); surf(X,Y,Z);
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
45
5.3. Animaţie vibraţie robot în jurul unei configuraţii pentru condiţii initiale de pornire specificate %Animatie=continuare program precedent %Recuperare şiruri de valori în cuple sircup1=X(:,1)';sircup2=X(:,2)';sircup3=X(:,3)'; %Poziţionare succesivă a braţului conform cu unghiuri cuple rotatie for t=1:length(sircup1) %se repetă pt fiecare triplet fi1=sircup1(t);fi2=sircup2(t);fi3=sircup3(t) cup1=l1*exp(j*(fi1c+fi1)); cup2=cup1+l2*exp(j*(fi2c+fi2)); cup3=cup2+l3*exp(j*(fi3c+fi3)); %se traseaza o configuratie a braţului cu line() lc=line([0 real(cup1) real(cup2) real(cup3)],... [0 imag(cup1) imag(cup2) imag(cup3)],... 'linewidth',1.5,'Color',[0 0 0] ) %negru pause(.001); %se şterge configuratia curenta a braţului cu line() lc=line([0 real(cup1) real(cup2) real(cup3)], ... [0 imag(cup1) imag(cup2) imag(cup3)],... 'linewidth',1.5,'Color',[1 1 1] ) %alb end
4. Elemente de CALCUL SIMBOLIC
Variabila simbolică se memorează în forma unui şir de caractere
% defineste mai multe obiecte simbolice
syms f g y g1 g2 ;
whos % afisare tip variabile Name Size Bytes Class Attributes
f 1x1 126 sym g 1x1 126 sym . . . . . .
%defineşte un singur obiect simbolic x = sym('x') x = x
Derivare cu funcţia diff(): dxdf
, derivare ordin 1, 2, 3: 3
3
2
2
,,dx
fddx
fddxdf
syms x f0=3*x^3+5*x^2-6*x+2 % definire f0 pretty(f0) % vizualizare f0 3 2 3 x + 5 x - 6 x + 2 diff(f0) ans = 9*x^2+10*x-6 -------------------------------------------------------- >>f1 = 2*x^2*exp(3*x) % definire f1 >> diff(f1) ans = > 4*x*exp(3*x) + 6*x^2*exp(3*x) -------------------------------------------------------- Derivare, integrare >> diff(log(x)) % log= logaritm natural ans = 1/x >> int(1/x)
% defineste expresia f f= 12 + (x-1)*(x-1)*(x-2)*(x-3) f = 12+(x-1)^2*(x-2)*(x-3) diff(f) % prima derivata ans = 2*(x-1)*(x-2)*(x-3) + (x-1)^2*(x-3) + (x-1)^2*(x-2) diff(f, x, 2) % derivată de ordin 2 ans = 2*(x-2)*(x-3)+4*(x-1)*(x-3)+4*(x-1)*(x-2)+2*(x-1)^2 diff(f, x, 3) % derivată de ordin 3 ans = 24*x-42
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
46
ans = log(x)
Derivare funcţii trigonometrice: >> diff(sin(5*x)) ans = 5*cos(5*x)
>> diff(sin(x)^2) ans = 2*sin(x)*cos(x)
>> diff( sin(x) * cos(x) ) ans = cos(x)^2 - sin(x)^2
>> diff(exp(x) * cos(x)) ans = exp(x)*cos(x) - exp(x)*sin(x)
Simplificare expresie simplify() 1. derivare raport polinoame 2. simplificare = se aduce la numitor comun+calcule: syms x %derivare fractie + simplificare forma num = 2*x^2 + 3*x -1; denom = x^2 - x + 3; RapPol = num/denom RapPol = (2*x^2+3*x-1) / (x^2-x+3) fp=diff( RapPol ) => fp = (4*x+3)/(x^2-x+3) - (2*x^2+3*x-1)/(x^2-x+3)^2*(2*x-1) pretty(fp) 2 4 x + 3 (2 x + 3 x - 1) (2 x - 1) ---------- - -------------------------- → 2 2 2 x - x + 3 (x - x + 3)
fps=simplify(fp), - -> fps = -(5*x^2-14*x-8)/(x^2-x+3)^2 pretty(fps) 2 5 x - 14 x - 8 sau: - --------------- 2 2 (x - x + 3)
Derivate parţiale: Matrice Jacobiana: syms g1 g2 x y ; g1= 20*x^3 +15*y -30 ; g2 = 0.25*x + y -1; % g1,g2 pot avea derivate partiale diff(g1, x) % derivata parţială ans = 60*x^2
diff(g1, y) ans = 15
% Calcul matrice Jacobiană=derivatele parţiale ale vectorului [g1; g2] % în raport cu variabilele independente x şi y
),()2,1(
yxgg
J∂
∂=
J = jacobian([g1; g2], [x y]) % calcul Jacobian J = [ 60*x^2, 15] [ 1/4, 1 ]
Sau: jacobian([g1 g2], [x y]) sau: jacobian([g1; g2], [x; y])
Funcţia ezplot(): “easy plot” ; curbe 2D şi 3D Grafice cu ezplot( )
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
47
syms x f1 f2; % polinom; ecu. polinom. cu solutii simetrice fată de oy: f1=(x-2.16)*(x-12.7)*(x-38.3) * ... (x+2.16)*(x+12.7)*(x+38.3) subplot(211) ezplot(f1, [-40,40]) ; line([-40 40] , [0 0] , 'Color','r'); f2= (x-1)*(x-1)*(x-2)*(x-3)+4 subplot(212) ezplot(f2) % easy plot -2 pi < x < 2 pi ezplot(f2, [0,4]) % graficul fun. f pentru 0 <= x <= 4 df1 = diff(f1); % derivare + grafic derivata ezplot(df1,[0,4]) line([0 4],[0 0],'Color','r') --------- Grafic spaţial 3D / fără parametru simbolic % trei expresii şi intervalul parametrului t (t nu-i simbolic) ezplot3('sin(t)' , 'sin(t).*cos(t)' , ' 2*t' , [0,6*pi]);
-40 -20 0 20 40
-4
-3
-2
-1
0
1
2
3
x 108
x
(x-54/25) (x-127/10) (x-383/10) (x+54/25) (x+127/10) (x+383/10)
0 1 2 3 4
4
6
8
10
12
14
x
(x-1)2 (x-2) (x-3)+4
Substituţii + simplificare (calculele numerice şi simbolice pot fi combinate): Substituie valoare numerică într-o variabilă Substituie expresie simbolică într-o variabilă syms x y;
f = x^2*y + 5*x*sqrt(y) subs(f, x, 3) ans = 9*y+15*y^(1/2)
subs(f, y, 3) ans = 3*x^2+5*x*3^(1/2)
>>aa=subs(f, x, x^2+y) ans = (x^2+y)^2*y + 5*(x^2+y)*y^(1/2)
>> simplify(aa) ans = x^4*y + 2*x^2*y^2 + y^3 + 5*x^2*y^(1/2) + 5*y^(3/2)
syms g1 g2 x y ;
g1= 20*x^3 +15*y -30 ; g2 = 0.25*x + y -1; g12 = [g1; g2]
% evaluare g12 pentru x = 1, y = 2.5
subs( g12, {x, y}, {1 , 2.5}) sau: subs( [g1 g2], {x, y}, {1 , 2.5}) ans = 27.5000 1.750
Funcţia solve() : soluţii simbolice pentru ecuaţii şi sisteme de ecuaţii algebrice Soluţie simbolică ecuaţie gradul 2 Parametrul este ‘ şir de caractere ’
>> x12=solve('a*x^2 + b*x + c') x12 = -1/2*( b - (b^2-4*a*c)^(1/2) )/a -1/2*( b + (b^2-4*a*c)^(1/2) )/a →
pretty(x12) [ 2 1/2 ] [ b – (b - 4 a c) ] [- 1/2 ------------------- ] [ a ] [ ] [ 2 1/2 ] [ b + (b - 4 a c) ] [- 1/2 ------------------- ]
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
48
[ a ] Sistem 2 ec. cu 2 necunoscute >> [sx sy] = solve( ' x + y = a ', ' x - 11*y = b ') % solutie simbolica sx = 11/12*a+1/12*b sy = 1/12*a-1/12*b
Soluţie ecuatie în raport de r apoi în raport de ze: syms r, ze; >> solve( '1-r^2+2*ze^2*r^2 ' , r) % ex. suport vibratii ans = -1/(1-2*ze^2)^(1/2) 1/(1-2*ze^2)^(1/2) pretty(1/(1-2*ze^2)^(1/2))
>> solve('1-r^2+2*ze^2*r^2', ze) ans =
1/2*(-2+2*r^2)^(1/2)/r
-1/2*(-2+2*r^2)^(1/2)/r
Soluţii numerice: Expresie matriceală (se reia exemplul cu polyval): syms w; M=[5 0;0 10]; K=[4 -2;-2 6]; detB=det(eval(K-w^2*M)) detB = 20-70*w^2+50*w^4
solve(detB) %sau: solve( '20 - 70*w^2 + 50*w^4' ) ans = -1 % 4 solutii w1,w2,w3,w4 1 1/5*10^(1/2) % (2/5)^(1/2) -1/5*10^(1/2)
% solutii numerice [sx sy] = solve(' x + y = 1 ' , ' x - 11*y = 5 ') sx = 4/3 sy = -1/3
Sistem 3 ecuaţii liniare (solutii numerice): [sx1 sx2 sx3] = solve(' 3*x1-x2=5 ' , ' -2*x1+x2+x3', ' 2*x1-x2+4*x3=15' ) %a doua ec. implicit=0 sx1 = 2 sx2 = 1 sx3 = 3 Rezolvare sistem două ecuaţii neliniare (solutii numerice):
clear syms x1 x2 % definire funcţii h1 = x1*x1 + x2*x2 - 2; h2 = 0.25*x1*x1 +0.75*x2*x2 -1; [x1 x2] = solve(h1, h2); %rezolva sist. pt. x1 şi x2 x1 = -1 1 -1 1 x2 = % -1 - 1 sol#1 -1 % 1 -1 sol#2 -1 % -1 1 sol#3 1 % 1 1 sol#4 1
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
49
Funcţia int() Integrare simbolică syms x fin =2*x^2 >> int(fin) ans = 2/3*x^3
>> int(1/x) ans = log(x)
>> int(tan(x)) ans = -log(cos(x)) diff( -log(cos(x)) ) ans = sin(x)/cos(x)
syms a b x % variabile simbolice f = 3*a*b*x + 2*exp(a*x + b); % definitie f f1 = diff(f, x) % derivata functiei f in rap. cu x >> f1 = 3*a*b+2*a*exp(a*x+b)
» int(f1, x) % integrare simbolica f1 în raport cu x ans = 3*a*b*x+2*exp(a*x+b) % s-a obţinut f din nou
Integrala definită: » int(f, x, 0, pi/2) % integrare în raport cu variabila x între 0 şi pi/2 ans = > 1/8*(3*a^2*b*pi^2+16*exp(1/2*pi*a+b)-16*exp(b))/a » f2 = int(f, b, 0, pi/2) % integrare în raport cu b între 0 şi pi/2 f2 = > 3/8*a*pi^2*x+2*exp(a*x+1/2*pi)-2*exp(a*x) Matrice Funcţia inv() inversare matrice, simbolic syms m1 m2 M; M=[m1 0; 0 m2]; inv(M) %matrice diagonală ans = [ 1/m1, 0] [ 0, 1/m2]
syms a b c d A; A=[a b; c d]; pretty(inv(A)) [ d b ] [ --------- - --------- ] [ a d - b c a d - b c] [ ] [ c a ] [- --------- --------- ] [ a d - b c a d - b c ] det(A) ans = a*d - b*c
%Matrice coloana * matrice linie [a; b]2x1 * [c d]1x2 ans = [ a*c, a*d] [ b*c, b*d]
Funcţia expand(): syms a b c ; c=sin(a+b) expand(c) ans = sin(a)*cos(b)+cos(a)*sin(b) expand(cos(a+b)) ans = cos(a)*cos(b)-sin(a)*sin(b)
>> expand( cos(2*a) ) ans = 2*cos(a)^2 - 1 etc.
Limite: dx
xfdxxfxfdx
)()(lim)(0
−+=
→ = definiţia derivatei
dxxdxx
dx
)cos()cos(lim0
−+→
→ -sin(x)
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
50
>> syms x, dx >> limit( (cos(x+dx)-cos(x) )/dx, dx, 0) ans = -sin(x)
sau: >> diff(cos(x)) ans = - sin(x)
dxxdxx
dx
)sin()sin(lim0
−+→
→ cos(x)
>> limit( (sin(x+dx) - sin(x) )/dx, dx, 0) ans = cos(x)
sau: >> diff(sin(x)) ans = cos(x)
enn
n
=→
+
→)1exp(11
inflim
>> limit( (1+1/n)^n, n, inf ) ans = exp(1) >> exp(1) ans = 2.7183
xn
exnx
n=→
+
→)exp(1
inflim
>> limit( (1+x/n)^n, n, inf ) ans = exp(x)
Dezvoltare în serie de funcţii Taylor Serie MacLaurin
syms x f1 = sin(x); % functie trigonometrică T1 = taylor(f1,10) % primii 10 termeni T1 = > x -1/6*x^3 +1/120*x^5 -1/5040*x^7 +1/362880*x^9 % sunt afisati termenii nenuli f2=cos(x); % functie trigonometrică T2=taylor(f2,10) T2 = > 1 - 1/2*x^2 + 1/24*x^4 - 1/720*x^6 + 1/40320*x^8
Să se verifice relaţiile: (x)j+(x)=e jx sincos ⋅ (x)j-(x)=e-jx sincos ⋅ f3 =exp(j*x); T3 = taylor(f3,10) T3 = 1+ i*x- 1/2*x^2 - 1/6*i*x^3+ 1/24*x^4+ 1/120*i*x^5- 1/720*x^6 -1/5040*i*x^7+ 1/40320*x^8+ 1/362880*i*x^9 Diverse 1. Calculul funcţiei sin(x) folosind dezvoltarea în serie Taylor:
nn
nRx
n!xfx
!xf+x
!xf+x
!xfxf=xxf ++++
)(3
)(2
)(1
)()()( 0)(
30'''
20''
0'
00
nn
nRx
n!fx
!f+x
!f+x
!ff=xf ++++
)0(3
)0(2
)0(1
)0()0()0()(
3'''
2'''
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
51
1)!+(2nx)(-1=(x)
12n+n
0=n∑∞
sin n0=nT∑=
∞ =>
)+2n)+(2nxT=T
2
nn 3(21−⋅+
x=input('Dati valoarea lui x [radiani] pt calcul sin(x)\n') n=input('Numar iteratii n= \n') suma=x; T=x; %suma partiala si termenul curent for i=0:n T=-T*x^2/(2*i+2)/(2*i+3); suma=suma+T; end fprintf('Valoare calc= %20.15f \nVal calc Matlab=%20.15f\n',suma,sin(x) ); Rulare: x =0.4 Numar iteratii n= 23 Valoare calc= 0.389418342308650 Val calc Matlab= 0.389418342308651 2. Rezolvare sistem de ecuaţii liniare de forma: AX=B 2.1. Inversare matrice: A=[3 -1 0;-2 1 1;2 -1 4] B=[5 0 15].' sau B=[5; 0; 15;] X1=A^-1 * B sau: X1=A \ B X1 = 2.0000 1.0000 3.0000 2.1. Metoda lui Cramer: x1= ∆∆ /1 , x2= ∆∆ /2 , x3= ∆∆ /3 unde ∆ este determinantul sistemului iar i∆ este determinantul matricei coeficienţilor (A) în care coloana “i” a fost înlocuită cu coloana termenilor liberi (B). A=[3 -1 0; -2 1 1; 2 -1 4] B=[5 0 15]'
X=A^(-1)*B; X= ... %calcul direct A1=[5 -1 0; % Cramer 0 1 1; 15 -1 4] x1=det(A1)/det(A)
A3=[3 -1 5; -2 1 0; 2 -1 15]; x3=det(A3)/det(A)
3. Calcul matriceal, verificarea unor relaţii: 1. (A*B)T=BT* AT, 3. (A-1)T=(AT)-1 5. (A+B)*C=A*C+B*C 2. (A*B)-1=B-1 * A-1 4. det(A) * det(A-1)=1 det(AB)= det(BA)=det(A)*det(B) 4. Sortare prin metoda selecţiei a=input('Va sorta in ord. descresc.\nIntroduceti un sir: ') asort=sort(a,'descend'); n=length(a); for i=1:n-1 poz_max=i; for j=i+1:n if a(j)>a(poz_max) poz_max=j;%retine pozitie element maxim end end aux=a(i);a(i)=a(poz_max);a(poz_max)=aux; %interschimba
=+−=++−
=−
153421203212
5213
xxxxxx
xx
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor
52
end a asort 5. Sortare prin metoda bulelor a=input('Va sorta in ord. descresc.\nIntroduceti un sir: ') asort=sort(a,'descend'); n=length(a); for i=n-1:-1:0 for j=1:i %elem. cel mai mare este plasat ultimul in subsirul de indici 1,...,i if a(j)<a(j+1) aux=a(j); a(j)=a(j+1); a(j+1)=aux; end end end a asort 6. Integrare function y = myfun(x) %definitie functie y = 1./(x.^3-2*x-5); quad('myfun',1,2) %integrare ans = -0.2860 >> quad('myfun',-1,7) Warning: Minimum step size reached; singularity possible. > In quad at 103 ans = -0.3811
tjea ω⋅