+ All Categories
Home > Documents > Sisteme de Programare Pentru Modelare Si Simulare - Curs

Sisteme de Programare Pentru Modelare Si Simulare - Curs

Date post: 01-Dec-2015
Category:
Upload: portal-studentesc-energetica
View: 441 times
Download: 12 times
Share this document with a friend
Description:
Autor: Gh. Lazaroiu
463
1. SISTEME DE PROGRAME PENTRU MODELARE ŞI SIMULARE Pentru a putea rezolva regimurile dinamice, care să includă si sistemele de reglare in timp real, este necesar ca programele de simulare sa fie rapide, complete, facile si dezvoltabile. În majoritatea cazurilor, acestea se bazează pe experienţa si dezvoltările limbajului FORTRAN, care dispune de algoritmi numerici robuşti şi o librărie de programe foarte dezvoltate. Totuşi, în ultimii ani, facilităţile introduse de Windows şi, în special grafica, sunt superioare, astfel încât au fost dezvoltate programe specializate, cu posibilităţi grafice superioare. Sistemele industriale care interesează aplicaţiile inginereşti sunt: Sisteme discrete, la care procesele se desfăşoară secvenţial, precum procesele de transport, din furnal, de încălziri si răciri etc. Sisteme de proces, care cuprind procese industriale la scară largă, procese ce se pot desfăşura continuu sau în tranşe. Fluxurile materiale şi de energie sunt esenţial continui în timp, ca exemplu lichide, gaze, pulberi. Sisteme dinamice generalizate, care cuprind sistemele tehnologice complexe şi dezvoltate, precum cele de propulsie (automobile, avioane) sau cele din unităţile energetice. De remarcat că aceste sisteme pot fi foarte mici (precum circuitele electronice) sau foarte mari (precum centralele electrice). 1.1. Simularea sistemelor discrete Sistemele discrete se întâlnesc în procesele de producţie şi manufacturiere şi cuprind multe fluxuri şi reţele care se combină odată cu componentele care se asamblează, compactează şi stochează. Pentru o eficienţă competitivă, liniile de producţie se optimizează, în sensul eliminării timpilor morţi si de aşteptare. De aceste procese se ocupă ramura tehnologică COMPUTER INTEGRATED MANUFACTURING (CIM); pentru ele s-au dezvoltat următoarele chituri de programe: SIMAN/CINEMA, dezvoltat de Cimulation Centre, Cornbrash, Anglia. SIMPLE++ , dezvoltat de AESOP Preston, Anglia. SIMFACTARY/SIMPROCES ,dezvoltat de Coliseum, Camberley, Anglia. WINTESS ,dezvoltat la AT and TISTEL, Anglia. Programele cuprind facilităţi grafice care să prezinte fluxurile materiale, structura procesului, strategii de asamblare, logistică etc. Rezultatele simulării pot fi prezentate sub formă tabelară, grafică, histograme etc. Au, de asemenea, posibilitatea construirii ierarhice a sistemelor complexe.
Transcript

1. SISTEME DE PROGRAME PENTRU

MODELARE ŞI SIMULARE

Pentru a putea rezolva regimurile dinamice, care să includă si sistemele de reglare in timp real, este necesar ca programele de simulare sa fie rapide, complete, facile si dezvoltabile. În majoritatea cazurilor, acestea se bazează pe experienţa si dezvoltările limbajului FORTRAN, care dispune de algoritmi numerici robuşti şi o librărie de programe foarte dezvoltate. Totuşi, în ultimii ani, facilităţile introduse de Windows şi, în special grafica, sunt superioare, astfel încât au fost dezvoltate programe specializate, cu posibilităţi grafice superioare.

Sistemele industriale care interesează aplicaţiile inginereşti sunt: Sisteme discrete, la care procesele se desfăşoară secvenţial, precum procesele de transport, din furnal, de încălziri si răciri etc. Sisteme de proces, care cuprind procese industriale la scară largă, procese ce se pot desfăşura continuu sau în tranşe. Fluxurile materiale şi de energie sunt esenţial continui în timp, ca exemplu lichide, gaze, pulberi. Sisteme dinamice generalizate, care cuprind sistemele tehnologice complexe şi dezvoltate, precum cele de propulsie (automobile, avioane) sau cele din unităţile energetice. De remarcat că aceste sisteme pot fi foarte mici (precum circuitele electronice) sau foarte mari (precum centralele electrice).

1.1. Simularea sistemelor discrete

Sistemele discrete se întâlnesc în procesele de producţie şi manufacturiere şi cuprind multe fluxuri şi reţele care se combină odată cu componentele care se asamblează, compactează şi stochează. Pentru o eficienţă competitivă, liniile de producţie se optimizează, în sensul eliminării timpilor morţi si de aşteptare.

De aceste procese se ocupă ramura tehnologică COMPUTER INTEGRATED MANUFACTURING (CIM); pentru ele s-au dezvoltat următoarele chituri de programe:

SIMAN/CINEMA, dezvoltat de Cimulation Centre, Cornbrash, Anglia. SIMPLE++ , dezvoltat de AESOP Preston, Anglia. SIMFACTARY/SIMPROCES ,dezvoltat de Coliseum, Camberley, Anglia. WINTESS ,dezvoltat la AT and TISTEL, Anglia.

Programele cuprind facilităţi grafice care să prezinte fluxurile materiale, structura procesului, strategii de asamblare, logistică etc.

Rezultatele simulării pot fi prezentate sub formă tabelară, grafică, histograme

etc. Au, de asemenea, posibilitatea construirii ierarhice a sistemelor complexe.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 22

1.2. Sisteme de proces

Sistemele de proces au fost dezvoltate cu precădere în industria petrochimică, farmaceutică, biotehnologii, procese chimice în general, pentru care s-au dezvoltat module specializate precum: schimbătoare de căldură, coloane de distilare, reactoare chimice, generatoare.

Programele dezvoltate sunt : CADAS (Computer Aide Design and Synthesis of industrial proces ), dezvoltat la SIMRAD ALBATROSS , Konsberg, Norvegia. ASPEN PLUSS - pentru optimizarea proceselor, dezvoltat la Cambridge, Anglia. MAX - orientat cu precădere pentru calculatoare personale, grafic, Cambridge, Anglia. SPEEDUP- simulează procesele dinamice on-line, Cambridge, Anglia.

1.3. Sisteme dinamice generalizate

Pentru sistemele dinamice generalizate s-au dezvoltat chituri, care să conţină algoritmi de rezolvare (diferenţiere şi integrare) rapizi şi robuşti, precum şi următoarele facilităţi: utilizarea eficientă a tehnologiei VDU, a Graphical User Interface (GUI), posibilităţi de dezvoltare ierarhică, de prezentare etc.

Noile chituri de simulare au în comun următoarele: Reprezentarea modelelor matematice prin icoane grafice, cu posibilitatea unirii acestora şi introducerii datelor specifice modelului dat. Simularea se face prin rutine de integrare numerică, bazate pe algoritmi eficienţi si robuşti (Rurge-Kutta, Euler, Adams). Posibilităţi grafice: datele pentru şi din simulare, afişate cu programe grafice. Detectarea erorilor si facilităţi de depanare: se realizează prin mesaje imediate sau prin utilizarea unor programe care să detecteze sursa erorilor. Comunicarea cu utilizatorul se face interactiv, prin pauze între simulări, pentru a analiza rezultatele grafice parţiale sau pentru a modifica anumiţi parametri ai simulării.

1.4. Sisteme de programe pentru simulare

Principalele programe pentru simulare sunt: • ACSL (Advance Continuous Simulation Language), care este

structurat pe limbajul FORTRAN şi care are posibilităţi de dezvoltare pentru simulare şi modelare. Facilităţile grafice ale versiunii sub WINDOWS constau în căsuţe de dialog, posibilităţi de help şi sunt disponibile prin PROTOBLOK sau Graphic Modeller. Toate blocurile

Sisteme de programe pentru modelare şi simulare 23

sunt cu structură ierarhică şi cu pictograme pentru echipamentele de simulat. Programul este dezvoltat de Rapid DATA Ltd, Anglia. Bazat pe ACSL este programul MMS, disponibil în catedră.

• EASY 5X este versiunea X - Window a lui EASY 5, introdus în 1987 de compania Boeing, pentru analiza sistemelor inginereşti. EASY 5X a fost introdus în 1992 pentru modelarea, simularea, analiza şi proiectarea sistemelor statice şi dinamice, liniare şi neliniare. Are posibilitatea de a modela sisteme la scară largă, complexe, continui, hibride, multiple. Utilizatorul are posibilitatea construirii modelului prin selectarea blocurilor din librăria de componente standardizate sau specializate, prin luarea cu mouse-ul şi mutarea în locul dorit, apoi prin apăsarea pe mouse se poziţionează. Legătura dintre componente se face prin linii, care se trag cu mouse-ul de la un bloc la altul.

• EASY 5X are facilitaţi ierarhice de a masca subsistemele în interiorul unui sistem, apelabile prin apăsarea pe mouse. Din pachetul de programe fac parte si rutinele pentru analiză şi rezolvare, de optimizare a parametrilor, analiză liniară, facilităţi de liniarizare ca şi de integrare şi diferenţiere. Rezultatele pot fi plotate on-line interactiv, în timpul simulării, sau of-line (la sfârşit). Pachetul de programe EASY 5X este dezvoltat de Boeing SUA.

• MATRIXx: este introdus începând din 1983 de Integrated System INC, Anglia, ajungând acum la versiunea 4. Acesta poate simula sisteme continuu discrete, hibride, cu una sau mai multe mărimi variabile. Editorul graphic, SYSTEM BUILD, introdus în 1984, permite apelarea facilă a blocurilor ca şi unirea acestora, prin conectare grafică. Parametrii modelului pot fi daţi şi modificaţi prin acces grafic la căsuţa acestuia. Dispune de librării specializate pentru proiectarea controlului (reglării), de modele de reducere şi optimizare. Parametrii constantelor pot fi daţi în sistem internaţional sau anglo-saxon. Are posibilităţi de prezentare grafică a rezultatelor. Sunt diferenţe mici între acesta şi MATLAB. Recent, a fost dezvoltat pachetul XMATH din familia MATRIXx, care lucrează pe staţii grafice sub X-WINDOWS şi care are posibilităţi grafice în 2D şi 3D, rutine numerice pentru procesarea semnalului şi funcţii de proiectare a controlului.

• PSI/C este noua versiune, C, a pachetului original PSI, dezvoltat de Delft Technical University, Olanda, cu posibilităţi grafice scrise în C. Este un program mai puţin avansat, la un preţ modest şi se pretează la aplicaţii restrânse sau educaţionale.

• SIMNON a fost dezvoltat începând cu 1974, la Lund Institute of Technology, Suedia, ajungând la versiunea 6. Cea mai importantă dezvoltare este interfaţa grafică ISEE-SIMNON, prin care se pot structura modele ierarhice complexe.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 24

• SIMULINK/MATLAB, dezvoltat de Math Works Inc, SUA, ştiinţifice şi inginereşti. Fundamental pentru acest program este faptul că lucrează cu matrice de dimensiuni arbitrare. MATLAB a fost introdus în 1981, ajungând la versiunea 7. Bazat pe algoritmii numerici ai MATLAB, a fost dezvoltat după 1992 programul SIMULINK, pentru simularea dinamică a sistemelor. SIMULINK permite modelarea şi analiza sistemelor dinamice, incluzând modelele liniare, neliniare, continui, discrete şi hibride. Modelele se construiesc simplu, prin copierea modelelor componente din biblioteca de programe, în spaţiul de lucru, prin intermediul mouse-ului. Unirea blocurilor se face tot cu mouse-ul, trăgând liniile între blocuri. Modificarea parametrilor şi alegerea algoritmului de simulare se face prin clicarea butonului mouse-ului. Are biblioteci de programe specializate pentru calculul statistic, analiza semnalului, sisteme neliniare, analiza în frecvenţă, programare liniară cu restricţii, sinteza circuitelor, proiectarea regulatoarelor etc. Posibilităţile de afişare grafică sunt, de asemenea, dezvoltate, putând prezenta rezultatele bidimensional sau tridimensional.

• VISSIM este un alt produs pentru simularea sistemelor continui, având peste 75 componente predefinite (liniare si neliniare). Este dezvoltat de Adept Scientific Micro System Ltd, Anglia.

• Datorită includerii în pachetul Microsoft Office, Microsoft Excel este instalat pe majoritatea calculatoarelor care rulează una dintre variantele Windows. Efectuarea unor calcule şi grafice în cadrul Microsoft Excel este recomandabilă, deoarece beneficiază de toate avantajele folosirii conjugate a aplicaţiilor componente Microsoft Office: eficacitate, transfer facil al informaţiilor între documente prin copiere, stabilirea unor legături între copiere şi original, încorporarea de noi date, prin copierea de informaţii existente sau inserare prin intermediul unor obiecte. Într-un capitol distinct, se va face o prezentare succintă a acestei aplicaţii software, prin descrierea principalelor funcţii şi modul în care acestea pot fi utilizate, pentru realizarea unor calcule matematice complexe, inclusiv pentru modelare şi simulare.

1.5. Criterii pentru compararea programelor de simulare

Pentru a compara diferitele produse soft sunt considerate următoarele: 1. cerinţe esenţiale 2. cerinţe dorite

a. Disponibilitatea relativă la subprograme precum: - facilităţi de lucru cu matrice; - testarea si plotarea răspunsului în frecvenţă şi timp; - analize de stabilitate şi senzitivitate;

Sisteme de programe pentru modelare şi simulare 25

- determinarea punctului de echilibru; - rutine pentru procesarea semnalului; - control robust si opţional; - funcţii pentru identificare model, transformare, reducere.

b. Acces la librăria cu componente şi module apropiate c. Facilităţi de help on-line d. Compatibilitate staţii de lucru / PC e. Posibilitatea creerii de pictograme f. Posibilităţi de simulare iterativă şi animaţie g. Cod de compilare de înalt nivel, optimizat prin convertirea diagramei

bloc, în cod sursă, pentru limbajul de compilare. h. Generarea automată a codului în timp real.

Analiza comparativă a pachetelor EASY 5X, MATLAB/SIMULINK şi MATRIXx este redată în tabelul de mai jos.

FACILITATEA EASY5X MATLAB /

SIMULINK

MATRIXx

• Cerinţe esenţiale a. Capacitatea de simulare a

sistemelor complexe X X X

b. Diagrame bloc X X X c. Ecuaţii pentru modulele de

bază X X X

d. Facilităţi de inserare din alte blocuri sau coduri

X X X

e. Simulare interactivă X X X f. Posibilităţi grafice X X X g. Rutine rapide neevaluat neevaluat neevaluat h. Utilizare facilă X X X • Cerinţe dorite a. Disponibilitate subprograme limitat X X b. Acces librărie componente X X - c. Help on-line X X X d. Lucru PC/staţii grafice - X X e. Creare de pictograme X X - f. Simulare interactivă şi

animaţie - X X

g. Cod optimizat X X X h. Posibilităţi de lucru în timp

real X X X

2. PREZENTARE GENERALĂ MATLAB

MATLAB (MATrix LABoratory) este un pachet de programe de înaltă

performanţă dedicat calculului numeric şi reprezentărilor grafice în domeniul ştiinţei şi al ingineriei, care integrează: analiza numerică, calculul matriceal, procesarea semnalului şi reprezentările grafice într-un mediu uşor de învăţat şi folosit. Elementul de bază cu care operează MATLAB este matricea (matrix), cu care se pot rezolva problemele date, fără a fi necesară cunoaşterea unui limbaj de programare. Cea mai importantă caracteristică a MATLAB este uşurinţa în operare şi dezvoltarea unor aplicaţii specifice domeniului în care lucrează utilizatorul.

Structural, MATLAB este realizat sub forma unui nucleu de bază, cu interpretor propriu, în jurul căruia sunt construite aplicaţii specifice diferitelor domenii, numite TOOLBOX (colecţii extinse de funcţii MATLAB, destinate rezolvării unor probleme din domenii variate).

2.1. Ferestre de lucru

MATLAB lucrează cu două tipuri de ferestre: o fereastră de comenzi (Command Window) şi o fereastră pentru reprezentări grafice.

Fereastra de comenzi

În momentul declanşării programului, apare fereastra de comenzi. Meniul principal din bara superioară a acesteia este accesibil prin selecţia directă cu mouse-ul a comenzii dorite sau prin tastarea simultană a tastei Alt şi a literei subliniate a comenzii dorite.

Fiecare comandă din meniul principal furnizează un meniu specific, în cadrul acestuia selecţia putându-se face, fie cu mouse-ul, fie prin tastarea literei marcate special, în fiecare subcomandă a respectivului meniu.

O parte din comenzile prezente în meniul principal sunt aliniate sub formă de butoane pe bara imediat inferioară (Bara cu butoane).

Comenzile esenţiale şi funcţiile matematice se introduc în dreptul cursorului MATLAB; tot de aici se pot declanşa iniţierea toolbox-urilor (colecţii extinse de funcţii MATLAB, destinate rezolvării unor probleme specifice anumitor domenii).

În momentul în care capacitatea ecranului este depăşită din punct de vedere orizontal sau vertical, este posibilă deplasarea cu ajutorul butoanelor de derulare orizontală şi verticală.

În figura următoare sunt prezentate componentele principale ale ferestrei de comenzi descrise anterior:

Prezentare generală Matlab 27

Gestionarea fişierelor

Selectând comanda File, din meniul principal, se obţine submeniul de gestionare a fişierelor, cu următoarea listă de comenzi:

New – provoacă descrierea unui alt sub-submeniu cu opţiunile: M-File (deschide o ferestră de editare a unui fişier), Figure (deschide o fereastră grafică nouă), Model (deschide fereastra corespunzătoare modelării în Simulink); Open – deschide o fereastră de dialog, pentru a selecta un fişier, care va deveni un fişier de lucru; Open selection – analizează fişierele pentru selectare şi deschide pe cel selectat; Run Script – rulează comenzile componente ale unui scenariu; Load Workspace – încarcă fişierul specificat, în care au fost salvate anterior datele din spaţiul de lucru; Save Workspace As – deschide o fereastră de dialog, pentru a salva datele din spaţiul de lucru într-un fişier, al cărui număr trebuie precizat; Show Workspace – prezintă conţinutul spaţiului de lucru; Show Graphics Property Editor – editorul de proprietăţi grafice ; Show GUI Layout Tool – modificarea interfeţei; Set Path – se stabilesc căile către directoarele în care se găsesc fişiere sau

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 28

aplicaţii MATLAB; Preferences – stabilirea proprietăţilor ferestrei de comenzi; Print Setup – configurarea caracteristicilor imprimantei şi paginii; Print – permite tipărirea documentului; Exit MATLAB – părăsirea aplicaţiei.

Funcţia Edit

Aproape toate comenzilor prezente în submeniul Edit sunt comune cu cele din meniurile similare ale majorităţii editoarelor de texte sub Windows: Undo, Cut, Copy, Paste, Clear, Select All.

Ştergerea sesiunii de lucru se realizează cu comanda Clear Session.

Selectarea ferestrelor

Trecerea dintr-o fereastră grafică sau de comenzi, într-o altă fereastră, se realizează prin selectarea comenzii Windows din meniul principal, urmată de selectarea uneia dintre ferestrele grafice deschise sau acelei de comenzi.

Editarea programelor

La editarea oricărui program, utilizatorul poate apela help-ul şi astfel să revadă parametrii de intrare şi ieşire ai funcţiei respective.

În plus, sunt furnizate informaţii referitoare la funcţionarea MATLAB, demonstraţii şi exemple.

Fereastra de reprezentări grafice în Matlab

Fereastra grafică este o formă elevată de reprezentare a graficelor; pot exista mai multe ferestre grafice deschise în acelaşi timp, dar o singură fereastră de comenzi.

În fereastra grafică pot fi reprezentate funcţii 2D sau 3D, imagini color, animaţie etc.

Gestionarea ferestrelor grafice

Selectarea comenzii File-New-Figure determină trecerea într-o fereastră grafică. Dacă se selectează comanda Window (din meniul principal), urmată de opţiunea Figure, se trece în fereastra grafică ce conţine o reprezentare anterioară.

Editarea graficelor

Selectând comanda Edit din meniul principal al ferestrei grafice, apare un submneniu, asemănător cu cel al ferestrei de comandă.

Prezentare generală Matlab 29

2.2. Funcţii de interes general

Funcţii pentru intrarea şi ieşirea din Matlab

Funcţiile pentru lansarea unei sesiuni de lucru în MATLAB, părăsirea acesteia, precum şi asigurarea unor informaţii necesare unei funcţionări corecte sunt:

startup – fişier M, executat la activarea MATLAB; matlabrc – fişierul principal pentru lansarea MATLAB (conţine toate căile de acces la fişierele de lucru, precum şi setările parametrilor de lucru); exit, quit – ieşire din MATLAB.

Funcţii pentru control general

Pentru controlul general al mediului de programare MATLAB se utilizează funcţiile:

help – furnizează informaţii despre funcţionarea MATLAB; what – listează fişierele *.M, *.MAT şi *.MEX din directorul curent; type – listează fişierul M menţionat; lookfor – întoarce numele fişierelor care au în prima linie a Help (linia H1) cuvintele precizate ca argument; which – întoarce calea spre un fişier sau o funcţie MATLAB; path – întoarce căile utilizate de MATLAB pentru a găsi fişierele apelate; who – listează variabile curente din memorie; whos – listează variabilele curente, dimensiunile lor, precum şi tipul acestora (reale sau complexe).

Funcţii pentru controlul directoarelor şi fişierelor

Principalele funcţii Matlab cu ajutorul cărora se controlează directoarele şi fişierele sunt:

cd – schimbă directorul curent; dir – listează conţinutul directorului curent; delete – şterge fişierul precizat de pe disc; ! – execută comenzi DOS (precedate de !), fără părăsirea MATLAB; diary – salvează sesiunea de lucru (fără partea grafică) într-un fişier text (ASCII).

Funcţii de control ale mărimilor de timp

Controlul mărimilor de timp specifice se realizează cu funcţiile: clock – citeşte timpul din BIOS-ul computerului; cputime – determină timpul de calcul al “CPU”; date – citeşte data din BIOS-ul computerului;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 30

etime –cronometrează intervalul de timp între două evenimente; tic, toc – porneşte, respectiv opreşte un cronometru.

Funcţii asociate ferestrei de comenzi

Fereastra de comenzi se poate controla prin următoarele funcţii: clc – şterge fereastra de comenzi; home – mută cursorul în poziţia iniţială (prima linie-prima comandă); format opţiune – setează formatul de afişare a datelor, în funcţie de opţiunea specificată (short – 5 cifre, long – 15 cifre, short e – 5 cifre + exp, long e – 15 cifre + exp, hex – hexazecimal, plus – plus blanc minus, blank – cu 2 zecimale, rat – în numere raţionale); echo – permite afişarea liniilor de program, în timpul executării acestora; more – funcţie pentru controlul numărului de linie afişat de monitor.

Funcţii de control ale variabilelor din memorie

În timpul lucrului, o serie de mărimi sunt reţinute în spaţiul de lucru sau în memoria calculatorului. Acestea pot fi controlate cu următoarele funcţii:

disp (X)– afişează o matrice sau un text, fără a tipări numele acesteea, unde X este un şir text sau o matrice; Exemplificare: Următoarea secvenţă de MATLAB duce la afişarea unei matrice cu etichete de coloane: Nr. Var1 Var2

disp (‘Nr. Var1 Var2) 1 5 2

for i= 1:4 ⇒ 2 20 4

y=[i,5*i^2, 2^i]; 3 45 8

end. 4 80 10

clear – şterge toate variabile din spaţiul de lucru (clear X Y Z şterge doar variabilele menţionate); pack – compactează datele din memorie; size – întoarce dimensiunea unei matrice; length – returnează lungimea unui vector. Exemplificare: Pentru matricea X = [1 2 4; 5 7 9], instrucţiunile: b = size(X) b = [2 3] - 1 linie şi 4 coloane [m,n] = size (X) ⇒ m = 2 - 1 linie

d = length (X) n = 3 - 4 coloane

d = 3 - dimensiunea maximă 4

Prezentare generală Matlab 31

Variabile speciale şi constante Matlab

Variabilele speciale şi constantele au o semnificaţie deosebită în MATLAB. Acestea nu pot fi declarate şi sunt accesibile global, în orice fişier-M. Variabilele speciale nu sunt introduse în mod obişnuit, fiind accesibile global în orice fişier-M.

Variabilele speciale şi constantele introduse în mod uzual în MATLAB sunt: ans – variabilă creată automat, reprezentând rezultatul unui calcul pentru care nu s-a alocat un nume; eps – variabilă permanentă, în care este memorată eroarea relativă pentru calculele efectuate în virgulă mobilă (2,2204e-016); pi – variabilă permanentă, care are alocată valoarea 3,14159265358;

1−=i – variabilă folosită pentru introducerea numerelor complexe (z =x + iy);

j= 1− – alternativă a unităţii imaginare, i; inf – variabilă folosită pentru reprezentarea lui plus infinit în standardul IEEE, rezultat al împărţirii 1,0/0,0; NaN – variabilă folosită pentru reprezentarea lui Not-a-Number (NaN), în aritmetica IEEE, rezultat al împărţirii nedefinite 0,0/0,0; nargin – variabilă permanentă, pentru testarea numărului argumentelor de intrare ce trebuie introduse pentru apelarea unei funcţii; nargout – variabilă permanentă, pentru testarea numărului argumentelor de ieşire ale unei funcţii; flops – întoarce numărul de operaţii, în virgulă mobilă, efectuate de calculator; computer – variabilă folosită pentru obţinerea informaţiilor referitoare la tipul calculatorului şi numărul maxim de elemente pe care le poate gestiona versiunea de MATLAB; realmax – reprezintă cea mai mare valoare pozitivă, în virgulă mobilă, care poate fi folosită în calcule (1,7977e+-308); realmin – reprezintă cea mai mică valoare pozitivă, în virgulă mobilă, care poate fi folosită în calcule (2,2251e+-308); isieee – funcţie care returnează 1, dacă computerul lucrează în standard IEEE şi 0, în caz contrar; version, ver –funcţii cu care se determină versiunea MATLAB sau a toolbox-urilor.

Importul şi exportul fişierelor de date

Pentru importul şi exportul fişierelor de date sunt următoarele funcţii mai importante:

load – încarcă varibilele dintr-un fişier de pe disc; sintaxa este load

nume_fişier-format_date (ASCII sau BINAR); save – salvează variabilele de pe disc într-un fişier de date; sintaxa este save

nume_fişier-format_date (ASCII sau BINAR).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 32

2.3. Obiecte Matlab

Matrice, vectori şi scalari

MATLAB-ul utilizează numai un singur tip de obiecte, matrice numerice rectangulare, cu elemente reale sau complexe. Astfel, scalarii sunt asimilaţi matricelor 1x1 (1linie x 1coloană), iar vectorii sunt asimilaţi matricelor 1xn sau nx1.

Cea mai simplă metodă de definire a matricelor mici, constă în utilizarea unei liste explicite, respectând următoarele reguli:

- elementele unei linii trebuie separate prin blank-uri sau virgule; - liniile se separă prin “;”; - elementele matricei sunt cuprinse între “[]”.

Astfel secvenţa A=[1 2; 3 4] întoarce rezultatul: A =

1 2

3 4 Pentru matricele mari, la care datele de intrate nu încap pe o singură linie, se

poate înlocui “;” cu “Enter”, ca în exemplul următor: A =[ 1 2

3 4]

Un alt mod de definire constă în apelarea unui fişier de tip ASCII, cu extensia .m, deja creat. Acest fişier trebuie să fie organizat ca o matrice rectangulară completă:

1 2

3 4 Elementele matricelor pot fi numere reale sau complexe, precum şi orice

expresie MATLAB. De exemplu, din secvenţa : x=[-1.3 sqrt(3) (1+2+3)*4/5], rezultă: x =[ -1.3000 1.7321 4.8000].

Elementul unei matrice x, aflat la intersecţia dintre linia i şi coloana j este identificat cu notaţia x(i,j). Astfel: a = x(2) ⇒ a = 1.7321.

Fie A1 şi A2 cele două matrice utilizate. Cu secvenţa următoare:

A1 = [1 2; 3 4] A =

A2 = [5 6; 7 8] ⇒ 1 2

A = [A1; A2] 3 4

5 6

Prezentare generală Matlab 33

Declaraţii şi variabile

Instrucţiunile în MATLAB apar sub forma: variabilă = expresie. Expresiile sunt compuse din operatori sau alte caractere speciale, din funcţii şi nume de variabile. Dacă numele variabilei şi semnul egal sunt omise, programul creează automat o variabilă cu numele “ans”, ca în exemplul: 3/4 întoarce, ans = 0.7500.

Orice instrucţiune este, în mod normal, terminată cu “Enter”. Dacă ultimul caracter al acesteia este “;” executată, tipărirea nu este executată. Astfel, secvenţa:

A= [1 2 3; 4 5 6; 7 8 9] ; introduce matricea A, dar nu o afişează.

Dacă expresia este mai lungă şi nu încape pe o linie, se utilizează semnul “…”, urmat de “Enter”, precizându-se astfel că instrucţiunea continuă pe următoarea linie. Astfel, instrucţiunea:

S=1+2+3+… 4+5+6;

evaluează suma celor şase numere şi o atribuie variabilei S. Spaţiile dintre semnele “=”,“+”, şi “-” şi numere sunt opţionale.

Numele de variabile şi funcţii au ca prim caracter o literă, urmată de litere, cifre sau “_”. MATLAB reţine doar primele 19 caractere din numele variabilei şi face distincţie între litere mari şi mici, deoarece funcţia caesesen este activată automat la activarea programului.

Numere şi expresii aritmetice

MATLAB utilizează pentru reprezentarea numerelor notaţia zecimală americană, cu punct zecimal.

Calculatoarele care utilizează aritmetica în virgulă mobilă IEEE, au precizia relativă a numerelor “eps”, aproximată cu 16 cifre semnificative. Limitele numerelor folosite în MATLAB sunt: 10-308 şi 10308.

Operatorii aritmetici utilizaţi sunt: + adunarea; - scăderea; * înmulţirea; / împărţirea la dreapta; \ împărţirea la stânga (1/4 = 4\1); ^ ridicarea la putere.

Structura programelor Matlab

Fişierele-M conţin instrucţiuni MATLAB şi au extensia .m şi constau într-o succesiune de instrucţiuni MATLAB, cu posibilitatea apelării altor fişiere-M, precum şi a apelării recursive.

Un program MATLAB poate fi scris sub forma fişierelor “script” sau “function”. Aceste tipuri de fişiere (.m) permit crearea unor funcţii noi, care le pot

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 34

completa pe cele deja existente. Prin această facilitate, MATLAB-ul poate fi extins la aplicaţii specifice utilizatorului, care are posibilitatea să scrie noi proceduri.

Fişierele script

Este un fişier extern care conţine o secvenţă de comenzi MATLAB, executată în momentul apelării numelui fişierului. Fişierele script sunt folosite pentru rezolvarea unor probleme care cer comenzi succesive atât de lungi, încât ar putea deveni greoaie pentru lucrul în mod interactiv. După execuţia completă a unui fişier script, variabilele cu care acesta a operat rămân în zona de memorie a aplicaţiei.

Fişierele function

Dacă prima linie a fişierului-M conţine cuvântul ”function”, fişierul respectiv este declarat ca fişier funcţie (spre deosebire de script în el se poate lucra cu argumente). Fişierele funcţie sunt utilizate pentru extinderea MATLAB, prin crearea de noi funcţii. La terminarea execuţiei unei funcţii, în memoria calculatorului rămân doar variabilele de ieşire ale acesteea.

Forma generală a primei linii a unui fişier funcţie este: function [param_ieşire]=nume_funcţie(param_intrare)

unde: - function – declară fişierul ca fişier funcţie; - nume_funcţie – numele funcţiei;

- param_ieşire – parametrii de ieşire trebuie separaţi cu virgulă şi cuprinşi între paranteze drepte; - param_intrare - parametrii de intrare trebuie separaţi cu virgulă şi cuprinşi între paranteze rotunde.

Exemplificare: Un fişier care calculează media aritmetică, numit medie.m: function m = medie (x) n=length (x); m = sum (x)/n; y = [‘Media numerelor este: ‘, num2str(m) ]; disp (y).

2.4. Instrucţiuni şi funcţii de control

Instrucţiuni de control logic

Matlab prezintă următoarele instrucţiuni de control logic: if - instrucţiunile pentru execuţia condiţionată; else – instrucţiune asociată if; elseif - instrucţiune asociată if; for – instrucţiune pentru crearea ciclurilor cu număr specificat de paşi; while – instrucţiune pentru crearea ciclurilor cu condiţie logică;

Prezentare generală Matlab 35

break – instrucţiune pentru terminarea forţată a unui ciclu; return – returnează execuţia la funcţia precizată; error – instrucţiune pentru afişarea unui mesaj de eroare; end – instrucţiune pentru închiderea ciclurilor “for”, “while” şi “if”.

Operatori relaţionali şi logici

În cazul unui algoritm este uneori nevoie de o selecţie a grupului de instrucţiuni a căror execuţie este condiţionată de valoarea de adevăr a unei expresii. Instrucţiunile condiţionale utilizează operatori relaţionali şi logici.

Operatorii relaţionali compară două matrice, element cu element, returnând o matrice de aceeaşi dimensiune cu a matricelor care se compară, cu elementele 1, când relaţia este ADEVĂRATĂ şi 0 când este FALSĂ.

Operatori relaţionali Semnificaţie

< mai mic <= mai mic sau egal > mai mare

>= mai mare sau egal = = identic - = diferit

Pentru combinarea a două sau mai multe expresii logice se utilizează

operatori logici.

Operatorii logici Simbol MATLAB Prioritatea

NU _ 1 ŞI & 2

SAU | 3 MATAB conţine funcţii pentru testarea unor condiţii relaţionale şi logice în

tablouri de date sau matrice. Acestea sunt des utilizate, asociate cu instrucţiunea “if”:

exist- verifică dacă variabilele sau funcţiile argument sunt definite; any-testează dacă cel puţin un element al unei matrice verifică o condiţie logică; find - returnează indicii elementelor diferite de zero; isnan - testează dacă elementele unei matrice sunt NaN; isinf - testează dacă elemntele unei matrice sunt infinite; finite – testează dacă elementele unei matrice sunt finite.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 36

Caractere speciale

Caracterul „:” sau „colon” este larg utilizat pentru: • a genera valori cu pas liniar constant sau cu pas constant dat; • a selecta o matrice, rândul sau coloana acesteia; • producerea unei liste de argumente.

Parantezele rotunde, simbolizate prin „( )”, sunt folosite: • în calculele aritmetice sau logice, pentru a grupa operaţiile şi unde ţin

locul tuturor tipurilor de paranteze (rotunde, drepte, acolade); • pentru a indica elementul unui vector sau matrice ; • pentru a grupa argumentele unei funcţii.

Parantezele drepte, simbolizate prin „[ ]”, sunt utilizate pentru: • formarea vectorilor şi matricelor, prin indicarea elementelor acestora; • stocarea unei matrice goale; • schimbarea unui rând sau coloane dintr-o matrice; • concatenarea vectorilor şi a matricelor.

Caracterul „@” este utilizat pentru a crea o funcţie implicită, apelabilă ca şi o variabilă.

Punctul, cu simbolul „.” este folosit pentru: • scrierea numerelor zecimale; • operaţii cu tablouri, pentru a indica că operatorii de înmulţire, de

ridicare la putere, de împărţire la dreapta, de împărţire la stânga, sau de transpunere, lucrează element cu element ;

• în câmpuri de acces, când se lucrează cu structuri.

Atribuirea unei variabile Var a valorii unei expresii se realizează prin utilizarea semnului egal, „=”.

3. FUNCŢII DE BAZĂ ÎN UTILIZAREA MATLAB

3.1. Funcţii ce furnizează informaţii generale despre

MATLAB

Aceste funcţii sunt : • help – care furnizează informaţii generale despre MATLAB şi funcţiile

acestuia, având următoarele posibilităţi: � tastând help, se obţine o listă a tuturor directoarelor din căile

de lucru MATLAB; � help topică, unde topică poate fi o comandă sau un director.

Dacă topică este o comandă, help prezintă informaţii despre acea comandă, iar dacă este nume de director, prezintă un tabel cu funcţiile conţinute în acesta. De exemplu, help exp prezintă conţinutul helpului funcţiei exponenţiale.

• helpwin deschide o fereastră pentru navigare: � helpwin topică deschide o fereastră help şi prezintă pe display

textul help pentru topica dată. Conexiunile sunt create pentru funcţiile la care se face referire în liniile funcţiei specificate.

• helpdesk deschide o pagină Web, care trimite (pe Internet) la helpul MATLAB ;

• demo rulează programe demonstrative, precum demo toolbox signal sau demo matlab language;

• ver oferă informaţii despre versiunea programelor MATLAB, SIMULINK şi TOOLBOX (pachete de funcţii specializate pentru un anumit subdomeniu);

• whatsnew prezintă fişierele readme, care conţin informaţii utile despre funcţii sau toolbox;

• readme prezintă noutăţile din versiunea actuală a MATLAB, SIMULINK, TOOLBOX sau o anumită funcţie specifică.

La apelarea funcţiei help nume, se afişează, pentru programele existente în Matlab, prima linie a fişierelor conţinute în calea de căutare, care sunt citite din fişierul contents.m al acestuia. Dacă nume este numele unui director, se afişează liniile de comentariu ale fişierului contents.m, localizat în acest director. Dacă fişierul contents.m nu are comentariu, funcţia help afişează toate fişierele conţinute în director. Dacă nume este numele unei funcţii, instrucţiunea help

afişează liniile primului comentariu al fişierului respectiv. Aceste linii de comentariu conţin „%”, ca prim semn şi se termină printr-o linie goală sau o linie de comandă.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 38

3.2. Funcţii pentru manipularea spaţiului de lucru

MATLAB

Pentru manipularea variabilelor din spaţiul de lucru MATLAB se utilizează următoarele funcţii specifice:

• who prezintă o listă a variabilelor curente din spaţiul de lucru iar who

global variabilele din spaţiul de lucru global ; who a* listează toate variabilele din spaţiul de lucru care încep cu a; who –file nume fişier listează variabilele din fişierul. Mat, specificat prin nume fişier.

• whos este asemănătoare cu who, dar listează variabilele curente în format long, incluzând dimensiunea, numărul de biţi şi clasa acestora, ca de exemplu :

Name Size Bytes Class a 1x5 40 double array b 1x5 40 double array (sau poate fi complex)

• clear şterge din memorie toate variabilele şi funcţiile sau numai variabilele (clear variabile), ori funcţiile (clear funcţie) ;

• pack compactează memoria spaţiului de lucru, salvează toate variabilele pe disc, şterge variabilele din memorie şi apoi le reîncarcă (este de preferat mărirea memoriei virtuale din Windows - Control Panel). De menţionat că, în timpul utilizării MATLAB-ului se creează şi se şterg continuu variabile din memoria calculatorului, astfel încât zona de memorie continuă neocupată se reduce, ceea ce poate face imposibilă stocarea unei variabile mari, dar mai mică decât cea totală disponibilă, astfel că poate să apară mesajul Out of memory, ce face necesară comanda pack.

• load încarcă variabilele din fişierul de date matlab.mat pe disc, având următoarele cazuri particulare :

� load nume_fişier încarcă datele din fişiere în format binar, cu extensia *.mat;

� load nume_fişier .ext-mat încarcă datele din fişiere în format binar, cu extensie;

� load nume_fişier -ascii încarcă datele din fişiere în format ASCII, fără extensie;

� load nume_fişier .ext-ascii încarcă date ASCII cu extensie. • save salvează variabilele din spaţiul de lucru pe disc în fişierul

matlab.mat, având următoarele cazuri particulare: � save nume_fişier salvează toate variabile din spaţiul de lucru

în fişierul nume_fişier.mat; � save nume_fişier A B C salvează numai variabilele A B C

Funcţii Matlab de interes general 39

din spaţiul de lucru, în fişierul nume_fişier.mat;

� save nume_fişier.ext A B C - ascii salvează în format ASCII cu 8 digiţi, numai variabilele A B C din spaţiul de lucru, în fişierul nume_fişier.ext;

� save nume_fişier.ext A B C – ascii - double salvează în format ASCII cu 16 digiţi, numai variabilele A B C din spaţiul de lucru, în fişierul nume_fişier.ext;

� save nume_fişier.ext A B C – ascii – double -tabs salvează în format ASCII cu 16 digiţi, numai variabilele A B C, separate prin TAB-uri, în fişierul nume_fişier.ext.

• quit închide MATLAB ,fără a salva spaţiul de lucru .

3.3. Manipularea comenzilor şi a funcţiilor

Pentru manipularea comenzilor şi a funcţiilor se utilizează următoarele funcţii specifice:

• what prezintă fişierele specifice MATLAB dintr-un director. Funcţia what prezintă de asemenea fişierele cu extensie *.m, *.mat, *.mex din directorul curent de lucru. Apelată singură, funcţia what prezintă fişierele *.mex din directorul c:\MATLAB\bin.

• type fişier_nume.m listează fişierul specificat, asemănător cu aceeaşi comandă din Dos.

• edit creează o nouă fereastră de editare, iar edit fişier.extensie deschide fişierul text specificat; de regulă extensia este m sau txt.

• open nume_fişier deschide fişierul specificat; • which nume_fişier localizează funcţia sau fişierul al cărui nume este

specificat. • lookfor returnează toate fişierele cu extensia .m din directorul Matlab,

iar lookfor cuvinte_căutate_în_prima_linie_de_help returnează numai acele fişiere care au în prima linie a helpului lor cuvântul respectiv.

De exemplu, instrucţiunea which ifft returnează C:\MATLAB\toolbox\ matlab\datafun\ifft.m, iar instrucţiunea lookfor ifft returnează:

IFFT Inverse discrete Fourier transform. IFFT2 Two-dimensional inverse discrete Fourier transform. IFFTN N-dimensional inverse discrete Fourier transform. IFFTSHIFT Inverse FFT shift. vifft.m: % function yout = vifft(yin)

• inmem listează funcţiile din memorie. De exemplu, dacă după o instrucţiune de ştergere (clear all), se tastează instrucţiunea de calcul a erorii, erf(0.5), atunci m=inmem returnează toate funţiile m.file utilizate pentru calculul erf, respectiv

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 40

m = 'repmat' 'erfcore' 'erf'.

• mex compilează funcţiile de tip mex, putând să şi le editeze, în funcţie de parametrii introduşi;

• pcode fun1.m, care creează un pseudocod din funcţia de tip m, func1.m, dorită.

3.4. Manipularea şi căutarea căilor de lucru

Principala funcţie care controlează căile de căutare este path. Aceasta constituie mediul variabil al sistemului de operare, în care se pot predefini, pot fi schimbaţi sau pot fi adăugaţi directorii proprii, în calea de căutat. Instrucţiunea p=path afişează setarea căilor de căutare curente ale MATLAB-ului, setată în fişierele startup.m sau matlabrc.m. Fişierul matlabrc.m este apelat automat, la lansarea în execuţie a Matlab-ului, iar fişierul startup.m poate fi apelat la lansare, permiţând apelarea unor fişiere suplimentare, care să condiţioneze lansarea propriu-zisă.

Dacă se doreşte schimbarea căii de căutare, la una precizată în variabila p, atunci se execută instrucţiunea path(p).

Adăugarea unei noi căi, notate cu pnou, la cele existente p (operaţie numită concatenarea căilor de căutare p cu pnou) se face cu instrucţiunea: path(p,pnou). Instrucţiunea path(path,pnou) adaugă calea pnou la cele existente, iar instrucţiunea path(pnou,path) renunţă la calea pnou.

De exemplu, cu instrucţiunea path(path,’C:\MATLAB\Lucru’) se adaugă o nouă cale de căutare (’C:\MATLAB\Lucru’) la cele existente.

Instrucţiunea addpath nume_director adaugă la calea de căutare întregul director; de exemplu, adăugarea directorului work, din driverul D, la calea de căutare, se face cu instrucţiunea addpath d:\work.

Ştergerea unui director din calea de căutare se realizează cu instrucţiunea rmpath nume_director; de exemplu, ştergerea din calea de căutare a directorului work, din driverul D, se execută cu instrucţiunea rmpath d:\work.

Modificarea căii de căutare, prin interfaţa grafică (GUI) se execută tastând instrucţiunea editpath, care deschide Path Browser, iar adăugarea sau ştergerea se realizează prin clicarea mouse-ului, poziţionat pe Path, şi apoi pe Add to path (pentru adăugare) sau Remove from Path (pentru ştergere).

Părăsirea sesiunii de lucru Matlab se poate face prin comenzile exit sau quit,

scrise explicit sau închiderea pur si simplu a programului. Acest procedeu de părăsire a unei sesiuni de lucru determină pierderea variabilelor din aplicaţia curentă.

Funcţii Matlab de interes general 41

3.5. Controlul ecranului, a directoarelor şi a

sistemului de operare

Funcţia echo permite afişarea în timpul apelării pentru rulare, a tuturor programelor de tip „m” apelate (pentru echo on) sau renunţarea la derularea pe monitor a instrucţiunilor (pentru echo off). Atunci când se doreşte să fie vizualizat numai un singur program, se utilizează instrucţiunea echo program on.

Ştergerea ecranului se realizează cu instrucţiunea clc, iar poziţionarea cursorului în locaţia corespunzătoare primei linii şi primei coloane de pe monitor se realizează cu instrucţiunea home.

Pentru controlul numărului de linii afişate pe ecran se utilizează instrucţiunea more. Afişarea succesivă a n linii dintr-un program sau matrice de date, se execută cu instrucţiunea more(n). Cu tasta „Enter” se trece la următoarea secvenţă, de n linii, iar cu tasta „q” se părăseşte modul de afişare, cu număr impus de linii.

Salvarea pe disc a sesiunii de lucru (comenzile introduse de la tastatură şi răspunsurile sistemului Matlab) se face cu instrucţiunea diary nume_fişier, fişierul fiind de tip ASCII. Închiderea fişierului nume_fişier se face cu instrucţiunea diary

off, iar dacă acesta există deja, atunci sesiunea de lucru se anexează la sfârşitul acestuia.

Fişierul format se poate deschide cu „Notepad” sau pe ecranul sesiunii Matlab, tastând instrucţiunea (existentă şi în Dos) type nume_fişier. Dacă nu a fost specificat nume_fişier, funcţia diary înregistrează sesiunea de lucru într-un fişier, cu nume implicit diary.

Funcţia dir afişează numele fişierelor din directorul curent sau din cel precizat, ca argument în instrucţiunea dir precizat.

Ştergerea unui fişier (text sau grafic) se realizează cu instrucţiunea delete

nume_fişier. Instrucţiunea lucrează asemănător ca şi în Dos sau Windows, astfel încât se pot şterge toate fişierele având o anumită extensie, prin comanda delete *.extensie. Se precizează că aceste fişiere, o dată şterse, nu mai pot fi refăcute de o instrucţiune, precum undelete, sau din Recycle Bin.

Funcţia cd returnează numele directorului curent, dacă se apelează cu sintaxa cd, revine spre rădăcină cu instrucţiunea cd.., sau schimbă directorul, dacă se apelează cu instrucţiunea cd cale\nume_director.

Returnarea numelui directorului curent se poate face şi cu instrucţiunea pwd, iar atunci când numele se asociază cu o variabilă s, se tastează s=pwd, la care se răspunde, de exemplu:

s = C:\MATLAB\bin.

MATLAB-ul utilizează pentru reprezentarea numerelor notaţia zecimală convenţională, cu punct zecimal. Puterea este un factor de scală inclus ca sufix, ca şi în notaţia ştiinţifică. Printre posibilele reprezentări ale numerelor în Matlab

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 42

avem: 3 -978 0.0001 9.6789875 1.52163e-021 4.12345e011. Calculele care utilizează aritmetica în virgulă mobilă IEEE, au precizia

relativă a numerelor „eps”, aproximată cu 16 digiţi (semne) semnificativi, ca de exemplu: 1.797693134862316e+308. Limitele numerelor folosite în Matlab sunt:

10-308 < numar < 10308.

MATLAB-ul permite utilizatorului două moduri de control al afişării datelor pe ecran, respectiv a numărului de cifre şi spaţierea dintre ele. La lansarea Matlab, afişarea numerelor se face în format scurt, cu 5 cifre semnificative.

Trecerea de la un format la altul se poate face fie selectând succesiv, File/Preferences/Numeric Format/Opţiune (în versiunea 5) sau Option/Numeric

Format/Opţiune (în versiunea 4), fie tastând comanda format opţiune, unde opţiune poate fi una dintre variantele: Short / Long / Short e / Long e / Short g /

Long g / Hex / Plus (ori +) / Bank / Rat. Formatele de afişare din opţiune sunt exemplificate mai jos:

Opţiune Rezultat Exemplu Short Maximum 7 cifre semnificative dintre

care max. 4 cifre zecimale 17.1717

Long 15 cifre zecimale semnificative şi max. 3 pentru partea întreagă şi semn

17.171717171717171

Short e 5 cifre semnificative + exponent 1.7172e+001 Long e Semn + 1cifră întreagă + 15 cifre

zecimale + exponent 1.717171717171717e+001

Short g 5 cifre semnificative şi numai dacă este necesar şi exponent

17.172

Long g 15 cifre semnificative şi pe cât posibil fără scriere exponenţială + exponent, dacă este strict necesar

17.1717171717172

Hex hexazecimal 40312BF5A814AFD7 Plus (+) + pentru valorile pozitive, - pentru

negative sau zero. Partea imaginară este ignorată

+

Bank Două zecimale 17.17 Rat Expresie raţională 1700/99

Dacă toate elementele unei matrice sunt numere întregi, atunci matricea este afişată într-un format fără zecimale. Când cel puţin un element nu este număr întreg, formatul de afişare este ales automat, pentru a putea prezenta toate elementele, dacă nu a fost preselectat un anumit format dintre cele de mai sus.

Pentru formatele short şi long, dacă cel puţin un element al matricei este mai

Funcţii Matlab de interes general 43

mare decât 1000 sau mai mic decât 0.001, afişarea se face cu un factor de scală comun pentru toate elementele.

Instrucţiunea format compact suprimă liniile libere şi afişează rezultatele într-un format mai compact, iar format loose afişează rezultatele într-un mod mai degajat, cu linii libere.

Copierea unui fişier sursă, într-un fişier destinaţie, se face cu instrucţiunea copyfile (sursă, destinaţie). De menţionat că atât fişierul sursă, cât şi cel destinaţie se găsesc în directorul de lucru. Dacă se doreşte specificarea explicită că destinaţia este un fişier ce poate fi doar citit, atunci se tastează instrucţiunea copyfile(sursă,

destinaţie, 'read'). Controlul operaţiei se realizează cu instrucţiunea status=copyfile(…), care returnează 1, dacă fişierul este copiat sau 0, altfel.

Instrucţiunea getenv('nume') caută în spaţiul de lucru variabila caracter nume, returnând ' ' dacă aceasta există.

Pentru a crea un nou director, în directorul curent, se utilizează instrucţiunea mkdir(nume_director), iar crearea directorului în unul existent se realizează cu instrucţiunea mkdir(director_existent, nume_director).

Executarea comenzilor Dos, fără părăsirea Matlab-ului, se face cu comanda „!” sau dos. Semnul de exclamare „!”, plasat la începutul unei linii de program Matlab, indică mediului de programare că următoarele linii de intrare sunt introduse din sistemul de operare Dos. Executarea unei comenzi Dos (de exemplu deschiderea editorului DOS 5.0 din DOS Windows) se poate face cu instrucţiunea!

edit &, sau dos('edit &'), iar deschiderea editorului Notepad, cu returnarea controlului imediat la Matlab, se poate realiza cu instrucţiunea dos('notepad file.m

&'). Comanda corectă returnează în Matlab ans =0.

Instrucţiunea web deschide browserul de dialog Internet, specificat în URL (Uniform Resource Locator). De exemplu, web http://www.mathworks.com încarcă adresa The MathWorks Web în browser, iar web mailto:email_address permite citirea e-mailului.

Pentru obţinerea informaţiilor referitoare la tipul calculatorului şi numărului maxim de elemente pe care le poate gestiona versiunea respectivă de Matlab, se utilizează instrucţiunea, [calculator, elemente] = computer, obţinându-se: calculator = PCWIN (PC lucrând sub Windows); elemente = 268435455.

3.6. Funcţii de control ale datelor şi ale timpului

Funcţia date citeşte data din Setup-ul calculatorului şi o returnează sub formă de semne, în formatul dd-mmm-yyyy, unde dd-ziua, mmm-luna, yyyy-anul. De exemplu, după tastarea instrucţiunii date, se obţine ans= 29-Oct-2004.

Funcţia clock returnează un vector linie, de şase elemente, conţinând data şi timpul în format zecimal, aşezate în ordinea [year month day hour minute seconds]. De exemplu, la tastarea clock, se obţine 2000 10 29 22 27 39.33, iar dacă se

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 44

utilizează instrucţiunea fix(clock), atunci secundele sunt rotunjite la valoare întreagă.

Convertirea unei serii de date numerice D, în semne puse sub un anume format, specificat în DATEFORM, se face cu instrucţiunea datestr

(D,DATEFORM). Semnele sunt în acord cu cele din DATEFORM (tabelul de mai jos), iar dacă lipsesc se consideră implicit 1, 16 sau 0, după cum D conţine data şi timpul. De exemplu: n = datenum('19-May-1995') returnează n = 728798; n =

datenum(1994,12,19) returnează n = 728647; n = datenum(1994,12,19,18,0,0) returnează n = 728647.75.

Acest număr, n ,este dat şi de funcţia now, care afişează data şi timpul ca număr, pus sub forma zi-lună-an oră:minit:secundă, prin comanda datestr(now).

Inversa acestei funcţii, cea care converteşte un set de date în semne (strings), este datetick.

Număr DATEFORM Semnul DATEFORM Exemplu 0 'dd-mmm-yyyy

HH:MM:SS' 01-Mar-2000

15:45:17 1 'dd-mmm-yyyy' 01-Mar-2000 2 'mm/dd/yy' 03/01/00 3 'mmm' Mar 4 'm' M 5 'mm' 3 6 'mm/dd' 03/01 7 'dd' 1 8 'ddd' Wed 9 'd' W 10 'yyyy' 2000 11 'yy' 00 12 'mmmyy' Mar00 13 'HH:MM:SS' 15:45:17 14 'HH:MM:SS PM'

3:45:17 PM 15 'HH:MM' 15:45 16 'HH:MM PM' 3:45 PM 17 'QQ-YY' Q1-00 18 'QQ' Q1

Găsirea datei, ca număr într-o serie de zile, unde ziua 1 corespunde la 1 ianuarie anul 0, se realizează cu instrucţiunea datenum(S), unde S este un semn DATEFORM, ca mai jos. De exemplu: n = datenum('19-May-1995') returnează n

= 728798; n = datenum(1994,12,19) returnează n = 728647, iar n = datenum

(1994,12,19,18,0,0) returnează n = 728647.75.

Funcţii Matlab de interes general 45

Funcţia datevec(semn) returnează componentele datei cuprinse în semn, care este dat sub una dintre formele din tabelul prezentat anterior. De exemplu, dacă d = '12/24/1984' şi t = 725000.00, atunci c = datevec(d) sau c = datevec(t) produce c =

[1984 12 24 0 0 0], iar [y,m,d,h,mi,s] = datevec(d) returnează y=1984, m=12,

d=24, h=0, mi=0, s=0.

Funcţia eomday(an,lună) returnează ultima zi din luna anului introdus. De exemplu, eomday(2001,2) returnează 28.

Pentru găsirea zilei din săptămână, se utilizează instrucţiunea [D,W] = weekday(T), unde ,T, este semnul conţinând data, iar ,D, este asociat conform zilei din săptămână astfel: 1-Sun; 2-Mon; 3-Tue; 4-Wed; 5-Thu; 6-Fri; 7-Sat. De exemplu [d,w] = weekday(728647) sau [d,w] = weekday('19-Dec-1994') returnează d = 2 şi w = Mon.

Funcţia calendar(an,lună) returnează o matrice de 6 pe 7, conţinând calendarul lunii din an specificată (prima zi fiind sâmbătă) sau din luna curentă, dacă se tastează numai calendar. De exemplu, calendar(2000,10) produce pe ecran

Oct 2000 S M Tu W Th F S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 0 0 0 0 0 0 0 0 0 0.

Determinarea timpului de calcul al procesorului (CPU), în secunde, se realizează cu instrucţiunea cputime, apelată în secvenţa t=cputime; pentru calculul măsurat ca timp se utilizează cputime-t, ca de exemplu:

t=cputime; tfph(100,500) ; x=cputime-t x = 0.1600.

Pentru pornirea cronometrului sistemului de calcul se utilizează funcţia tic, iar pentru oprirea cronometrului, funcţia toc. Aceste funcţii se utilizează împreună în secvenţa tic; operaţia măsurată ca timp; t=toc, ca de exemplu:

tic; tfph(100,500); x=toc x = 0.1000.

Cronometrarea intervalului de timp dintre două evenimente se realizează cu funcţia etime. Intervalul se măsoară dintre timpul iniţial, t0, şi timpul final ,t1, cu funcţia clock, iar cei doi vectori (t0, t1) au 6 elemente, respectiv [An Lună Zi Oră

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 46

Minut Secundă]. Secvenţa de instrucţiuni este: t0 = clock; operaţie măsurată; t1=etime(clock,t0),

ca de exemplu: t0=clock; tfph(100,500); t1=etime(clock,t0) t1 = 0.1100.

Introducerea unor pauze, înainte de executarea unor instrucţiuni, se realizează prin funcţia pause(n), unde, n, este numărul de secunde de pauză.

Dacă într-un program se găsesc astfel de instrucţiuni şi se doreşte anularea acţiunii acestora, se tastează pause off, iar reconsiderarea efectului acestei instrucţiuni se realizează prin pause on.

3.7. Instrucţiuni pentru depanarea programelor

Programele de tip, funcţie.m, pot avea anumite erori de scriere în limbaj Matlab astfel că, uneori, este necesar să se apeleze şi la instrucţiuni specializate, care să indice erorile pe care nu le putem observa la citirea programului.

Instrucţiunea debug listează toate comenzile utile depanării programelor. Oprirea temporară a execuţiei unei funcţii de tip m (de exemplu func1.m),

pentru a examina local, ca şi când instrucţiunile ar fi introduse de la tastatură, se execută prin instrucţiunea dbstop, apelată sub una dintre cele şase forme:

• dbstop in func1.m at linia_număr, care are ca efect oprirea execuţiei la linia indicată, prin numărul anterior;

• dbstop in func1.m at subfun, care are ca efect oprirea execuţiei la apelarea subfuncţiei indicate în interiorul funcţiei principale;

• dbstop in func1.m, având ca efect oprirea execuţiei la prima linie, executabilă din func1.m;

• dbstop if error, ce are ca efect oprirea execuţiei, dacă apare o eroare; • dbstop if warning, are ca efect oprirea execuţiei la apariţia unei erori

minore, de avertizare; • dbstop if naninf sau dbstop if infnan cauzează oprirea execuţiei, dacă

din execuţie este obţinută o valoare infinită (Inf) sau este întâlnită o operaţie ilegală (NaN).

De menţionat că prepoziţiile at, in, if sunt opţionale. Anularea instrucţiunii dbstop se face prin funcţia dbclear, întâlnită sub opt

forme: • dbclear in func1.m at linia_număr, ce are ca efect anularea comenzii

dbstop corespunzătoare; • dbclear in func1.m at subfun, care anulează comanda dbstop

corespondentă; • dbclear all in func1.m ce are ca efect anularea efectului oricărei

Funcţii Matlab de interes general 47

comenzii dbstop, relativă la funcţia func1.m; • dbclear in func1.m anulează numai prima comandă dbstop; • dbclear all anulează toate comenzile dbstop; • dbclear if error şi dbclear if warning care anulează comanda dbsop,

redând controlul în spaţiul de lucru; • dbclear if naninf sau dbclear if infnan anulează comanda dbstop

corespunzătoare.

Pentru a continua execuţia, după întâlnirea unei instrucţiuni dbstop sau dbstep, se utilizează funcţia dbcont, care are efect până la următoarea instrucţiune de oprire.

Schimbarea spaţiului de lucru, când se lucrează în modul debug, se face cu instrucţiunile dbdown şi dbup.

Prezentarea comenzii de debug, întâlnită într-o funcţie de tip m, se face cu instrucţiunea [st,i]=dbstack, unde ,st, este numele funcţiei, iar ,i, linia din program (aceasta este negativă, dacă nu există nici o funcţie).

Listarea tuturor instrucţiunilor de debug prezente se realizează prin comanda dbstatus.

Executarea, pas cu pas, a unei funcţii program se realizează cu instrucţiunea dbstep, apelată sub trei forme:

• dbstep, prin care programul se execută linie după linie; • dbstep nr_linii, prin care se execută un număr de linii specificat; • dbstep in subfunct, prin care subfuncţia chemată este executată pas cu

pas.

Listarea numărului de linii asociate prin debug, unei funcţii date, se face prin instrucţiunea dbtype funcţia_dată sau dbtype funcţia_dată lstart:lend, unde lstart este linia de la care se afişează (listează) pe ecran, iar lend este linia până unde se afişează.

Părăsirea modului de lucru debug se realizează tastând comanda dbquit, care redă comanda spaţiului de lucru, fără a termina depanarea programului.

Modificarea contextului spaţiului de lucru curent, pentru lucru în modul debug, se realizează cu instrucţiunea dbup.

3.8. Instrucţiuni ce furnizează informaţii despre

profilul funcţiilor executate

Profilul funcţiilor executate este evidenţiat prin funcţia profile, apelată cu instrucţiunea,

profile on care porneşte găsirea profilului şi şterge înregistrările anterioare, referitoare la profil.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 48

După funcţia profile, pot urma unul sau mai multe argumente, care să detalieze acest profil, la un anumit nivel (level),

profile on – detail level

în care level poate fi: • mmex (sau lipsi în mod normal), când se dau informaţii despre funcţiile

de tip M, subfuncţiile de tip M, funcţiile de tip MEX; • builtin, când se dau informaţii şi despre funcţiile interne; • operator, când se dau informaţii şi despre operatorii interni precum „+,

-, :, ^”. Ieşirea totală din acest mod de lucru se face prin comanda profile off.

Funcţia profil viewer opreşte căutarea profilului şi deschide browser-ul grafic al profilului, care este un fişier HTML.

Considerând secvenţa de instrucţiuni, profile on -detail builtin hfpt(100,500) profile viewer

se obţine profilul care dă următoarele informaţii: • data generării, de exemplu Generated 17-Nov-2004 11:34:00; • numărul de fişiere chemate, de exemplu ,Number of files called: 11; • un tabel, cuprizând 5 coloane: Filename, File Type, Calls, Total

TimeTime, Plot. Prin clicarea mouse-ului pe numele funcţiei, se obţin informaţii pentru fiecare

linie a programului, astfel: • Coloana 1 (red), prezintă timpul total de execuţie a liniei, în secunde; • Coloana 2 (blue), evidenţiază numărul de chemări ale liniei; • Coloana 3 prezintă informaţii referitoare la faptul, dacă comanda este

accelerată (semnul ".") sau neaccelerată (semnul "x"); • Coloana 4 dă numărul liniei.

Ştergerea informaţiilor referitoare la profilul anterior memorat se execută prin comanda profile clear.

Generarea raportului privind funcţiile apelate, durata de timp totală şi pe instrucţiune, se realizează cu comanda profile report.

4. OPERATORI ŞI CARACTERE SPECIALE MATLAB

4.1. Declaraţii şi variabile

Matlab-ul este un limbaj de expresii, care sunt introduse şi interpretate. Deci, MATLAB-ul este un limbaj care interpretează şi evaluează instrucţiunile introduse de utilizator. Aceste instrucţiuni au, de cele mai multe ori, forma:

Variabilă=expresie sau, mai simplu:

expresie. Expresiile sunt compuse din operatori sau alte caractere speciale, din funcţii

şi nume de variabile. Terminarea unei instrucţiuni, introdusă de la tastatură, se realizează prin

apăsarea tastei „Enter”, după care, limbajul MATLAB execută instrucţiunea introdusă.

Pe ecran este afişat rezultatul expresiei (de exemplu, 3/4) sub forma: Variabilă = 0.7500. Atunci când expresia este aşa de mare încât nu încape pe o singură linie, se

utilizează semnul „…” (trei puncte), urmat de „Enter”, pentru a preciza că instrucţiunea continuă pe linia următoare. Astfel, instrucţiunea:

S=1+2+3+4 … 5+6+7+8

evaluează suma celor 8 numere şi răspunde: S=

36. Spaţiile dintre semnele „=”, ”+”, „-„ şi numere, sunt opţionale. Dacă numele variabilei şi semnul egal („Variabilă =”) sunt omise, Matlab-ul

creează automat o variabilă „ans”, căreia îi atribuie valoarea expresiei evaluate, ca de exemplu:

ans = 0.7500. Prin urmare, o variabilă introdusă fără nominalizare este atribuită variabilei

ans (answer). În variabila ans este memorată în permanenţă valoarea ultimei variabile

căreia nu i s-a atribuit un nume. Pe de altă parte ,în urma instrucţiunilor succesive: a=10; a=20;

în variabila a se află valoarea 20. Dacă ultimul caracter al acesteia este „ ; ” instrucţiunea este executată, dar

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 50

afişarea pe ecran (tipărirea) este suprimată. Numele de variabile şi funcţii au ca prim caracter o literă, urmată de litere,

cifre sau caracterul „_” (liniuţă de subliniere). Deşi se pot folosi oricâte caractere, Matlab-ul reţine ca nume de variabile numai primele 19 caractere.

Matlab-ul face deosebirea între literele mari şi mici, astfel încât „a” şi „A” sunt două variabile distincte. Funcţia casesen permite trecerea Matlab-ului în modul senzitiv/nesenzitiv, în vederea separării literelor mari de cele mici. Numele de funcţii este obligatoriu să fie redate cu litere mici. La lansare, Matlab-ul lucrează în modul senzitiv, adică face distincţia între literele mari şi cele mici, dar cu comanda,

casesen off trece în modul nesenzitiv, iar revenirea se face cu comanda: casesen on.

4.2. Operatori aritmetici

MATLAB-ul utilizează operatorii aritmetici consacraţi cunoscuţi. Operaţiile aritmetice dintre doi scalari sunt cele prezentate în tabelul 4.1.

Tabelul 4.1

Forma operatorilor MATLAB pentru scalari

Operaţia Forma algebrică Forma MATLAB

Adunarea a+b a+b

Scăderea a-b a-b

Înmulţirea a x b a*b

Împărţirea la dreapta a:b a/b

Împărţirea la stânga b:a a\b

Ridicarea la putere ab a^b

Expresiile aritmetice pot fi evaluate şi rezultatul memorat în variabilele specificate. Dacă, de exemplu

a=5 ; b=6 ;

atunci, a+b

ans = 11 a-b

ans = -1

Operatori şi caractere speciale Matlab 51

a*b ans =

30 a/b

ans = 0.8333 b\a

ans = 0.8333 a^b

ans = 15625.

Limitele variabilelor memorate au un interval foarte mare, fiind cuprinse între o valoare minimă, realmin (adesea 10-308) şi o valoare maximă, realmax (adesea 10308). Uneori, este posibil ca rezultatul unei expresii să depăşească aceste limite, iar valoarea calculată nu poate fi memorată.

Dacă rezultatul unui calcul este mai mic decât 10-308, calculatorul înregistrează valoarea zero, iar dacă este mai mare decăt 10308 ,se înregistrează ∞ (în Matlab se returnează Inf).

Rezultatul împărţirii cu zero este, firesc, ∞, iar în acest caz se afişează mesajul de atenţionare,

Warning: Divide by zero. ans = Inf

şi calculele continuă cu operandul ∞.

Ordinea operaţiilor în MATLAB este aceeaşi cu cea a operaţiilor aritmetice standard, cunoscută din matematica elementară, respectiv:

1 – parantezele; 2 – ridicarea la putere; 3 – înmulţirea şi împărţirea ; 4 – adunarea şi scăderea.

Operatorul „+” semnifică adunarea din aritmetică, respectând regulile cunoscute. Astfel, doi scalari se adună pur şi simplu:

4+5 ans = 9.

Calculele aritmetice asupra tablourilor de date MATLAB pot fi operaţii după regulile calculului matriceal (adică operaţii cu matrice) sau operaţii după regulile calculului scalar (adică operaţii cu tablouri). Operatorii folosiţi în calculele aritmetice cu tablouri şi matrice sunt prezentaţi în tabelul 4.2.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 52

Operaţiile cu tablouri sunt operaţii aritmetice între elementele situate în aceeaşi poziţie a tablourilor, cunoscute sub numele de operaţii element cu element.

Pentru efectuarea operaţiilor cu tablouri se folosesc aceiaşi operatori ca în operaţiile cu scalari, precedaţi de semnul punct, „.”, semn ce indică efectuarea operaţiilor în ordinea element cu element. Dacă unul dintre operanzi este un scalar, acesta operează cu fiecare element al tabloului.

Atunci când în stânga se află un scalar, între acesta şi operatorii care au în componenţă punctul (.*, .^, ./, .\) se lasă un blank pentru a nu interpreta punctul care indică operarea cu tablouri ca punct zecimal.

Tabelul 4.2.

Operatori aritmetici MATLAB

Operaţia Scalari Matrice Tablouri

Adunarea + + +

Scăderea - - -

Înmulţirea * * .*

Împărţirea la dreapta / / ./

Împărţirea la stânga \ \ .\

Ridicarea la putere ^ ^ .^

Transpunerea ’ ’ .’

Pentru exemplificarea calculelor cu tablouri se consideră matricele A, B şi scalarul p, daţi de:

A=[1 2 3]; B=[4 5 6]; p=7. Matricele diferenţă se calculează cu secvenţele Matlab, C=A-B; D=A-p; E=p-A; F=A-B-p;

iar rezultatele sunt: C = [ -3 -3 -3]; D=[ -6 -5 -4]; E=[ 6 5 4] ; F=[ -10 -10 -10]. Matricele sumă se calculează cu secvenţele Matlbab, C=A+B; D=A+p; E=p+A; F=A+B+p;

iar rezultatele sunt: C = [5 7 9]; D=[ 8 9 10]; E=[ 8 9 10] ; F=[ 12 14 16]. Considerând matricele A şi B ca tablouri, se poate exemplifica înmulţirea

acestora, prin secvenţele Matlab, C= A.*B; D=A.*p; E=p.*A; F=p.*A.*B;

iar rezultatele sunt: C = [4 10 18]; D=[ 7 14 21]; E=[ 7 14 21] ; F=[ 28 70 126]. Operaţia de împărţire la dreapta, element cu element, a matricelor A şi B,

considerate ca tablouri, se poate exemplifica prin secvenţele Matlab, C= A./B; D=A./p; E=p./A; F=p./A./B;

Operatori şi caractere speciale Matlab 53

iar rezultatele sunt: C = [0.25 0.40 0.50]; D=[0.1429 0.2857 0.4286]; E=[7.000 3.500

2.3333] ; F=[ 1.7500 0.7000 0.3889]. Operaţia de împărţire la stânga, element cu element, a matricelor A şi B,

considerate ca tablouri, se poate exemplifica prin secvenţele Matlab, C= A.\B; D=A.\p; E=p.\A; F=p.\A.\B;

iar rezultatele sunt: C = [4.0 2.5 2.0]; D=[ 7.0000 3.5000 2.3333]; E=[ 0.1429 0.2857

0.4286] ; F=[ 28.0000 17.5000 14.0000]. Ridicarea la putere, element cu element a matricelor A şi B, considerate ca

tablouri, se poate exemplifica prin secvenţele Matlab, C= A.^B; D=A.^p; E=p.^A; F=p.^A.^B;

iar rezultatele sunt: C = [1 32 729]; D=[ 1 128 2187]; E=[ 7 49 343] ; F= 1.0e+015 * [ 0.0000 0.0000 1.6284]. Operaţia de transpunere a unui tablou, simbolizată de operatorul „ .' ” (punct

apostrof), face ca un tablou X, de dimensiuni m x n, să devină un tablou Y, cu dimensiunea n x m. Dacă, de exemplu,

X=[ 1 1+i 2 2-i 3 3+i ],

atunci, Y=[ 1 2 3 1+ i 2-i 3+i].

Adunarea a două matrice este posibilă numai dacă matricele sunt de acelaşi tip. De meţionat că o matrice este un sistem de numere aşezate într-un tablou dreptunghiular, cu un număr oarecare de linii şi de coloane. Numerele din tablou se numesc elementele matricei. O matrice cu p linii şi n coloane se spune că este de tipul {p, n}. Dacă p sau n sunt egali cu 1, atunci avem matrice de tipul {1, n}, respectiv {p, 1}, care mai sunt cunoscute şi ca vectori (coloană, respectiv linie).

În general, suma a două matrice de acelaşi tip, oricare ar fi natura elementelor lor, este tot o matrice, de acelaşi tip. Elementele sumei se obţin adunând elementele corespunzătoare din cele două matrice. Dacă notăm cu aij elementul generic al matricei [a], cu bij elementul generic al matricei [b] şi cij elementul generic al matricei sume [c], atunci avem:

[c] = [a]+[b], ceea ce se reduce la,

cij = aij + bij

pentru toate valorile luate de i şi j.

De exemplu, dacă:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 54

A=[1 2 3]; B=[5 6 7];

atunci la tastarea comenzii, A+B

se răspunde ans = 6 8 10. În exemplul următor: a=[1 2 3 4 5 6]; b=[7 8 9 10 11 12];

iar, a+b

este: ans = 8 10 12 14 16 18. Dacă însă, BB=[8 9];

atunci la tastarea comenzii, A+BB

interpretorul Matlab răspunde ??? Error using ==> + Matrix dimensions must agree.

O variantă a operatorului este „Plus”, care semnifică adunarea a două matrice, ale căror dimensiuni sunt agreate, lucrând cu matricele ca simboluri.

De exemplu, dacă se tastează, c=plus(a,b)

sistemul răspunde: c = 8 10 12 14 16 18. O instrucţiune posibilă pentru sintaxa „+A” este uplus, astfel că, dacă uplus(A)

sistemul răspunde: ans = 1 2 3.

Operatorul „-„ sau „Minus”, semnifică X- Y şi permite scăderea unei matrice Y din X. Toate considerentele făcute la adunare rămân valabile. Matricele trebuie să fie de acelaşi tip (să aibă aceleaşi dimensiuni) sau X, Y să fie scalari.

Operatori şi caractere speciale Matlab 55

Dacă, de exemplu, X=[10 11 12 13 14 15]; Y=[1 1 1 1 1 1];

atunci la tastarea comenzii X-Y

se răspunde: ans = 9 10 11 12 13 14. Atunci când X şi Y sunt tratate ca obiecte, pentru sintaxa „X-Y”, se

utilizează instrucţiunea minus. Astfel: Z=minus(Y,X)

este: Z= -9 -10 -11 -12 -13 -14. Instrucţiunea posibilă pentru sintaxa „-X” este uminus, astfel că, dacă uminus(X)

sistemul răspunde: ans = -10 -11 -12 -13 -14 -15.

Înmulţirea a două matrice M1 cu M2 se face prin utilizarea operatorului „*” sau „mtimes”. Dacă, de exemplu,

M1=[4 5 6 7 8 9]; M2=[10 13 11 14 12 15];

atunci instrucţiunea, M1*M2

face ca sistemul să răspundă ans = 167 212 266 338. Utilizarea instrucţiunii mtimes, când matricele M1 şi M2 sunt considerate ca

obiecte, este M=mtime(M1,M2), la care se obţine : M = 167 212 266 338.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 56

De menţionat că, pentru orice scalar (care este o matrice de 1-pe-1) nu se face nici o restricţie, putând fi înmulţit oricând cu un alt scalar sau o altă matrice, dar pentru două matrice X şi Y trebuie ca numărul de coloane ale matricei X să fie egal cu numărul de rânduri ale matricei Y.

Înmulţirea, element cu element, a două matrice X şi Y, care trebuie să aibă aceeaşi dimensiune, se realizează cu instrucţiunea „.*”, sau times, când aceste matrice sunt considerate obiecte. Dacă, de exemplu,

X =[ 2 3 4 5 7 8 9 10 11 12 13 14]; Y=[2 2 2 2 2 2 2 2 2 2 2 2];

atunci instrucţiunea, X.*Y

conduce la, ans = 4 6 8 10 14 16 18 20 22 24 26 28. De menţionat că, una dintre matrice poate fi un scalar, cu care se poate

înmulţi la stânga sau la dreapta o matrice. De exemplu, dacă se tastează, 2.* X

sau X.*2

se obţine, ans = 4 6 8 10 14 16 18 20 22 24 26 28.

Ridicarea la putere a unei matrice se face prin utilizarea operatorului „^”, sau a instrucţiunii mpower(A,B), pentru sintaxa „A ^ B”, când A şi B sunt obiecte.

Instrucţiunea Z = X^y semnifică ridicarea la puterea y (un scalar) a matricei X, matrice ce este întotdeauna pătrată. Pentru ridicarea la putere simbolică, se utilizează instrucţiunea Z=power(X,y).

Dacă y este un întreg mai mare decât unu (y>1), ridicarea la putere se efectuează prin multiplicare. Pentru alte valori ale lui y, calculul utilizează valori proprii şi vectori proprii. Se recomandă utilizarea acestei instrucţiuni numai pentru puteri numere naturale întregi, mai mari decât unu. Pentru y = 2 şi

X=[4 5 6 7]

Operatori şi caractere speciale Matlab 57

atunci, Z=X^y

este, Z = 46 55 66 79. Elementele matricei Z sunt obţinute astfel, Z= [ 4^2+6*5 4*5+7*5 6*4+7*6 6*5+7*7]. Instrucţiunea Z = x^Y semnifică x la puterea Y, unde Y este o matrice

pătrată şi x este un scalar, iar calculele se fac folosind vectori şi valori propii. Cu x=3; Y =[ 4 5 6 7]

pentru Z=x.^Y

se obţine, Z = 81 243 729 2187. Atunci când X şi Y sunt matrice, instrucţiunea Z= X^Y este eronată.

Ridicarea la putere a două tablouri, element cu element, se poate face utilizând operatorul „.^” sau „power”. Instrucţiunea,

Z = X.^Y reprezintă ridicarea fiecărui element din tabloul X la puterea indicată de valoarea elementului din aceeaşi poziţie a tabloului Y, adică: Z(i,j)=X(i,j).^Y(i,j).

Dacă, de exemplu: X=[1 2 3 4 5 6]; Y=[3 3 3 3 3 3];

atunci comanda X.^Y conduce la,

ans = 1 8 27 64 125 216. Se observă că X şi Y trebuie să aibă aceeaşi dimenesiune sau unul să fie

scalar, ca în exemplu: Z=5 .^X Z = 5 25 125 625 3125 15625.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 58

Dacă matricele sunt considerate ca obiecte, atunci ridicarea la putere a acestora se face cu instrucţiunea C=power(X,Y), rezultând:

C = 1 8 27 64 125 216. Pentru împărţirea la stânga a două matrice se utilizează operatorul „\”,

respectiv „backslash”, astfel încât A\B înseamnă împărţirea matricei A cu B, ceea ce este acelaşi lucru, atunci când este posibil, cu A-1*B, adică inv(A)*B. Dacă A este o matrice pătrată cu N linii şi N coloane (de NxN), iar B este un vector coloană de N elemente sau o matrice cu acelaşi număr N de coloane, rezultatul X=A\B este soluţia ecuaţiei A*X=B, calculată prin eliminarea Gausiană. De menţionat că, pentru calcul simbolic, se utilizează instrucţiunea mldivide(A,B), pentru sintaxa „A\B”.

De exemplu dacă, A =[ 10 25 3 4 5 6 7 8 9]; B =[ 2 3 4];

atunci, X=A\B

sau X=mldivide(A,B)

conduce la, X = -0.6216 0.2432 0.7117. Dacă maticea B este cu acelaşi număr de coloane, B = [ 2 5 3 6 4 7];

atunci, X=A\B

rezultă, X = -0.6216 -2.4865 0.2432 0.9730 0.7117 1.8468. Atunci când matricea A este singulară sau determinantul acesteia este zero,

apare un mesaj de eroare. De exemplu, dacă

Operatori şi caractere speciale Matlab 59

A =[ 1 2 3 4 5 6 7 8 9]

atunci, X=A\B

face ca pe ecran, înaintea rezultatului, să apară mesajul, Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 2.055969e-018. X = -3.3333 5.6667 -2.0000. Pentru a calcula inversa matricei A se poate utiliza instrucţiunea

A\eye(size(A)). Considerând, A =[ 1 20 3 4 5 6 7 8 9];

atunci, A\eye(size(A)),

produce inversa matricei A, respectiv: ans = -0.0278 -1.4444 0.9722 0.0556 -0.1111 0.0556 -0.0278 1.2222 -0.6944. Dacă matricea A are dimensiunile MxN, unde M< sau > N, iar B este un

vector coloană de M componente sau o matrice cu acelaşi număr de coloane, atunci X=A\B este soluţionată prin metoda celor mai mici pătrate, X fiind soluţia sistemului de ecuaţii A*X=B. Rangul efectiv al matricei A se determină prin descompunere ortogonal triunghiulară QR, cu pivotare.

Pentru împărţirea la dreapta, a două matrice, se utilizează operatorul „/”, respectiv „slash”, astfel încât A/B înseamnă împărţirea matricei B cu A, ceea ce este acelaşi lucru, atunci când este posibil, cu A*B-1, adică A* inv(B), dar mult mai precis A/B = (B'\A')'. Pentru calculul simbolic se utilizează instrucţiunea mrdivide(A,B), pentru sintaxa „A/B”, unde A şi B sunt considerate obiecte. Dacă,

A = [ 10 25 35 45 55 75 85 95 100]; B = [ 100 2 3 200 5 6 7 8 9];

atunci la instrucţiunea A/B

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 60

compilatorul Matlab răspunde, ans = 12.2810 -6.2287 3.9477 23.3788 -11.7577 8.3788 -12.2469 6.1604 11.0865. Operaţia de împărţire la stânga, element cu element, între două tablouri, este

simbolizată prin operatorul „.\”, astfel că A.\B, reprezintă împărţirea element cu element. În calculul simbolic, pentru sintaxa”A.\B” se utilizează instrucţiunea ldivide(A,B). Matricele A şi B trebuie să aibă aceleaşi dimensiuni sau una dintre ele să fie un scalar. Dacă,

A = [ 10 25 35 45 55 75 85 95 100];

iar, B=5;

atunci, C=A.\B sau C=ldivide(A,B)

conduce la, C = 0.5000 0.2000 0.1429 0.1111 0.0909 0.0667 0.0588 0.0526 0.0500. Pe de altă parte, instrucţiunile D=B.\A sau D=ldivide(B,A)

au ca rezultat, D = 2 5 7 9 11 15 17 19 20. Pentru matricele de mai sus, instrucţiunea A.\D sau ldivide(A,D), conduce la: ans = 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000. Operaţia de împărţire la dreapta, element cu element, între două tablouri este

simbolizată prin operatorul „./”, astfel că A./B, reprezintă împărţirea element cu element a matricelor respective. În calculul simbolic, pentru sintaxa”A./B”, se utilizează instrucţiunea rdivide(A,B). Matricele A şi B trebuie să aibă aceleaşi dimensiuni sau una dintre ele să fie un scalar. Dacă,

A = [ 10 25 35 45 55 75 85 95 100];

Operatori şi caractere speciale Matlab 61

iar B=5; atunci C=A./B sau C=rdivide(A,B) conduce la,

C = 2 5 7 9 11 15 17 19 20. Pe de altă parte instrucţiunile, D=B./A sau D=rdivide(B,A)

au ca rezultat, D = 0.5000 0.2000 0.1429 0.1111 0.0909 0.0667 0.0588 0.0526 0.0500. Pentru matricele de mai sus, instrucţiunea A./D sau rdivide(A,D), conduce

la: ans = 20 125 245 405 605 1125 1445 1805 2000.

Instrucţiunea kron(X,Y) permite calculul produsului tensorial Kronecker dintre X şi Y. Acesta se obţine prin înmulţirea componentelor lor, în toate modurile

posibile, dar ţine seama şi de simbolul lui Kronecker,

=

=

ji

jii

i pentru ,1

pentru ,0δ . De

exemplu dacă, X = [ 2 4 6 8 10 12]; Y = [ 3 3];

atunci comanda, kron(X,Y)

conduce la, ans = 6 6 12 12 18 18 24 24 30 30 36 36.

Se reaminteşte că, în general, cu tensorii l

m

k

ji ba , , se pot forma produsele, l

m

k

ji

kl

mji bac ,,, ⋅= , sau ,,,k

ji

l

m

lk

jim abd ⋅= , după cum cei doi tensori se consideră într-

o ordine sau alta. Dacă X şi Y sunt matrice rare, atunci sunt multiplicate numai elementele ce

nu sunt zero.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 62

4.3. Operatori relaţionali

Operatorii relaţionali, prezentaţi în tabelul 4.3, compară element cu element două matrice, de exemplu A cu B şi returnează o matrice C, a cărei elemente sunt 1, dacă relaţia este adevărată şi 0, dacă relaţia este falsă.

Matricele A şi B trebuie să aibă aceleaşi dimensiuni sau una dintre ele să fie un scalar. În mod obişnuit, în programele de calcul numeric Matlab, operatorii relaţionali sunt semne matematice consacrate, iar structura instrucţiunii este:

C=A operator relaţional B De menţionat că, pentru calculul simbolic, când matricele sunt considerate

ca obiecte, structura instrucţiunii Matlab este: C=operator relaţional (A,B)

Tabelul 4.3

Operatori relaţionali MATLAB

Semnificaţia Forma pentru calcul numeric Forma pentru calcul simbolic

Egal == eq

Diferit ~= ne

Mai mic < lt

Mai mare > gt

Mai mic sau egal <= le

Mai mare sau egal >= ge

Pentru exemplificarea funcţionării operatorilor relaţionali, se consideră următoarele matrice A şi B, precum şi scalarul BB:

A = [ 10 25 35; 45 55 75; 85 95 100]; B = [ 10 15 35; 14 55 70; 85 90 100]; BB=55,

calculându-se matricea rezultat, C.

Pentru instrucţiunea egalitate, C=A==B sau C=eq(A,B), se obţine, C = 1 0 1 0 1 0 1 0 1,

iar dacă se compară cu BB, prin instrucţiunea C=A==BB sau C=eq(A,BB), se obţine,

C = 0 0 0 0 1 0 0 0 0.

Operatori şi caractere speciale Matlab 63

Pentru instrucţiunea diferită, C=A~=B sau C=ne(A,B), se obţine, C = 0 1 0 1 0 1 0 1 0,

iar dacă se compară cu BB prin instrucţiunea C=A~=BB, sau C=ne(A,BB), se obţine,

C = 1 1 1 1 0 1 1 1 1.

Pentru instrucţiunea mai mic, C=A<B sau C=lt(A,B), se obţine, C = 0 0 0 0 0 0 0 0 0,

iar dacă se compară cu BB, prin instrucţiunea C=A<BBsau C=lt(A,BB), se obţine, C = 1 1 1 1 0 0 0 0 0.

Pentru instrucţiunea mai mare, C=A>B sau C=gt(A,B), se obţine, C = 0 1 0 1 0 1 0 1 0,

iar dacă se compară cu BB, prin instrucţiunea C=A>BB sau C=gt(A,BB), se obţine, C = 0 0 0 0 0 1 1 1 1.

Pentru instrucţiunea mai mic sau egal, C=A<=B sau simbolic C=le(A,B), se obţine,

C = 1 0 1 0 1 0 1 0 1,

iar dacă se compară cu BB, prin instrucţiunea C=A<=BB sau C=le(A,BB), se obţine,

C =

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 64

1 1 1 1 1 0 0 0 0.

Pentru instrucţiunea mai mare sau egal, C=A>=B sau C=ge(A,B), se obţine, C = 1 1 1 1 1 1 1 1 1,

iar dacă se compară cu BB, prin instrucţiunea C=A>=BB sau C=ge(A,BB), se obţine,

C = 0 0 0 0 1 1 1 1 1.

4.4. Operatori logici

Operatorii logici au prioritate mai mică decât operatorii relaţionali sau aritmetici. Într-o expresie, se evaluează mai întâi relaţiile care conţin operatori relaţionali şi aritmetici şi apoi cele cu operatori logici.

Aceşti operatori, prezentaţi în tabelul 4.4, compară, cu excepţia operatorului

negaţie- NU, două matrice A cu B (de obicei cele calculate cu operatorii relaţionali şi care au elementele 0 sau 1), sau o matrice A şi un scalar BB.

Operatorul negaţie, având simbolul „~” sau „not”, acţionează numai asupra

unui element (matrice sau scalar), sub forma, de exemplu ~A sau not(A). De menţionat că ceilalţi operatori logici au, pentru calculul numeric,

simboluri matematice consacrate, iar structura instrucţiunii este: C=A operator logici B Pentru calculul simbolic, când matricele sunt considerate ca obiecte,

structura instrucţiunii Matlab este: C=operator logici (A,B) Ordinea de prioritate a operatorilor logici în expresii este: � Nu, respectiv ~ sau not – prioritate 1 în expresii logice; � Şi, respectiv & sau and – prioritate 2 în expresii logice; � Sau, respectiv | sau or – prioritate 3 în expresii logice.

Operatori şi caractere speciale Matlab 65

Tabelul 4.4

Operatori logici MATLAB

Semnificaţia Forma pentru

calcul numeric

Forma pentru

calcul simbolic

Nu ~ not

Şi & and

Sau | or

Sau exclusiv gt

Caută un element diferit de zero any

Caută ca orice element să fie diferit de zero all

Pentru două expresii logice simple E1 şi E2 şi operatorii logici principali, tabela de adevăr este redată în tabelul 4.5.

Tabelul 4.5

Tabela de adevăr a operatori logici

E1 E2 ~E1 E1&E2 E1 | E2

ADEVĂRAT ADEVĂRAT FALS ADEVĂRAT ADEVĂRAT ADEVĂRAT FALS FALS FALS ADEVĂRAT

FALS ADEVĂRAT ADEVĂRAT FALS ADEVĂRAT FALS FALS ADEVĂRAT FALS FALS

De reţinut că, în Matlab, orice valoare diferită de zero este considerată adevărată logic, adică 1.

Pentru exemplificarea modului de acţiune a operatorilor logici, considerăm două matrice A şi B, cât şi scalarii AA, BB, ca de exemplu:

A = [ 11 0 22; 1 15 1; 0 4 1]; B = [ 12 0 23; 1 14 1; 0 4 1]; AA = 1; BB = 0.

Pentru instrucţiunea logică de negare nu, simbolizată prin „~” sau „not”, se obţine,

C = ~A = not(A) = [ 0 1 0; 0 0 0; 1 0 0]; C = ~B = not(B) = [ 0 1 0; 0 0 0; 1 0 0]; C = ~AA = not(AA) = 0; C = ~BB = not(BB) = 0;

din care se observă că, în matricea rezultat, C, sunt egale cu 1 numai acele elemente care sunt iniţial zero, iar celelalte diferite de zero devin, prin negare, nule.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 66

Pentru instrucţiunea logică şi, cu simbolul „&” sau „and”, se obţine, C = A&B = and(A,B) = [ 1 0 1; 1 1 1; 0 1 1]; C = A&AA = and(A,AA) = [ 1 0 1; 1 1 1; 0 1 1]; C = A&BB = and(A,BB) = [ 0 0 0; 0 0 0; 0 0 0]; C = AA&BB = and(AA,BB) = 0.

Pentru instrucţiunea logică sau, cu simbolul „|” sau „or”, se obţine, C = A | B = or (A,B) = [ 1 0 1; 1 1 1; 0 1 1]; C = A | AA = or (A,AA) = [ 1 1 1; 1 1 1; 1 1 1]; C = A | BB = or (A,BB) = [ 1 0 1; 1 1 1; 0 1 1]; C = AA | BB = or (AA,BB) = 1.

Pentru instrucţiunea logică diferenţă simetrică sau exclusiv, cu simbolul „xor”, se obţine,

C = xor (A,B) = [ 0 0 0; 0 0 0; 0 0 0]; C = xor (A,AA) = [ 0 1 0; 0 0 0; 1 0 0]; C = xor (A,BB) = [ 1 0 1; 1 1 1; 0 1 1]; C = xor (AA,BB) = 1,

din care se observă că rezultatul este 1, când unul dintre elementele matricelor comparate nu este zero, dar nu simultan.

Căutarea, dacă un element al vectorului este zero, se realizează cu instrucţiunea având simbolul „any”. Pentru un vector, aceasta returnează 1, dacă un element al vectorului nu este negativ, altfel returnând 0. Pentru matrice, operatorul „any” lucrează asupra întregii matrice, dacă se specifică dimensiunea (sub forma any(A,DIM), cu DIM –dimensiunea matricei) sau, dacă nu se specifică, numai asupra coloanelor, returnând un vector rând.

De exemplu, C = any (A,3) = [ 1 0 1; 1 1 1; 0 1 1]; C = any (A) = [ 1 1 1]; C = any (B,3) = [ 1 0 1; 1 1 1; 0 1 1]; C = any (A,AA) = [ 1 1 1]. Căutarea, dacă toate elementele vectorului sunt zero, se face cu instrucţiunea

având simbolul „all”. Pentru un vector, aceasta returnează 1, dacă un element al vectorului nu este negativ, altfel returnând 0. Pentru matrice, operatorul „any” lucrează asupra întregii matrice, dacă se specifică dimensiunea (sub forma all(A,DIM), cu DIM –dimensiunea matricei) sau, dacă nu se specifică, numai asupra coloanelor, returnând un vector rând.

De exemplu, C = all (A,3) = [ 1 0 1; 1 1 1; 0 1 1]; C = all (A) = [ 0 0 1]; C = all (B,3) = [ 1 0 1; 1 1 1; 0 1 1]; C = all (A,AA) = [ 0 0 1].

Operatori şi caractere speciale Matlab 67

4.5. Caractere speciale

Instrucţiunea „:” sau „colon” este larg utilizată în programele Matlab pentru: • a genera valori cu pas liniar constant sau cu pas constant dat; • a selecta o matrice, rândul sau coloana acesteia; • producerea unei liste de argumente.

Generarea valorilor cu pas liniar constant, între o valore J şi K, se face cu instrucţunea J:K sau colon (J,K), la fel ca şi [J, J+1, ..., K], cu condiţia ca J > K.

De exemplu, dacă J=4, K=12, atunci: J:K sau colon(J,K)

conduce la, ans = 4 5 6 7 8 9 10 11 12. Generarea valorilor, între J şi K cu pas constant dat, notat cu D, se

realizează cu instrucţiunea, J:D:K sau colon (J,D,K),

care sunt la fel ca şi [J, J+D, ..., J+m*D], cu condiţia ca, dacă J > K ,atunci D<0, iar dacă J<K, atunci D>0.

Dacă, de exemplu, J=-20, K=+11, iar D=3, atunci: ans = -20 -17 -14 -11 -8 -5 -2 1 4 7 10. Considerând matricea,

A = [ 11 14 4 8 12 13 2 10 15 16 7 5],

atunci, • instrucţiunea A(:), conduce la selectarea tuturor elementelor matricei,

puse sub forma unei coloane, aranjând coloanele unele sub altele: ans = 11 12 15 14 13 16 4 2 7 8 10 5,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 68

• instrucţiunea A(:,2), conduce la selectarea tuturor elementelor coloanei specificate, respectiv 2:

ans = 14 13 16,

• iar instrucţiunea A(3,:), conduce la selectarea tuturor elementelor liniei 3:

ans = 15 16 7 5. Producerea unei liste de argumente, utilizate în alte subprograme, se face cu

instrucţiunea C{:}, care este la fel cu C{1},C{2},...,C{end} şi este validă la chemare prin ( ) sau [ ]. Parantezele, de toate felurile, sunt larg utilizate în structura programelor Matlab.

Parantezele rotunde, simbolizate prin „( )”, sunt folosite: • în calculele aritmetice sau logice, pentru a grupa operaţiile şi unde ţin

locul tuturor tipurilor de paranteze (rotunde, drepte, acolade); • pentru a indica elementul unui vector sau matrice sau elementele

vectorului X, mai mari sau mai mici decât o valoare (fie aceasta >0.5), prin instrucţiunea X(>0.5);

• pentru a grupa argumentele unei funcţii. Parantezele drepte, simbolizate prin „[ ]”, sunt utilizate pentru:

• formarea vectorilor şi matricelor, prin indicarea elementelor acestora, elemente separate neapărat prin blank sau “,” , pentru elementele unei linii şi prin „;”, coloanele, ca de exemplu [6.9 9.4 sqrt(2)], sau [6.9,9.4,sqrt(2)], pentru linie, iar pentru coloane [6.9;9.4;sqrt(2)];

• stocarea unei matrice goale, ca de exemplu matricea de dimensiuni 0x0, prin instrucţiunea A=[];

• schimbarea unui rând sau coloane dintr-o matrice, de exemplu dacă matricea A este,

A = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15], atunci prin instrucţiunea A([1,5],:) = A([5,1],:), în matricea A, se schimbă rândul 1 cu rândul 5, obţinându-se: A = [ 13 14 15 4 5 6 7 8 9 10 11 12 1 2 3];

Operatori şi caractere speciale Matlab 69

• concatenarea (unirea) vectorilor şi matricelor, prin instrucţiuni de forma [A B; C], care presupune că numărul de rânduri ale lui A este egal cu numărul de rânduri ale lui B, iar numărul de coloane ale lui A plus numărul de coloane ale lui B este egal cu numărul de coloane ale lui C, ca de exemplu dacă:

A = [ 5 6 B = [ 7 8 9 C = [ 11 14 16 3 2 10 12]; 1 4 17 ]; 22 25 30 41 42]; atunci [A B; C] este:

ans = 5 6 7 8 9 10 12 1 4 17 11 14 16 3 2 22 25 30 41 42

Concatenarea orizontală a unei matrice A cu o matrice B, care au acelaşi număr de rânduri, se obţine prin instrucţiunea [A B], ori [A,B], iar pentru obiecte, prin instrucţiunea horzcat(A,B). De exemplu, cu A şi B de mai sus, prin instrucţiunea [A,B] sau [A B], se obţine:

ans = 5 6 7 8 9 10 12 1 4 17.

Concatenarea verticală se realizează prin instrucţiuni de forma [A;BB] şi impune ca numărul de coloane a celor două matrice să fie acelaşi, iar pentru obiecte, prin instrucţiunea vertcat(A,BB). Dacă matricea A anterioară şi BB=[7 8; 1 4], prin instrucţiunea [A;BB], se obţine:

ans = 5 6 10 12 7 8 1 4.

Parantezele de tip acolade, simbolizate prin „{ }”, sunt utilizate similar ca şi parantezele drepte, cu deosebirea că acestea se referă la obiecte, specificând conţinutul căsuţelor acestora. De exemplu, prin instrucţiunea {magic(3),6.9,'hello'} se obţine o matrice cu trei elemente,

ans = [3x3 double] [6.9000] 'hello'.

iar prin instrucţiunea {'This' 'is' 'a';'two' 'row' 'cell'} se obţine o matrice de 2x3 celule,

ans = 'This' 'is' 'a' 'two' 'row' 'cell'.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 70

Caracterul „@” este utilizat pentru a crea o funcţie implicită, apelabilă ca şi o variabilă, în lista de argumente intrate într-o funcţie, denumită, function_handle. În ea sunt stocate informaţiile referitoare la funcţia din context.

De exemplu: f = @humps;

creează o function_handle f pentru funcţia 'humps'. x = fminbnd(f,1,2);

cheamă function_handle f ,ca argument în funcţia 'fminbnd'.

Când funcţia 'humps' este chemată în funcţia 'fminbnd', aceasta este determinată în contextul în care f a fost creată, faţă de cazul când f este argument în funcţia feval, când această funcţie este evaluată pentru argumentul x.

Punctul, cu simbolul „.” este folosit în Matlab pentru: • scrierea numerelor zecimale, ca de exemplu 1.25 sau 0.125e1; • operaţii cu tablouri, pentru a indica că operatorii de înmulţire, “.*”, de

ridicare la putere, “.^”, de împărţire la dreapta, “. /”, de împărţire la stânga, “.\”, sau de transpunere, “.’ ”, lucrează element cu element ;

• în câmpuri de acces, când se lucrează cu structuri.

Trecerea din subdirectorul curent în directorul din faţa acestuia (mai

cuprinzător) se face prin utilizarea a două puncte, „cd ..”. De exemplu, dacă ne aflăm în subdirectorul bin din directorul Matlab, D:\MATLAB\bin, atunci aceasta se realizează prin comanda cd .., obţinându-se: D:\MATLAB.

Continuarea unei linii de program, pe o altă linie, se realizează prin utilizarea a trei puncte, „…”, după un blank, ca de exemplu:

a = sin(pi/2)+tg(pi/3)+ … 2+5/6.

Separarea indicilor unei matrice, a elementelor de pe linie sau a argumentelor unei funcţii se face prin virgulă, „ ,”.

Atribuirea unei variabile Var a valorii expresiei 3+4 se realizează prin utilizarea semnului egal, „=”, adică Var=3+4.

Pentru a indica terminarea rândurilor unei matrice sau a suprimării scrierii pe ecran, se utilizează punct şi virgula, „ ; ”.

Începerea unei linii de comentariu se realizează prin utilizarea semnului procent, „%”, astfel că, după acesta, orice text scris va fi ignorat de către compilatorul limbajului Matlab.

Chemarea unei instrucţiuni, specifică sistemului de operare sau a unui program extern Matlab, se face prin utilizarea semnului exclamării, „!”, înaintea

Operatori şi caractere speciale Matlab 71

instrucţiunii.

Semnul apostrof, „’ ”, se utilizează în Matlab pentru: • scrierea unui şir de caractere în codul ASCII, ca de exemplu prin

a='Exemplu' se obţine a=Exemplu; • transpunerea unei matrice.

Dată fiind o matrice [a], de tipul {p, n}, transpusa sa, [a]t , este matricea obţinută din aceasta, schimbându-i liniile în coloane şi coloanele în linii, cu păstrarea ordinii lor. Linia j a matricei [a] devine coloana j a matricei [a]t , iar coloana i a a matricei [a] devine linia i a matricei [a]t. Pentru o matrice dată

jiaa ,= , transpusa acesteea, at, se obţine prin înlocuirea liniilor cu coloanele de

acelaşi rang, astfel că ijt aa ,= .

Transpusa unei matrice cu o singură coloană este o matrice cu o singură linie, iar transpusa unei matrice cu o singură linie are numai o coloană. De menţionat că transpusa transpusei, coincide cu matricea iniţială, transpusa sumei este egală cu suma transpuselor şi transpusa matricei produs este egală cu produsul transpuselor, în ordine schimbată.

Dată fiind o matrice cu un număr oarecare de linii sau coloane, ale cărei elemente sunt numere reale sau complexe, conjugata sa este matricea formată prin înlocuirea fiecărui element cu imaginarul său.

Prin definiţie, matricea cu toate elementele numere reale este o matrice

reală. Deoarece imaginarul conjugat al unui număr real este el însuşi, iar numerele reale complexe, care coincid cu conjugatele lor, sunt numere reale, urmează că: o matrice reală este egală cu conjugata sa şi, reciproc, dacă o matrice este egală cu conjugata sa, matricea este reală.

În Matlab, pentru matricea complexă A = [ 1.0000 + 2.0000i 5.0000 4.0000 + 1.0000i 7.0000 10.0000 + 3.0000i 0 + 6.0000i 12.0000 + 4.0000i 8.0000 9.0000 +19.0000i],

matricea transpusă neconjugată se obţine cu instrucţiunea, A.' sau transpose(A) rezultând, ans = 1.0000 + 2.0000i 7.0000 12.0000 + 4.0000i 5.0000 10.0000 + 3.0000i 8.0000 4.0000 + 1.0000i 0 + 6.0000i 9.0000 +19.0000i iar matricea transpusă complexă conjugată se obţine cu instrucţiunea, A' sau ctranspose(A) rezultând,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 72

ans = 1.0000 - 2.0000i 7.0000 12.0000 - 4.0000i 5.0000 10.0000 - 3.0000i 8.0000 4.0000 - 1.0000i 0 - 6.0000i 9.0000 -19.0000i.

4.6. Operatori la nivelul biţilor de informaţie

Principalele instrucţiuni care permit lucrul cu informaţia, la nivelul biţilor sunt: bitand, bitcmp, bitor, bitmax, bitxor, bitset, bitget, bitshift.

Cel mai mare întreg suportat de calculatorul pe care se rulează Matlab-ul este aflat prin instrucţiunea bitmax. Pentru calculatoarele care lucrează cu aritmetică IEEE, cel mai mare întreg este 253-1, respectiv 9.0072e+015. Pentru a verifica dacă maşina pe care se rulează programul lucrează cu aritmetică IEEE, se execută instrucţiunea isieee, la care răspunsul trebuie să fie 1. Cu aritmetică IEEE lucrează calculatoarele de tip PC, majoritatea staţiilor UNIX şi Macintosh, iar cele de tip VACS sau Cray, nu.

Instrucţiunea bitand(A,B), returnează informaţia „ŞI”, de la nivelul biţilor pentru argumentele A şi B, bitor(A,B) returnează informaţia „ORI”, iar bitxor(A,B) informaţia „ORI” exlusiv. Aceste argumente, trebuie să conţină întregi nenegativi mai mici decât bitmax.

Bitul complement al lui A, funcţie de un întreg N, nenegativ, se obţine prin instrucţiunea bitcmp(A,N).

Instrucţiunea bitset(A,BIT,V) setează biţii pozitivi, BIT, în A, la valoarea V (sau 1 dacă V lipseşte), dar A trebuie să fie un număr întreg < 52 (pentru IEEE).

Găsirea valorii pozitive a biţilor lui A se realizează prin instrucţiunea bitget(A,BIT), iar găsirea valorii lui A, împărţit la K biţi (sau multiplicarea cu 2^K) şi rotunjire, se execută prin instrucţiunea bitshift(A,K).

4.7. Operatori pentru stabilirea proprietăţilor

Unirea fără repetiţie şi sortarea elementelor a doi vectori, A şi B, se realizează prin instrucţiunea union(A,B).

Dacă A=[ 1 2 8 9] şi B=[ 4 5 7], atunci comanda union(A,B), conduce la: ans = 1 2 4 5 7 8 9. Pentru două matrice A şi B, cu acelaşi număr de coloane, combinarea

rândurilor acestora, fară repetiţie, se poate face prin instrucţiunea union(A,B,rind). Dacă A=[1 2 3; 4 5 6], iar B=[7 8 9; 2 3 10], atunci instrucţiunea union(A,B,2)

Operatori şi caractere speciale Matlab 73

conduce la: ans = 1 2 3 2 3 10 4 5 6 7 8 9.

Găsirea valorilor unui vector (cu valori numerice sau semne), care nu se repetă, aranjate în ordine crescătoare, se poate face cu instrucţiunea unique(A). Considerând vectorul A=[1 2 10 2 8 9 14 2 1 8 11] şi vectorul aa='textul este acesta' atunci instrucţiunea:

unique(A), conduce la, ans = 1 2 8 9 10 11 14, iar unique(aa) la, ans = acelsta.

Valorilor comune a doi vectori, fără a se repeta, aranjate în ordine crescătoare, se găsesc cu instrucţiunea intersect(A,B). Considerând vectorul A=[1 2 10 2 8 9 14 2 1 8 11] şi vectorul B =[ 3 2 6 8 4 10] atunci instrucţiunea:

intersect(A,B), conduce la, ans = 2 8 10.

Valorile diferite ale unui vector, fără a se repeta, aranjate în ordine crescătoare, se găsesc cu instrucţiunea setdiff(A,B). Considerând instrucţiunea:

setdiff(A,B), conduce la, ans = 1 9 11 14.

Valorilor unui vector, fără a se repeta, aranjate în ordine crescătoare, se găsesc cu instrucţiunea setxor(A,B). Prin instrucţiunea setxor(A,B) se obţine,

ans = 1 3 4 6 9 11 14.

Pentru a verifica dacă un element este membru, se utilizează ismember.

5. LIMBAJUL MATLAB - INSTRUCŢIUNI

ŞI FUNCŢII DE CONTROL SPECIFICE

Programele MATLAB sunt scrise pentru a realiza numai paşi secvenţiali, operaţiile fiind executate una după alta.

5.1. Instrucţiuni de control logic

Uneori, este necesară repetarea unui set de instrucţiuni, atâta timp cât o condiţie nu este realizată sau repetarea unui grup de instrucţiuni, de un anumit număr de ori. Alteori, este necesară terminarea normală sau forţată a unui ciclu sau reîntoarcerea execuţiei la o funcţie precizată. Nu lipsită de interes este şi afişarea unor mesaje de eroare.

Instrucţiunile de control logic (condiţionale) utilizează operatori relaţionali şi operatori logici.

Instrucţiuni condiţionate

În cadrul unui algoritm este deseori necesară o selecţie a grupului de instrucţiuni ce urmează a fi executate, condiţionate de valoarea de adevăr a unei expresii. Grupul de instrucţiuni care se repetă este numit şi corpul ciclului.

Instrucţiunea „if” poate fi implementată ca instrucţiune if simplă; poate include clauzele else sau elseif.

Forma generală a unei instrucţiuni if simplă, este: if expresie logică grup de instrucţiuni end

Dacă expresia logică este adevărată, se execută grupul de instrucţiuni cuprinse între if şi end. Dacă expresia logică este falsă, se trece la prima instrucţiune, care urmează după instrucţiunea end.

Pentru o citire mai uşoară, cât şi pentru o urmărire a grupurilor de instrucţiuni care se execută, se procedează la decalarea (deplasarea ) acestora, lucru realizat automat, de editorul intern al Matlab.

Un exemplu de utilizare a instrucţiunii if simplă este secvenţa Matlab: if a < 10 b=b+1 c=c+a end. Dacă a este un scalar şi dacă a<10, b se incrementează cu 1, iar c cu a. Instrucţiunea if poate fi inclusă în interiorul altei instrucţiuni if, ca în

exemplul următor:

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 75

if expresie_logică_A grupul_de_instricţiuni_1 if expresie_logică_B grupul_de_instrucţiuni_2 end grupul_de_instrucţiuni_3 end grupul_de_instrucţiuni_4 Atâta timp cât expresie_logică_A este 1 (ADEVĂRATĂ), se execută

grupul_de_instrucţiuni_1 şi grupul_de_instrucţiuni_3. Dacă şi expresie_logică_B este 1 (ADEVĂRATĂ), se execută grupul_de_instrucţiuni_2, înaintea executării grupului de instrucţiuni 3. Dacă expresie_logică_B este 0 (FALSĂ), nu se execută grupul_de_instrucţiuni_2, chiar dacă expresia logică A continuă să fie adevărată.

Dacă expresie_logică_A este 0 (FALSĂ), se trece la grupul de instrucţiuni 4,fără a mai executa grupurile de instrucţiuni 1÷3. De altfel, grupul de instrucţiuni 4 se execută indiferent de valoarea de adevăr a expresiilor logice A şi/sau B.

Pentru a evidenţia grupurile de instrucţiuni care se execută, funcţie de condiţiile pe care le îndeplinesc, se utilizează identarea (deplasarea instrucţiunilor respective spre dreapta cu căteva spaţii).

Fie următorul exemplu de utilizare a instrucţiunilor condiţionale „if” succesive:

b=0 a=1 if a < 10 b=b+a c=b+a a=a+b if b < a b=b+a end c=c.^2 a=a+1 end d=a*b+c*a În exemplul de mai sus, a=1 şi deci a<10, astfel că, se execută instrucţiunile, b=b+a c=b+a a=a+b

rezultând b=1, c=2, a=2. Cum b<a, se execută instrucţiunea b=b+a, rezultând b=3 şi apoi se trece la

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 76

grupul de instrucţiuni, c=c.^2 a=a+1

după care se execută instrucţiunea, d=a*b+c*a

rezultând, în final, a=3, c=4 şi d=21.

Dacă a este un vector sau o matrice, condiţia a<10 este adevărată numai dacă fiecare element al lui a este mai mic de 10. Dacă a şi b sunt vectori sau matrice, atunci <a numai dacă fiecare pereche (b, a) verifică această condiţie.

Dacă a sau b este scalar, comparaţia se face între fiecare element al matricei cu scalarul extins la o matrice.

Clauza „else” este utilizată pentru a executa un set de instrucţiuni, dacă expresia logică este ADEVĂRATĂ şi un alt set de instrucţiuni, dacă expresia logică este FALSĂ.

Forma generală a instrucţiunii if, combinată cu clauza else (numită şi instrucţiunea if-else) este:

if expresie_logică_A grupul_de_instricţiuni_1 else grupul_de_instrucţiuni_2 end

Dacă expresia logică A este adevărată, se execută grupul de instrucţiuni 1, iar dacă este falsă, se execută grupul de instrucţiuni 2.

Un exemplu de aplicare a instrucţiunii if-else este cel pentru descrierea funcţiei,

( )

2.y dacã , yy2

2y dacã ,2yy3g(y)

2

32

<+⋅

>−⋅⋅=

a cărei descriere MATLAB este: if y >= 2 g(y)=3*y^2*(y-2)^3 else g(y)=2*y+2 end Clauza „elseif” se utilizează dacă funcţia de calculat are mai multe niveluri

de instrucţiuni if-else şi este mai dificilă determinarea expresiei logice adevărate. Structura generală a utilizării clauzei elseif este:

if expresie_logică_A grupul_de_instricţiuni_1 elseif expresie_logică_B

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 77

grupul_de_instrucţiuni_2 elseif expresie_logică_C grupul_de_instrucţiuni_3 end Modul de evaluare este următorul:

• dacă expresia logică A este adevărată, este executat numai grupul de instrucţiuni 1;

• dacă expresia logică A este falsă şi expresia logică B este adevărată, se execută numai grupul de instrucţiuni 2 ;

• dacă expresiile logice A şi B sunt false, iar expresia logică C este adevărată, se execută numai grupul de instrucţiuni C ;

• dacă mai multe expresii logice sunt adevărate, prima instrucţiune logică adevarată determină grupul de instrucţiuni care este executat prima dată ;

• dacă nici o expresie logică nu este adevărată, nu se execută nici un grup de instrucţiuni din structura if-elseif.

Clauza elseif poate fi combinată cu clauza else într-o structură generală de

forma: if expresie_logică_A grupul_de_instricţiuni_1 elseif expresie_logică_B grupul_de_instrucţiuni_2 elseif expresie_logică_C grupul_de_instrucţiuni_3 else grupul_de_instrucţiuni_4 end

Dacă nici o expresie logică (A÷C) nu este adevărată, se execută grupul de instrucţiuni 4.

De exemplu, dacă trebuie generată o matrice X cu n linii şi n+1 coloane, ale cărei elemente sunt:

ji dacã,1

ji dacã 0,

ji dacã , 1-

X

>

=

<

=

Cu secvenţa Matlab: n=4; for i=1:n for j=1:n+1

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 78

if i==j X(i,j)=0 elseif i<j X(i,j)=-1 else X(i,j)=1 end end end

se obţine, X = 0 -1 -1 -1 -1 1 0 -1 -1 -1 1 1 0 -1 -1 1 1 1 0 -1.

Instrucţiuni pentru încheierea ciclurilor

Instrucţiunea care încheie ciclurile (if, for, while, switch, try) este end, fiecare pentru o instrucţiune de deschidere a unui ciclu.

End mai este utilizată şi ca ultim index într-o matrice sau pornind de la acesta, să poată identifica elementele matricei, având ca bază ultimul element. În acest context, pentru X=[1 2 3 4; 5 6 7 8; 9 10 11 12], rezultă că end este 12, iar:

X(end)=12, X(end-3)=X(9)=11, X(end-10)=X(2)=5.

Instrucţiuni repetitive

Instrucţiunea for este folosită pentru repetarea unui grup de instrucţiuni din corpul buclei, de un anumit număr de ori, cunoscut iniţial.

Forma generală a instrucţiunii for este: for index=expresie grupul de instrucţiuni end

unde: index este numele contorului, expresie este un scalar, un vector sau o matrice, iar grupul de instrucţiuni sunt, una sau mai multe expresii Matlab.

În aplicaţii, de cele mai multe ori, „index=expresie” este de forma: k=valoare_iniţială : pas : valoare_finală,

unde k este indexul cont, valoare_iniţială este prima valoare a lui k, pas este pasul la care este calculat indexul, iar valoare_finală este cea mai mare valoare pe care o poate lua k.

La fiecare pas este calculat indexul k, care este folosit în grupul de instrucţiuni. Dacă „expresie” este o matrice, atunci ciclarea se face pe coloane.

Pentru un ciclu for, cu pasul negativ sau neîntreg, se generează mai întâi un vector cu pasul şi limitele dorite şi apoi se citesc valorile acestuia, în cadrul buclei

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 79

for. La folosirea buclei for trebuie respectate următoarele reguli:

• indexul buclei for trebuie să fie o variabilă; • dacă expresia este o matrice goală, bucla nu se execută şi se va trece la

următoarea instrucţiune, după instrucţiunea end; • dacă expresia este un scalar, bucla se execută o singură dată, cu indexul

dat de valoarea scalarului ; • dacă expresia este un vector linie, bucla se execută de atâtea ori câte

elemente are vectorul şi de fiecare dată, indexul are valoarea egală cu următorul element din vector ;

• dacă expresia este o matrice, indexul va avea la fiecare iteraţie valorile conţinute în următoarea coloană a matricei ;

• la terminarea ciclurilor for, indexul are ultima valoare utilizată; • dacă se utilizează operatorul “:” pentru a definii expresia, sub forma: for k=k_init : pas : k_final

• bucla se execută de 1pas

k_initk_final+

−=n ori, dacă n este pozitiv

şi nu se execută dacă n este negativ. Am notat prin [] valoarea întreagă a numărului.

De exemplu, instrucţiunea, for k=3:5:95

se execută de 918111

395=+=+

−=n ori. Prin aceasta, valorile lui k sunt : 3, 14,

25, 36, 47, 58, 69, 80, 91. Bucla nu se va executa pentru valori mai mari decât 95. Ca exemplu de aplicare a instrucţiunii for, considerăm generarea matricei

Hilbert de ordinul 4, ale cărei elemente sunt date de expresia1ji

1j)H(i,

++

= .

Secvenţa Matlab este: n=4; for i=1:n; for j=1:n; H(i,j)=1/(i+j+1); end end

care conduce la, H = 0.3333 0.2500 0.2000 0.1667 0.2500 0.2000 0.1667 0.1429 0.2000 0.1667 0.1429 0.1250 0.1667 0.1429 0.1250 0.1111

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 80

Instrucţiunea while este o structură care se utilizează pentru reperatea unui set de instrucţiuni, atâta timp cât o condiţie specificată este adevărată. Formatul general al acestei instrucţiuni de control este:

while expresie grup de instrucţiuni end Grupul de instrucţiuni se execută cât timp „expresie” are toate elementele

nenule, iar „expresie” are de obicei forma: expresie_1 condiţie expresie_2,

unde “condiţie” este unul dintre operatorii relaţionali: ==, <, >, <=, >=, or ~=. Când condiţia este verificată (expresia este adevărată logic), se execută

grupul de instrucţiuni. După ce se execută grupul de instrucţiuni, condiţia este retestată. Când condiţia este din nou adevărată, grupul de instrucţiuni se execută iar. Când condiţia este falsă, se trece la următoarea instrucţiune după instrucţiunea end. Dacă expresia este totdeauna adevărată logic (valoarea acesteia este diferită de zero), bucla devine infinită; dintr-o buclă infinită se iese forţat, prin apăsarea concomitentă a tastelor [ Ctrl]+[C].

De exemplu, dacă A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16], atunci secvenţa Matlab:

E = 0*A; F = E + eye(size(E)); N = 1; while norm(E+F-E,1) > 0, E = E + F; F = A*F/N; N = N + 1; end conduce la: N = 98 F = 0.0111 0.0125 0.0140 0.0155 0.0256 0.0289 0.0323 0.0357 0.0401 0.0454 0.0507 0.0560 0.0546 0.0618 0.0690 0.0762 E = 1.0e+015 * 0.3523 0.3990 0.4456 0.4923 0.8140 0.9218 1.0296 1.1374 1.2757 1.4447 1.6136 1.7825 1.7375 1.9675 2.1976 2.4276.

Instrucţiunea „break”

Instrucţiunea break se utilizează pentru a ieşi dintr-o buclă, înainte ca aceasta să se fi terminat. Se recomandă a fi utilizată dacă o condiţie de eroare este detectată în interiorul buclei. Instrucţiunea break încetează execuţia ciclurilor for şi while.

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 81

În cazul unor cicluri intercalate, break comandă ieşirea din ciclul cel mai interior. Se apelează cu sintaxa:

break Pentru exemplificare, considerăm secvenţa: for i=1:10 a(i)=i*10 break b(i)=a(i)+5 end

care calculează numai a(1), rezultând: a = 10

Instrucţiunea „continue”

Instrucţiunea continue transferă controlul la următoarea iteraţie din bucla for sau while în care apare, sărind celelalte instrucţiuni rămase între aceasta şi end. Este utilă pentru cazul unor bucle mari, când trebuie sărite anumite instrucţiuni.

Pentru a exemplifica modul de lucru, se dau două secvenţe scurte: • fără instrucţiunea continue:

for i=1:10 a(i)=i*10 b(i)=a(i)+5 end

când se calculează, a = 10 20 30 40 50 60 70 80 90 100 b = 15 25 35 45 55 65 75 85 95 105

• cu instrucţiunea continue : for i=1:10 a(i)=i*10 continue b(i)=a(i)+5 end

când se calculează numai a, nu şi b.

Blocuri de instrucţiuni

Blocul switch, funcţie de valoarea expresiei switch_expr, permite transferul execuţiei unei anumite secvenţe din cadrul unui bloc ce se găseşte între două expresii: case case_expr, case {case_expr1, case_expr2, case_expr3,...}, sau otherwise. Forma generală a instrucţiunii switch este:

switch switch_expr

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 82

case case_expr, statement, ..., statement case {case_expr1, case_expr2, case_expr3,...} statement, ..., statement ... otherwise statement, ..., statement end

Dacă case este de forma case {case_expr1, case_expr2, case_expr3,...}, atunci trebuie să fie adevărată cel puţin una dintre case_expr1, case_expr2, case_expr3,.… Dacă nici una dintre case_expr nu este adevărată, se execută secvenţa dintre otherwise şi end, dacă această secvenţă există. Nu se execută decât o secvenţă valabilă şi apoi se iese din bloc.

De menţionat că, switch_expr poate fi scalar sau caracter (string). Dacă este scalar, atunci se transferă controlul secvenţei pentru care case_expr= switch_expr. Dacă switch_expr este de tip caracter, se execută setul de instrucţiuni care încep cu case, pentru care instructiunea strcmp(switch_expr,case_expr) are valoarea 1.

Instrucţiunea strcmp(S1,S2) compară semnele S1 şi S2 şi, dacă sunt la fel, returnează 1 şi 0, dacă sunt diferite. Dacă S1 şi S2 sunt matrice celule de semne, acestea trebuie să aibă aceeaşi dimensiune, iar comparaţia se face pentru fiecare celulă în parte. Semnele S1 şi S2 sunt din setul de caractere internaţionale.

Considerând că METHOD este o variabilă de tip caracter, un exemplu de aplicare a blocului switch este:

switch lower(METHOD) case {'linear','bilinear'} disp('Method is linear') case 'cubic' disp('Method is cubic') case 'nearest' disp('Method is nearest') otherwise disp('Unknown method.') end

Un alt bloc de instrucţiuni este blocul try-catch. Blocul try are forma generală:

try

statement; ..., statement; catch statement; ...; statement; end

În mod normal, se execută numai seturile de instrucţiuni dintre try şi catch.

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 83

Dacă se întâlneşte o eroare până la instrucţiunea catch, atunci aceasta este captată în lasterr şi se va executa setul de instrucţiuni dintre catch şi end. Dacă şi în această secvenţă se întâlneşte o eroare, execuţia se opreşte şi eroarea este memorată în lasterr. Controlul execuţiei se transferă unui alt eventual bloc try-catch.

Instrucţiunea lasterr memorează ultima eroare întâlnită în execuţia Matlab. Chemată simplu lasterr, ea returnează ultima eroare întâlnită. Chemată lasterr(''), resetează matricea erorilor, pregătind-o pentru următoarea secvenţă de rulare.

Instrucţiunea „return”

Instrucţiunea return comandă o ieşire normală din fişierul de tip M (nume_fişier*m) către funcţia care l-a apelat sau către tastatură. Se apelează cu sintaxa:

return Un exemplu de aplicare este: function d = det(A) if isempty(A) d = 1; return else ... end

5.2. Instrucţiuni pentru evaluare şi execuţie

Funcţia eval execută o expresie Matlab dată sub formă de caractere, s, putând fi apelată sub forma eval(s). De exemplu, apelată sub forma,

eval('sin(pi/3)') evaluează sin(pi/3) şi returnează rezultatul

ans = 0.8660 Dacă expresia Matlab lucrează cu matrice, atunci evaluarea se face pentru

orice element al matricei, ca de exemplu: x=[1 2 3 4 5] ; eval('x.^2+x+2'), care dă rezultatul, ans = 4 8 14 22 32 Un alt exemplu este selectarea programului de executat, funcţie de numărul

introdus de la tastatură: D = ['odedemo ' 'quaddemo' 'fitdemo ']; n = input('Select a demo number: '); eval(D(n,:))

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 84

Funcţia evalc este asemănătoare cu eval, cu deosebirea că expresia s, sub formă de caractere, este preluată printr-o comandă window şi este returnată într-o matrice de ieşire, T, având liniile separate. Apelarea se face cu sintaxa T=evalc(s). Apelarea se face asemănător cu eval.

De notat că la apelarea lui evalc sunt inactive comenzile diary, more şi input.

Funcţia feval execută o anumită funcţie, specificată sub formă de caractere şi returnează mărimile de ieşire. Structura generală este de forma:

[y1,..,yn] = feval(F,x1,...,xn) în care x1,...,xn sunt argumentele de intrare pentru funcţia F, dată sub formă de character, iar y1,..,yn sunt argumentele de ieşire ale funcţiei F.

Un exemplu de mod de apelare este: [hm,hv,hmol]=feval('Haert',35)

care are acelaşi rezultat, hm = 309.5269 hv = 400.0208 hmol = 8.9661e+003

ca şi [hm,hv,hmol]=Haert(35).

Funcţia evalin evaluează o expresie din spaţiul de lucru, fiind apelată cu sintaxa [X,Y,Z,...] = evalin(WS,'expression'), în care WS este spaţiul de lucru pe care se găseşte 'expression'. Spaţiul de lucru WS poate fi 'caller' sau 'base'. Este similară cu eval, cu excepţia faptului că se menţine controlul spaţiului de lucru de pe care se evaluează expresia.

Un exemplu de apelare este [hm,hv,hmol]=evalin('caller','Haert(35)'), care calculează aceleaşi mărimi ca şi anterior.

Funcţia builtin evaluează numai funcţiile interne ale Matlab, fiind pentru

acestea asemănătoare cu feval. Sintaxa de apelare este: [y1,..,yn] = builtin(F,x1,...,xn)

în care x1,...,xn sunt argumentele de intrare pentru funcţia F, dată sub formă de caractere, iar y1,..,yn sunt argumentele de ieşire ale funcţiei F.

De exemplu, builtin('sin',pi/3)

conduce la: ans = 0.8660, la fel ca şi feval('sin',pi/3).

Funcţia assignin(WS, ‚name’,V) atribuie variabilei „name” o valoare „V” în

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 85

spaţiul de lucru „WS”, care poate fi 'caller' sau 'base'. De exenplu, prin: assignin('caller','b',15)

variabila b primeşte valoarea, b = 15 Funcţia run execută în mod normal un program Matlab, fără să fie explicit

chemată sub forma run nume_fişier, ci numai prin tastarea numelui fişierului şi apăsarea tastei „Enter”. Pentru a se putea rula programul, acesta trebuie să se găsească în calea de lucru Matlab, fapt ce se poate obţine, fie prin utilizarea instrucţiunii addpath, care adaugă directorul în calea de lucru, fie prin utilizarea comenzii”cd” care schimbă directorul de lucru, acolo unde este nume_fişier.

5.3. Funcţii şi variabile specifice

Un fişier script este un fişier extern, având extensia „m”, care conţine o secvenţă de comenzi Matlab, ca de exemplu nume_fişier.m. Din această cauză, mai sunt denumite fişiere de tip M. Prin apelarea numelui fişierului, se execută secveţa Matlab conţinută în acesta. După execuţia completă a unui fişier script, variabilele cu care acesta a operat rămân în zona de memorie a aplicaţiei. Aceste fişiere nu permit integrarea în programe mari, realizate pe principiul modularizării. Fişierele script sunt folosite pentru rezolvarea unor probleme care cer comenzi succesive atât de lungi, încât ar putea deveni greoaie pentru lucrul în mod interactiv, adică în modul linie de comandă.

Un exemplu de program script este cel pentru calculul randamentului pompei de alimentare, care vehiculează un debit de apă:

d= 120; x=d.*3.6; c=[-2.394344424806420e-013 1.204969248337818e-009 ... -2.493067720884727e-006 2.359430867915677e-003 ... -1.006032839331329e-002]; eta=c(1).*x.^4+c(2).*x.^3+c(3).*x.^2+c(4).*x+c(5); end

în care: c – constantele curbei debitului, d [kg/s] este debitul de apă vehiculat de pompa de alimentare, iar eta randamentul pompei, care depinde de debit.

Fişierele funcţie sunt un tip special de fişiere M, care conţin în prima linie

cuvântul „function”, prin care fişierul respectiv este declarat ca fişier funcţie. O „funcţie” diferă de un „script” prin faptul că poate lucra cu argumente (de intrare şi/sau ieşire). Variabilele definite şi manipulate în interiorul unui fişier funcţie sunt localizate la nivelul acestuia. Prin urmare, la terminarea execuţiei unei funcţii, în memoria calculatorului nu rămân decât variabilele de ieşire ale acesteia.

Fişierele funcţie sunt utilizate pentru extinderea Matlab-ului, adică pentru

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 86

crearea unor noi funcţii Matlab. Forma generală a primei linii a unui fişier funţie este:

function [param_ieşire]=nume_funcţie(param_intrare) unde:

function – cuvântul cheie obligatoriu care declară fişierul de tip funcţie; param_iesire – parametrii de ieşire care trebuie separaţi prin virgulă şi cuprinşi între paranteze drepte, iar dacă funcţia nu are parametrii de ieşire atunci parantezele drepte şi semnul egal nu mai au sens; nume_funcţie – numele functiei, adica numele sub care se salvează fişierul, iar acesta nu trebuie să fie identic cu al unei funcţii Matlab existente; param_intrare – parametrii de intrare care trebuie separaţi prin virgulă şi închişi între paranteze rotunde, iar dacă funcţia nu are parametrii de intrare aceste paranteze nu mai au sens.

Aceste fişiere pot fi adăugate ca funcţii noi în structura Matlab. Comenzile şi funcţiile care sunt utilizate de noua funcţie sunt înregistrate într-un fişier cu extensia „*.m”. Prima linie a fişierului trebuie să conţină definiţia sintactică a noii funcţii. De exemplu, fişierul de mai sus, care calculează randamentul pompei de alimentare funcţie de debit, se poate numi „etapa.m”, fiind de forma:

function eta=etapa(d) % function eta=etapa(d) % d [ kg/s ] - debit apa vehiculat de Pompa de alimentare PA % eta [ - ] - randament Pompa de Alimentare PA x=d.*3.6; c=[-2.394344424806420e-013 1.204969248337818e-009 ... -2.493067720884727e-006 2.359430867915677e-003 ... -1.006032839331329e-002]; eta=c(1).*x.^4+c(2).*x.^3+c(3).*x.^2+c(4).*x+c(5); end

Din exemplele anteriore, se observă şi diferenţa dintre un fişier funcţie şi un fişier script.

Dacă considerăm funcţia existentă, stat.m, care calculează deviaţia statistică, function [mean,stdev] = stat(x) %STAT Interesting statistics. n = length(x); mean = sum(x) / n; stdev = sqrt(sum((x - mean).^2)/n);

putem defini o nouă funcţie avg.m, care calculează media, function mean = avg(x,n) %MEAN subfunction mean = sum(x)/n;

ce poate fi chemată în stat.m, aceasta devenind:

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 87

function [mean,stdev] = stat(x) %STAT Interesting statistics. n = length(x); mean = avg(x,n); stdev = sqrt(sum((x-avg(x,n)).^2)/n); Prin urmare, o funcţie poate fi chemată în interiorul altei funcţii, ceea ce

permite o mare flexibilitate în rezolvarea unor probleme complexe. Definirea unei variabile globale se face prin instrucţiunea global, care are

următoarea sintaxă: global X Y Z,

în care variabilele Z, Y şi Z sunt definite global. În mod normal, fiecare funcţie Matlab, definită printr-un fişier de tip „m”, are

variabile locale, care nu pot fi utilizate în alte funcţii şi care nu apar în spaţiul de lucru. Pentru ca mai multe funcţii să lucreze cu aceeaşi valoare a unei variabile, calculată într-o funcţie sau din spaţiul de lucru, aceasta este declarată de tip global.

Dacă la momentul declarării variabilei, aceasta nu are alocată o valoare,

atunci se iniţializează pentru ea o matrice goală, în care urmează a se introduce valoarea calculată la momentul apelării funcţiei, în care i se alocă o valoare. Fără a fi strict necesar, variabilele globale sunt de regulă definite cu litere mari.

Verificarea faptului dacă o variabilă este de tip global se face prin

instrucţiunea isglobal, care are următoarea sintaxă: isglobal(A)

care returnează 1, dacă A este declarată de tip global şi 0, altfel.

În mod normal, după chemarea unei funcţii, variabilele locale sunt şterse din memorie. Prin comanda persistent X Y Z, se reţin în memorie variabilele locale X, Y şi Z dintr-o funcţie oarecare, după ce aceasta a fost chemată. Variabilele persistente sunt similare cu variabilele locale, cu deosebirea că acestea pot fi create şi schimbate numai în funcţia în care au fost definite, prevenindu-se modificarea lor în alte funcţii Matlab, unde pot avea acelaşi nume (X, Y, Z). Numele variabilelei persistente nu trebuie să fie acelaşi cu al unei variabile din spaţiul de lucru.

Variabilele persistente sunt şterse din memorie, când fişierul de tip „m” este modificat sau prin comanda mlock.

Comanda mlock previne ştergerea fişierului de tip „m” din memorie, printr-o comandă clear.

Comanda mfilename, dă numele fişierului de tip „m” executat în momentul respectiv. Când comanda este executată într-un fişier, atunci la execuţia acestuia,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 88

prima dată se dă şi numele fişierului de tip „m”, sub care este salvată funcţia. De exemplu, funcţia car, dă căldurile specifice ale CaO solid, function [cp,cpm]=cpcao(t) % function [cp,cpm]=cpcao(t) % Căldurile specifice masice şi molare reale, a CaO solid % funcţie de temperatură, după Hayhurst % cp [ kJ/(kg.K) ] - căldura specifică masică reală la p=const. % cpm [kJ/(kmol.K)] - căldura specifică molară reală la p=const. % t [ grd. C ] - temperatura > 298 K si < 3020 K % Mmol [ kg/kmol ] - masa molară CaO solid. Mmol=56.8; tk=t+273.15; a=48.86; b=4.52e-3; c=-6.53e+5; cpm=a+b.*tk+c./tk.^2; cp=cpm./Mmol; format mfilename

apelată cu comanda, [cp,cpm]=cpcao(50)

conduce la, ans = cpcao cp = 0.7758 cpm = 44.0674

Dacă schimbăm numele fişierului „m” din cpcao.m în ,de exemplu, cap.m, atunci putem apela funcţia de mai sus cu,

cp,cpm]=cap(50) care va avea ca rezultat:

ans = cap cp = 0.7758 cpm = 44.0674

Când comada mfilename este apelată singură, ca de exemplu, mfilename

atunci va returna o matrice goală, ans = []

Crearea unei liste de variabile, lists, separate prin virgulă, dintr-o matrice de tip celulă sau structurarea unei liste se poate face:

• prin comanda C{:} sau S.name ; • cu paranteze, în partea de chemare a funcţiei : myfun(x,y,C{:}) sau

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 89

myfun(x,y,S.name) ; • cu paranteze drepte, în partea de ieşire, care produce o cocatenare

orizontală : [C{:}] sau [S.name] • cu paranteze drepte [C{:}] = myfun sau [S.name] = myfun ; • cu acolade în partea de construcţie a celulei : {C{:}} sau {S.name}

În toate cazurile de mai sus, C{:} este la fel ca şi C{1},C{2},...,C{end}, iar S.name este la fel ca şi S(1).name,S(2).name,...,S(end).name. Dacă C sau S sunt o matrice de 1-pe-1, atunci se produce sau extrage un singur element, iar pentru mai multe elemente se utilizează „:” , ca de exemplu C{1:5} sau S(2:3).name.

De exemplu: C = {1 2 3 4} A = [C{:}] B = cat(2,C{:}) [S(1,3,:).FIELD] = magic(4)

conduce la: C = [1] [2] [3] [4] A = 1 2 3 4 B = 1 2 3 4 S = 1x3 struct array with fields: FIELD

iar S.FIELD este, ans = [] ans = [] ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

Verificarea existenţei unei variabile sau funcţii se execută prin comanda exist, având structura,

exist('A') la care se returnează :

• 0 ,dacă A nu există ; • 1, dacă A este o variabilă din spaţiul de lucru ; • 2, dacă A este un fişier de tip “m” în directorul căutat sau A este numele

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 90

directorului ; • 3, dacă A este un fişier de tip “mex” în directorul în care se caută ; • 4, dacă A este un fişier de tip “mdl” în directorul în care se caută ; • 5, dacă A este o funcţie internă a Matlab ; • 6, dacă A este un fişier de tip “p” în directorul în care se caută ; • 7, dacă A este un director ; • 8 ,dacă A este din clasa Java.

Instrucţiunea exist('A') sau exist('A.ext') returnează 2, dacă numele 'A' sau 'A.ext' şi extensia este P sau MEX.

Prin exist('a', 'var'), caută numai variabila a în fişierul în care este comanda sau în spaţiul de lucru.

Instrucţiunea exist('A',’builtin’) caută numai funcţiile interne, iar cu exist('A', 'file') se caută numai fişiere sau directoare.

Prin exist('A', 'dir') se caută numai existenţa directoarelor, iar cu exist('A',

'class') se verifică existenţa fişierelor de tip Java. Atunci cănd rezultatul căutării este nul, se returnează 0.

Prin instrucţiunea munlock('fun') se şterge din memorie fişierul fun, de tip „m”, având ca efect similar cu cel al comenzii clear, fără însă a-l şterge permanent.

Comanda mislocked('fun') returnează 1, dacă numele 'fun' este în memorie şi 0, altfel.

Operatorii precedenţi versiunii rulate momentan sunt identificaţi cu comanda precedente, care, de regulă, se referă numai la operatorii interni (built-in). Operatorii interni, ordonaţi după „tărie”, în ordinea, de la cel mai „puternic” (highest) spre cel mai „slab” (lowest), sunt:

1. transpunerea (.'), putere (.^), conjugatul complex, transpusa ('), matrice la putere (^);

2. adunare matrice (+), scădere matrice (-), negaţie logică (~);

3. multiplicare (.*), împărţire la dreapta (./), împărţire la stânga (.\), multiplicare matrice (*), împârţire la dreapta matrice (/), împărţire la stânga matrice (\);

4. adunare (+), scădere (-);

5. operatorul a două puncte sau colon (:);

6. mai mic (<), mai mic sau egal (<=), mai mare (>), mai mare sau egal, cu (>=), egal (==), nu este egal (~=);

7. operatorul logic „şi” - and (&);

8. operatorul logic „sau” - or (|)

Pentru a vedea dacă numele unei variabile este valid în Matlab, se utilizează

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 91

instrucţiunea, Isvarname(S)

unde S, este numele variabilei. De menţionat că numele unei variabile Matlab trebuie sa înceapă cu o literă şi poate avea până la 31 de semne diferite (litere şi/sau numele), separate cel mult prin liniuţă jos (underscore).

5.4. Argumente de intrare

Verificarea dacă numărul argumentelor de intrare ale unei funcţii este corect ales la apelare, se face cu instrucţiunea:

MSG = nargchk(low,high,N), care returnează un mesaj de eroare, dacă N-, numărul de argumente de intrare nu este cuprins între low şi high. Dacă numărul de argumente se încadrează în domeniul respectiv, se returnează o matrice vidă.

Pentru testarea numărului argumentelor de intrare, ce trebuie introduse pentru apelarea unei funcţii, este disponibilă variabila permanentă nargin, care se apelează cu sintaxa:

nargin(‚fun’), unde fun, este numele funcţiei căreia i se caută numărul de argumente. Se returneză numărul variabilelor de intrare, iar dacă funcţia nu are intrări, se returnează un număr negativ.

Pentru hfpt(p,t), având 2 argumente, se obţine: nargin('tfph') ans = 2

Pentru testarea numărului argumentelor de ieşire, ce pot fi introduse pentru apelarea unei funcţii, este disponibilă variabila permanentă nargout, care se apelează cu sintaxa:

nargout(‚fun’), unde fun, este numele funcţiei căreia i se caută numărul de argumente de ieşire. Se returneză numărul variabilelor de ieşire, iar dacă funcţia nu are ieşiri, se returnează un număr negativ.

Pentru hfpt(p,t), având un argument, se obţine: nargout('tfph') ans = 1. Lista variabilelor de intrare este dată prin variabila varargin, care poate

avea orice număr de argumente de intrare ale funcţiei. Variabila varargin este o matrice, ce conţine argumentele opţionale ale funcţiei. Ea trebuie declarată ultim argument de intrare (scrisă numai cu litere mici) şi colectează toate argumentele de intrare,

function myplot(x,varargin)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 92

plot(x,varargin{:}) La apelarea prin comanda, myplot(sin(0:.1:1),'color',[.5 .7 .3],'linestyle',':')

rezultă o matrice de 1 x 4 care conţine valorile: 'color', [.5 .7 .3], 'linestyle', and ':'. Lista variabilelor de ieşire este dată prin variabila varargout, care poate

avea orice număr de argumente de ieşire ale funcţiei. Variabila varargout este o matrice ce conţine argumentele opţionale ale funcţiei. Ea trebuie declarată ultim argument de ieşire (scrisă numai cu litere mici) şi colectează toate argumentele de ieşire. De exemplu, funcţia,

function [s,varargout] = mysize(x) nout = max(nargout,1)-1; s = size(x); for i=1:nout, varargout(i) = {s(i)}; end

returnează dimensiunea vectorului argumentelor, respectiv: [s,rows,cols] = mysize(rand(4,5));

returnează, s = [4 5], rows = 4, cols = 5.

Numele argumentului (variabilei) de intrare este memorat în variabila inpuitname. Dacă considerăm funcţia,

function y = myfun(a,b) disp(sprintf('My first input is "%s".' ,inputname(1))) disp(sprintf('My second input is "%s".',inputname(2))) y = a+b; then x = 5; myfun(x,5)

aceasta produce, My first input is "x". My second input is "". Dacă nu există nici un nume al variabilei de intrare, ca la apelările: a(1), varargin{:}, eval(expr) etc.,

atunci se returnează o matrice goală.

5.5. Mesaje pe display

Afişarea unor mesaje, la întâlnirea unei erori, se face prin instrucţiunea error, care se apelează cu sintaxa: error( 'MSG').

După afişarea textului 'MSG', controlul este redat tastaturii. Cele mai frecvente mesaje sunt: <component>[:<component>]:<mnemonic>, unde <component> şi <mnemonic> sunt alfanumerice.

De exemplu, pentru a verifica că o funcţie (aici numită test) este apelată corect, ca număr de argumente de intrare (aici 2), se procedează astfel:

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 93

function test(x,y) if nargin ~=2 error('Numărul argumentelor de intrare greşit')

end. Afişarea unui mesaj de avertizare, care nu întrerupe execuţia programului,

se face cu instrucţiunea warning('MSG'), care permite afişarea pe ecran a mesajului de avertizare MSG, care poate fi 'MATLAB:divideByZero'.

Prin comanda warning off se suprimă afişarea oricărui mesaj, iar prin comanda warning on, se afişează toate mesajele de avertizare. Comanda warning

backtrace este la fel ca şi comanda warning on, cu deosebirea că fişierul numerotează liniile de mesaje de avertizare. Prin instrucţiunea warning debug se porneşte depanatorul şi are ca efect stoparea programului, ca şi instrucţiunea dbstop if warning, oprind rularea la întâlnirea unei erori.

Prin comanda warning once, se prezintă pe ecran orice informaţie referitoare la graficele din sesiunea de lucru. Prin comanda warning always, se dau mesaje privind compatibilitatea graficelor executate. La executarea comenzii warning debug, se activează debuger-ul, similar ca şi la comanda dbstop if

warning. Pentru setarea argumentului de stare, ARG, la una din stările on, off,

backtrace sau debug şi reîntoarcerea stării în mărimea de ieşire, S, se utilizează comanda,

S=warning(ARG), iar pentru a marca mesajul de atenţionare cel mai frecvent, se utilizează comanda,

[S,F]= warning(ARG), unde ,în F, este reţinut mesajul cel mai frecvent.

Afişarea pe ecran a ultimului mesaj de eroare întâlnit se face prin comanda lasterr. Dacă nu a fost întâlnită nici o eroare, se afişează o matrice vidă,

ans = ''

iar la intâlnirea unei erori, de exemplu mărimea c este nedefintă, se afişează: ans = Undefined function or variable 'c'. Pentru afişarea pe ecran a ultimului mesaj de avertizare, se utilizează

comanda lastwarn, care returnează o matrice vidă, dacă nu s-a întâlnit nici un mesaj de avertizare,

ans = ''

sau conţinând mesajul de averizare, Warning: File:C:\MATLABR12\work\bunem\CPCAO.M Line: 13 Column: 1 Unmatched "end". Afişarea pe ecran a unei informaţii conţinute într-o matrice X, se face cu

comanda disp('X'), astfel : disp(' Presiunea absolută a aburului viu, pab [ bar ]')

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 94

care are ca efect afişarea pe ecran : Presiunea absolută a aburului viu, pab [ bar ] Pentru a afişa pe ecran o matrice, se utilizează comanda display. Pentru

obiectul X, funcţia este chemată cu display, apelează funcţia disp, ca în exemplu, X = inline('sin(x)')

pentru care se obţine, X = Inline function: X(x) = sin(x) În mod normal, funcţia display(X) apelează funcţia disp, în cadrul unor

bucle, precum, function display(X) if isequal(get(0,'FormatSpacing'),'compact') disp([inputname(1) ' =']); disp(X) else disp(' ') disp([inputname(1) ' =']); disp(' '); disp(X) end Scrierea datelor în format se face cu instrucţiunea fprintf, care are structura, COUNT = printf(FID,FORMAT,A,...)

unde: COUNT este numărul de biţi scrişi succesiv, care de cele mai multe ori lipseşte; FID este un un număr întreg, asociat pentru identificarea fişierului în care se scrie, care poate fi ieşirea standard, respectiv ecranul, când FID=1 sau este omis, sau 2 pentru erorile standard; FORMAT, este formatul de scriere ; A, este matricea care trebuie scrisă.

Identificatorul FID al fişierului ,se obţine prin funcţia fopen. Formatul de scriere este un caracter specific limbajului C, precedat de

caracterul ”%”, ce arată începutul conversiei specificate, astfel încât, să poată fi scrise datele din matricea A. Principalele formate de scriere sunt d, i, o, u, x, X, f,

e, E, g, G, c şi s. Conversia datelor controlează notaţia, alinierea, semnele (digiţi)

semnificative, mărimea câmpului şi alte aspecte ale formatului de scriere. Acest format poate conţine şi caractere speciale neprintabile, precum \n,\r,\t,\b,\f, \\, care produc o linie nouă, reîntoarcerea cursorului la cap de rând (carriage return), tab orizontal, backspace, formă liberă şi beckslash.

Prin urmare, conversia începe întotdeauna cu caracterul „%” şi conţine

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 95

următoarele elemente opţionale sau obligatorii, • semne, opţionale, care controlează alinierea, respectiv :

• caracterul “-”, care poziţionează datele la stânga şi justificat, iar dacă lipseşte poziţionarea, se face la dreapta;

• caracterul “+”, care scrie întotdeauna semnul datei (plus,+, sau minus,-); • caracterul “0”, care scrie în spaţiile libere zero (0);

• mărimea şi precizia câmpului,opţional, precum : • mărimea câmpului în digiţi, ca de exemplu 6 (prin %6f); • precizia, prin precizarea numărului de digiţi aflaţi după punctual

zecimal, ca de exemplu 3 (prin %6.3f); • formatul de conversie obligatoriu, care poate fi :

• semnul “c”, pentru un singur caracter; • semnul “d”, pentru notaţia zecimală; • semnul “e”, pentru scrierea sub forma lui exponenţială, cu litera e mică; • semnul “E”, pentru scrierea sub formă exponenţială, cu litera E mare; • semnul “f”, pentru notaţia cu punct zecimal sau virgulă fixă; • semnul “g”, o formă mai compactă decât formatele “e” sau “f”,

nescriind zerourile nesemnificative; • semnul “G”, asemănător cu “g”, dar utilizând notaţia G; • semnul “o”, pentru date în baza opt (octagonală); • semnul “s” pentru caractere; • semnul “u”, pentru date în baza decimală; • semnul “x”, pentru date hexazecimale, utilizând litere a-f; • semnul “X”, pentru date hexazecimale, utilizând litere A-F;

• subtipul de format de scriere, opţional, utilizat în special pentru date în dublă precizie şi baza octogonală, zecimală sau hexagonală, ca de exemplu, punând caracterul “b”, înaintea caracterului “x” ('%bx').

Formatul fprintf este vectorizat pentru cazul în care datele nu sunt scalare, fiind repetat de câte ori e necesar.

De exemplu, setul de instrucţiuni, x = 0:.1:1; y = [x; exp(x)]; fid = fopen('exp.txt','w'); fprintf(fid,'%6.2f 12.8f\n',y); fclose(fid);

create de fişierul text, numit exp.txt, conţinând un scurt tabel al funcţiei exponenţiale,

0.00 1.00000000 0.10 1.10517092 0.20 1.22140276 0.30 1.34985881 0.40 1.49182470 0.50 1.64872127 0.60 1.82211880

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 96

0.70 2.01375271 0.80 2.22554093 0.90 2.45960311 1.00 2.71828183

Comanda, fprintf('A unit circle has circumference %g.\n',2*pi)

afişează pe ecran, A unit circle has circumference 6.28319.

Pentru a introduce un apostrof, ca semn între caractere, se utilizează de două ori apostroful, ca, de exemplu, fprintf(1,'It’s Friday.\n'), care scrie It's Friday.

Prin setul de comenzi: B = [8.8 7.7; 8800 7700]; fprintf(1,'X este %4.2f metri sau %8.3f mm\n',9.9,9900,B); se obţine, X este 9.90 metri sau 9900.000 mm X este 8.80 metri sau 8800.000 mm X este 7.70 metri sau 7700.000 mm.

Conversia unor date ,în 32 biţi, în date hexazecimale, se face astfel: a = [6 10 14 44]; fprintf('%9X\n',a + (a<0)2^32)

rezultând, 6 A E 2C.

Scrierea datelor formatate dintr-o matrice A, în variabila Matlab S, utilizând un anume FORMAT, ca cel specificat anterior, se realizează cu funcţia sprintf apelată,

[S,ERRMSG] = sprintf(FORMAT,A,...) în care, ERRMSG este un mesaj de eroare, întâlnit la conversie sau dacă matricea A e vidă.

Funcţia sprintf este asemănătoare funcţiei fprintf, cu deosebirea că

returnează datele în format Matlab. De exemplu, sprintf('%0.5g',(1+sqrt(5))/2) conduce la 1.618 sprintf('%0.5g',1/eps) conduce la 4.5036e+15 sprintf('%15.5f',1/eps) conduce la 4503599627370496.00000 sprintf('%d',round(pi)) conduce la 3 sprintf('%s','hello') conduce la hello sprintf('The array is %dx%d.',2,3) conduce la The array is 2x3. sprintf('\n') este linie de terminare a caracterelor.

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 97

5.6. Intrări (inputuri) interactive

Introducerea datelor de la tastatură se realizează prin instrucţiunea input, care dă comanda utilizatorului, ca de exemplu:

n=input('introduceţi numărul proiectului, n= ') care conduce la afişarea pe ecran a mesajului, introduceţi numărul proiectului, n= după care, Matlab aşteaptă introducerea numărului n, iar dacă se introduce 1 şi se execută “Enter”, atunci se răspunde prin, n=1.

Prin comanda input, se poate aloca o anumită valoare, introdusă de la tastatură, unei variabile, aici sim, prin comanda: sim=input('puterea transformatorului este:').

Pentru valori alfanumerice, variabile de tip caracter, comanda este de forma: input('Comentariu ','s'). Semnul „s” poate conţine unul sau mai multe semne '\n', ceea ce indică saltul la următoarea linie.

Chemarea tastaturii într-un fişier de tip M, se realizează prin comanda keyboard, care trece controlul acesteia, iar revenirea la programul respectriv se face după introducerea datei cerute (sau nu), dar oligatoriu prin executarea comenzii RETURN. Funcţia este utilă în depanarea unor programe.

Funcţia pause conduce la aşteptarea unui răspuns din partea utilizatorului. Apelată sub forma pause(n), se face o pauză de n secunde (poate fi şi număr fracţional de forma lui k*0.01), până la următoarea instrucţiune.

Comanda pause off dezactivează orice altă comandă pause sau pause(n), până la întâlnirea, eventuală, a comenzii pause on.

Crearea meniurilor pentru interfeţe grafice se realizează cu funcţia uimenu, iar crearea elementelor de control pentru interfeţe grafice se execută prin comanda uicontrol. O explicitare a acestor comenzi este redată în capitolul de grafică.

5.7. Tipuri de date

5.7.1. Conversii de date

Setarea indicatorului şir de caractere se obţine cu funcţia setstr, care returnează caracterul corespunzător lui n din setstr(n), n fiind in intervalul 32÷127, pentru precizie simplă şi 0÷255, pentru precizie dublă.

Detectarea şirurilor de caractere se realizează cu funcţia isstr, care lucrează logic.

Formarea matricei şir de caractere, din şiruri individuale, se execută cu funcţia str2mat, apelată cu sintaxa

S=str2mat(s1,s2,...)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 98

rezultând numărul de linii ale matricei S, egal cu numărul şirurilor individuale, s1,s2,..., iar numărul de coloane este egal cu dimensiunea celui mai mare şir component.

Introducerea unui număr de spaţii, n, se realizează cu funcţia blanks(n), iar eliminarea spaţiilor goale din şirul S, cu funcţia deblank(S).

Crearea unui şir de caractere se realizează prin instrucţiunea char, care se poate apela:

• S = char(X), transformă şirul X, ce conţine elemente întregi, pozitive, într-un şir de caractere, în intervalul 0-65535, iar prin double, transformăm şirul de caractere în numeric ;

• S = char(C), unde C, este o parte a şirului; plasează fiecare element al lui C, într-o coloană a şirului de caractere S, iar pentru a transforma înapoi, se utilizează cellstr ;

• S = char(t1,t2,t3,..), formează caracterele şirului S, ce conţine textele t1,t2,t3,…pe coloană, iar fiecare parametru al textului, ti, poate fi însăşi un şir de caractere.

Pentru a afişa pe monitor şirul de caractere ASCII, de la 3 la 32, se utilizează comanda,

ascii = char(reshape(32:127,32,3)'), rezultând,

ascii = ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ' a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ Conversia literelor mici dintr-un şir de caractere, s, în litere mari, S, se

realizează cu S=upper(s). Conversia literelor mari dintr-un şir, S, în litere mici, s, se execută cu

s=lower(S). Verificarea dacă, într-un şir de caractere, S, sunt literele alfabetului, se face

cu F=isletter(S), care lucrează logic, întorcând 1, pentru adevărat şi 0, pentru fals. Compararea a două şiruri de caractere se realizează cu funcţia strcmp,

apelată, F=strcmp(S1,S2)

care compară şirul S1 cu şirul S2 şi returnează F=1, dacă este adevărat şi F=0, dacă este fals. Funcţia lucrează în modul senzitiv, incluzând în comparaţie, spaţiile dintre caractere şi tipul caracterelor, mari sau mici, folosite la scriere.

Căutarea unui şir de caractere, S2, într-un alt şir de caractere, S1, se realizează cu,

M=findstr(S1,S2) rezultând poziţia M, de la care începe şirul S2 în şirul S1.

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 99

Conversia unui număr, X, într-un şir de caractere, S, se obţine cu S=num2str(X), iar funcţia inversă este X=str2num(S).

Conversia unui întreg, I, într-un şir de caractere, S, se realizează prin S=int2str(I).

Conversia numerelor zecimale întregi, n, la numere hexazecimale, h, se face prin h=dec2hex(n), iar trecerea inversă se execută cu funcţia n=hex2dec('h').

Transformarea datelor în dublă precizie se realizează cu instrucţiunea double(x), care determină o valoare în dublă precizie pentru x. Dacă x este deja un şir în dublă precizie, instrucţiunea double nu mai are efect. Double este chemată de expresii de forma for, if şi while loops, dacă expresia nu este deja de precizie dublă.

Transformarea în precizie simplă se realizează cu funcţia single, B = single(A)

transformă matricea A în precizie simplă, returnând valorile în B. Matricea A poate fi de orice formă numerică (chiar şi precizie dublă). Dacă A este deja de precizie simplă, single nu are efect. Precizia simplă necesită un spaţiu de stocare mai mic decât precizia dublă, dar are o precizie slabă.

Transformarea unui vector, X, într-un între, fără semn se face cu funcţiile, uint8, uint16, uint32. Dacă X este deja un număr întreg fară semn, din aceeaşi clasă, uint... nu are nici un efect.

Apelate, i=uint..., acestea acţionează astfel: • uint8 utilizează 1 byt pe element, pentru întregi între 0 şi 255 ; • uint16 utilizează 2 byţi pe element, pentru întregi de la 0 la 65 535 ; • uint32 utilizează 4 byţi pe element, pentru întregi între 0 şi 4 294 967 295.

Transformarea unui vector, X, într-un întreg cu semn se face cu funcţiile, int8, int16, int32. Dacă X este deja un număr întreg cu semn, din aceeaşi clasă, int... nu are nici un efect.

Apelate, i=int..., acestea acţionează astfel: • int8 utilizează 1 byt pe element, pentru întregi între -128 şi 128 ; • int16 utilizează 2 byţi pe element, pentru întregi de la -32 768 la 32 767 ; • int32 utilizează 4 byţi pe element, pentru întregi între -2147483648 şi

21474836470.

Scrierea datelor dintr-o matrice sau vector A, într-un format dorit, se face cu funcţia sprintf, care se apelează cu sintaxa: S=sprintf('format',A).

Parametrul de control, şirul 'format', conţine specificaţia de conversie şi poate fi de forma,

% -d.p tip_format în care,

• semnul “-“ este opţional şi specifică alinierea la stânga, iar dacă lipseşte,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 100

alinierea se face la dreapta; • d este numărul minim de cifre (câmpuri) aferente datei respective; • p este numărul de câmpuri folosite pentru partea zecimală; • tip_format poate fi unul din caracterele:

� e – notaţie exponenţială ; f - notaţie în virgulă fixă ; � g - formatele scurte ale lui e sau f, fără zerourile nesemnificative ; � \n - linie nouă ; \t - tab orizontal’ ; \b - backspace ; � \r - carriage return (de la cap de rând) ; � \f - form feed ; \\ backslash ; \’ - apostrof.

5.7.2. Construirea unui obiect în linia de comandă

Construirea unui obiect în linie, se realizează cu funcţia inline, care se poate apela cu una dintre sintaxele:

• inline(expr), construieşte o funcţie de tip obiecte pentru Matlab, conţinând expresia expr, iar argumentul de intrare al funcţiei astfel construite este determinat automat din expresia, expr, care se compară cu expresiile Matlab valide, iar dacă nu există nici un caracter, se utilizează variabila x ;

• inline(expr,arg1,arg2, ...), construieşte o funcţie care are argumentele de intrare specificate de arg1, arg2,.... şi, în acest caz, pot fi utilizate şi multicaractere ;

• inline(expr,n), construieşte o funcţie cu n argumente, de n variabile.

Funcţia inline este realizată practic de trei comenzi, care şi determină modul în care este creată,

• char(fun), transformă funcţia linie, într-un şir de caractere, care sunt identificate de formula fun;

• argnames(fun), returnează numele argumentelor de intrare ale liniei de obiecte fun, din şirul de celule;

• formula(fun), returnează formula pentru obiectul fun. De exemplu comanda g = inline('t^2') conduce la:

g = Inline function: g(t) = t^2

comanda g = inline('sin(2*pi*f + theta)') conduce la, g = Inline function: g(f,theta) = sin(2*pi*f + theta) comanda g = inline('sin(2*pi*f + theta)', 'f', 'theta') conduce la,

g = Inline function: g(f,theta) = sin(2*pi*f + theta)

iar comanda g = inline('x^P1', 1) conduce la,

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 101

g = Inline function: g(x,P1) = x^P1

5.7.3. Funcţii specifice şirului de celule şi structurilor

Crearea unui şir de celule se realizează prin cell, care se apelează cu una dintre sintaxele:

• c = cell(n), creează un şir de celule de forma n x n, afişând un mesaj de eroare, dacă n nu este întreg ;

• c = cell(m,n) sau c = cell([m,n]), determină un şir m-n al matricei goale, iar argumentele m şi n trebuie să fie scalare ;

• c = cell(m,n,p,...) sau c = cell([m n p ...]), creează un şir de celule m-n-p-… al matricei goale, dar argumentele m,n,p,… trebuie să fie scalare ;

• c = cell(size(A)), determină un şir de celule de dimensiunea lui A, conţinând toate matrice goale ;

• c = cell(javaobj), transformă şirul Java sau obiectele Java, javaobj, într-un şir de celule în Matlab, iar elementele rezultate din şirul de celule vor putea fi recunoscute de Matlab.

De exemplu, pentru a crea un şir de celule care are aceeaşi dimensiune ca a şirului A, se utilizează secvenţa,

A = ones(2,2); c = cell(size(A)), Rezultând:

c = [] [] [] [] Următorul exemplu transformă un şir din obiecte al java.lang.String într-un

şir de celule din Matlab, strArray = java_array('java.lang.String',3); strArray(1) = java.lang.String('one'); strArray(2) = java.lang.String('two'); strArray(3) = java.lang.String('three'); cellArray = cell(strArray)

rezultând: cellArray = 'one' 'two' 'three'

Aplicarea unei funcţii fiecărui element dintr-un şir se realizează cu cellfun, apelată:

• D = cellfun('fname',C), aplicată elementelor din şirul C, al funcţiei fname, determină un rezultat D, care este un şir dublu, în sensul că, fiecare element din D conţine valoarea returnată de fname, prin corespondenţa cu

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 102

şirul C, iar D are aceeaşi dimensiune cu C ; • D = cellfun('size',C,k), determină dimensiunea fiecărui element, k, din C ; • D = cellfun('isclass',C,'classname'), determină ‘adevarat’ pentru fiecare

element din C, care aparţine unei clase şi ‘fals’, pentru obiectele ce aparţin unei subclase.

Funcţia 'fname'poate fi: 'isreal' - verifică dacă elementele celulei sunt reale; 'isempty' - verifică dacă elementele celulei sunt goale; 'islogical' - verifică dacă elementele celulei sunt elemente logice; 'length' - determină lungimea celulei; 'ndims' -determină numărul de dimensiuni ale celulei; 'prodofsize'-determină numărul de elemente din celulă.

De exemplu, considerăm şirul de celule de forma 2-3, format prin setul de instrucţiuni,

C{1,1} = [1 2; 4 5]; C{1,2} = 'Name'; C{1,3} = pi; C{2,1} = 2 + 4i; C{2,2} = 7; C{2,3} = magic(3);

rezultând celula C = [2x2 double] 'Name' [ 3.1416] [2.0000+ 4.0000i] [ 7] [3x3 double]. Verificarea, dacă elementele sunt reale, se realizează cu D =

cellfun('isreal',C), rezultând, D = [ 1 1 1 0 1 1 ]. Lungimea elementelor celulei rezultă cu len = cellfun('length',C), obţinând: len = [ 2 4 1 1 1 3 ]. Determinarea elementelor duble ale celulei se realizează cu, isdbl = cellfun('isclass',C,'double'),

rezultând, isdbl = [ 1 0 1 1 1 1 ].

Afişarea elementelor celulei se realizează cu funcţia celldisp, care, aplicată celulei C, de mai sus, este celldisp(C) şi conduce la,

C{1,1} = [ 1 2 ; 4 5 ]; C{2,1} = [ 2.0000 + 4.0000i ]; C{1,2} = [ Name ]; C{2,2} = [ 7 ]; C{1,3} = [ 3.1416 ]; C{2,3} = [ 8 1 6 ; 3 5 7 ; 4 9 2 ].

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 103

Afişarea sau plotarea elementelor unei celule se execută cu comanda cellplot, care se poate apela:

• cellplot(c), afişează o fereastră cu un grafic, reprezentat de conţinutul lui c, elementele fiind reprezentate de vectori şi şiruri de valori scalare şi texte scurte ;

• cellplot(c,'legend') afişează în plus, o legendă, având culori diferite pentru date de la double, char, sparse, structure şi altele.

Transformarea unui şir de celule al unei matrice, într-o matrice simplă, se realizează cu cell2mat, care se poate apela cu m = cell2mat(c).

Dacă, C = {[1] [2 3 4]; [5; 9] [6 7 8; 10 11 12]}

adică, C = [ 1] [1x3 double] [2x1 double] [2x3 double]

prin, M = cell2mat(C)

rezultă, M = 1 2 3 4 5 6 7 8 9 10 11 12.

Transformarea unei matrice obişnuite, într-o matrice de celule, se realizează cu comanda mat2cell, care se poate apela,

c = mat2cell(x,m,n) şi împarte în mai multe părţi cele două dimensiuni ale matricei x, returnând şirul de celule, c, iar vectorii m şi n specifică numarul de linii şi coloane.

Dacă, x=[1 2 3 4; 5 6 7 8; 9 10 11 12]

cu comanda, c=mat2cell(x,[1 2],[2 2])

se obţine, c= [1x2 double] [1x2 double] [2x2 double] [2x2 double].

Transformarea unui şir numeric într-un şir de celule se realizează cu funcţia num2cell, care se poate apela,

• C = num2cell(A), transformă matricea A într-un şir de celule, plasând fiecare element din A într-o celulă separată, iar şirul de celule, C, va avea aceeaşi dimensiune cu matricea A ;

• C = num2cell(A,dims), transformă matricea A într-un şir de celule, plasând

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 104

dimensiunile specificate de dims, într-o celulă separată, iar C are aceeaşi dimensiune cu A, exceptând cazul când dimensiunea este 1.

Dacă A=[1 2 3; 4 5 6; 7 8 9], prin C=num2cell(A) se obţine: C = [1] [2] [3] [4] [5] [6] [7] [8] [9]

Administrarea intrărilor şi ieşirilor se realizează cu funcţia deal, care se apelează,

• [Y1,Y2,Y3,...] = deal(X) copiază intrările unice în ieşiri, fiind acelaşi lucru ca şi Y1 = X, Y2 = X, Y3 = X, ... ;

• [Y1,Y2,Y3,...] = deal(X1,X2,X3,...) este acelaşi lucru ca şi Y1 = X1; Y2 = X2; Y3 = X3;

Pentru exemplificare, se prezintă utilizarea funcţiei deal pentru a copia conţinutul şirului de celule, C, în patru variabile separate de ieşire, a,b,c,d, astfel:

C = {rand(3) ones(3,1) eye(3) zeros(3,1)}; [a,b,c,d] = deal(C{:}).

Realizarea unei structuri se execută cu funcţia struct, apelată cu una dintre sintaxele:

• s = struct('field1',{},'field2',{},...) determină o structură goală, cu câmpurile field1, field2, ... ;

• s = struct('field1',values1,'field2',values2,...) determină o structură şir, cu specificarea câmpurilor şi a valorilor, cu observaţia că valorile values1, values2 etc. trebuie să fie un şir de celulă de aceeaşi dimensiune sau celule scalare, iar elementele corespunzătoare şirurilor de valori sunt plasate într-o structură corespunzătoare de elemente şir, cu dimensiunea rezultatului ca şi cea a valorilor şirului de celule.

De exemplu, comanda s = struct('type',{'big','little'},'color',{'red'},'x',{3 4})

determină o structură de şir s, s =

1x2 struct array with fields: type color x

în care, s(1) =

type: 'big' color: 'red' x: 3

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 105

s(2) = type: 'little' color: 'red' x: 4

Transformarea unui şir de celule într-o structură de tip şir, care să conţină informaţia din celule, se realizează cu funcţia cell2struct, apelată:

s = cell2struct(c,fields,dim) în care, argumentele câmpurilor specifică numele câmpului din structura şirului, c, astfel că fields poate fi un şir de celule, iar dim controlează care valoare a şirului de celule este folosită în crearea structurii şirului. Lungimea lui c este specificată de numărul câmpurilor de nume fields; cu alte cuvinte, următoarele relaţii trebuie să fie adevărate:

size(c,dim) == length(fields) % dacă câmpul este un şir de celule; size(c,dim) == size(fields,1) % dacă câmpul este un şir (vector);

Dacă un şir de celule, c, conţine informaţii, (de exemplu cele trei coloane indică numele, genul, greutatea)

c = {'birch','betula',65; 'maple','acer',50} c = 'birch' 'betula' [65] 'maple' 'acer' [50]

pentru a pune aceste informaţii într-o structură denumită 'nume', 'gen', 'greutate', se foloseşte funcţia cell2struct,

fields = {'nume', 'gen', 'greutate'}; s = cell2struct(c, fields, 2);

rezultând: s(1)= s(2)= nume: 'birch' nume: 'maple' gen: 'betula' gen: 'acer' greutate: 65 greutate: 50

Vizualizarea structurii şirului transformat se realizează cu funcţia struct2cell, apelată,

c = struct2cell(s) care transformă o structură s, de forma m x n (cu p câmpuri), într-o structură de forma p x m, pe c şiruri de celule c, iar dacă structura lui s este multidimensională, şirul de celule c are dimensiunea [p size(s)].

Apelată pentru exemplul anterior, c=struct2cell(s), rezultă, c= 'birch' 'maple' 'betula' 'acer' [ 65] [ 50]

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 106

Verificarea dacă un vector sau şir oarecare este un şir de celule se realizează cu funcţia iscell, astfel:

tf = iscell(A) care returnează un răspuns logic true (sau 1), dacă A este un şir de celule şi false

(sau 0), dacă nu este.

Pentru a crea un şir de obiecte Java, se utilizează funcţia Matlab javaArray, care are următoarea sintaxă:

A = javaArray('element_class', m, n, p, ...) în care primul argument, element_class, este numele elementelor din şir, iar argumentele (m,n,p,…) sunt elementele fiecărei dimensiuni din şir.

Un şir care a fost creat cu javaArray este echivalent cu şirul creat de codul Java. Funcţia javaArray nu memorează orice şir, într-un grup de elemente create, ci acest lucru se face separat.

5.7.4. Funcţii specifice şirului multidimensional

Determinarea numărului de dimensiuni ale şirului A se realizează cu funcţia n=ndims(A), rezultând numărul n. Numărul dimensiunilor dintr-un şir este mereu mai mare sau egal cu 2. Dimensiunea lui A este determinată pentru fiecare mărime prin size(A,dim) = 1, iar în general ndims(x) este length(size(x)).

Concatenarea şirurilor se realizează cu funcţia cat, care se apelează: • C = cat(dim,A,B) concatenează sirurile A şi B ; • C = cat(dim,A1,A2,A3,A4,...) concatenează intrările şirurilor

(A1,A2,A3,A4) ; • C= cat(2,A,B) este acelaşi lucru ca şi [A,B], iar cat(1,A,B) este acelaşi

lucru ca şi [A;B].

Sintaxa cat(dim,C{:}) sau cat(dim,C.field) este modul de a concatena celula sau structura şirului ce conţine matrice numerice, într-o singură matrice.

Generarea unui şir multidimensional, pentru realizarea unei reţele (grid), se realizează cu funcţia ngrid, care se apelează,

• [X1,X2,X3,...] = ndgrid(x1,x2,x3,...), transformă domeniul specificat de vectorii x1,x2,x3,… în şirul X1,X2,X3,… care poate fi folosit pentru a evalua funcţiile cu mai mulţi parametri şi interpolări multiple ;

• [X1,X2,...] = ndgrid(x) este acelaşi lucru ca şi [X1,X2,...] = ndgrid(x,x,...).

Funcţia ndgrid este asemănătoare cu meshgrid, exceptând faptul că ordinea celor două intrări este schimbată. Astfel, [X1,X2,X3] = ndgrid(x1,x2,x3) produce acelaşi rezultat ca şi [X2,X1,X3] = meshgrid(x2,x1,x3).

Permutarea dimensiunilor unui şir multidimensional se realizează cu funcţia permute apelată,

Limbajul Matlab – instrucţiuni şi funcţii de control specifice 107

B = permute(A,order) rearanjează dimensiunile lui A, care sunt specificate vector; B are aceleaşi valori ca şi A, dar ordinea este rearanjată, iar toate elementele din order trebuie să fie unice.

Inversarea permutării realizate se execută cu funcţia ipermute apelată, A = ipermute(B,order)

care rearanjează dimensiunea lui B, deci permute(A,order) va produce B, care are aceleaşi valori ca şi A, dar ordinea elementelor este schimbată. Toate elementele din order trebuie să fie unice.

Funcţiile permute şi ipermute sunt utile pentru şiruri multidimensionale.

Schimbarea dimensiunilor unui şir se realizează cu funcţia shiftdim, care se poate apela:

• B = shiftdim(X,n) schimbă dimensiunea lui X ; când n este pozitiv, schimbă dimensiunea la stânga, iar când n este negativ, schimbă dimensiunea către dreapta ;

• [B,nshifts] = shiftdim(X) determină şirul B, cu acelaşi număr de elemente ca şi X, iar dacă X este scalar, shiftdim nu are efect.

Comanda shiftdim este asemănătoare comenzilor sum sau diff, care sunt aplicate pentru monodimensiuni.

Pentru exemplificare, se recomandă secvenţa, a = rand(1,1,3,1,2); [b,n] = shiftdim(a); % b este 3-pe-1-pe-2 şi n este 2. c = shiftdim(b,-n); % c == a. d = shiftdim(a,3); % d este 1-pe-2-pe-1-pe-1-pe-3.

Înlăturarea monodimensiunilor unui şir se realizează cu funcţia squeeze, care se apelează,

B = squeeze(A) ce returnează un şir B cu aceleaşi elemente ca şi A, dar cu o singură monodimensiune, size(A,dim) = 1.

6. GENERAREA ŞI MANIPULAREA VECTORILOR

ŞI A MATRICELOR

Deşi în MATLAB nu există instrucţiuni pentru declararea tipurilor de variabile, iar matricele se autodimensionează în timpul utilizării, pentru a creşte viteza de lucru, se procedează la crearea unei matrice goale. Acest lucru se realizează la începutul sesiunii de lucru sau la apelarea unei funcţii program.

Declararea unei matrice goale (fie aceasta G) se realizează, după cum s-a arătat, cu instrucţiunea G = [ ], prin care se alocă G o matrice de dimensiuni 0x0.

Orice matrice goală trebuie să aibă cel puţin una din dimensiuni zero. Pentru a testa dacă o matrice G este goală, se foloseşte funcţia isempty(G), care returnează 1, dacă matricea este goală şi 0, în caz contrar.

6.1. Generarea vectorilor

Pentru generarea vectorilor cu pas liniar este necesară cunoaşterea limitelor intervalului (minimă şi maximă) şi a pasului dintre două elemente.

Cunoscând valoarea minimă a intervalului (vmin) şi pe cea maximă (vmax), fară a se indica pasul, atunci acesta se consideră egal cu unitatea, iar secvenţa de instrucţiuni pentru generarea vectorului V este V=vmin:vmax , ca de exemplu:

V=10.45:15.8 rezultând V = 10.4500 11.4500 12.4500 13.4500 14.4500 15.4500. Se observă că valoarea iniţială şi finală pot fi numere reale, cu condiţia ca

vmin<vmax. Dacă se cunosc limitele intervalului (vmin şi vmax) şi pasul (pas) dintre două

elemente, generarea vectorului se face cu instrucţiunea V=vmin:pas:vmax, ca de exemplu:

V=10.45:1.5:15.8 rexultând V = 10.4500 11.9500 13.4500 14.9500. Numărul de elemente ale vectorului rezultant V este:

1pas

vmaxvminN +

−= , unde „[ ]” semnifică partea întreagă a rezultatului

expresiei dintre paranteze. Instrucţiunea presupune că dacă pas>0, atunci vmin<vmax, iar dacă pas<0, atunci vmin>vmax. De exemplu:

x=2:5:25 rezultând

Generarea şi manipilarea vectorilor şi a matricelor 109

x = 2 7 12 17 22 sau, x=-20:3:4 rezultând x = -20 -17 -14 -11 -8 -5 -2 1 4 sau, x=4:-3:-5 rezultând x = 4 1 -2 -5 sau x=-14:-3:-25 rezultând x = -14 -17 -20 -23 sau x=-4:1 rezultând x = -4 -3 -2 -1 0 1

sunt corecte, în timp ce următoarele instrucţiuni: x=3 : -1 : 4 şi x=-5 :2 :-10

sunt incorecte. Generarea unui vector, având N elemente cu pas liniar, între vmin şi vmax, se

poate realiza cu instrucţiunea X=linspace(vmin,vmax,N), ca de exemplu: X=linspace(2.7,7,4) rezultând X = 2.7000 4.1333 5.5667 7.0000. Pasul liniar dintre două elemente, generate cu linspace este:

1N

vmaxvminpas

−= . Dacă valoarea N este omisă, atunci aceasta este considerată

implicit egală cu 100. După cum am arătat anterior, valorile limitelor intervalului nu sunt supuse nici unei restricţii.

Generarea unui vector X, de N elemente, cu pas logaritmic, între limita inferioară lmin şi superioară lmax, se realizează cu funcţia X=logspace(lmin,lmax,N). Vectorul X conţine N elemente, distribuite logaritmic între decadele [10lmin 10lmax]. Dacă numărul de elemente este omis, se generează un

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 110

vector cu 50 elemente distribuite logaritmic între [10lmin 10lmax]. Dacă lmax=pi (adică π), atunci elementele vectorului sunt distribuite între 10lmin şi π. Asupra valorilor limitelor nu se face nici o restricţie şi acestea pot fi date în orice ordine. Dacă lmin >lmax, vectorul generat va fi ordonat descrescător.

De exemplu, generarea unui vector cu N=5 elemente distribuite logaritmic între 10-2 şi 102 se realizează cu instrucţiunea x=logspace(-2,2,5), rezultând

x = 0.0100 0.1000 1.0000 10.0000 100.0000. Generarea unui vector cu N=5 elemente, distribuite logaritmic în intervalul

[10-2 pi], se face prin instrucţiunea x=logspace(-2,pi,5),

rezultând x = 0.0100 0.0421 0.1772 0.7462 3.1416.

Generarea unei reţele (mesh) se execută prin funcţia meshgrid, care transformă un domeniu specificat prin vectorii x şi y, în tablourile X şi Y, care pot fi folosite, atât la evaluarea funcţiilor de două variabile, cât şi pentru reprezentările grafice în două, 2D, sau trei, 3D, dimensiuni.

Sintaxa de apelare a funcţiei este [X,Y] = meshgrid(x,y), iar atunci când vectorii x şi y sunt egali, apelarea se face prin [X,Y] = meshgrid(x).

Funcţia returnează în tablourile X şi Y perechile de coordonate ale tuturor punctelor din domeniul definit de vectorii x şi y. Vectorii x şi y sunt de forma:

x = xmin : ∆x : xmax , y = ymin : ∆y : ymax mesh-ul rezultat din divizarea domeniului fiind reprezentat în figura 6.1.

Fig. 6.1. Mesh-ul rezultat prin divizarea domeniului x-y

De exemplu, generarea tablourilor X şi Y pentru domeniul –3≤x≤6, -2≤y≤4, cu pasul ∆x=3 şi ∆y=2, se face cu instrucţiunea: [X,Y]=meshgrid(-3:3:6, -2:2:4), obţinându-se rexultatul,

Generarea şi manipilarea vectorilor şi a matricelor 111

X = -3 0 3 6 -3 0 3 6 -3 0 3 6 -3 0 3 6 Y = -2 -2 -2 -2 0 0 0 0 2 2 2 2 4 4 4 4. Dacă este necesar ca pentru domeniul de mai sus să se evalueze funcţia

x^2+y^2 şi să se traseze graficul acesteia, prezentat în figura6.2, atunci instrucţiunile care permit acest lucru sunt:

[X,Y] = meshgrid(-3:3:6, -2:2:4); Z=X.^2+Y.^2; mesh(Z).

Fig. 6.2. Reprezentarea funcţiei x2+y2 pe domeniului x-y

Spaţierea pentru răspunsul în frecvenţă, similar cu meshgrid, dar în spaţiul 2 D, se realizează cu funcţia freqspace, apelată cu sintaxa,

[F1,F2]=freqspace(n) în care: F1, F2 – vectorii de dimensiunea n x n; n- numărul de puncte.

Dacă n este impar, atunci vectorii F = (-1+1/n:2/n:1-1/n), iar dacă este par, atunci F = (-1 :2/n:1-2/n).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 112

6.2. Instrucţiuni care permit obţinerea unor informaţii de bază despre variabile şi matrice

Pentru determinarea dimensiunilor unei matrice, X, se utilizează funcţia size, apelată cu sintaxa :

[m,n]=size(X) care reîntoarce vector linie cu două componente [m,n], care conţine numărul de linii m şi numărul de coloane n, ale matricei X. Considerând matricea X de forma,

X = 1 2 3 4 5 6 7 8 9 10 11 12,

prin instrucţiunea [m,n]=size(X) se obţine, m = 3 n = 4,

respectiv m=3 coloane şi n=4 linii. O instrucţiune de forma [M1,M2,M3,...,MN] = size(X), returnează lungimile

primelor N dimensiuni ale lui X. Printr-o instrucţiune de forma m = size(X,DIM), se returnează lungimea

dimensiunii specificate prin scalarul DIM. De exemplu, prin instrucţiunea m=size(X,1) se găseşte numărul de rânduri, respectiv m=3.

Lungimea unui vector sau dimensiunea maximă a unei matrice, se obţine cu instrucţiunea a=length(X), rezultând :

a = 4. Această instrucţiune, length, este echivalentă cu instrucţiunea max(size(X)),

doar că această ultimă formă nu este posibil de aplicat matricelor goale.

Numărul de dimensiuni n, ale unei matrice X, sau vector, se determină prin instrucţiunea n=ndims(X). Pentru matricea X de mai sus se obţine n=2. O instrucţiune similară lui ndims este length(size(X)).

Vizualizarea (afişarea) unei matrice sau a unui vector text, notat generic cu X, pe dispay (ecran), fără să tipărească numele acesteia, se face prin funcţia disp(X).

Dacă X=[1 2 3 4 ; 5 6 7 8], atunci prin comanda disp(X), pe ecran va apărea, 1 2 3 4 5 6 7 8,

iar dacă Xx=['Acest text apare pe ecran'], prin comanda disp(Xx), pe ecran apare, Acest text apare pe ecran.

Pentru creşterea vitezei de lucru se procedează la crearea unei matrice goale

Generarea şi manipilarea vectorilor şi a matricelor 113

cu instrucţiunea, X=[ ]

prin care se alocă lui X, matricea de dimensiuni 0 x 0. Orice matrice goală trebuie să aibă cel puţin una dintre dimensiuni zero. Verificarea faptului că o matrice este goală se realizează prin instrucţiunea

isempty(matrice), care va avea rezultatul 1, dacă este goală sau zero, altfel..Dacă considerăm matricele Y=[] şi YY=[1 2; 3 4], cu instrucţiunea isempty(Y) se obţine 1, iar cu instrucţiunea isempty (YY), se obţine 0. Matricea goală nu are nici un element, astfel că prod(size(Y))==0.

Pentru a verifica dacă două sau mai multe matrice sunt egale, se utilizează instrucţiunea isequal(A, B, …, C), în care A, B, C sunt matricele ce trebuie verificate. Atunci când toate elementele corespunnzătoare sunt egale, rezultatul este 1, iar altfel este 0.

Verificarea faptului, dacă o matrice sau vector A conţine valori numerice, se realizează folosind instrucţiunea isnumeric(A), la care se returnează 1, atunci când elementele sunt numerice şi 0, altfel. Dacă A=[1 2; 3 4] atunci prin isnumeric(A) se obţine 1, iar pentru B=[' acest text '; 'nu este numeric'] prin isnumeric(B) se obţine 0.

Pentru a verifica dacă o variabilă A (matrice sau vector), este de tip logic se utilizează instrucţiunea islogical(A), la care răspunsul trebuie să fie 1, dacă este de tip logic şi 0, dacă nu. De exemplu, dacă A=[1 10; 15 20], atunci islogical(A) va fi 0, iar pentru B=~A, islogical(B) va fi 1.

Convertirea unei variabile numerice A în variabilă logică, se face prin instrucţiunea logical(A).

6.3. Generarea matricelor elementare

Matricea nulă sau matricea zero, pe care o vom nota cu O, este o matrice cu toate elementele zero:

=

0....00

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

0....00

0....00

O .

Această matrice zero poate fi generată cu funcţia zeros, care se apelează cu una dintre sintaxele:

O=zeros(n), O=zeros(m,n) sau O=zeros(size(A)), unde m şi n sunt scalari, iar A este o matrice oarecare.

Dacă funcţia zeros este apelată cu un singur argument scalar, atunci matricea

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 114

generată este o matrice pătrată, având dimensiunea argumentului. De exemplu, dacă n=4, atunci la comanda O=zeros(4), se obţine:

O = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0. Atunci când funcţia zeros este apelată cu două argumente scalare (m, n),

matricea generată are m linii şi n coloane. Dacă m=3 şi n=4, atunci cu instrucţiunea O=zeros(4,3), se obţine:

O = 0 0 0 0 0 0 0 0 0 0 0 0. Funcţia zeros apelată cu instrucţiunea O=zeros(size(A)), produce o matrice

zero, de aceleaşi dimensiuni cu cele ale matricei A. Considerând matricea A = [ 1 2 3; 4 5 6], atunci prin instrucţiunea

O=zeros(size(A)), se obţine: O = 0 0 0 0 0 0. Matricea unitară, pe care o vom nota cu U, este o matrice cu toate

elementele 1:

=

1....11

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

1....11

1....11

U .

Generarea matricei unitate se face cu funcţia ones, ce poate fi apelată cu una dintre sintaxele:

U=ones(n), U=ones(m,n) sau U=ones(size(A)), unde m şi n sunt scalari, iar A este o matrice oarecare.

Dacă funcţia ones este apelată cu un singur argument scalar, atunci matricea generată este o matrice pătrată, având dimensiunea argumentului. De exemplu, dacă n=4, atunci la comanda U=ones(4), se obţine:

U = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1. Atunci când funcţia ones este apelată cu două argumente scalare (m, n),

matricea generată are m linii şi n coloane. Dacă m=3 şi n=4, atunci cu instrucţiunea U=ones(4,3), se obţine:

Generarea şi manipilarea vectorilor şi a matricelor 115

U = 1 1 1 1 1 1 1 1 1 1 1 1.

Funcţia ones, apelată cu instrucţiunea U=ones(size(A)), produce o matrice zero de aceleaşi dimensiuni cu cele ale matricei A.

Considerând matricea A = [ 1 2 3; 4 5 6], atunci prin instrucţiunea U=ones(size(A)), se obţine:

U = 1 1 1 1 1 1. Printr-o instrucţiune de forma U=ones(m, n, … , p), se poate obţine o

matrice unitate de m x n x … x p dimensiuni. Matricea identitate sau unitate, pe care o vom nota cu I, se generează cu

una dintre sintaxele: I=eye(n), I=eye(m,n) sau I=eye(size(A)),

unde m şi n sunt scalari, iar A este o matrice oarecare.

Matricea identitate este o matrice care are elementele de pe diagonala principală egale cu unu, iar toate celelalte egale zero:

=

1....00

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

0....10

0....01

I .

Elementele sale sunt:

=

=

ji

jiI ij pentru ,1

,pentru ,0.

Dacă funcţia eye este apelată cu un singur argument scalar, atunci matricea generată este o matrice pătrată, având dimensiunea argumentului. De exemplu, dacă n=4, atunci la comanda I=eye(4), se obţine:

I = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1.

Atunci când funcţia eye este apelată cu două argumente scalare (m, n), matricea generată are m linii şi n coloane.

Dacă m=3 şi n=4, atunci cu instrucţiunea I=eye(4,3), se obţine:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 116

I = 1 0 0 0 1 0 0 0 1 0 0 0. Funcţia eye, apelată cu instrucţiunea I=eye(size(A)), produce o matrice

identitate de aceleaşi dimensiuni cu cele ale matricei A. Considerând matricea A = [ 1 2 3; 4 5 6], atunci prin instrucţiunea

I=eye(size(A)), se obţine: I = 1 0 0 0 1 0. Generarea matricelor cu numere aleatoare se poate face utilizând funcţia

rand, pentru numere aleatoare, cu distribuţie uniformă în intervalul (0,1) sau funcţia randn, pentru numere aleatoare cu distribuţie normală (Gaussiană), de medie zero şi variantă unu.

Instrucţiunile pentru generarea matricelor cu numere aleatoare au formele, • pentru distribuţia uniformă, Ru = rand(n), Ru = rand(m,n), Ru = rand(size(A)), • pentru distribuţia normală, Rn = randn(n), Rn = randn(m,n), Rn = randn(size(A)),

unde m şi n sunt scalari, iar A este o matrice oarecare. Apelate cu un singur argument scalar, funcţiile rand sau randn generează

matrice pătrate de numere aleatoare, având dimensiunea argumentului. Dacă m=3, atunci prin comanda Ru=rand(3), se obţine,

Ru = 0.1124 0.3459 0.5733 0.2915 0.6931 0.2175 0.4433 0.3445 0.0443,

iar prin comanda Rn=randn(3), Rn = -0.1567 -1.0565 0.5287 -1.6041 1.4151 0.2193 0.2573 -0.8051 -0.9219. Atunci când funcţiile rand sau randn sunt apelate cu două argumente scalare

(m, n), matricea generată are m linii şi n coloane. Dacă m=3 şi n=4, atunci cu instrucţiunea Ru = rand(4,3), se obţine, Ru = 0.2898 0.8921 0.7216 0.4357 0.0167 0.6730 0.3234 0.0562 0.3465 0.8637 0.1458 0.1722,

Generarea şi manipilarea vectorilor şi a matricelor 117

iar cu instrucţiunea Rn = randn(4,3),

Rn = -0.6918 -1.4410 0.8156 0.8580 0.5711 0.7119 1.2540 -0.3999 1.2902 -1.5937 0.6900 0.6686. Funcţiile rand şi randn, apelate cu instrucţiunea Ru=rand(size(A)), sau

Rn=randn(size(A)), produc matrice cu numere aleatoare de aceleaşi dimensiuni cu cele ale matricei A.

Considerând matricea A = [ 1 2 3; 4 5 6], atunci prin instrucţiunea Ru=rand(size(A)), se obţine:

Ru = 0.4565 0.8214 0.6154 0.0185 0.4447 0.7919,

iar prin instrucţiunea Rn=randn(size(A)), Rn = 0.5913 0.3803 -0.0195 -0.6436 -1.0091 -0.0482. Prin instrucţiuni de forma: Ru = rand(m, n, … , p), sau Ru = rand(m, n, … , p)

se poate obţine o matrice cu numere aleatoare de m x n x … x p dimensiuni. De menţionat că la orice altă apelare a instrucţiunilor de mai sus, se obţin

matrice cu alte numere aleatoare, fiind 35 de stări ale generatorului de numere aleatoare, cu distribuţie uniformă în intervalul [2^(-53), 1-2^(-53)].

Pentru simularea experienţelor care comportă aceleaşi condiţii, se generează serii de numere aleatoare identice, la care se controlează parametrul de iniţializare al generatorului, notat seed, prin instrucţiunile rand('seed',n) sau randn('seed',n), unde n este valoarea atribuită lui seed. De exemplu, prin instrucţiunile,

rand('seed',33); rand(2), se va obţine, la orice apelare, aceeaşi matrice de numere aleatoare cu distribuţie uniformă,

ans = 0.9260 0.5630 0.1365,

iar prin setul de instrucţiuni, randn('seed',33); randn(2),

se va obţine, la orice apelare, aceeaşi matrice de numere aleatoare cu distribuţie normală,

ans = 0.1885 1.2282 -1.6564 -1.9732.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 118

6.4. Instrucţiuni pentru manipularea matricelor

Schimbarea dimensiunilor unei matrice sau transformarea unei matrice A, de m rânduri şi n coloane, într-o matrice B, de l rânduri şi p coloane, prin ordonarea, începând cu elementele de pe coloane, se realizează prin instrucţiunea B=reshape(A,l,p).

Pentru ca operaţia de redimensionare să fie posibilă, trebuie ca l x p = m x n. Dacă matricea A are m=3 rânduri şi n=6 coloane, A = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18],

prin instrucţiunea B=reshape(A,6,3) se obţine, ans = 1 3 5 7 9 11 13 15 17 2 4 6 8 10 12 14 16 18,

iar prin instrucţiunea B=reshape(A,2,9) se obţine, ans = 1 13 8 3 15 10 5 17 12 7 2 14 9 4 16 11 6 18. Se observă că, elementele matricei B, în ordinea succesivă a coloanelor şi pe

fiecare coloană de sus în jos, sunt elementele matricei A originale, citite de sus în jos şi de la stânga la dreapta.

Instrucţiunea diag permite găsirea diagonalelor unei matrice şi a matricei diagonale.

Pentru exemplificarea modului de acţiune a acestei instrucţiuni, se consideră matricea A, descrisă anterior, respectiv:

A = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]. Prin aplicarea adecvată a instrucţiunii diag se determină:

• diagonala principală, cu instrucţiunea diag(A) sau diag(A,0), rezultând o matrice coloană cu aceste elemente,

ans = 1 8 15

Generarea şi manipilarea vectorilor şi a matricelor 119

• diagonalele deasupra diagonalei principale, respectiv cele care au ca prim element numărul coloanei, nd, specificat în instrucţiunea diag(A,nd), astfel că pentru diag(A,2) rezultă,

ans = 3 10 17

• elementele de pe diagonalele de sub diagonala principală, prin instrucţiunea diag(A,-nd), astfel că, pentru diag(A,-1) se obţine,

ans = 7 14.

Crearea, prin extragerea dintr-o matrice dată A, a unei matrice superior

triunghiulare se face utilizând instrucţiunea tril, iar crearea unei matrice inferior

triunghiulare se realizează cu comanda triu.

Sintaxele de apelare a funcţiilor tril şi triu, pentru matricea A, sunt tril(A,k) şi triu(A,k), unde k indică diagonala matricei A, cu următoarea semnificaţie:

• k=0 sau k omis, pentru diagonala principală ; • k > 0, indică diagonala k, de deasupra diagonalei principale ; • k < 0, pentru diagonala k, de sub cea principală.

Pentru matricea A, prin instrucţiunea tril(A) sau tril(A,0) se obţine, ans = 1 0 0 0 0 0 7 8 0 0 0 0 13 14 15 0 0 0,

iar prin instrucţiunea triu(A) sau triu(A,0), ans = 1 2 3 4 5 6 0 8 9 10 11 12 0 0 15 16 17 18. Pentru diagonala 2, de deasupra diagonalei principale, extragerea matricei

inferioare se face cu instrucţiunea tril(A,2), ans = 1 2 3 0 0 0 7 8 9 10 0 0 13 14 15 16 17 0,

iar a matricei superioare cu triu(A,2), ans = 0 0 3 4 5 6 0 0 0 10 11 12 0 0 0 0 17 18.

Pentru prima diagonală de sub diagonala principală, extragerea matricei diagonale inferioare se face prin tril(A,-1),

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 120

ans = 0 0 0 0 0 0 7 0 0 0 0 0 13 14 0 0 0 0,

iar a celei superioare prin triu(A,-1), ans = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15 16 17 18.

Inversarea ordinii coloanelor unei matrice, de la stânga la dreapta, sau rotirea matricei în jurul axei verticale se realizează cu instrucţiunea fliplr(B), unde B este matricea asupra căreia se acţionează. Elementele matricei rezultate sunt obţinute prin pivotarea matricei argument în jurul ultimei coloane, operaţie prin care aceasta devine prima coloană. Instrucţiunea flipdim(B,2) conduce la acelaşi rezultat.

Dacă B=[1 2 3 4; 5 6 7 8; 9 10 11 12], atunci prin comanda fliplr(B) sau flipdim(B,2) se obţine,

ans = 4 3 2 1 8 7 6 5 12 11 10 9.

Rotirea matricei în jurul axei orizontale sau inversarea ordinii liniilor

unei matrice, de sus în jos se realizează cu instrucţiunea flipud(B), unde B este matricea asupra căreia se acţionează. Elementele matricei rezultate sunt obţinute prin pivotarea matricei argument în jurul ultimei linii, operaţie prin care aceasta devine prima linie. Acelaşi rezultat se obţine şi prin utilizarea instrucţiunii flipdim(B,1).

Dacă B=[1 2 3 4; 5 6 7 8; 9 10 11 12], atunci prin comanda flipud(B) sau flipdim(B,1) se obţine,

ans = 9 10 11 12 5 6 7 8 1 2 3 4.

Rotirea unei matrice A, cu multipli de 90 grade, se face prin instrucţiunea rot90(A,k), unde k sunt multipli de 90º, numere naturale. Dacă k lipseşte, atunci rotirea se face cu 90º, în sens trigonometric.

Atunci când k >=1, rotirea se face în sens trigonometric (invers sensului orar), iar dacă k <=0, rotirea se face în sens orar. Atunci când k=0, mu se realizează nici o rotire.

Considerând matricea A = [ 1 2 3; 4 5 6; 7 8 9], prin instrucţiunea rot90(A) sau rot90(A,1), se realizează rotirea cu 90º în sens trigonometric,

Generarea şi manipilarea vectorilor şi a matricelor 121

ans = 3 6 9 2 5 8 1 4 7,

iar prin instrucţiunea rot90(A,-2) sau rot90(A,6) se obţine rotirea cu 180° în sens orar şi cu 540º în sens trigonometric,

ans = 9 8 7 6 5 4 3 2 1.

Determinarea indicilor elementelor unui vector X care sunt diferite de zero sau verifică o condiţie, se realizează prin instrucţiunea find(X). Pentru vectorul X=[1 0 –2 3 0 5 0 7], instrucţiunea a=find(X) va returna indicii elementelor lui X diferiţi de zero, respectiv:

a = 1 3 4 6 8.

Pentru o matrice A ca argument, funcţia fiind analizează coloană cu coloană elementele acesteia, returnând indicii diferiţi de zero, ce au valori cuprinse în intervalul 1 … mxn, în care m este numărul de linii iar n, de coloane, al matricei A.

Dacă A = [ 1 0 3; 4 -5 0; 0 8 9], atunci prin comanda a=find(A) se obţine, a = [1 ; 1 ; 2 ; 5 ; 6 ; 7 ; 9 ].

Instrucţiunea [l,c]=find(A) permite returnarea numărului liniei (vectorul l) şi al coloanei (vectorul c) matricei argument A ,care conţine elemente diferite de zero,

l = 1 2 2 3 1 3 c = 1 1 2 2 3 3. Returnarea şi a vectorului V, al elementelor diferite de zero (eliminând

elemente diferite de zero), se face cu instrucţiunea [l,c,V]=find(A),

rezultând,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 122

V = 1 4 -5 8 3 9. Atunci când este necesară determinarea poziţiei indicilor unor elemente dintr-o

matrice, care îndeplinesc o anumită condiţie, de exemplu, mai mari decât o valoare dată v, se utilizează inctrucţiunea [l,c]=find(A>v). Dacă v=4, atunci prin comanda [l,c]=find(A>4) se obţine:

l = 3 3 c = 2 3.

Ultimul indice al unei linii sau coloane dintr-o matrice sau ultimul indice al unui vector, poate fi desemnat prin end. Dacă, de exemplu V=[1 2 0 7 9 10 11 4], atunci V(end)=4, iar V(end-2)=10. Pentru matricea,

A = [ 1 2 3 4 5 6 7 8 9 10 11 12], A(2:end, :) este, 5 6 7 8 9 10 11 12, iar A(2:end, 2:end-1) este, 6 7 11.

Găsirea indicelui liniar dintr-o matrice, de dimensiuni oarecare, se face prin instrucţiunea ind=sub2ind(siz,i1,i2,…,in), care returnează un indice echivalent ind, ce corespunde aşezării în matricea iniţială de dimensiune siz (dată sub forma [siz]=size(A), unde A este matricea iniţială) şi de indici i1,i2,…,in, care corespund celor n dimensiuni ale matricei iniţiale A.

Inversa funcţiei de mai sus, prin care se găsesc indicii i1,i2,…,in, când se dau, dimensiunea iniţială a matricei siz şi indicele liniar ind, este funcţia [siz,i1,i2,…,in]=sub2ind(siz,nd).

Funcţia ind2sub este utilizată pentru determinarea valorii indicelui dintr-o matrice, ce verifică o anumită proprietate, fiind apelată, de exemplu, sub forma:

[I,J] = ind2sub(size(A),find(A>5)). Dacă,

Generarea şi manipilarea vectorilor şi a matricelor 123

A = 1 2 3 4 5 6 7 8 9 10 11 12,

atunci, [I,J] = ind2sub(size(A),find(A>9)),

conduce la: I = 2 2 2 J = 4 5 6.

6.5. Extragerea elementelor individuale ale unui vector

sau ale unei matrice şi a submatricelor acesteia

Elementele individuale ale unui vector se apelează prin numele vectorului, urmat de numărul elementului dorit, pus între paranteze rotunde. De exemplu, pentru vectorul A=[1 2 3 4 5 6 7 8 9], elementul al cincelea se extrage cu comanda A(5), rezultând:

ans = 5. Modificarea valorii unui element al vectorului se face, prin atribuirea noii

valori elementului respectiv, A(i)=v, unde i este elementul, iar v valoarea atribuită. Dacă se doreşte ca elementul al patrulea al vectorului A să fie suma dintre elementul al treilea şi al cincelea, atunci aceasta se realizează prin instrucţiunea,

A(4)=A(3)+A(5), rezultând:

A = 1 2 3 8 5 6 7 8 9.

Pentru extragerea vectorilor cu elemente succesive, decupate din alţi vectori, se utilizează o instrucţiune de forma A(i:j), care selectează elementele [i, i+1, …, j]

ale vectorului A, iar dacă i > j, atunci vectorul rezultat este nul. De exemplu, pentru A=[1 2 3 4 5 6 7 8 9 10 11], prin instrucţiunea A(4:7) se obţine,

ans = 4 5 6 7,

iar prin instrucţiunea A(7:4) rezultă o matrice goală,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 124

ans = Empty matrix: 1-by-0. Extragerea elementelor unui vector, aflate la un pas dat, unul de altul, se

realizează prin instrucţiunea A(i:p:j), având ca rezultat un vector cu elementele [i,

i+p, i+2p, …, j], sau un vector nul, dacă p>0 şi i>j sau dacă p<0 şi i<j. De exemplu, prin comanda A(3:2:11) se obţine:

ans = 3 5 7 9 11.

Elementele individuale ale unei matrice se apelează cu numele acesteia, urmat de doi indici (primul specificând linia, iar al doilea coloana), cuprinşi între paranteze rotunde şi separaţi de virgulă.

Pentru a specifica faptul că sunt extrase toate liniile sau toate coloanele matricei originale, se folosesc „:” ca prim indice, respectiv al doilea indice. Indicii pot fi şi vectori, ceea ce permite definirea unor submatrice. De menţionat că, M(:,:), este întreaga matrice M dată.

Dacă considerăm matricea: M = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20],

atunci elementul de pe linia 3 şi coloana 2 va fi apelat prin M(3,2), rezultând valoarea 10.

Extragerea unei submatrice B, de dimensiuni 4x1, constând din primele 4 elemente din coloana a 3-a a matricei M, se face cu instrucţiunea B=M(1:4,3), rezultând:

B = 3 7 11 15. Pentru extragerea unei matrice C, care să conţină elementele liniilor 2:4 şi

coloanelor 1:3, se utilizează instrucţiunea C=M(2:4,1:3), obţinându-se: C = 5 6 7 9 10 11 13 14 15. Utilizând două puncte în locul primului indice, se extrag toate elementele

liniei, iar două puncte în locul celui de al doilea, toate coloanele. Astfel, prin instrucţiunea D=M(:,2), se extrage, din matricea M, o submatrice

D, care conţine toate liniile (datorită semnului „: ”) din coloana a 2-a, respectiv,

Generarea şi manipilarea vectorilor şi a matricelor 125

D = 2 6 10 14 18,

iar prin instrucţiunea E=M(3,:) se extrage matricea E, care conţine toate coloanele din linia 3,

E = 9 10 11 12.

Inversarea coloanelor unei matrice date M, se face cu instrucţiunea M=M(:,nc:-1:1), unde nc este numărul maxim de coloane, calculat prin instrucţiunea [nl,nc]=size(M). Pentru matricea anterioară, cu [nl,nc]=size(M) se obţine,

nl = 5 nc = 4,

astfel că, inversarea coloanelor se face prin instrucţiunea M=M(:,nc:-1:1), rezultând,

M = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20.

Pentru inversarea liniilor unei matrice date M, se utilizează instrucţiunea M=M(nl:-1:1,:), unde nl este numărul maxim de linii. Pentru matricea M iniţială se obţine,

M = 17 18 19 20 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4.

Crearea matricelor mari, precum şi manipularea acestora se poate face uşor, prin utilizarea unor vectori ca indici. De exemplu, cu instrucţiunea A(:, [2,4,6])=B(:,1:3) se înlocuiesc coloanele 2, 4 şi 6 ale matricei A cu primele 3 coloane ale matricei B.

Pentru extragerea din matricea M, obţinută anterior, a tuturor liniilor pentru care elementul dintr-o anumită coloană (fie aceasta 4), îndeplineşte o anumită condiţie (de exemplu este mai mare decât 6), se formează vectorul ajutător, pe care

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 126

îl notăm cu L, care conţine toate liniile şi coloana specificată, care îndeplinesc condiţia, cu instrucţiunea:

L=X(:,4) > 6, rezultând: L = 1 1 1 1 0. Acesta permite apoi identificarea elementelor matricei M, care îndeplinesc

condiţia pusă, prin instrucţiunea Y=M(L,:), rezultând matricea Y, de elemente: Y = 17 18 19 20 13 14 15 16 9 10 11 12 5 6 7 8. Duplicarea unei matrice A de M ori, pe linii şi N ori pe coloane, se realizează

cu instrucţiunea: B = repmat(A,M,N). De exemplu, dacă A=[1 2; 3 4], atunci instrucţiunea B = repmat(A,2,3), conduce la:

B = 1 2 1 2 1 2 3 4 3 4 3 4 1 2 1 2 1 2 3 4 3 4 3 4.

6.6. Matrice specializate

6.6.1. Companionul matriceal

Generarea companionului matriceal al unui polinom P, dat, se face cu instrucţiunea compan(p), unde p este un vector cu coeficienţii polinomiali scrişi în ordinea descrescătoare a puterilor.

Pentru polinomul:

)1()()1( ... )3()2()1()( 221++⋅+⋅−++⋅+⋅+⋅=

−− npxnpxnpxpxpxpxP nnn prima linie a companionulul este:

)1(

)1( ,

)1(

)( ,

)1(

)1( , ... ,

)1(

)3( ,

)1(

)2(

p

np

p

np

p

np

p

p

p

p +−−−−−−.

După cum se observă, prima linie a companionului este constituită din numere reprezentând câtul cu semn schimbat dintre coeficienţii polinomiali, începând cu puterea (n-1), până la termenul liber şi coeficientul polinomial al

Generarea şi manipilarea vectorilor şi a matricelor 127

puterii n. Valorile proprii ale companionului unui vector p, ai cărui coeficienţi

polinomiali sunt daţi de funcţia eig(compan(p)), sunt rădăcinile polinomului. Deci, pentru a determina rădăcinile r ale unui polinom, în Matlab, se poate

utiliza expresia r = eig(compan(p)). Pentru un polinom dat,

1)( 23+++= xxxxp ,

vectorul p, care conţine coeficienţii acestuia este, p = [1 1 1 1],

astfel încât, companionul polinomului, notat cu b, se determină cu, b=compan(p),

rezultând, b = [ -1 -1 -1 ; 1 0 0 ; 0 1 0 ]. Pentru determinarea rădăcinilor polinomului, notate cu r, se găsesc valorile

proprii ale acestuia cu relaţia, r=eig(b),

sau direct din vectorul p prin relaţia, r=eig(compan(p)),

rezultând rădăcinile polinomului: x = [ -1 +i –i].

6.6.2. Matricea Hadamard

Matricea Hadamard este o matrice pătrată neortogonală, cu toate elementele 1 sau –1, aşezate într-o astfel de succesiune încât, linia j este identică cu coloana j. Pentru a determina matricea Hadamard, pe care o notăm cu Ha, de ordinul n, se exectă comanda,

Ha=hadamard(n), unde ordinul n aparţine numerelor naturale pozitive şi trebuie să fie divizibil cu 4, adică rem(n,4)=0, sau ca n, n/12 ori n/20 să fie o putere a lui 2.

Pentru n=8, matricea Hadamard este Ha=hadamard(8), respectiv: Ha = 1 1 1 1 1 1 1 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1. Utilizarea practică a matricei Hadamard se găseşte în trasarea liniilor de

nivel cu funcţia contour(hadamard(n)), funcţia contour fiind folosită la trasarea

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 128

grafică a conturului. De exemplu, pentru matricea de mai sus, conturul este redat în figura 6.1.

1 2 3 4 5 6 7 8

1

2

3

4

5

6

7

8

Fig. 6.1. Conturul a 8 nivele.

O proprietate importantă a matricei Hadamard este că Ha'*Ha = n*eye(n).

Matricea Hadamard se poate ortogonaliza prin înmulţirea cu un scalar de

forma . ,2

1Nk

k∈ Prin urmare, pentru matricea anterioară, luând k=4, se obţine

matricea Hadamard ortogonalizată, Hao, cu instrucţiunea, Hao= 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5.

6.6.3. Matricea Hankel

Matricea Hankel este o matrice antisimetrică şi antidiagonală, generată cu una dintre sintaxele: H=hankel(c) sau H=hankel(c,l).

O matrice A este simetrică dacă matricea transpusă este egală cu matricea

Generarea şi manipilarea vectorilor şi a matricelor 129

iniţială (A'=A) şi antisimetrică, dacă transpusa este A' = - A. Este evident că o

matrice de mxn, definită prin jiaA ,= cu mi ,...,2,1= şi nj ,...,2,1= ,este

simetrică dacă ijji aa ,, = şi antisimetrică, dacă ijji aa ,, −= .

Atunci când funcţia hankel este apelată cu un singur vector ca argument, matricea returnată este o matrice Hankel pătrată, a cărei coloană şi primă linie sunt elementele vectorului argument şi toate elementele de sub antidiagonală sunt nule. Dacă c=[5 4 1 2 3], atunci matricea Hankel corespunzătoare va fi, H=hankel(c), respectiv,

H = 5 4 1 2 3 4 1 2 3 0 1 2 3 0 0 2 3 0 0 0 3 0 0 0 0,

de unde se observă că prima coloană şi prima linie sunt elementele vectorului argument c, iar toate elementele de sub prima antidiagonală sunt nule. Totodată, antidiagonalele paralele cu antidiagonala principală au aceleaşi elemente.

Dacă funcţia Hankel este apelată cu doi vectori ca argument, de dimensiuni m şi n, matricea returnată este o matrice Hankel, cu dimensiunea mxn. La această matrice, prima coloană este definită de primul vector argument, iar ultima linie este definită prin elementele celui de-al doilea vector argument. De menţionat că, ultimul element al primului vector (respectiv prima coloană) diferă de primul element al celui de-al doilea vector (ultima linie) ; elementul coloanei (primul vector) are prioritate faţă de elementul liniei. Pentru vectorii daţi:

c = [ 11 4 8] şi l = [ 2 7 9 3], se generează matricea Hankel cu instrucţiunea H=hankel(c,l), rezultând,

H = 11 4 8 7 4 8 7 9 8 7 9 3,

unde se observă prioritatea ultimului element al vectorului, care defineşte prima coloană, faţă de primul element al vectorului, care defineşte ultima linie.

6.6.4. Matricea Hilbert

Matricea Hilbert este o matrice slab condiţionată, ale cărei elemente sunt definite de relaţia:

.,...,2,1 ,,...,2,1 ,1

1)( mjni

jinHi ==

−+

= ,

fiind unul dintre cele mai faimoase exemple de matrice bandă. Dacă n=5, atunci matricea Hilbert va fi Hi=hilb(5), respectiv:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 130

Hi = 1 0.5 0.33333 0.25 0.2 0.5 0.33333 0.25 0.2 0.16667 0.33333 0.25 0.2 0.16667 0.14286 0.25 0.2 0.16667 0.14286 0.125 0.2 0.16667 0.14286 0.125 0.11111. O utilizare eficientă a matricei Hilbert se găseşte în înlocuirea buclele for şi

do prin segmente vectorizate.

6.6.5. Inversa matricei Hilbert

În general, inversa unei matrice se obţine prin următoarele operaţii:

1. se formează matricea care are ca elemente complemenţii algebrici ai elementelor matricei date;

2. se ia transpusa acesteia;

3. se împarte matricea obţinută cu determinantul matricei iniţiale. Principala proprietate a matricei inverse este aceea că produsul dintre o

matrice şi inversa sa este matricea unitate. Funcţia care calculează matricea Hilbert inversă, de ordinul n, este

invhilb(n). Pentru matricea Hilbert anterioară, Hi=hilb(5), matricea inversă este, iHi=invhilb(5),

respectiv, iHi = 25 -300 1050 -1400 630 -300 4800 -18900 26880 -12600 1050 -18900 79380 -117600 56700 -1400 26880 -117600 179200 -88200 630 -12600 56700 -88200 44100. Dacă se verifică proprietatea anterioară, se constată că Hi*iHi este practic

matricea unitate, respectiv eye(5), ans = 1 0 0 0 0 0 1 0 0 0 1.4211e-014 0 1 -3.638e-012 0 0 0 0 1 0 0 0 0 0 1. Se precizează că algoritmul implementat pentru inversarea matricei Hilbert

este deficitar pentru n>15 şi, prin aceasta, se atrage atenţia că este necesară o verificare atentă a algoritmilor de rezolvare şi condiţiilor de aplicare utilizaţi.

Pentru n=25, dacă se verifică proprietatea anterioară, d=hilb(25)*invhilb(25)-eye(25), se obţin valori total inacceptabile cu o diferenţă maximă de 3.4588e+018.

Generarea şi manipilarea vectorilor şi a matricelor 131

6.6.6. Pătratul magic

Pătratul magic de ordinul n, cu n>3, este o matrice de nxn, construită cu întregi de la 1 la n

2, care are suma elementelor de pe fiecare linie, coloană, diagonală şi anti-diagonală principală, egală. Pătratul magic are suma scalată dublu stocastic.

Funcţia care generează pătratul magic (matrice pe care o notăm cu Pmag) de ordinul n este: Pmg=magic(n). Perntru n = 5, se obţine:

Pmg = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9,

care are suma elementelor liniilor, coloanelor, diagonalei principale şi antidiagonalei, egală cu 65.

6.6.7. Matricea Pascal

Matricea Pascal conţine elementele triunghiului lui Pascal. Triunghiul lui

Pascal conţine coeficienţii binomiali ai descompunerii ( )n

ba + , respectiv:

( ) ,... 112121 nnn

n

n

n

n

n

nnbabCbaCbaCaba +++++=+

−−−

pentru orice număr natural n. De exemplu, triunghiul lui Pascal, cu coeficienţii descompunerii unui

polinom de ordinul patru, are următoarea formă: 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1.

Pentru numerotarea liniilor triunghiului lui Pascal, începând cu zero (ca în exemplu de mai sus), fiecare linie din triunghi va conţine numărul n şi coeficienţii

decompunerii binomului ( )n

ba + . De exemplu, linia 3 conţine coeficienţii

descompunerii binomului ( )3

ba + , respectiv 1, 3, 3, 1.

Funcţia Pascal se apelează cu sintaxa P=pascal(n). De multe ori, apelarea funcţiei Pascal se face cu una dintre sintaxele:

P1=abs(pascal(n,1)), sau, P2=abs(pascal(n,2)).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 132

Dacă n=5, atunci matricele Pascal de ordinul 5 sunt: P = 1 1 1 1 1 1 2 3 4 5 1 3 6 10 15 1 4 10 20 35 1 5 15 35 70, P1 = 1 0 0 0 0 1 1 0 0 0 1 2 1 0 0 1 3 3 1 0 1 4 6 4 1, P2 = 0 0 0 0 1 0 0 0 1 4 0 0 1 3 6 0 1 2 3 4 1 1 1 1 1. Matricea P1 conţine elementele triunghiului Pascal ordonate pe linie, în

partea triunghiulară, din colţul stâng. Dacă P1=pascal(n,1), atunci rezultă factorul Cholesky, ca o matrice triunghiulară inferioară.

Matricea P2 conţine elementele triunghiului lui Pascal ordonate pe coloană, în partea triunghiulară din colţul drept.

Pentru extragerea coeficienţilor descompunerii binomiale ( )9

ba + , se foloseşte secvenţa n=9; P=abs(pascal(n+1,1)); Coef=P(n+1,1:n+1), rezultând,

Coef = [ 1 9 36 84 126 126 84 36 9 1 ].

6.6.8. Matricea Rosser

Matricea Rosser este o matrice de 8x8 cu elemente întregi, fiind utilizată în algoritmii care lucrează cu valori proprii. Apelarea acestei matrice se face prin comanda rosser, rezultând:

ans = 611 196 -192 407 -8 -52 -49 29 196 899 113 -192 -71 -43 -8 -44 -192 113 899 196 61 49 8 52 407 -192 196 611 8 44 59 -23 -8 -71 61 8 411 -599 208 208 -52 -43 49 44 -599 411 208 208 -49 -8 8 59 208 208 99 -911 29 -44 52 -23 208 208 -911 99.

Generarea şi manipilarea vectorilor şi a matricelor 133

6.6.9. Matricea Toeplitz

Matricea Toeplitz, generată de funcţia toeplitz, este definită prin vectorii elementelor primei coloane şi ai primei linii. O matrice Toeplitz simetrică este definită doar de un singur vector ca argument. Funcţia toeplitz se poate apela cu una dintre sintaxele:

T1=toeplitz(c) sau

T2=toeplitz(c,l). Dacă matricea Toeplitz este generată de funcţia toeplitz(c), apelată cu un

singur vector argument, atunci matricea returnată este pătrată, având ca elemente ale primei linii şi primei coloane elementele vectorului argument, iar pe diagonala principală şi pe toate diagonalele paralele cu aceasta se găsesc elementele definite în linia sau coloana respectivă. De exemplu, dacă c=[1 2 3 4 5 6], atunci T1=toeplitz(c) , este:

T1 = 1 2 3 4 5 6 2 1 2 3 4 5 3 2 1 2 3 4 4 3 2 1 2 3 5 4 3 2 1 2 6 5 4 3 2 1. Matricea T1 este simetrică şi hermitică. Atunci când matricea Toeplitz este generată prin T2=toeplitz(c,l), matricea

generată este nesimetrică şi va avea dimensiunea mxn, unde m este lungimea vectorului c, iar n este dimensiunea vectorului l. La această matrice prima coloană este definită de primul vector argument (vectorul c), iar prima linie de elementele celui de-al doilea vector argument (vectorul l). Dacă primul element al primului vector (prima coloană) diferă de primul element al celui de-al doilea vector (prima linie), elementul coloanei are prioritate faţă de elementul liniei. De exemplu, dacă c=[1 2 3 4 5 6] şi l=[8 9 10 11], atunci T2=toeplitz(c,l) devine:

T2 = 1 9 10 11 2 1 9 10 3 2 1 9 4 3 2 1 5 4 3 2 6 5 4 3.

6.6.10. Matricea Vandermonde

Matricea Vandermonde este definită de expresia ( ) ( )jn

icjiV−

=, , unde c, este vectorul cu n elemente, asociat penultimei coloane. Coloana j a matricei

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 134

Vandermonde este A(:,j)=C^(n-j). Generarea matricei Vandermonde se face prin funcţia vander(c), unde c este un vector argument dat.

Dacă c = [1 2 3 4 5], atunci V = vander(c) este:

01234

01234

01234

01234

01234

55555

44444

33333

22222

11111

1525125625

141664256

1392781

124816

11111

V ==

6.6.11. Matricea Wilkinson

Matricea Wilkinson este o matrice larg utilizată în testarea valorilor proprii ale matricelor, fiind o matrice simetrică, tridiagonală, cu perechi de valori proprii.

Matematric, matricea Wilkinson de ordinul n are elementele definite prin relaţia:

( )

+=

=

+

=

altfel ,

j i ,

j, iin-

i,jW

0

1 12

12

.

Generarea matricei Wilkinson se face cu comanda W=wilkinson(n), unde n este ordinul. Cea mai frecventă matrice Wilkinson este cea de ordinul 7, generată prin wilkinson(7) şi având ca rezultat

ans = 3 1 0 0 0 0 0 1 2 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 2 1 0 0 0 0 0 1 3. O altă matrice Wilkinson, frecvent utilizată, este cea de ordinul 21, generată

cu instrucţiunea wilkinson(21).

6.6.12. Matrice de testare

Pentru testarea tipurilor de matrice se utilizează instrucţiunea gallery, apelată cu sintaxa :

[out1,out2,...] = gallery('matname', param1, param2, ...),

Generarea şi manipilarea vectorilor şi a matricelor 135

unde : out1,out2 sunt parametrii de ieşire, 'matname' este unul dintre numele de matrice de mai jos, iar param1, param2 sunt parametrii de intrare.

Sunt disponibile următoarele tipuri de matrice, 'matname' , respectiv : cauchy, chebspec, chebvand, chow, circul, clement, compar, condex, cycol, dorr, dramadah, fiedler, forsythe, frank, gearmat, grcar, hanowa, house, invhess, invol, ipjfact, jordbloc, kahan, kms, krylov, lauchli, lehmer, lesp, lotkin, minij, moler, neumann, orthog, parter, pei, poisson, prolate, randcolu, randcorr, rando, randhess randsvd, redheff, riemann, ris, rosser, smoke, toeppd, tridiag, triw, vander, wathen, wilk.

În plus , gallery (3) este o matrice bandă condiţionată de 3 x 3, iar gallery(5) este utilă în problemele cu valori proprii, găsind uşor vectorii şi valorile proprii.

6.7. Instrucţiuni, variabile şi constante specifice

Instrucţiunea end este utilizată pentru încheierea ciclurilor „for”, „while”, „switch”, „try” şi a segmentului de comandă „if”. Fără această instrucţiune, după una dintre comenzile for, while, switch, try sau if, se aşteaptă introducerea unei linii de comenzi Matlab pentru a face parte din corpul de instrucţiuni precizate anterior. Fiecare end introdus încheie ultima comandă for, while, switch, try sau if tastată.

De menţionat că end este şi ultimul index al unui vector sau matrice, notată cu X, adică end = size(X,k), unde k este indexul coloanei, pentru matrice.

De exemplu, dacă X=[1 2 3 4 5 6 7 0 8 9], atunci elementul al treilea, începând de la sfârşit spre început, se află cu comanda X(end-2), rezultând 0.

Dacă considerăm vectorul A=[1 2 3 4; 5 6 7 8; 9 10 11 12], atunci: • A(end), este ultimul element al matricei A, respectiv, 12; • A(1,end), este ultimul element al liniei 1, respectiv 4; • A(end,1), este ultimul element al coloanei 1, respectiv 9; • A(2,3:end) prezintă elementele liniei 2 de la coloana 3 până la ultima

coloană, respectiv 7 şi 8.

Atunci când unei expresii nu i se asociază nici o variabilă, Matlabul creează automat variabila de lucru ans, care va avea întotdeauna ultima valoare calculată. În această variabilă ans, creată automat, este returnat rezultatul calculelor expresiei.

Variabila permanentă, în care este memorată eroarea relativă pentru calculele efectuate în virgulă mobilă, este eps. Valoarea implicită este eps=2.2204e-016, dar poate fi redefinită la oricare altă valoare, prin instrucţiunile pinv şi rank.

Cea mai mare valoare pozitivă în virgulă mobilă, care poate fi folosită în calcule, este memorată în variabila realmax, având valoarea 1.7977e+308.

Cea mai mică valoare pozitivă în virgulă mobilă, care poate fi folosită în

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 136

calcul, respectiv 2.2251e-308, este memorată în variabila realmin.

Variabilei matematice cunoscute π , îi este asociată variabila permanentă pi, cu valoarea: pi = 4*atan(1) = imag(log(-1)) = 3.1415926535897....

Pentru introducerea numerelor complexe, ca de exemplu,

iz 21121 +=−+= , se utilizează pentru partea imaginară, ca variabile

predefinite i sau j, .1−== ji Este posibil ca variabilei imaginare să îi fie

ataşată o variabilă predefinită utilizării sale, de exemplu , sz 21+= .

Pentru reprezentarea lui ∞+ în aritmetica IEEE, rezultat al împărţirii 0

1 sau

al depăşirii celui mai mare număr, la operaţia de ridicare la putere 1000e , se

foloseşte variabila inf.

Variabila pentru reprezentarea lui Not-a-Number (NaN), în aritmetica IEEE,

rezultat al împărţirii nedefinite 0

0, sau

∞ este notată NaN.

Testarea dacă elementele unui vector sau matrice sunt NaN se face cu funcţia isnan.

Pentru o matrice dată oarecare X, prin comanda Y=isnan(X) se returnează o matrice Y, de aceleaşi dimensiuni cu matricea argument X, având 1 pe poziţia în care elementele maticei X sunt NaN şi 0, în caz contrar.

De exemplu, dacă X=[-15 NaN 20; 2 pi Inf; -Inf 0 NaN], prin instrucţiunea Y=isnan(X), se obţine:

Y = 0 1 0 0 0 0 0 0 1.

Testarea şi determinarea poziţiei elementelor infinite dintr-o matrice sau

vector se face cu funcţia isinf, apelată cu sintaxa Y=isinf(X). În matricea Y, de aceleaşi dimensiuni cu matricea iniţială X, se returnează 1

pe poziţia elementelor infinite din X şi 0, în caz contrar. Pentru matricea X de mai sus, prin comanda Y=isinf(X) se obţine: Y = 0 0 0 0 0 1 1 0 0.

Determinarea poziţiei elementelor finite dintr-o matrice sau vector se face cu

funcţia isfinite, apelată cu sintaxa Y=isfinite(X). În matricea Y, de aceleaşi dimensiuni cu matricea iniţială X, se returnează 1

Generarea şi manipilarea vectorilor şi a matricelor 137

pe poziţia elementelor finite din X şi 0, în caz contrar. Pentru matricea X de mai sus, prin comanda Y=isinf(X) se obţine: Y = 1 0 1 1 1 0 0 1 0.

Funcţia flops, returnează numărul de operaţii în virgulă mobilă efectuate de calculator.

Adunările şi scăderile sunt contorizate, fiecare câte o operaţie, dacă se efectuează între numere reale, şi două operaţii, dacă se efectuează între valori complexe.

Înmulţirile şi împărţirile sunt considerate fiecare câte o operaţie, dacă rezultatul este real şi 6 operaţii, dacă acesta este complex.

Aducerea la zero a contorului operaţiilor efectuate se realizează prin comanda flops(0).

7. ALGEBRĂ NUMERICĂ LINIARĂ

7.1. Analiză matriceală

De notat că, în MATLAB, indicii matricei încep întotdeauna cu 1 şi nu cu 0; de aici rezultă că elementele matricei A(1, 1), B(1, 1) şi C(1, 1) corespund mulţimilor matematice (elementele matricelor) A(0, 0), B(0, 0) şi C(0,0).

7.1.1. Urma unei matrice

Urma unei matrice A, AUr , este, prin definiţie, suma elementelor de pe diagonala principală,

∑=

=

n

i

iia1

,Ur A .

Urma produsului a două matrice este independentă de ordinea factorilor,

)(Ur )(Ur ,1

,1

,1

,1

ABBA ⋅=⋅=⋅=⋅ ∑∑∑∑====

ji

n

i

ij

n

j

ij

n

j

ji

n

i

bbba .

De meţionat că urma unei matrice este nealterată de o transformare ortogonală şi că aceasta este totodată şi suma valorilor proprii ale lui A.

În Matlab, se calculează cu funcţia trace(A), care este similară cu sum(diag(A)).

Considerând matricea A=[1 2 3; 4 5 6; 7 8 9], atunci urma acesteia, calculată cu trace(A), este 15, la fel ca şi cu sum(diag(A)).

7.1.2. Calculul normelor vectorilor şi ale matricelor

Conceptele de normă vectorială, normă matriceală şi rază spectrală a unei matrice, joacă un rol important în analiza matriceală.

Prin definiţie, norma euclidiană sau lungimea vectorului x este

( )

1/2n

1i

2i

1/2x

=⋅= ∑

=

xxx T

unde x şi xT sunt, prin definiţie:

[ ]nT

n

xxx

x

x

x

... ,... 21

2

1

=

= xx .

Normele vectorilor şi ale matricelor se calculează cu funcţia norm, apelată cu una dintre sintaxele:

Algebră numerică liniară 139

n=norm(X) sau n=norm(X,p), unde p=1, 2, inf, sau fro.

Pentru o matrice, X, sunt definite următoarele tipuri de norme: � norma 1 a lui X, respectiv cea mai mare sumă a elementelor de pe

coloană, Nj1cu ,xmaxXN

1kjk ≤≤

= ∑

=

, calculată cu funcţia

norm(X,1), care este egală cu max(sum(abs((X)))); � norma 2, sau raza spectrală a lui X, definită prin aceea că toate valorile

proprii (reale, pentru matrice real simetrice şi complexe, pentru matrice real nesimetrice) se înscriu într-un cerc, de rază egală cu maximul valorilor proprii în modul, într-un plan (real sau complex), cu centrul în origine, respectiv ( ) Ni1cu ,λmaxXρX i2

≤≤== , unde ρ este raza

spectrală, iar iλ sunt valorile singulare, calculată cu funcţia norm(X) sau norm(X,2), egală cu max(svd(X));

� norma infinită a lui X, sau cea mai mare sumă a elementelor de pe

linie, respectiv Nk1cu ,xmaxXN

1jjk ≤≤

= ∑

=

, calculată cu

funcţia norm(X,inf), egală cu max(sum(abs((X')))) ; � norma Frobenius, calculată cu funcţia norm(X,’fro’), definită cu

relaţia 2

NN

2

22

2

11

N

1kj,jkF

...xX xxx +++=

= ∑

=

şi egală cu

sqrt(sum(diag(X'*X))).

Pentru cazul matricelor rare (sparse) sau foarte mari, se recomandă utilizarea funcţiei normest(X), în locul funcţiei norm(X), sau norm(X,2). Această funcţie se poate utiliza sub forma [nrm,cnt] = normest(X,tol), unde nrm – norma, cnt – numărul de iteraţii, iar tol – eroarea relativă, având valoarea implicită 10-6.

Considerând matricea X=[1 2 3; 4 5 6; 7 8 9], atunci: norm(X)= 16.8481; norm(X,1)=18; norm(X,2)= 16.8481; norm(X,'fro')= 16.8819; norm(X,inf)=24, iar [nrm,cnt] = normest(X,1e-9) conduce la nrm=16.8481, cnt=4.

Pentru un vector V, pot fi definite următoarele tipuri de norme: � norma, norma 2 sau lungimea vectorului definită de relaţia

2

N

2

2

2

1

2N

1kk2

V...VVVV +++=

= ∑

=

se calculează cu

funcţia norm(V) sau norm(V,2) ; � norma de gradul p sau lungimea de ordinul p, definită cu relaţia

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 140

p p

N

p

2

p

1p

pN

1kkp

V...VVVV +++=

= ∑

=

, se calculează cu

norm(V,p), egală cu sum(abs(V).^P)^(1/P);

� valoarea maximă în modul, respectiv ( ) Nk1 ,VmaxV k ≤≤=∞

,

este calculată cu funcţia norm(V,inf) ;

� valoarea minimă în modul, respective ( ) Nk1 ,VminV k ≤≤=∞−

,

este calculată cu funcţia norm(V,-inf) .

Considerând vectorul V=[-10 –12 0 11 15 25], atunci: norm(V)=34.8569; norm(V,2)= 34.8569; norm(V,3)= 28.4630; norm(V,inf)=25; norm(V,-inf)=0.

7.1.3. Determinantul unei matrice

O matrice pătrată este o matrice care are numărul de linii egal cu numărul de coloane. Dacă tipul său este {n, n}, se spune că matricea este de ordinul n. Fie o matrice pătrată de ordinul n, [ ]

ijaA = , cu elementele în R (sau C).

Determinantul format cu elementele maticei [ ]ijaA = , păstrându-le

poziţia, se numeşte determinantul matricei A şi se notează cu

[ ]ijij aAaA det,det,, , fiind calculat în Matlab cu funcţia det(A).

Considerând matricele A=[1 2; 3 4] şi B=[1 2 3; 4 5 6; 7 8 9], determinanţii acestora sunt: det(A)=-2 şi det(B)=0.

O matrice B se numeşte singulară dacă det(B)=0, iar dacă determinantul det(A)≠0, matricea A este nesingulară (sau nedegenerată).

Determinantul produsului a două matrice pătrate, de ordinul n, este egal cu produsul determinanţilor celor două matrice,

det(A*B)=det(B*A)=det(A)*det(B) .

7.1.4. Rangul unei matrice

Considerăm o matrice A, dreptunghiulară, mxn şi p, un număr natural,

astfel încât, nmp ,≤ . Dacă alegem din A, p linii piii ,...,, 21 şi p coloane

pjjj ,...,, 21 , oarecare, obţinem, înlăturând elementele matricei care nu se găsesc pe liniile şi coloanele alese, o matrice pătrată, M, de ordinul p

( ),min( ,,...,2,1 nmqqp == ,

Algebră numerică liniară 141

=

pppp

p

p

jijiji

jijiji

jijiji

aaa

aaa

aaa

M

...

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

...

...

21

22212

12111

.

În modul acesta, cu liniile şi coloanele matricei A se poate forma un număr

de ( ) ( )!!!!

!!

pnppmp

nmCC p

n

n

m−−

= matrice de ordinul p. Determinanţii acestor

matrice se numesc determinanţii de ordinul p ai matricei A. Dacă 0A ≠ , atunci nu toţi aceşti determinanţi sunt nuli.

Se observă că, dacă toţi determinanţii de ordinul s sunt nuli, atunci toţi determinanţii de ordin superior lui s sunt nuli, deoarece, dezvoltând determinanţii de ordinul s+1, de exemplu, după o linie sau coloană, coeficienţii elementelor respective sunt determinanţi de ordinul s, care sunt nuli. Dacă 0A ≠ , există un număr ),min( nmqr =≤ , astfel încât cel puţin un determinant al matricei A, de ordinul r, este diferit de zero şi toţi determinanţii de ordin r+1 sunt nuli. Numărul

r, care îndeplineşte această condiţie, se numeşte rangul matricei A. Dacă A=0, rangul matricei A este zero, r=0.

Calculul rangului se efectuează cu funcţia r=rank(A) sau r=rank(A,tol), unde tol este eroarea relativă, având valoarea implicită 10-6 sau tol = max(size(A)) * norm(A) * eps.

De exemplu, dacă A=[2 3 1 4 -1; 1 4 -2 1 6; 1 -1 3 3 -7], atunci rangul matricei este rank(A)=2. Toţi determinanţii de ordinul trei sunt nuli, deoarece, dacă în matricea A scădem linia a doua din linia întâi, obţinem linia a treia. Această operaţie, fiind efectuată în toţi determinanţii de ordinul trei, arată că toţi sunt nuli. Rangul matricei este doi, deoarece matricea formată cu primele două linii şi coloane, [2 3; 1 4], are determinantul diferit de zero.

Rangul matricei este egal cu ordinul determinantului.

7.1.5. Matricea transpusă

Considerând [ ]ijaA = , o matrice nm × , deci njmi ,...2,1 ,,...,2,1 == ,

atunci, prin definiţie, matricea care se obţine din A, prin înlocuirea liniilor cu coloanele de acelaşi rang, se numeşte matricea transpusă şi se notează cu At sau AT, iar în Matlab se calculează şi se notează cu A' sau transp(A). Pentru transpusa neconjugată, se utilizează transpose(A).

Din definiţie rezultă că [ ]jit aA = , minj ,...,2,1 ,,...2,1 == . Dacă,

B = [ 2 3 1 4 -1 1 4 -2 1 6 1 -1 3 3 -7 ],

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 142

atunci: B' = [ 2 1 1 3 4 -1 1 -2 3 4 1 3 -1 6 -7]. O matrice pătrată A, se spune că este simetrică dacă elementele simetrice

faţă de diagonala principală sunt egale, jiij aa = şi că este antisimetrică dacă

jiij aa −= . Prin urmare:

� o matrice simetrică este egală cu transpusa sa, deoarece jiij aa = ;

� într-o matrice antisimetrică, elementele de pe diagonala principală sunt nule, 0=iia (pentru a putea satisface definiţia jiij aa −= ) ;

� transpusa unei matrice antisimetrică este opusa matricei iniţiale, A'= -A; � dacă A'= -A atunci, matricea A este antisimetrică ; � traspusa transpusei este matricea iniţială, (A') ' = A ; � transpusa sumei a două matrice este suma transpuselor, (A+B) '=A'+B' ; � transpusa produsului a două matrice este (A*B) '= B' * A'; � orice matrice pătrată poate fi considerată ca suma a două matrice, una

simetrică, cealaltă antisimetrică, iar această descompunere este unică.

Dată fiind o matrice, cu un număr oarecare de linii sau coloane, ale cărei elemente sunt numere reale sau complexe, conjugata sa este matricea formată prin înlocuirea fiecărui element cu imaginarul său conjugat. În matematica clasică, se utilizează notaţia A*.

Matricea adjunctă a unei matrice este conjugata transpusei sale. Conjugata unei matrice este obţinută prin înlocuirea fiecărui element cu imaginarul său conjugat.

În general, un număr complex, Z, este scris ca suma dintre o parte reală şi una imaginară,

Z = x + i*y = real(Z) + i*imag(Z) astfel încât, conjugatul lui Z este:

conj(Z) = x - i*y = real(Z) - i*imag(Z) De exemplu, pentru matricea X, X = [1+i 2-i ; 3+2*i 1-2*i]

conjugata este, conj(X) = [1 - i 2 + i; 3 – 2 i 1 + 2 i].

Se numeşte matrice reală, o matrice care are toate elementele numere reale. Ţinând seama de cele anterioare, rezultă că o matrice reală este egală cu

conjugata sa şi, reciproc, dacă o matrice este egală cu conjugata sa, matricea este reală.

Matricea conjugată are următoarele proprietăţi evidente:

Algebră numerică liniară 143

• conj(X+Y)=conj(X)+conj(Y) - conjugata sumei a două matrice este egală cu suma conjugatelor;

• conj(X*Y)=conj(X)*conj(Y) – conjugata produsului este produsul conjugatelor;

• transpose(conj(X))= conj(transpose(X)) şi totodată conj(X')= (conj(X))'; • conj(conj(X)) = X.

Matricea adjunctă a unei matrice este conjugata transpusei sale. Dacă, X =[ 1.0000 + 1.0000i 2.0000 - 1.0000i 3.0000 + 2.0000i 1.0000 - 2.0000i ]

transpusa acestei matrice (neconjugată) este, XT=transp(X) = [ 1.0000 + 1.0000i 3.0000 + 2.0000i 2.0000 - 1.0000i 1.0000 - 2.0000i ] iar conjugate transpusei este, Xa=conj(XT)=conj(transp(X)) = X' = [ 1.0000 - 1.0000i 3.0000 - 2.0000i 2.0000 + 1.0000i 1.0000 + 2.0000i ] care este matricea adjunctă, notată X+, care se vede că în Matlab este: X+ = X'.

Din proprietăţile matricelor transpuse şi ale matricelor conjugate, rezultă proprietăţile:

• (X+Y)' = X'+Y' ; • (X*Y)' = Y'*X' ; • (X')' = X .

Se numeşte matrice hermitică sau autoadjunctă, o matrice pătrată care este egală cu adjuncta sa, Z+ =Z = Z' . În particular, matricea hermitică are toate elementele de pe diagonala principală reale, iar cele simetrice faţă de această diagonală sunt imaginar conjugate.

Următoarele matrice sunt hermitice sau autoadjuncte: Z=[ 1 1-i ; 1+i -3], ZZ=[3 -i 2+3*i ; i 0 5 ; 2-3*i 5 1]. Principalele proprietăţi ale matricelor hermitice sunt:

• dacă o matrice hermitică are toate elementele reale, matricea este simetrică, adică aij = aji ;

• suma a două matrice hermitice este tot o matrice hermitică; • produsul a două matrice hermitice este tot o matrice hermitică, dacă şi

numai dacă, cele două matrice sunt permutabile.

7.1.6. Matricea inversă şi pseudoinversă

Pentru o matrice pătrată [ ]ijaA = , de ordinul n, nesingulară, deci det(A)≠0,

matricea de ordinul n este

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 144

=

=−

A

A

A

A

A

A

A

A

A

A

A

A

A

AA

A

A

A

A

A

Aji

nnnn

n

n

det

det...

detdet

............det

...detdet

det...

detdet

21

22212

12111

1 ,

unde jiA este complementul algebric al lui ija , din determinantul [ ]ija şi se numeşte

matricea inversă a matricei A, fiind notată cu A-1. Notarea matricei inverse cu A-1 este justificată prin faptul că, în compunerea transformărilor A şi A-1, acestea se comportă ca puterile unui număr real sau complex, dacă convenim să notăm transformarea unitate i, cu A0, A-1*A = A*A-1 = A0 = I = [1] , respectiv, inv(A)*A = A*inv(A) = ones(size(A)) .

Principalele proprietăţi ale matricei inverse sunt: • A-1*A = A*A-1 = A0 = I = [1] - produsul dintre o matrice şi inversa sa este

egal cu matricea unitate; • reciproc, dacă avem două matrice, astfel încât A*B = I =[1], atunci una

este inversa celeilalte; • det(A-1) = det(inv(A)) = 1/det(A) - inversa unei matrice proprii este tot o

matrice proprie; • (A-1)-1 = inv(inv(A)) = A - inversa matricei inverse este matricea iniţială; • (A*B)-1 = B-1 * A-1 , respectiv inv(A*B) = inv(B)*inv(A)

Fie matricele, A = [ cos (pi/3) -sin (pi/3) ; sin (pi/3) cos (pi/3) ]; B= [ 1 -1 i ; 0 1 0 ; i 3 1] ,

transpusele sunt, A' = [ cos (pi/3) sin (pi/3) ; -sin (pi/3) cos (pi/3) ] B' = [ 1 0 -i ; -1 1 3 ; -i 0 1 ]

iar inversele sunt, inv(A) = ( A-1 ) = [ cos (pi/3) sin (pi/3) ; -sin (pi/3) cos (pi/3) ] inv(B) = ( B-1 ) = [0.5 0.5 + 1.5 i - 0.5 i ; 0 1 0; - 0.5 i -1.5-0.5 i 0.5 ]

de unde se verifică uşor că A*inv(A) = [1] şi B*inv(B) = [1] . Instrucţiunea inv(X), returnează un mesaj de avertizare, dacă matricea X

este singulară sau bandă.

Pseudoinversa sau inversa generalizată, Moore-Penrose, a unei matrice, se calculează cu funcţia pinv, apelată cu sintaxa:

B=pinv(A),

Algebră numerică liniară 145

sau B=pinv(A,tol),

unde tol este toleranţa, care are valoarea implicită (când lipseşte la apelare), tol = max(size(A)) * norm(A) * eps, cu eps, depinzând de acurateţea calculelor în virgulă mobilă.

Se utilizează, de regulă, pentru rezolvarea sistemelor de ecuaţii liniare, în sensul celor mai mici pătrate.

Matricea B este de aceleaşi dimensiuni ca şi matricea A' şi verifică patru condiţii:

A∗B∗A = A B∗A∗B = B A∗B este hermitică B∗A este hermitică. De exemplu, calculul pseudoinversei matricei A=[1 2 3; 4 5 6; 7 8 9],

conduce la, B = pinv(A) = [ -0.6389 -0.1667 0.3056 -0.0556 0.0000 0.0556 0.5278 0.1667 -0.1944 ], A*B*A = A = [ 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 ] B*A*B = B = [ -0.6389 -0.1667 0.3056 -0.0556 0.0000 0.0556 0.5278 0.1667 -0.1944 ]

iar A*B şi B*A sunt matrice hermitice şi în acest caz sunt egale între ele fiind, [ 0.8333 0.3333 -0.1667 0.3333 0.3333 0.3333 -0.1667 0.3333 0.8333 ].

Dacă matricea A este pătrată şi nesingulară, funcţia pinv(A) consumă un timp de calcul mai mare decât inv(A).

Dacă matricea A nu este pătrată sau este pătrată şi singulară, atunci nu există inversă, inv(A). În acest caz, pinv(A) are unele, dar nu toate, proprietăţi ale lui inv(A).

Dacă matricea A are mai multe rânduri decât coloane şi rangul matricei este mai mic decât minimul dintre rânduri şi coloane, atunci problema celor mai mici pătrate, de minimizare a norm(A*x-b), nu are soluţie unică. Se obţin două infinităţi de soluţii date de:

x=pinv(A)*b şi

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 146

y=A\b, care se disting prin aceea că norm(x) este mai mică decât norma oricărei alte soluţii, iar y are, pe cât posibil, componente diferite de zero.

De exemplu, matricea generată de, A = magic(8); A = A(:,1:6)

este o matrice de 8-pe-6 care are rank(A) = 3. A = [ 64 2 3 61 60 6 9 55 54 12 13 51 17 47 46 20 21 43 40 26 27 37 36 30 32 34 35 29 28 38 41 23 22 44 45 19 49 15 14 52 53 11 8 58 59 5 4 62 ]

Termenul liber, din partea dreaptă, este: b = 260*ones(8,1) = [ 260; 260; 260; 260; 260; 260; 260; 260 ].

7.1.7. Bază ortogonală şi bază ortonormală

După cum se cunoaşte, doi vectori x, y sunt ortogonali, dacă produsul lor scalar este nul.

Înt-un spaţiu euclidian, real sau complex, deseori se preferă ca bază un sistem de vectori, neee ,...,, 21 , ortogonali doi câte doi , având fiecare norma egală cu 1,

( )

=

=

ji

jiee ji daca ,1

daca ,0, .

Dacă numai prima condiţie este îndeplinită, se spune că neee ,...,, 21 formează o bază ortogonală. Dacă sunt îndeplinite amândouă condiţiile, baza este ortonormală.

Cu vectorii unei baze oarecare, nuuu ,...,, 21 , se poate construi întotdeauna o bază ortonormală,

( )

=

=

ji

jiuu ji daca ,1

daca ,0,

iar vectorii bazei sunt ortogonali doi câte doi şi au norma ( ) 1, == iii uuu .

În Matlab, funcţia care realizează o bază ortogonală pentru o matrice A este orth(A). Ea se apelează cu sintaxa:

Q=orth(A), în care numărul de coloane ale lui Q este egal cu rangul matricei A.

Baza ortogonală are proprietatea că Q'*Q = I .

Algebră numerică liniară 147

Obţinerea unei baze ortogonale, Z, pentru un spaţiu nul al matricei A, prin descompunerea în valori proprii, se face prin funcţia null, apelată prin:

Z = null(A) sau Z=null(A, 'r') unde r este o bază raţională având elemente mici întregi, astfel încât A*Z să aibă elemente neglijabile, size(Z,2) = 1, iar Z'*Z = I.

De exemplu, dacă A=[1 2 3;4 5 6; 7 8 9]

atunci, z=null(A) = [ -0.4082 ; 0.8165 ; -0.4082 ] size(z,2)= 1 z'*z = 1 z=null(A,'r') = [ 1 ; -2 ; 1 ] Descompunerea unei matrice, A, în vederea determinării rangului, se face

cu funcţia rref, apelată cu sintaxa, [R,jb] = rref(A) su [R,jb] = rref(A,TOL)

unde r=length(jb) este rangul matricei A, A(:,jb) este matricea luată ca bază la determinarea rangului; R(1:r,jb) este matricea identitate de r x r; x(jb), sunt numărul de variabile independente; TOL este toleranţa impusă la determinarea rangului.

Dacă A=[1 2 3 4; 5 6 7 8; 9 10 11 12 ; 13 14 15 16; 17 18 19 20] atunci prin comanda,

[R,jb]=rref(A) rezultă:

R=[ 1 0 -1 -2 ; 0 1 2 3 ; 0 0 0 0 ; 0 0 0 0 ; 0 0 0 0 ] jb=[ 1 2 ] ; R(1:2,jb) = [ 1 0 ; 0 1 ] A(:,jb) = [1 2 ; 5 6 ; 9 10 ; 13 14 ; 17 18 ].

Unghiul dintre două subspaţii este calculat cu funcţia subspace. Prin urmare, subspace(A,B) dă unghiul dintre coloanele matricei A şi matricei B.

Atunci când A şi B sunt vectori de lungime unitară, atunci subspace(A,B) este identic cu acos((A'*B).

Dacă unghiul este mic, atunci cele două subspaţii sunt practic liniar dependente. Funcţia este utilă pentru evidenţierea diferenţelor ce nu sunt cauzate de fluctuaţia erorilor statistice, în două experimente succesive (A şi B), aplicate aceluiaşi fenomen fizic.

7.2. Condiţionarea unei matrice

Importanţa cunoaşterii condiţionării unei matrice rezidă în faptul că rezultatele obţinute prin calcul numeric au întotdeauna erori de rotunjire, fiind, prin urmare, soluţiile unei probleme perturbate.

Determinarea condiţionării are la bază teoria matematică a perturbaţiilor. Se spune că o funcţie f(x) este rău condiţionată, dacă pentru un x1, apropiat de x,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 148

funcţia f(x1) diferă mult de f(x). Invers, o funcţie se spune că este bine condiţionată, dacă pentru un x1 apropiat de x, funcţia f(x1) este apropiată de f(x). Din păcate, termenii apropiaţi sunt calitativi şi, pentru a putea fi cuantificaţi, este necesară utilizarea numerelor de condiţionare.

Numărul de condiţionare al unei matrice indică sensibilitatea soluţiei unui sistem de ecuaţii liniare şi dă indicaţii despre precizia rezultatelor la inversarea matricelor şi la rezolvarea ecuaţiilor liniare. O matrice bine condiţionată este o matrice relativ insensibilă la aceste mici perturbaţii.

Numărul de condiţionare al unei matrice, calculat ca raportul dintre cea mai mare şi cea mai mică valoare singulară a acesteia, se determină cu funcţia cond, care se apelează cu sintaxa:

c=cond(X,p) unde c este numărul de condiţionare al matricei X, în norma p, care poate fi 1, 2, inf sau 'fro', după norma calculată, astfel încât, norm(X,p) * norm(inv(X),p).

O funcţie mai performantă, care calculează numărul de condiţionare, c, după un algoritm din codul de calcul LAPACK, este rcond, care se apelează cu sintaxa:

c=rcond(X).

Estimarea celui mai mic număr de condiţionare se realizează cu funcţia condest, care se apelează cu sintaxa: c = condest(X).

Dacă considerăm, iniţial, sistemul de ecuaţii:

=⋅+

=⋅+⋅

095.1152.1

543.6917.66

21

21

xx

xx

şi un sistem “perturbat”,

=⋅+

=⋅+⋅

095.1152.1

543.6912.66

21

21

xx

xx

atunci, cu secvenţa Matlab, A1=[6 6.917; 1 1.152]; A2=[6 6.912; 1 1.152]; c1=cond(A1);

c2=cond(A2); d1=condest(A1);d2=condest(A2);r1=rcond(A1);r2=rcond(A2);

se obţine: c1 = 1.7234e+004, c2 = 3.1875e+016, d1 = 2.0845e+004, d2 = Inf, r1 = 4.7972e-005, r2 = 0,

de unde rezultă că sistemul este rău-condiţionat. Dacă se rezolvă cele două sisteme (iniţial si perturbat), folosind secvenţa, A1=[6 6.917; 1 1.152]; A2=[6 6.912; 1 1.152]; b=[6.543; 1.095]; x1=A1\b; x2=A2\b;

Algebră numerică liniară 149

se obţin soluţiile: x1=[ 7.3158 -5.4000] ; x2= [Inf Inf]; de unde se observă diferenţele foarte mari între acestea, datorate slabei condiţionări.

7.3. Generarea unei matrice rare

Generarea unei matrice rare şi afişarea coeficienţilor se realizează cu funcţia sparse, care se apelează cu una dintre sintaxele:

• S = sparse(A), transformă o matrice plină într-o formă rară, înlăturând toate elementele egale cu zero, iar dacă o matrice S este deja rară, atunci sparse(S) înapoiază tot S ;

• S = sparse(i,j,s,m,n,nzmax), foloseşte vectorii i, j şi s pentru a genera matricea de m x n, de forma S(i(k),j(k)) = s(k), cu spaţii alocate pentru nzmax, diferit de zero ; vectorii i, j, şi s au toţi aceeaşi lungime, dar sunt mai mici decât 2^31-1, iar oricare element din s, ce apare şi în i sau j, este adăugat ;

• S= sparse(i,j,s,m,n), foloseşte nzmax = length(s) ; • S =sparse(i,j,s), foloseşte m = max(i) şi n = max(j), calculaţi înainte să fie

înlăturate zerourile, deci una dintre coloanele [i j s] poate fi [m n o] ; • S= sparse(m,n) sau sparse([],[],[],m,n,0), generează ultima matrice rară, de

forma m x n.

Aplicarea operatorilor specifici Matlab (aritmetici, logici, etc.) pe matricea rară, detemină apariţia unei matrice rare, iar în cazul unor combinaţii de matrice rare şi întregi, se va obţine o matrice întreagă.

Excepţiile apar atunci când rezultatul este o structură rară; de exemplu, A.*S este cel puţin o matrice rară ca şi S.

De exemplu, S = sparse(1:n,1:n,1)

generează o reprezentare rară, de forma n x n, faţă de S = sparse(eye(n,n)) care va genera o matrice completă, n x n, cu multe dintre elementele sale egale cu zero.

Utilitatea matricelor rare se relevă la matrice foarte mari, ca de exemplu, cazul unei matrice B = sparse(10000,10000,pi), cu care poate opera Matlabul, pe când cu matricea completă, full(B), nu poate opera, datorită memoriei insuficiente, aceasta necesitând 800 megabytes.

Reasamblarea unei matrice rare se face prin succesiunea de instrucţiuni, [i,j,s] = find(S); [m,n] = size(S); S = sparse(i,j,s,m,n);

sau, dacă ultima linie şi coloană are elemente diferite de zero, [i,j,s] = find(S); S = sparse(i,j,s).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 150

7.4. Ecuaţii liniare

Fie sistemul de ecuaţii liniare:

111111 ...... bxaxaxa nnjj =⋅++⋅++⋅

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

ininjiji bxaxaxa =⋅++⋅++⋅ ......11

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

mnmnjmjm bxaxaxa =⋅++⋅++⋅ ......11

de m ecuaţii liniare cu n necunoscute, m şi n fiind două numere naturale oarecare. Dacă notăm,

;

....

....

B ;

....

....

X ;

......

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

......

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

......

A

11

1

1

1111

=

=

=

m

i

n

j

mnmjm

iniji

nj

b

b

b

x

x

x

aaa

aaa

aaa

atunci sistemul de ecuaţii liniare se poate scrie, matriceal, sub forma: A*X = B.

Un şir ordonat de numere, 002

01 ,...,, nxxx , care satisfac relaţiile:

; ,...,2,1 ; ...... 00011 mibxaxaxa ininjiji ==⋅++⋅++⋅

se numeşte soluţie a sistemului. Numerele 002

01 ,...,, nxxx , care verifică sistemul, se mai

numesc şi rădăcinile sistemului. Dacă sistemul admite o soluţie unică, se numeşte compatibil determinat, iar

dacă admite cel puţin două soluţii, se numeşte compatibil nederminat. Dacă sistemul nu are soluţii, este incompatibil.

În cazul în care sistemul este compatibil nedeterminat, poate avea o infinitate simplă, dublă, ... , multiplu de ordinul r de soluţii (sau un număr finit, în numere întregi).

Deoarece nu toţi ija sunt nuli, rangul matricei A, cu m linii şi n coloane,

formată cu coeficienţii necunoscutelor, va fi 1≥p . Presupunem că unul dintre determinanţii de ordinul p, diferit de zero, este chiar

pppp

p

p

p

... a a a

... aa a

... a a a

21

22221

11211

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

=∆

Algebră numerică liniară 151

ceea ce este întotdeauna posibil să se realizeze, schimbând, la nevoie, atât ordinea ecuaţiilor, cât şi indicii necunoscutelor.

Determinantul 0≠∆ p , se numeşte determinantul principal al sistemului.

Evident, există şi alţi determinanţi de ordinul p diferiţi de zero, însă toţi determinanţii de ordinul p+1, p+2, ..., p+q, cu q=min(m,n) ce se pot forma cu liniile şi coloanele matricei A, sunt nuli.

Putem întotdeauna aranja necunoscutele şi schimba ordinea ecuaţiilor, astfel încât p∆ să fie format cu coeficienţii primelor p necunoscute, luate din

primele p ecuaţii. Ecuaţiile care intervin în formarea determinantului principal se numesc

ecuaţii principale, iar necunoscutele pnxxx ,...,, 21 , cu ale căror coeficienţi se

formează determinantul principal, se numesc necunoscute principale. Celelalte ecuaţii şi necunoscute se numesc secundare. Se numeşte determinant caracteristic, un determinant de ordinul p+1 din

A, obţinut prin completarea determinantului principal, p∆ , cu o coloană formată

din termenii liberi corespunzători ai ecuaţiilor principale şi cu o linie formată cu coeficienţii necunoscutelor principale şi cu termenul liber al unei ecuaţii secundare,

( )

11,11,1

2

1

11

....

...

+++

+

=

ppp

pp

p

baa

b

b

b

D , … , ( )

mmm

pp

pmp

baa

b

b

b

D

11

2

1

1

....

...

=−

+.

Dacă nmp ≤< (sau mnp ≤< ) vom putea forma pm − determinanţi, numiţi determinanţi caracteristici.

Conform teoremei lui Rouché, un sistem liniar de m ecuaţii cu n necunoscute este compatibil, dacă şi numai dacă, toţi determinanţii caracteristici sunt nuli.

Dacă toţi determinanţii caracteristici sunt nuli, dar: • n>p, există n-p necunoscute secundare, care apar ca parametri în soluţiile

găsite , 002

01 ,...,, pxxx , şi avem pn−

∞ soluţii, iar sistemul este compatibil

nedeterminat; • n=p, nu avem necunoscute secundare, iar sistemul este compatibil

determinat; • m=n=p, nu există determinanţi caracteristici (formal putem spune că sunt

nuli), • sistemul este compatibil determinat, cu soluţie unică.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 152

Dacă cel puţin unul dintre determinanţii caracteristici este diferit de zero, sistemul este incompatibil sau imposibil, respectiv nu are soluţii.

Analiza soluţiilor unui sistem de ecuaţii liniare se poate face mai comod aplicând teorema Kronecker-Capelli, care se bazează, în esenţă, pe rangul matricelor A şi B. Dacă notăm p=rang A şi q=rang (A|B), atunci, pentru ca sistemul de m ecuaţii cu n necunoscute să fie complet compatibil, este suficient ca:

rang A = rang (A|B),

( ) ;

......

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

......

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

......

B|A ;

......

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

......

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

......

A

1

1

11111

1

1

1111

=

=

mmnmjm

iiniji

nj

mnmjm

iniji

nj

baaa

baaa

baaa

aaa

aaa

aaa

sau în Matlab, p=rank(A)==rank([A,B]).

Funcţia rank se poate apela şi sub forma: p=rank(A,tol),

unde tol este toleranţa, care are valoarea implicită (când lipseşte la apelare), tol = max(size(A)) * norm(A) * eps, cu eps depinzând de acurateţea calculelor în virgulă mobilă.

Dacă: • m=n=p, sistemul este compatibil determinat, cu soluţie unică;

• p = q < n, sistemul este compatibil nedeterminat, cu pn−

∞ soluţii; • p < q, sistemul este incompabitil sau nedeterminat şi nu va avea nici o

soluţie.

Una dintre metodele de rezolvare a sistemelor de n ecuaţii, cu n

necunoscute, constă în împărţirea matricelor. Soluţiile unui sistem de ecuaţii liniare de forma, A*X=B

pot fi determinate în Matlab, prin instrucţiunile: X=B/A – împărţirea la dreapta sau X=A\B – împărţirea la stânga.

De meţionat că împărţirea la stânga este mai rapidă decât împărţirea la dreapta. Pentru un sistem de 1000 ecuaţii cu 1000 necunoscute, ai cărui coeficienţi şi termeni liberi sunt numere aleatoare, cu secvenţa Matlab,

A=rand(1000); B=rand(1000); tic; X=A\B; ts=toc tic; X=B/A; td=toc

Algebră numerică liniară 153

s-au obţinut, pe un calculator PC 1.7 MHz, timpi: ts=2.614 s şi td=2.663 s, în cele două variante de împărţire, la stânga şi la dreapta.

O altă cale de rezolvare a sistemelor de n ecuaţii, cu n necunoscute, constă în folosirea matricei inverse.

Deoarece det(A)≠0, matricea A este nesingulară şi are deci, o inversă A-1,

Adet

A 1 jiA=

calculată în Matlab cu inv(A). Dacă în sistemul, A*X=B, înmulţim la stânga cu A-1, avem X=A-1*B,

respectiv în Matlab, X=inv(A)*B. Reluând acelaşi sistem, de 1000 ecuaţii cu 1000 necunoscute, cu

coeficienţii şi termenii liberi numere aleatoare, timpul de calcul rezultă din, A=rand(1000); B=rand(1000); tic; X=inv(A); ti=toc

şi, pentru acelaşi calculator, este ti= 2.1430 s.

O serie de metode de rezolvare a sistemelor de ecuaţii sunt cunoscute ca fiind metode prin triunghiularizare. Din această categorie fac parte: factorizarea Cholesky, factorizarea LU, factorizarea QR etc.

O matrice pătrată A, de forma,

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

A

21

22221

11211

=

nnnn

n

n

... a a a

... aa a

... a a a

poate fi descompusă sub forma, A = Ls + D +Us, cu:

0...

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

00...0

00...00

Ls

121

21

=

−nnnn aaa

a;

0...00

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

00...0

00...0

D 12

11

=

nna

a

a

;

0...000

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

...00

...0

Us 223

11312

=n

n

aa

aaa

Matricea Ls, care conţine elemente diferite de zero numai sub diagonala principală, se numeşte strict inferior triunghiulară. Similar, matricea Us, care

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 154

conţine elemente diferite de zero doar deasupra diagonalei principale, se numeşte strict superior triunghiulară. Matricea D este evident diagonală.

O matrice L, definită ca, L=Ls+D se numeşte inferior triunghiulară.

În acest caz, este evident că det(L)=det(D) şi, dacă det(D)≠0, atunci există inversa matricei L, respectiv L-1, care este de forma,

L-1 = L' + D' şi este de asemenea inferior triunghiulară.

Asemănător, dacă U=Us+D şi dacă U-1 există, ea este superior triunghiulară.

Pentru un sistem liniar neomogen, L*x = b, având matricea L a coeficienţilor sistemului inferior triunghiulară,

...

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

0...0

0...00

L

321

2221

11

=

nnnnn llll

ll

l

, ...

x 2

1

=

nx

x

x

, ...

b 2

1

=

nb

b

b

,

componentele vectorului x, soluţiile sistemului, pot fi găsite prin substituţie înainte, respectiv:

( ) .1,2,..., ;1

x;1

x;x1

11212

222

11

11 nmxlb

lxlb

ll

b m

j

jmjm

mm

m =

⋅−⋅=⋅−⋅== ∑

=

Un caz mai complicat, dar şi mai instructiv, este cazul în care matricea A este produsul unei matrice inferior triunghiulare L, cu o matrice superior

triunghiulară U. Prin urmare, avem A*x = L*U*x = b.

Pentru rezolvare, se introduce un vector auxiliar definit ca z=U*x

ceea ce face ca ecuaţia iniţială să devină L*z = b, care este de forma anterioară, având necunoscutele:

( ) .1,2,..., ;1

z ;1

z ;z1

11212

222

11

11 nmzlb

lzlb

ll

b m

j

jmjm

mm

m =

⋅−⋅=⋅−⋅== ∑

=

Odată vectorul z cunoscut, ecuaţia z=U*x (care este identică cu U*x=z) având,

...000

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

...0

...

U 22322

1131211

=

nn

n

n

u

uuu

uuuu

, ...

x 2

1

=

nx

x

x

, ...

z 2

1

=

nz

z

z

,

Algebră numerică liniară 155

din care, din ultima linie, rezultă,

11

nxu

zn= ,

şi în general,

1.,...,1, ;1

1

−=

⋅−⋅= ∑

+=

nnmxuzu

xn

mj

jmjm

mm

m

Se remarcă faptul că, în acest caz, se utilizează o substituţie înainte şi apoi o substituţie înapoi.

Cazuri particulare ale acestui caz general sunt atunci când matricea sistemului este o matrice tridiagonală, o matrice tridiagonal simetrică sau o matrice multidiagonală.

O matrice tridiagonală este, prin definiţie, o matrice care are două diagonale secundare adiacente diagonalei principale, toate cu elemente diferite de zero. Se întâlneşte, de regulă, la aproximaţia difuziei multigrupale monodimensionale.

Matricea tridiagonal simetrică are elementele simetrice nepozitive şi se mai numeşte şi matrice Stieltjes.

O matrice pătrată de ordinul n, multidiagonală, este o matrice cu un număr m, impar de diagonale, m<n, de elemente diferite de zero. O astfel de matrice poate fi adusă la forma unei matrice quasitridiagonale, prin utilizarea unor submatrice adecvate.

Factorizarea Cholesky este o metodă de rezolvare a unui sistem de ecuaţii liniare, de forma A*x=B, cu matricea A pozitiv definită.

Un sistem dat, având forma matriceală, A*x-B=0

prin metoda Cholescky, se înlocuieşte cu un sistem echivalent, R'*R *x=B în care R este o matrice unică, superior triunghiulară, nesingulară, care satisface relaţia: A=R'*R.

Factorizarea Cholesky utilizează numai matricea superior triunghiulară, iar cea inferior triunghiulară este considerată ca fiind transpusa complex conjugată a celei superioare, astfel că, A este o matrice hermitică.

Funcţia Matlab, care factorizează Cholesky, este chol, apelată cu sintaxa: R=chol(A),

care necesită ca A să fie pozitiv definită, altfel returnând numai un mesaj de eroare. Exemple de matrice pozitiv definite sunt, A1=[3 2+i 3-i;-2-i 8 5; 6 3+i 7]; A2=pascal(5)

pentru care, R1 = [ 1.7321 1.1547 + 0.5774i 1.7321 - 0.5774i 0 2.5166 1.3245 + 0.6623i 0 0 1.2140 ],

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 156

R2 = [ 1 1 1 1 1 0 1 2 3 4 0 0 1 3 6 0 0 0 1 4 0 0 0 0 1 ]. Factorizarea Cholesky, pentru coeficienţii binomului lui Pascal, îi

aranjează într-o matrice superior triunghiulară. Dacă matricea nu este pozitiv definită, ca de exemplu, A3=[1 2 3 4;5 6 7 8; 9 10 11 12; 13 14 15 16]

atunci se utilizează apelarea funcţiei chol sub forma, [R3,p]=chol(A3),

care conduce la, R3 = [ 1.0000 2.0000 3.0000 0 1.4142 0.7071 0 0 1.2247 ] p=4,

astfel încât: R'*R = A(1:q,1:q) , q = p-1. Rezolvarea unui sistem de ecuaţii, A*x=B,

se realizează cu secvenţa Matlab: R=chol(A); x=R\R’\b.

Pentru o matrice X, factorizarea incompletă Cholesky, aplicabilă pentru matrice rare şi factorizarea Cholesky infinită este realizată, în Matlab, cu una dintre sintaxele:

• R = cholinc(X,dtol), în care, dtol este un scalar nenegativ, ce evidenţiză toleranţa permisă la factorizarea incompletă, iar dacă dtol=0,, se realizează factorizarea completă;

• R = cholinc(X,opt), în care, opt poate fi dtol, michol (0 pentru factorizarea Cholesky nemodificată şi 1 pentru modificată ) sau rdiag (0, în mod normal sau 1, când se forţează R ca o matrice cu zero pe diagonala principală);

• R = cholinc(X,'0'), care realizează o factorizare incompletă Cholesky, a unei matrice rare simetric pozitive, care nu garantează existenţa lui R şi putând apărea un mesaj de eroare;

• [R,p] = cholinc(X,'0'), evită mesajul de eroare şi dacă p=0, atunci R există, altfel R'*R corespunde cu X , pentru primele q=p-1 linii şi coloane;

• R = cholinc(X,'inf'), care produce o factorizare Cholosky infinită, ceea ce presupune că, la întâlnirea unui pivol egal cu zero, atunci se completează Inf pe diagonală, iar pe rânduri 0, iar X este pozitiv semidefinită, astfel că, la întâlnirea unui pivot negativ, acesta se înlocuieşte cu Inf.

Modificarea factorizării Cholesky se realizează cu funcţia cholupdate.

Algebră numerică liniară 157

Dacă R=chol(A) este factorizarea Cholesky inţială a matricei A, atunci R1=cholupdate(R,x) returnează o matrice superior triunghiulară, rezultată din factorizarea matricei A + X*X', cu X un vector coloană. Funcţia lucrează numai cu matrice pline, nu rare.

Prin factorizarea LU (lower-upper), o matrice pătrată este descompusă sub forma produsului a două matrice triunghiulare: una inferior triunghiulară, matricea L, cu elemente 1 pe diagonala principală şi cealaltă, matricea U, superior triunghiulară.

Factorizarea LU a unei matrice se realizează în Matlab cu funcţia lu, care se apelează cu una dintre sintaxele:

• [L,U]=lu(X), când se returnează o matrice superior triunghiulară U şi o matrice inferior triunghiulară permutată L, astfel încât X=L*U;

• [L,U,P]=lu(X), când se returnează o matrice superior triunghiulară U, o matrice inferior triunghiulară permutată L şi permutarea matriceală P, astfel încât L*U=P*X.

Factorizarea LU este utilizată în Matlab pentru obţinerea inversei unei matrice, cu funcţia inv şi pentru calculul determinantului, cu funcţia det.

Să considerăm sistemul A*x=b unde, A = [ 1 1 2 1 1 2 b = [ 0 3 -1 -2 1 -2 1 -6 -1 1 3 -1 4 2 6 1 2 -1 2 -1 -3 1 -2 -3 1 -2 -3 -1 6 1 -2 4 2 -1 4 ] -1 ].

Prin factorizarea LU, [L1,U1] = lu(A) sau [L,U,P] = lu(A)

obţinem: L1 = [ 0.3333 -0.3636 0.5283 0.5143 0.8676 1.0000 1.0000 0 0 0 0 0 -0.3333 -0.1818 0.4717 1.0000 0 0 0.3333 -0.6364 -0.1132 -0.5429 1.0000 0 -0.6667 1.0000 0 0 0 0 0.3333 0.4545 1.0000 0 0 0 ],

U1 = [ 3.0000 -1.0000 -2.0000 1.0000 -2.0000 1.0000 0 -3.6667 -0.3333 -1.3333 -4.3333 -0.3333 0 0 4.8182 2.2727 1.6364 3.8182 0 0 0 -1.9811 1.7736 0.4717 0 0 0 0 -1.9429 -2.8571 0 0 0 0 0 1.7647 ],

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 158

L = [ 1.0000 0 0 0 0 0 -0.6667 1.0000 0 0 0 0 0.3333 0.4545 1.0000 0 0 0 -0.3333 -0.1818 0.4717 1.0000 0 0 0.3333 -0.6364 -0.1132 -0.5429 1.0000 0 0.3333 -0.3636 0.5283 0.5143 0.8676 1.0000 ],

U = [ 3.0000 -1.0000 -2.0000 1.0000 -2.0000 1.0000 0 -3.6667 -0.3333 -1.3333 -4.3333 -0.3333 0 0 4.8182 2.2727 1.6364 3.8182 0 0 0 -1.9811 1.7736 0.4717 0 0 0 0 -1.9429 -2.8571 0 0 0 0 0 1.7647 ],

P = [ 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 ].

Se observă că L1*U1 este identică cu A, iar L*U este identică cu P*A.. Inversa matricei A, calculată cu funcţia inv, este egală cu produsul

inverselor, respectiv: inv(A) = inv(U1)*inv(L1) şi inv(P*A) = inv(U)*inv(L). De asemenea, pentru determinanţi, sunt valabile relaţiile: det(A) = det(L1)*det(U1) şi det(P*A) = det(L)*det(U). Rezolvarea sistemelor de ecuaţii A*x = b, prin factorizarea Lu, presupune

soluţionarea succesivă a sistemelor: y=L1\b şi x=U1\y,

rezultând, x = [2 -1 3 -2 1 -3 ].

Pentru o matrice X, factorizarea incompletă LU, luinc, aplicabilă pentru matrice rare, este realizată în Matlab cu una dintre sintaxele:

• [L,U,P] = luinc(X,dtol) sau [L,U] = luinc(X,dtol) , în care dtol este un scalar nenegativ, ce evidenţiază toleranţa permisă la factorizarea LU incompletă, aplicabilă fiecărei coloane a lui X, iar dacă dtol=0, se realizează factorizarea LU completă;

• [L,U,P] = luinc(X,opt) sau [L,U] = luinc(X,opt) , în care opt poate fi dtol, milu (0, pentru factorizarea LU nemodificată şi 1, pentru modificată) sau udiag (0, în mod normal sau 1, când se forţează U ca o matrice cu zero pe diagonala principală);

• [L,U] = luinc(X,'0'), care realizează o factorizare incompletă LU a unei matrice rare, simetric pozitive, fără a da permutarea;

Algebră numerică liniară 159

• [L,U,P] = luinc(X,'0'), prezintă şi matricea de permutare şi se bazează pe algoritmul de pivotare parţială.

Factorizarea QR este o descompunere a unei matrice, A, ca produsul dintre o matrice ortonormală, Q, cu o matrice superior triunghiulară, R, astfel încât A = Q*R.

Factorizarea QR se utilizează pentru rezolvarea sistemelor de ecuaţii liniare cu mai multe ecuaţii decât necunoscute. Cea mai bună soluţie a unor astfel de sisteme, A*x = b, în sensul celor mai mici pătrate, este calculată cu x = A\b, care utilizează implicit această factorizare.

Prin utilizarea factorizării QR, cu funcţia Matlab qr, soluţia este calculată în doi paşi:

y=Q`*b şi apoi x=R\y. Apelarea funcţiei qr se poate face cu una dintre sintaxele:

• [Q,R]=qr(A), returnează matricea triunghiular superioară R, de aceeaşi dimensiune cu A şi matricea unitară Q, astfel încât, A = Q*R.

• [Q,R,E]=qr(A), returnează matricea de permutare E, a matricei superior triunghiulare R, cu elementele diagonalei descrescătoare şi matricea unitară Q, astfel încât A*E = Q*R, cu menţiunea că, matricea E are coloanele aranjate în ordinea descrescatoare a abs(diag(R));

• [Q,R]=qr(A,0), realizează o descompunere „economică” a matricei A, care, dacă este de mxn, cu m>n, lucrează numai cu primele n coloane;

• [Q,R,E]=qr(A,0), realizează o descompunere „economică” a matricei A, prezentând şi vectorul de permutare E, având coloanele aşezate în ordinea descrescătoare a abs(diag(R)), astfel încât Q*R = A(:,E);

• R = qr(A), returnează numai matricea R, care R = chol(A'*A).

Pentru matrice rare, versiunea QR nu permută coloanele. Soluţia sistemului A*x=b, prin metoda celor mai mici pătrate, bazată pe

descompunerea QR, se află fie într-un pas, x = R\(R'\(A'*b))

fie succesiv, r = b - A*x e = R\(R'\(A'*r)) x = x + e; De exemplu, descompunerea QR a matricei aceleiaşi matrice A, utilizată la

descompunerea LU, conduce la: Q = [ -0.2425 0.1866 -0.4555 0.2090 -0.5768 0.5679 -0.7276 -0.3466 0.2364 0.4411 -0.1208 -0.2923 0.2425 0.2666 -0.5238 0.5303 0.0392 -0.5595 -0.2425 0.4133 0.0328 -0.5493 -0.4742 -0.4927 0.4851 -0.5999 0.0671 0.0150 -0.6101 -0.1670 -0.2425 -0.4932 -0.6758 -0.4227 0.2325 -0.0919 ],

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 160

R = [ -4.1231 -0.7276 1.4552 -3.1530 1.2127 -1.4552 0 4.4125 -1.1198 0.6132 3.8260 -2.0530 0 0 -5.6239 -1.1158 -2.5818 -4.5909 0 0 0 -1.8541 2.3748 1.8616 0 0 0 0 1.8936 1.7669 ]

astfel încât soluţia se obţine prin, R\(R'\(A1'*b))

sau secvenţial, r = b - A*x ; e = R\(R'\(A'*r)) ; x = x + e;

rezultând x = [2 -1 3 -2 1 -3 ], la fel ca şi prin metoda LU.

Modificarea factorizării QR iniţiale se realizează cu funcţia qrupdate, care se apelează [Q1,R1] = qrupdate(Q,R,U,V), care returnează factorizarea matricei A + U*V', iar matricele U şi V sunt de tipul coloană.

Ştergerea unei coloane din factorizarea QR se realizează cu funcţia qrdelete, care se apelează cu sintaxa:

[Q,R]=qrdelete(Q0,R0,j), unde Q0 şi R0 sunt factorizările iniţiale, [Q0,R0]=qr(A), iar Q şi R sunt factorizările obţinute după ce din matricea A, a fost ştearsă coloana j, respectiv elementele A(:,j).

Inserarea unei coloane în factorizarea QR se realizează cu funcţia qrinsert, care se apelează cu sintaxa:

[Q,R]=qrdelete(Q0,R0,j), unde Q0 şi R0 sunt factorizările iniţiale, [Q0,R0]=qr(A), iar Q şi R sunt factorizările obţinute după ce, în matricea A, a fost inserată coloana j, respectiv elementele A(:,j), după ultima coloană a matricei iniţiale.

Găsirea planului de rotaţie al unei matrice X, de 2 x 2, se realizează cu funcţia planerot, apelată sub forma [G,Y]=planerot(X), care returnează două matrice ortogonale, astfel că Y = G*X şi Y(2) = 0.

Realizarea factorizării QZ, pentru valori proprii generalizate, se realizează cu funcţia qz. Apelarea funcţiei se face cu:

• [AA, BB, Q, Z, V] = qz(A,B); pentru matricele pătrate A şi B, produce matricele quasitriunghiulare superioare AA şi BB, matricele unitare Q şi Z, astfel încât Q*A*Z = AA şi Q*B*Z = BB, şi matricea vectorilor proprii generalizaţi, V.

Dacă matricele iniţiale, A şi B, sunt complexe, atunci AA şi BB sunt triunghiulare.

Factorizarea unei matrice la forma Hessenberg, se realizează prin funcţia hess. Forma Hessenberg a unei matrice are elementele de sub prima diagonală nule şi aceleaşi valori proprii, ca matricea originală. Dacă matricea iniţială este

Algebră numerică liniară 161

simetrică sau hermitică, atunci matricea Hessenberg are formă tridiagonală. Se apelează:

• H=hess(A) – aduce la forma Hessenberg, H, matricea iniţială A; • [H,P]=hess(A) – calculează o matrice unitară P şi o matrice Hessenberg

H, astfel încât A = P*H*P' şi P'*P = eye(size(P)).

Dacă considerăm matricea X, de test a valorilor proprii, de 3 x 3, X = [ -149 -50 -154 ; 537 180 546 ; -27 -9 -25 ]

forma Hessenberg are elementul (3,1) zero, hess(X) = [ -149.0000 42.2037 -156.3165 -537.6783 152.5511 -554.9272 0 0.0728 2.4489 ]

Factorizarea unei matrice la forma Schur, se realizează cu funcţia schur. Descompunerea Schur produce o matrice quasitriunghiulară T şi o matrice unitară U, astfel încât, X = U*T*U' şi U'*U = eye(size(U)), în care matricea iniţială X, trebuie să fie pătrată. Sintaxele de apelare sunt: [U,T] = schur(X), T = schur(X).

Pentru aceeaşi matrice X, de mai sus, descompunera Schur este: schur(X) = [ 1.0000 7.1119 815.8706

0 2.0000 -55.0236 0 0 3.0000 ].

Pentru matricea X complexă, forma Schur este superior triunghiulară, cu valorile proprii pe diagonală.

Transformarea matricei de ieşire de forma Schur, din reală în complexă, pentru o matrice de intrare X reală, se face cu funcţia rsf2csf, apelată sub forma:

[U,T]=rsf2csf(U0,T0), unde U0 şi T0 sunt matricele Schur iniţiale din [U0,T0]=schur(X), iar U, T

sunt cele finale, complexe, respectiv o matrice superior triunghiulară, cu valorile proprii pe diagonală.

Aplicarea metodei celor mai mici pătrate la rezolvarea unui sistem de ecuaţii liniare omogene, cu restricţii nenegative, se realizează în Matlab de către funcţia lsqnonneg. Aceasta se apelează cu una dintre sintaxele:

• X=lsqnonneg(C,d), cu C şi d reale, care returnează un vector X, ce minimizează norm(C*X-d), atunci când X >= 0;

• X=lsqnonneg(C,d,x0), utilizează x0 (x0>0) ca punct de plecare al soluţiei; • X=lsqnonneg(C,d,x0,tol) utilizează o toleranţă impusă la aflarea soluţiei;

altfel aceasta este 10*max(size(C))*norm(C,1)*eps, cu eps=2.2204e-016.

Aplicarea metodei celor mai mici pătrate la rezolvarea unui sistem de ecuaţii liniare omogene, cu covarianţă oarecare, se realizează în Matlab de către funcţia lscov.

Aceasta se apelează cu una dintre sintaxele:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 162

• X=lscov(A,B,V), returnează vectorul X, ca soluţie a ecuaţiei A*X=B+E, unde E este o funcţie de distribuţie normală, cu media zero şi covarainţa V, iar matricea A este de dimensiuni mxn, cu m>n, astfel încât, vectorul X minimizează (A*X-B)'*inv(V)*(A*X-B) şi soluţia sistemului este dată de X=inv(A'*inv(V)*A)*A'*inv(V)*B;

• [X,DX]=lscov(A,B,V), returnează erorile standard ale lui X în DX, erori calculate cu relaţiile mse=B'*(inv(V)-inv(V)*A*inv(A'*inv(V)*A)*A'*inv(V))*B./(m-n) dx = sqrt(diag(inv(A'*inv(V)*A)*mse)).

7.5. Vectori şi valori proprii

În foarte multe aplicaţii, apar situaţii în care se pune problema determinării acelor valori ale unei constante λ , pentru care există soluţii nebanale ale unui sistem de ecuaţii liniar omogen, de forma:

111111 ...... xxaxaxa nnjj ⋅=⋅++⋅++⋅ λ

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

ininjiji xxaxaxa ⋅=⋅++⋅++⋅ λ......11

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

nnnnjnjn xxaxaxa ⋅=⋅++⋅++⋅ λ......11

de n ecuaţii liniare cu n necunoscute, având matricea A simetrică.

Dacă un vector 0≠x are proprietatea că xx ⋅=⋅ λA , se spune că x reprezintă o direcţie proprie a transformării A, iar numărul λ (real sau complex), este o valoare proprie a acestei transformări.

Denumirea de direcţie proprie a transformării este justificată prin aceea că, dacă x satisface relaţia xx ⋅=⋅ λA , aceeaşi proprietate o va avea orice vector xk ⋅ , unde k este un număr oarecare, real sau complex. Acest fapt este o consecinţă a proprietăţilor transformării liniare, ( ) ( )xkxkxAkxk ⋅⋅=⋅⋅=⋅⋅=⋅⋅ λλA .

O astfel de problemă este cunoscută ca o problemă cu valori şi vectori proprii. Valorile lui λ , pentru care există soluţii nebanale, se numesc valori

proprii sau caracteristice ale matricei A a coficienţilor sistemului, iar soluţiile vectori corespunzătoare se cunosc sub denumirea de vectori proprii sau caracteristici ai matricei A.

Forma matriceală a sistemului xx ⋅=⋅ λA este echivalentă cu, ( ) 0I-A =⋅⋅ xλ

unde I, este matricea identitate, calculabilă în Matlab cu eye(A). Această matrice este denumită uneori şi unitate, are toate elementele de pe diagonala principală egale cu 1, iar celelalte nule. Se mai notează şi cu [1] sau [e], având elementele,

Algebră numerică liniară 163

=

=

ji

jieij dacã ,1

dacã ,0

Acest sistem omogen posedă soluţii nebanale, dacă şi numai dacă, determinantul matricei coeficienţilor se anulează, adică matricea I-A ⋅λ este singulară,

( ) 0

...

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

...

...

I-A

21

22221

11211

=

==⋅

λ

λ

λ

λλ

nnnn

n

n

aaa

aaa

aaa

P

Această condiţie necesită ca λ să fie o rădăcină a ecuaţiei algebrice de mai sus, cunoscută sub denumirea de ecuaţie caracteristică a transformării A sau ecuaţie seculară. Fiind de gradul n în λ , va avea n rădăcini, fie distincte, fie unele dintre ele confundate. Aceste rădăcini sau soluţii nλλλ ,...,, 21 , sunt valorile proprii

ale matricei sau transformării A. Polinomul ( )λP , se numeşte polinomul

caracteristic al transformării liniare A. Corespunzător cu fiecare valoare proprie kλ , există cel puţin un vector

soluţie kx , a sistemului xx ⋅=⋅ λA , determinat până la o constantă arbitrară. În continuare, se enunţă principalele teoreme şi proprietăţi ale valorilor

proprii. Dacă o transformare liniară A, are n direcţii proprii, reprezentate prin

vectorii nuuu ,...,, 21 , liniar independenţi, aceşti vectori pot fi luaţi ca bază a spaţiului, iar matricea transformării A, în această bază, va avea forma diagonală,

[ 0,...,0,1λ ; 0,...,,0 2λ ; ... ; nλ,...,0,0 ].

Reciproc, dacă matricea transformării A, în baza nuuu ,...,, 21 , are formă

diagonală, atunci nλλλ ,...,, 21 sunt valorile proprii, iar nuuu ,...,, 21 reprezintă direcţiile proprii corespunzătoare.

Dacă valorile proprii nλλλ ,...,, 21 sunt distincte, direcţiile proprii

corespunzătoare sunt reprezentate prin vectorii nuuu ,...,, 21 , liniar independenţi. Valorile proprii ale unei transformări liniare autoadjuncte (hermitice), sunt

reale. La două valori proprii distincte, ale unei transformări autoadjuncte,

corespund două direcţii proprii ortogonale. Într-un spaţiu euclidian cu n dimensiuni (matricea A de nxn), o

transformare autoadjunctă (hermitică) are n direcţii proprii, ortogonale, două câte două. Vectorii neee ,...,, 21 , care reprezintă cele n direcţii proprii ale transformării A, ortogonale două câte două, pot fi luaţi de lungime unitate,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 164

( )

=

=

ji

jiee ji pentru ,1

pentru ,0, . Drept consecinţă, matricea A, faţă de această bază are

forma diagonală, [ 0,...,0,1λ ; 0,...,,0 2λ ; ... ; nλ,...,0,0 ]. Un caz particular de matrice hermitică îl formează matricele simetrice

reale. În acest caz, transformarea are n direcţii proprii ortogonale, două câte două şi valorile proprii reale. Transformarea se va reprezenta printr-o matrice care poate fi adusă la forma diagonală. Pe diagonala principală, în noua matrice, vor figura valorile proprii, nu întotdeauna distincte.

Valorile proprii ale transformărilor unitare au modulul egal cu 1. Orice transformare unitară într-un spaţiu euclidian cu n dimensiuni are n

direcţii proprii ortogonale, două câte două. Matricea transformării, raportată la aceste direcţii, va avea formă diagonală.

În Matlab, calculul valorilor şi al vectorilor proprii ai unei matrice pătrate se realizează cu funcţia eigs, care se apelează cu una dintre sintaxele:

• E=eigs(A) – returnează un vector E, care conţine valorile proprii ale matricei pătrate A;

• [V,D]=eigs(A) – returnează o matrice diagonală D, care conţine valorile proprii ale matricei A şi o matrice V, modală, ale cărei coloane sunt vectorii proprii, astfel încât A*V = V*D;

• [V,D] = eigs(A,'nobalance') – returnează valorile şi vectorii proprii, fără a executa o balansare, deoarece dacă matricea conţine elemente mici, comparabile cu erorile de rotunjire, balansarea le scalează, făcându-le la fel de semnificative ca celelalte elemente ale matricei originale şi, acest fapt, ar conduce ,în final, la vectori proprii incorecţi.

În cazul matricelor nesimetrice de ordinul n, pentru care AT≠A (sau în

Matlab A'≠A), dacă valorile proprii sunt distincte, atunci există n vectori proprii, liniar independenţi asociaţi.

Dacă matricea are numai valori proprii de ordinul întâi (valorile proprii λ sunt distincte), atunci vectorii proprii sunt independenţi. Dacă vectorii proprii nu sunt independenţi, atunci matricea originală este neregulată.

Dacă valorile proprii ale unei matrice nesimetrice de ordin n nu sunt toate distincte, atunci setul de vectori proprii asociaţi poate să nu fie de rang n. În cazul în care vectorii proprii ai matricei A nesimetrice nu formează un set complet, este totuşi posibil să găsim un set complet de alţi vectori, denumiţi vectori principali, care împreună cu setul vectorilor proprii, vor determina un set complet de vectori. Dacă multiplicitatea unei rădăcini este k, avem n-k+1 vectori proprii şi nu putem găsi mai mult decât k-1 vectori principali independenţi.

Şi pentru matrice nesimetrice există întotdeauna o matrice Jordan, aproape diagonală (având valoarea proprie multiplă kλ , pe diagonala principală şi 1, pe diagonala adiacentă superioară).

Algebră numerică liniară 165

Dacă toate valorile proprii ale matricei A sunt pozitive, matricea A se numeşte pozitiv definită. Invers, dacă toate valorile proprii ale matricei A sunt negative, matricea A se numeşte negativ definită.

Valorile şi vectorii proprii generalizaţi determină soluţiile nebanale ale ecuaţiei:

xBx ⋅⋅=⋅ λA unde A şi B sunt matrice pătratice de ordinul n, iar λ este un scalar.

Valorile lui λ , care satisfac ecuaţia, se numesc valori proprii generalizate şi valorile x, corespunzătoare, sunt vectorii proprii generalizaţi.

Dacă B este o matrice nesingulară, det(B)≠0, adică matrice iversabilă, problema calculului valorilor şi al vectorilor proprii se reduce la o problemă standard de valori proprii, prin înlocuirea lui A cu B-1*A, dearece ecuaţia este echivalentă cu:

xx ⋅=⋅ λ.AB-1 . Calculul vectorilor şi valorilor proprii generalizate se realizează cu funcţia

eig, apelată cu sintaxa: • V=eig(A) – returnează un vector V, care conţine valorile proprii

generalizate; • [V,D] = eig(A,B) produce o matrice diagonală D, care conţine valorile

proprii ale matricei A şi o matrice V, modală, ale cărei coloane sunt vectorii proprii, astfel încât A*V = B*V*D;

• [V,D] = eig(A,B,'chol') – se aplică la matricele A, B, simetrice, utilizând factorizarea Cholesky, pentru B;

• [V,D] = eig(A,B,'qz') – se aplică la matricele A, B, utilizând factorizarea QZ.

De exemplu, considerând A=[ -2 1 0 ; 1 -2 1; 0 1 -2], atunci

[V,D]=eig(A), conduce la: V = [ 0.500 -0.707 -0.500 ; -0.707 0.000 -0.707; 0.500 0.707 -

0.500] D=[ -3.41 0 0; 0 -2.00 0 0 0 -0.59].

Pentru calculul valorilor proprii generalizate se utilizează funcţia eig, care permite redarea unui set de şase valori proprii generalizate şi, în plus, se poate utiliza şi în cazul matricelor mari şi/sau rare.

Transformarea matricelor de ieşire, V şi D, ale funcţiei eig(X), cu X real, din forma complexă diagonală în forma reală, se realizează cu funcţia cdf2rdf, apelată sub forma [V,D]=cdf2rdf(V,D). În forma complexă diagonală, matricea D are valori proprii complexe sub diagonală. În formă reală, valorile proprii complexe formează un bloc diagonal de 2 x 2.

Analiza inţială a acurateţei determinării valorilor proprii se realizează cu

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 166

funcţia balance, apelată cu: [T,B] = balance(A),

unde T şi B sunt transformările de similaritate, astfel că B = T\A*T, şi normele pe linii şi coloane să fie egale. Matricea T este o matrice diagonală de permutare.

Calculul valorilor singulare ale unei matrice se realizează cu funcţia svd,

fiind şi un mijloc sigur de determinare a rangului unei matrice. Funcţia svd se apelează cu una dintre sintaxele:

• S1=svd(X), când se returnează un vector S1, care conţine valorile singulare ale matricei X;

• [U,S,V]=svd(X), care returnează o matrice diagonală S, cu aceleaşi dimensiuni ca X, având elementele diagonale nenegative (care sunt şi valorile singulare), în ordine descrescătoare şi matricele unitare U şi V, astfel încât X= U*S*V' ;

• [U,S,V]=svd(X,0), realizează un calcul mai rapid al valorilor singulare, considerând, în cazul unei matrice X, de m x n, cu m>n, numai primele n coloane, pentru U şi S de n x n.

Descompunerea în valori singulare a matricei X=[1 2;3 4;5 6;7 8] se poate realiza cu

S1=svd(X) ; [U,S,V]=svd(X) ; [U0,S0,V0]=svd(X,0); rezultând:

S1 = [ 14.2691 ; 0.6268]; U = [ -0.1525 -0.8226 -0.3945 -0.3800 -0.3499 -0.4214 0.2428 0.8007 -0.5474 -0.0201 0.6979 -0.4614 -0.7448 0.3812 -0.5462 0.0407 ] S = [ 14.2691 0 ; 0 0.6268 ; 0 0; 0 0 ] V = [ -0.6414 0.7672 ; -0.7672 -0.6414 ] U0 = [ -0.1525 -0.8226 ; -0.3499 -0.4214 ; -0.5474 -0.0201; -0.7448

0.3812 ] S0 = [ 14.2691 0 ; 0 0.6268 ] ; V0 = [ -0.6414 0.7672 ; -0.7672 -

0.6414 ] Calculul valorilor singulare generalizate se realizează cu funcţia gsvd.

Funcţia gsvd se apelează cu relaţia [U,V,X,C,S] = gsvd(A,B),

care returnează matricele unitare U şi V ale matricei, de regulă, pătrate X şi matricele diagonale nenegative C şi S, astfel încât:

A = U*C*X' B = V*S*X' C'*C + S'*S = I. Matricele A şi B trebuie să aibă acelaşi număr de coloane, dar pot avea

Algebră numerică liniară 167

număr de linii (rânduri) diferite. Dacă A este de m x p şi B de n x p, atunci U este de m x m, V este de n x n şi X este de p x q, unde q=min(m+n,p).

Funcţia gsvd apelată SIGMA = gsvd(A,B) returnează vectorul valorilor singulare generalizate, adică sqrt(diag(C'*C)./diag(S'*S)).

Pentru manipularea valorilor şi a vectorilor proprii ai unor matrice mari sau rare, calculate cu eigs, se utilizează funcţia svds, în locul funcţiei svd.

Calculul coeficienţilor unui polinom, având date rădăcinile, se realizează cu funcţia poly, care se apelează cu sintaxele:

• c=poly(r) – când returnează un vector linie, c, conţinând coeficienţii polinomului, în ordinea descrescătoare a puterilor, iar r este un vector ce conţine rădăcinile polinomului;

• c=poly(A) – returnează coeficienţii c, în ordinea descrescătoare, ai polinomului caracteristic al matricei A, de tipul n x n .

Calculul coeficienţilor unui polinom, la care se cunosc valorile proprii, se realizează cu funcţia polyeig.

Calculul numărului de condiţionare, ţinând seama de valorile proprii ale unei matrice, se obţine cu funcţia condeig, care se apelează frecvent,

[V,D,s] = condeig(A) care este echivalent cu: [V,D] = eig(A); s = condeig(A).

7.6. Funcţii de matrice

Exponenţiala unei matrice iniţiale ,X, se calculează cu funcţia expm. Calculul se face utilizând aproximaţia Pade, iar apelarea cu Y=expm(X), Y fiind matricea exponenţială a lui X. Dacă X are un set de vectori proprii V, cu valorile proprii corespondente D, atunci:

[V,D]=eig(X) expm(X)=V*diag(exp(diag(D)))/V. De menţionat că, exponenţiala unei matrice, funcţia expm(X), este

diferită de funcţia exp(X), care calculează element cu element.

Sunt disponibile trei variante de calcul:

• Y=expm1(X), care este identică cu expm, iar calculul se face cu aproximaţia Pade;

• Y=expm2(X), la care calculul exponenţialei este cel clasic, prin serii Taylor, dar carculul este lent şi cu erori;

• Y=expm3(X), calculul se efectuează prin intermediul vectorilor şi valorilor proprii şi diagonalizare, dar poate da erori dacă matricea X nu are un set de vectori proprii liniar independenţi.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 168

Considerăm matricea X= [ 1 1 0 ; 0 0 2 ; 0 0 -1 ]. Aplicând diversele funcţii de calcul ale exponenţialei, obţinem:

exp(X) = [ 2.7183 2.7183 1.0000 1.0000 1.0000 7.3891 1.0000 1.0000 0.3679 ], expm(X) = [ .7183 1.7183 1.0862 0 1.0000 1.2642 0 0 0.3679 ]. Pentru acest caz, toate varianteleexpm1, expm2, expm3, conduc la acelaşi

rezultat. Logaritmul unei matrice ,X, se calculează cu funcţia logm(X) şi este inversa

funcţiei expm(X). Dacă X are valori proprii negative, atunci rezultatul este complex. Dacă logaritmul matricei nu se calculează cu suficientă precizie, se dă un mesaj de eroare. Pentru a evita mesajul de eroare, se preferă apelarea funcţiei sub forma,

[L,esterr] = logm(A), care returnează eroarea reziduală egală cu norm(expm(L)-A)/norm(A).

Dacă X este real simetrică sau hermitică complexă, atunci are log(X). Unele matrice, ca de exemplu A=[0 1 ; 0 0], nu au logaritm, nici real şi nici complex şi, prin urmare, funcţia log(A) nu returnează nimic.

Pentru majoritatea cazurilor, logm(expm(X)) = X = expm(logm(X)). Calculele se efectuează după algoritmul Parlett, care utilizează

descompunerea (factorizarea) Schur. Radicalul unei matrice A este calculat de funcţia sqrtm. Apelată sub

forma X=sqrtm(A), aceasta calculează radicalul matricei A, astfel încât X*X = A. Matricea X este unică, dacă valorile proprii ale părţii reale nu sunt negative. Dacă o valoare proprie a părţii reale este negativă, atunci rezultatul este complex.

Dacă matricea A este singulară, aceasta poate să nu aibă matrice radical şi, în acest caz, se dă un mesaj de eroare. Apelată cu două argumente, [X, RESNORM] = sqrtm(A), nu dă nici un mesaj de eroare, ci returnează reziduu norm(A-X^2,'fro')/norm(A,'fro').

Apelată cu trei argumente de ieşire, [X, ALPHA, CONDEST] = sqrtm(A),

returnează factorul de stabilitate, ALPHA şi numărul de condiţionare, CONDEST, al matricei. Reziduu norm(A-X^2,'fro')/norm(A,'fro') este aproximat de N*ALPHA*EPS, iar norma relativă Frobenius, a erorii lui X este aproximată de N*ALPHA*CONDEST*eps, unde N = max(size(A)).

Funcţia generală de evaluare a unei matrice, A, este funm şi este apelată sub forma:

F=funm(A,fun), unde fun poate fi expm, logm, sqrtm sau o altă funcţie internă, ca de exemplu sin, introdusă ca funcţie handler, @.

8. FUNCŢII MATEMATICE ÎN MATLAB

Funcţiile matematice uzuale şi speciale se apelează cu sintaxa generală: y=nume_funcţie(argument)

unde: • nume_funcţie, este numele uneia dintre funcţiile matematice; • argument, este valoarea pentru care se evaluează funcţia; • y este variabila în care se returnează rezultatul.

Dacă argumentul este o matrice, funcţiile matematice operează asupra fiecărui element.

8.1. Funcţii trigonometrice

Principalele funcţii trigonometrice directe, apelabile în Matlab sunt: • sin(x) , care calculează sinusul argumentului x, dat în radiani; • cos(x) , care calculează cosinusul argumentului x, dat în radiani; • tan(x) , care calculează tangenta argumentului x, dat în radiani; • cot(x) , care calculează cotangenta argumentului x, dat în radiani; • sec(x) , care calculează secanta argumentului x, dat în radiani; • csc(x) , care calculează cosecanta argumentului x, dat în radiani.

Dacă, de exemplu, argumentul x este vectorul: x = [ pi/6 pi/4 pi/3 pi/2 pi/2+pi/6 pi/2+pi/4 pi/2+pi/3 pi pi+pi/6 pi+pi/4 pi+pi/3 pi+pi/2 3*pi/2+pi/6 3*pi/2+pi/4 3*pi/2+pi/3 2*pi ],

care în radiani este,

x =[ 0.5236 0.7854 1.0472 1.5708 2.0944 2.3562 2.6180 3.1416 3.6652 3.9270 4.1888 4.7124 5.2360 5.4978 5.7596 6.2832], atunci pentru: � sin(x) se obţine,

ans = 0.5000 0.7071 0.8660 1.0000 0.8660 0.7071 0.5000 0.0000 -0.5000 -0.7071 -0.8660 -1.0000 -0.8660 -0.7071 -0.5000 -0.0000

� cos(x) se obţine, ans = 0.8660 0.7071 0.5000 0.0000

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 170

-0.5000 -0.7071 -0.8660 -1.0000 -0.8660 -0.7071 -0.5000 -0.0000 0.5000 0.7071 0.8660 1.0000. Pentru y = [pi/3 pi/4 pi/6], dacă se calculează: � tan(y) se obţine,

ans = 1.7321 1.0000 0.5774, � cot(y) se obţine,

ans = 0.5774 1.0000 1.7321, � sec(y) se obţine,

ans = 2.0000 1.4142 1.1547, � csc(y) se obţine,

ans = 1.1547 1.4142 2.0000.

Principalele funcţii trigonometrice inverse, apelabile în Matlab sunt: • asin(x), care calculează arcsinusul argumentului x; • acos(x), care calculează arccosinusul argumentului x; • atan(x), care calculează arctangenta argumentului x; • atan2(y,x), care calculează arctangenta părţii reale a elementelor x şi y,

cu condiţia ca . -pi <= atan2(y,x) <= pi; • acot(x), care calculează arccotangenta argumentului x; • asec(x), care calculează arcsecanta argumentului x; • acsc(x), care calculează arccosecanta argumentului x.

Dacă pentru x = [ 0 1/2 1], calculând: � asin(x) se obţine,

ans = 0 0.5236 1.5708, � acos(x) se obţine,

ans = 1.5708 1.0472 0, � atan(x) se obţine,

ans = 0 0.4636 0.7854, � acot(x) se obţine,

ans = 1.5708 1.1071 0.7854.

Funcţii matematice în Matlab 171

8.2. Funcţii hiperbolice

Principalele funcţii hiperbolice directe, apelabile în Matlab sunt: • sinh(x), care calculează sinusul hiperbolic al argumentului x; • cosh(x), care calculează cosinusul hiperbolic al argumentului x; • tanh(x), care calculează tangenta hiperbolică a argumentului x; • coth(x), care calculează cotangenta hiperbolică a argumentului x; • sech(x), care calculează secanta hiperbolică a argumentului x; • csch(x), care calculează cosecanta hiperbolică a argumentului x;

Considerând x=[0 pi/6 pi/2 pi/3 pi] şi calculând: � sinh(x) se obţine,

ans = 0 0.5479 2.3013 1.2494 11.5487, � cosh(x) se obţine,

ans = 1.0000 1.1402 2.5092 1.6003 11.5920, � tanh(x) se obţine,

ans = 0 0.4805 0.9172 0.7807 0.9963, � coth(x) se obţine,

ans = Inf 2.0813 1.0903 1.2809 1.0037, � sech(x) se obţine,

ans = 1.0000 0.8770 0.3985 0.6249 0.0863, � csch(x) se obţine,

ans = Inf 1.8253 0.4345 0.8004 0.0866.

Principalele funcţii hiperbolice inverse, apelabile în Matlab, sunt: • asinh(x), care calculează arcsinusul hiperbolic al argumentului x; • acosh(x), care calculează arccosinusul hiperbolic al argumentului x; • atanh(x), care calculează arctangenta hiperbolică a argumentului x; • acoth(x), care calculează arccotangenta hiperbolică a argumentului x; • asech(x), care calculează arcsecanta hiperbolică a argumentului x; • acsch(x), care calculează arccosecanta hiperbolică a argumentului x;

Dacă x = [0 1/2 1], calculând: � asinh(x) se obţine,

ans = 0 0.4812 0.8814, � acosh(x) se obţine,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 172

ans = 0 + 1.5708i -0.0000 + 1.0472i 0, � atanh(x) se obţine,

ans = 0 0.5493 Inf.

Pentru argumente numere complexe de forma z=x+iy, relaţiile de calcul sunt:

sin(z) = sin(x)*cosh(y) + i*cos(x)*sinh(y); cos(z) = cos(x)*cosh(y) - i*sin(x)*sinh(y); tan(z) = sin(z)/cos(z); cot(z) = cos(z)/sin(z).

8.3. Funcţii de tip exponenţial

După cum am arătat anterior, ridicarea unui număr a la puterea n se face prin instrucţiunea a^n. Exponentul n poate avea orice valoare, reală sau complexă. Pentru a calcula radicalul de ordinul n dintr-un număr a, se utilizează funcţia putere sub forma a^(1/n). De exemplu, dacă a = 9 şi n=2, atunci a^n este 9^2, respectiv 81, iar a^(1/n) este 9^(1/2), respectiv 3.

Ridicarea la puterea x a numărului 2 (2x), se poate face prin funcţia pow2(x). Dacă x este o matrice, atunci rezultatul va fi o matrice de aceleaşi dimensiuni, funcţia acţionând element cu element. Pentru x=3.1, pow2(x) este 8.5742. Calculul unui număr de forma y=m*2n, se realizează printr-o instrucţiune de forma y=pow2(m,n). Pentru m=20.1 şi n=3.5, cu comanda y=pow2(m,n) se obţine 161.2.

Pentru calculul exponenţialei ex (unde e=2.71828182845…), se utilizează

funcţia exp(x), unde x este argumentul. Dacă x=[1 2 –2 –1], atunci exp(x) conduce la:

ans = 2.7183 7.3891 0.1353 0.3679. Dacă argumentul este un număr complex de forma z=x+i*y, atunci rezultatul

se calculează cu relaţia: ( ) ( )( )ysiniycosee xz⋅+= . Pentru z=2+3*i se obţine:

ans = -7.3151 + 1.0427i.

Pentru calculul logaritmului natural, al logaritmului în baza 2 sau al

logaritmului zecimal (în baza 10) al numărului a (real, sau complex), sunt disponibile funcţiile log, log2 şi respectiv log10, apelabile cu sintaxele:

x=log(a); x=log2(a); x=log10(a). Dacă a = [2 ^2 3^2 2^5 10^3 10^(-2) 2^(-3)], atunci: log(a) este [1.3863 2.1972 3.4657 6.9078 -4.6052 -2.0794],

Funcţii matematice în Matlab 173

log2(a) este [2.0000 3.1699 5.0000 9.9658 -6.6439 -3.0000], iar log10(a) este [0.6021 0.9542 1.5051 3.0000 -2.0000 -0.9031]. Atunci când argumentul funcţiei log este un număr complex, de forma

z=x+i*y, rezultatul este calculat cu relaţia: log(z) = log(abs(z)) + i * atan2(y,x). Funcţia log2 , de argument complex, se calculează cu relaţia: log2(z) = log2(abs(z)) + i * atan2(y,x)/log(2), iar funcţia log10 prin relaţia, log10(z) = log(abs(z)) + i * atan2(y,x)/log(10). Pentru z = 5+ 7* i se obţine că log(z) este 2.1520 + 0.9505i, log2(z) este

3.1047 + 1.3713i, iar log10(z) este 0.9346 + 0.4128i. Funcţia log2 de argument real X (număr sau vector), poate fi apelată prin

sintaxa [F,E]=log2(x), situaţie în care returnează un număr real F, uzual în domeniul 0.5 <= abs(F) < 1, şi un număr întreg E, astfel încât X = F .* 2.^E, ceea ce corespunde funcţiei frexp( ) din ANSI C şi funţiei standard logb( ) din IEEE.

Calculul radicalului de ordinul 2 dintr-un număr a, respectiv a , se realizează prin utilizarea funcţiei sqrt(a). Dacă numărul a este negativ sau complex, rezultatul calculului este un număr complex.

De exemplu, pentru a = [9 –4 4+9*i 2], prin sqrt(a) se obţine: ans = 3 2i 2.6314 + 1.7101i 1.4142.

Determinarea puterii N a numărului 2 care majorează modulul

argumentului P, astfel încât N2P ≤ se face prin funcţia N=nextpow2(P), care

returnează cel mai mic număr N, care îndeplineşte condiţia impusă. Dacă P este vector, funcţia returnează scalarul N, astfel încât 2N majorează numărul de elemente ale vectorului. Pentru P=19, cel mai mic număr N este obţinut cu relaţia nextpow2(19), rezultând 5, astfel încât 2^5=32 este numărul majorant.

8.4. Funcţii de tip complex

Construirea unui număr complex, z, dat prin partea reală x şi partea imaginară y, se face cu instrucţiunea z=complex(x,y), care are ca rezultat z=x+i*y. De altfel, se poate forma un număr complex şi numai prin instrucţiunea z=x+i*y, iar în loc de i poate fi şi j. Dacă y lipseşte, atunci instrucţiunea devine complex(x), iar numerele z sunt complexe, având partea imaginară 0.

Calculul valorii absolute sau a modulului argumentului iyxz ⋅+= , real

sau imaginar se face prin funcţia abs(z). După cum se ştie, modulul r al unui

număr complex este 22 yxr += . Pentru x=[2 –3 4+2*i], aplicând funcţia

abs(x), se obţine [ 2.0000 3.0000 4.4721].

Calculul unghiului fazei, respectiv a argumentului ϕ a numărului complex

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 174

iyxz ⋅+= , respectiv unghiului, în radiani, făcut în planul complex (x – i y), se realizează prin funcţia angle(z), care este echivalentă cu atan(y/x). În general, argumentul ϕ este determinat, în afara unui multiplu de π2 , prin

( ) ( )r

ysin ,

r

xcos == ϕϕ . Cu cele de mai sus, forma trigonometrică a numărului

complex este: ( ) ( )( )ϕϕ sin cosrz i+= . Pentru z=2+3*i, prin angle(z) se obţine 0.9828, acelaşi rezultat ca şi prin atan(3/2).

Partea reală x, a unui număr complex iyxz ⋅+= , se extrage prin funcţia

real(z), iar partea imaginară prin funcţia imag(z). Pentru z=2+3*i, prin real(z) se obţine valoarea 2, iar prin imag(z) se obţine 3. Calculul părţii reale şi imaginare a numerelor complexe, exprimate în formă polară, se poate face şi cu funcţia unwrap.

Pentru un număr complex iyxz ⋅+= , conjugatul său este iyxz ⋅−= şi poate fi obţinut prin funcţia conj(z). Dacă z=2+3*i, atunci conj(z) este 2-3*i.

Determinarea situaţiei, dacă un vector sau matrice X are toate elementele

numere reale (respectiv dacă partea imaginară a fiecărui element este 0) se realizează prin funcţia isreal(X), care răspunde prin 1, dacă toate elementele sunt reale şi prin 0, altfel. Pentru X=[2 i 5+2*i 7] prin isreal(X) se obţine 0, iar pentru XX=[2 -1 7], cu isreal(XX) se obţine 1.

Sortarea unor numere complexe conjugate perechi (sau reale – partea conjugată 0), în ordinea crescătoare a părţii reale, se realizează prin funcţia cplxpair. Dacă X=[8 1+2*i 4 1-2*i 2 3-2*i 3+2*i], atunci funcţia cplxpair(X), returnează [1+2i 1-2i 3+2i 3-2i 2 4 8].

8.5 Funcţii pentru aproximarea numerelor

Funcţiile Matlab pentru aproximarea cu numere întregi sunt: • fix – care rotunjeşte la cel mai apropiat întreg spre zero ; • floor – ce rotunjeşte la cel mai apropiat întreg spre minus infinit (- ∞) ; • ceil - care rotunjeşte la cel mai apropiat întreg spre plus infinit (+∞) ; • round - care rotunjeşte la cel mai apropiat întreg.

Funcţiile de mai sus operează asupra fiecărui element al unei matrice sau vector şi se apelează cu sintaxa nume_funcţie(argument), unde nume_funcţie este numele uneia dintre funcţiile de mai sus (fix, floor, ceil, round), iar argument poate fi un scalar, un vector sau o matrice, ale cărui elemente se doresc a fi rotunjite. Atunci când elementele din argument sunt numere complexe, funcţiile de mai sus operează independent asupra fiecărei părţi (reală sau imaginară). Dacă considerăm vectorul, V = [-0.25 -7.2 –2.4-2.6i 0.499 0.501 2.71+3.49i

Funcţii matematice în Matlab 175

11.5i], atunci: fix(V) este [ 0 -7 -2-2i 0 0 2+3i 11i ]; floor(V) este [ -1 -8 -3-3i 0 0 2+3i 11i ]; ceil(V) este [ 0 -7 -2-2i 1 1 3+4i 12i ]; round(V) este [ 0 -7 -2-3i 0 1 3+3i 12i ].

Pentru aproximarea numerelor reale cu fracţii continue se utilizează funcţia rat, apelată cu una dintre sintaxele,

[N,D] = rat(x), [N,D] = rat(x,tol), unde: x este numărul care trebuie aproximat cu fracţii continue ; tol este toleranţa care se acceptă între numărul x dat şi numărul y (aproximat), astfel încât

tolxy ≤− , având valoarea implicită, tol=10-6; N, D sunt numărătorul, respectiv

numitorul fracţiei, care aproximează pe x cu toleranţă tol, astfel încât abs(N./D - X) <= tol*abs(X); y este exprimarea lui x ca fracţie continuă.

Numărul y, rezultat prin funcţia rat, aproximează fiecare element al

vectorului x cu un număr de forma:

k2

1

0

d

1...d

1d

1dy

++

+

+= . De menţionat că

acelaşi algoritm se utilizează şi la apelarea instrucţiunii interne format rat. Dacă, de exemplu, x = [0.25 1.35 –3.455 1.3456], atunci rat(x) este ans = 0 + 1/(4) 1 + 1/(3 + 1/(-7)) -3 + 1/(-2 + 1/(-5 + 1/(-18))) 1 + 1/(3 + 1/(-9 + 1/(-3 + 1/(2 + 1/(4))))),

astfel încât: 4

100.25 += ,

7-

13

111.35

+

+= ,

18

15-

12-

133.455-

+

+

+−= ,

4

12

13

19-

13

111.3456

+

+−

+

+

+= , approximate cu toleranţa implicită 10-6.

Aproximarea numerelor reale cu numere raţionale se realizează prin apelarea funcţiei rats, cu sintaxa rats(x), utilizată şi în format rat. Pentru aceleaşi valori ale lui x, ca mai sus, se obţine:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 176

ans = 1/4 27/20 -691/200 841/625.

Funcţia mod(x,y) calculează modulus (restul cu semn după împăţirea dintre x şi y), astfel că mod(x,y) = x - y.*floor(x./y) dacă y ~= 0, iar prin convenţie, mod(x,0) este x. Intrările x şi y trebuie să fie matrice reale de aceeaşi dimensiune, sau una trebuie să fie scalar.

Funcţia rem(x,y) calculează restul împărţirii lui x la y, element cu element, astfel că mod(x,y) = x - y.*fix(x./y) dacă y ~= 0, iar prin convenţie, rem(x,0) este NaN. Intrările x şi y trebuie să fie matrice reale de aceeaşi dimensiune sau una trebuie să fie scalar.

Dacă se calculează restul împărţirii vectorului x=[1 3 -6], la y=[2 3 4], cu z=rem(z,y), se ob=[2 3 4], cu z=rem(z,y), se obţine

z=[ 1 0 -2]

Funcţia mod(x,y) are acelaşi semn cu y, atunci când rem(x,y) are semnul lui x. Cele două funcţii mod(x,y) şi rem(x,y) sunt egale dacă x şi y au acelaşi semn, dar diferă dacă y sau x au semne diferite. Dacă X=[1.5 9 -4.5] şi Y=[-0.5 -3 4], atunci mod(X,Y) este [ 0 0 3.5], iar rem(X,Y) este [0 0 -0.5], dar mod(Y,X) este [1 6 -0.5], iar rem(Y,X) este [-0.5 -3 4]. Considerând X1=[2.5 6 –7] şi Y1=3, atunci rem(X1,Y1) este [2.5 0 -1], iar rem(Y1,X1) este [0.5 3 3], pe când mod(X1,Y1) este [2.5 0 2], iar mod(Y1,X1) este [0.5 3 -4].

Funcţia sign(x) asociază fiecărui element al vectorului x elementele –1, 0, 1,

după următoarea regulă: ( )

<

=

>

=

0x 1-

0x 0

0x 1,

xsign , . Dacă x este complex, atunci

sign(x)=x./abs(x).

8.6. Funcţii pentru aflarea unor numere importante

Factorii primi ai unui număr natural pozitiv N, alţii decât 1, sunt calculaţi cu funţia factor(N). Dacă N=33, atunci factor(N), găseşte ca factori primi 3 şi 11.

Generarea unei liste cu toate numerele prime mai mici sau egale cu un număr natural pozitiv N (altele decât 1), se face prin utilizarea funcţiei primes(N). Dacă N=33, atunci primes(33), produce lista,

ans = 2 3 5 7 11 13 17 19 23 29 31,

care conţine toate numerele prime mai <=N.

Verificarea dacă, un număr natural N sau un element dintr-un vector sau matrice este prim, se realizează prin utilizarea funcţiei isprime( N), la care se

Funcţii matematice în Matlab 177

obţine răspunsul 1 atunci când este prim şi 0, altfel. De exemplu, pentru isprime(31) se obţine 1, iar pentru isprime(33) se obţine 0.

Calculul celui mai mare divizor comun G, a două numere întregi a şi b, se obţine prin utilizarea funcţiei G=gcd(a,b). Pentru a=2310 şi b=273, funcţia gcd(a,b) găseşte 21, care este cel mai mare divizor comun.

Calculul celui mai mic multiplu comun M, a două numere întregi a şi b, se realizează prin utilizarea funcţiei M=lcm(a,b). Pentru a=2310 şi b=273, funcţia lcm(a,b) se găseşte 30030, care este cel mai mic multiplu comun.

Numărul tuturor combinaţiilor a N elemente, luate câte K (K<=N), respectiv a coeficienţilor binomiali, se află cu instrucţiunea nchoosek(N,K), care calculează N!/(K!(N-K)!). Pentru N=9 şi K=3, prin nchoosek(N,K), se obţine 84, iar pentru N=3, K=2, se obţine 3.

Găsirea tuturor permutărilor posibile (fără repetiţie), a numerelor naturale dintre 1 şi un număr oarecare N (N<15), se obţine cu funcţia perms(1:N), care are ca rezultat o matrice cu N! linii şi N coloane, conţinând toate permutările posibile.

Pentru N=3, prin perms(1:3) se obţine: ans = 3 2 1 2 3 1 3 1 2 1 3 2 2 1 3 1 2 3.

Funcţia factorial(N) realizează produsul tuturor întregilor de la 1 la N, fiind similară cu funcţia prod(1:N) şi realizând produsul 1*2* … *N. Pentru numere în dublă precizie, care au peste 15 digiţi, rezultatul este corect pentru N<=21, iar pentru N>21 sunt corecte primele 15 semne (digiţi). De exemplu, factorial(4) este 1*2*3*4=24.

8.7. Funcţii matematice speciale

8.7.1. Funcţia Gamma, Gamma incompletă

Funcţia Gamma sau funcţia lui Euler de speţa a doua, poate fi definită prin:

• integrala ( ) ∫∞

−−

0

1dtetx

tx , unde ℜ∈x ,

sau

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 178

• prin limita şirului ( )

( ) ( ) ( )

xn nn

nxxxx

x ⋅

++⋅+⋅=

Γ ∞→ !

21lim

1 K.

Principalele proprietăţi ale funcţiei Gamma sunt: • dacă argumentul x este un întreg, atunci funcţia Gamma este identică cu

funcţia factorial, respectiv ( )1! +Γ= nn ;

• pentru orice z finit, este satisfăcută relaţia de recurenţă ( ) ( )xxx Γ=+Γ 1 ;

• cunoscând valoarea pentru x > 1, valorile pentru x < 1 se determină din

ecuaţia complementelor ( )( ) ( ) ( ) ( )xx

x

xxx

⋅+Γ

⋅=

⋅Γ

=−Γ

π

π

π

π

sin1sin1 ;

• pentru 2

1=x funcţia π=

Γ

2

1.

În Matlab, funcţia Gamma se apelează cu sintaxa y=gamma(x), unde x este argumentul iar y este valoarea calculată. Pentru x=2.5 se obţine 1.3293, iar pentru x=–0.5 se obţine -3.5449.

Pentru x>0 se poate calcula logaritmul natural al funcţiei Gamma cu instrucţiunea gammaln(x), care corespunde lui log(gamma(x)), însă calculul se face printr-o metodă directă, fără a calcula gamma(x).

Funcţia Gamma incompletă, gammainc(x,a), este definită de relaţia,

∫ ℜ∈ℜ∈>

Γ

=+

−−

x

atxaadtte

aaxP

0

1 ,0 ,)(

1),( ,

şi are limitele: ( ) 1),( ,0,0 =∞= aPaP . Pentru x=1.25 şi a=0.5, cu gammainc(1.25,0.5) se obţine 0.8862. Pentru x=[0:0.1:15] şi diverse valori ale lui a, funcţia Gamma incompletă se

obţine prin instrucţiunile: g_05=gammainc(x,0.5); g_1=gammainc(x,1); g_3=gammainc(x,3); g_10=gammainc(x,10),

iar valorile sunt prezentate în figura 8.1.

Complementul funcţiei P(x,a), notată cu Q(x,a), este de multe ori confundată cu funcţia gamma incompletă,

∫ ℜ∈ℜ∈>

Γ

=

Γ

Γ=−=

+

−−

x

x

atxaadtte

aa

axaxPaxQ ,0 ,

)(

1

)(

),(),(1),( 1

şi are limitele, ( ) 0),( ,1,0 =∞= aPaQ .

Funcţii matematice în Matlab 179

Fig. 8.1. Funcţia Gamma incompletă pentru diverse valori ale lui a şi x

8.7.2. Funcţiile Beta şi Beta incompletă

Funcţia Beta, ( )qpB , , sau funcţia lui Euler de prima speţă, de variabile complexe p şi q, poate fi definită prin integrala,

( ) ( )∫−−

−=

1

0

11 1, dtttqpBqp ,

convergentă pentru ( ) 0>ℜ p , ( ) 0>ℜ q .

Principalele proprietăţi ale funcţiei Beta sunt:

• funcţia Beta, ( )qpB , , este simetrică în raport cu p şi q, ( ) ( )pqBqpB ,, = ,

obţinută prin schimbarea de variabilă τ=− t1 , astfel că

( ) ( ) ( )∫ ∫ =−=−−=

0

1

1

0

),(11, pqBddqpBpqpp

ττττττ ;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 180

• între funcţiile lui Euler ( )qpB , şi ( )zΓ există relaţia

( )( ) ( )

( )qp

qpqpB

ΓΓ=, ;

• pentru funcţia lui Euler de prima speţă avem egalitatea,

( )( ) ( )

( )

( ) ( )

( )( )qpqB

qp

qpq

qp

qppqppB ,1

1

1

1

11, +=

++Γ

Γ+Γ=

++Γ

+ΓΓ=+ .

În Matlab, funcţia Beta se apelează cu sintaxa b=beta(p,q), unde p şi q sunt argumentele, iar b este valoarea calculată. Pentru p=0.5 şi q=1.5 se obţine 1.5708.

Pentru x>0 se poate calcula logaritmul natural al funcţiei beta, cu instrucţiunea betaln(p,q), care corespunde lui log(beta(p,q)), însă calculul se face printr-o metodă directă, fără a calcula beta(p,q). Pentru p=0.5 şi q=1.5 se obţine 0.4516.

Funcţia Beta incompletă, betainc(x,p,q), este definită de relaţia,

( )( )

( )

( )

( )∫ ∑

++

+++

−=−=

=

+−−

x

n

n

qpqpinc

xnqpB

npB

qppB

xxdttt

qpBqpxB

0 0

111 1,

1,11

,

11

),(

1),,(

cu,

]1,0[ ,0, ∈ℜ∈>+

xp,qqp şi limitele:

( ) 0,,0 =qpB inc , 1),,( =∞ qpBinc

. Pentru x=[0:0.01:1] şi diverse valori ale lui p şi q, funcţia Beta incompletă se

obţine prin: b1=betainc(x,0.5,5), b2=betainc(x,1,3), b3=betainc(x,8,10), b4=betainc(x,0.5,0.5),

iar graficul este prezentat în figura 8.2.

Pentru calculul funcţiei Beta incompletă se utilizează algoritmul din funcţia betacore, apelată în betainc(x,a,c) prin instrucţiunea betacore(x,a,b).

Funcţii matematice în Matlab 181

Fig. 8.2. Funcţia Beta incompletă pentru diverse valori ale lui p, q şi x

8.7.3. Funcţiile lui Bessel

Printre funcţiile speciale, deosebit de importante sunt funcţiile lui Bessel, deoarece se întâlnesc în diverse probleme din mai toate domeniile fizicii şi ale tehnicii.

Ecuaţia diferenţială

( )

( ) 0)()()(

0)()()(

222

22

222

=−++

⇔=−+′+′′

xyxdx

xdyx

dx

xydx

xyxxyxxyx

ν

ν

unde ν este un parametru real sau complex, se numeşte ecuaţia lui Bessel, iar soluţiile acestei ecuaţii se numesc funcţii Bessel.

Funcţiile Bessel se mai numesc şi funcţii cilindrice datorită faptului că apar la rezolvarea ecuaţiei lui Laplace în coordonate cilindrice, în problemele la limită din teoria potenţialului (electric, termic, chimic).

Soluţia generală a ecuaţiei lui Bessel pentru n≠ν întreg este )()( 21 xJCxJCy

νν −+=

unde C1 şi C2 sunt constante arbitrare, iar Jν şi J-ν sunt funcţiile Bessel de speţa întâi şi ordinul ν, respectiv –ν.

Funcţia Bessel de speţa întâi şi ordinul ν, pentru o valoare x, din domeniul de

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 182

olomorfie (x)-T, unde T este o semidreaptă cu originea în x=0, este dată de relaţia

( )( )

∑∞

=

+

++Γ

−=

0

2

1!2

1)(p

p

p

pp

x

xJν

ν

ν.

Între funcţiile Bessel cu indici de semne contrare, Jν şi J-ν, există relaţia

( ) )(1)( xJxJn

νν−=

−.

În Matlab, funcţia Bessel de speţa întâi şi ordinul niu (ν) real, pozitiv şi argumentul x se calculează cu instrucţiunea J=besselj(niu,x). Dacă x şi niu sunt vectori de dimensiunile m şi respectiv n, atunci J va fi o matrice cu dimensiunea m

xn, în care elementul din poziţia (j,k) este dat de J(j,k)=besselj(niu(j),x(k)), cu

j=1,…,m<=1000, iar k=1,…,n. O variantă veche de apelare a funcţiei Bessel de speţa întâi şi ordinul niu (ν)

real, pozitiv şi argumentul x era bessela(niu,x). În figura 8.3 se prezintă grafic valorile funcţiei Bessel de speţa întâi şi de

ordinele –2,-1,0, 1, 2, pentru argumentul x variind între 0 şi 20, cu decrementul 0.1, calculate cu secvenţa de program:

x=0:0.1:20; niu=[-2 -1 0 1 2]; J_2=besselj(-2,x); J_1=besselj(-1,x); J0=besselj(0,x); J1=besselj(1,x); J2=besselj(2,x); plot(x,J_2,'r-',x,J_1,'b:',x,J0,'g.',x,J1,'y-.',x,J2,'c--');grid Soluţia generală a ecuaţiei lui Bessel pentru n=ν întreg este

)()( 21 xYCxJCy nn +=

unde C1 şi C2 sunt constante arbitrare, Jn este funcţia Bessel de speţa întâi şi ordin n

iar Yn este funcţia Bessel de speţa a doua şi ordinul n, numite şi funcţiile lui Neumann, astfel că uneori sunt notate cu Nn.

Pentru n întreg şi pozitiv ( )( )

∑−

=

−−−=

1

0

22 !2

!11

2ln

3

2)(

n

k

nk

nknn xk

knxxJxY

π

, iar

pentru n neîntreg este o combinaţie liniară, ( ) ( )

nx

xJnxxJxY nn

n sin

cos)( −

−= .

Funcţiile Bessel de speţa întâi, Jν(x), şi speţa a doua, Y-ν (x), sunt linear independente oricare ar fi ν.

De menţionat că functiile Bessel de speţa a doua (funcţiile Neumann) sunt definite şi pentru valori negative ale lui n, iar între acestea există relaţia

( ) )(1)( xYxY n

n

n −=−

.

În Matlab, funcţiile Bessel de speţa a doua (funcţiile Neumann) sunt calculate cu instrucţiunea Y=bessely(niu,x), unde niu este ordinul, iar x ordonatele

Funcţii matematice în Matlab 183

punctelor unde se evaluază funcţia Neumann.

Fig. 8.3. Funcţiile Bessel de speţa întâi şi ordin întreg

Funcţiile Bessel de prima speţă (numite de multe ori de primul sau întâiul ordin) şi speţa a doua (numite şi de ordinul doi) sunt asemănătoare cu funcţiile trigonometrice şi, de fapt, funcţia Jν(x) corespunde lui cos(x) şi funcţia Yν(x) corespunde lui sin(x). Aceasta sugerează deci să se definească pentru funcţiile cilindrice, funcţii care sunt legate de Jν şi Yν în acelaşi mod cum funcţiile exponenţiale sunt legate de cele trigonometrice, adică

( )( )

( )( ),)()( ,)()( 21xiYxJxHxiYxJxH

νννννν−=+=

unde i este unitatea imaginară.

Funcţiile ( ) ( ) )( ),( 21xHxH

νν se numesc funcţiile lui Bessel de speţa a treia

(sau de ordinul trei) sau funcţiile lui Hankel. Acestea sunt cunoscute ca funcţiile

Hankel de speţa întâi , ( ) )(1xH

ν, respectiv de speţa a doua, ( ) )(2

xHν

.

Dacă n≠ν întreg, atunci

( ) ( ) ( )

νπ

ν

νπ

ν

ν sin)(1 xJexJ

ixHi

−= , ( )

( ) ( )

νπ

ν

νπ

ν

ν sin)(2 xJexJ

ixHi

−−

−= .

Schimbând pe ν în ν− , rezultă evident, ( ) ( ) )()( 11

xHexHi

ν

νπ

ν=

−, ( ) ( ) )()( 22

xHexHi

ν

νπ

ν

−= .

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 184

În Matlab, funcţiile Bessel de ordinul trei sau funcţiile lui Hankel sunt calculate cu instrucţiunea H=besselh(niu,k,z), unde niu este ordinul, k este ordinul sau speţa (k=1 pentru speţa întâi şi k=2 pentru speţa a doua), iar x ordonatele punctelor unde se evaluază funcţia Hankel.

Valorile funcţiilor Bessel pentru valori foarte mici ale argumentului (|x|<<1) sunt:

( ) 124

1

21

42

0 ≅

+

−≈

xxxJ ; ( )

( )n

xxJ

n

n

2;

( ) ;57722.0ln1

...3

1

2

11limln ;ln

2ln

20 =

−++++=

+≈

∞→

nn

xxY

nγγ

π

( )( )

0 , ,!12

>∈−

−≈ nNnx

nxY

n

n

,

în care γln este constanta Euler-Mascheroni. Comportarea funcţiilor Bessel pentru valori foarte mari ale argumentului

( ∞→x ) este dată de formulele asimtotice:

( ) ,24

cos2

−−≈

ππ

π

nxx

xJ n |x|≅1;

( ) ,24

sin2

−−≈

ππ

π

nxx

xYn |x|≅1;

( ) ( ) ,2

,2 242241

−−−

−−

≈≈

ππππ

ππ

nxj

n

nxj

n ex

xHex

xH |x|≅1.

Pentru funcţiile lui Bessel sunt valabile următoarele formule de recurenţă:

( ) ( ) ( ) ( ) ( ) ( )xYxYx

nxYxJxJ

x

nxJ nnnnnn 1111

2 ,

2−+−+

−=−= ,

( ) ( ) ( ) ( ) ( ) ( )xJx

nxJxJxJ

x

nxJxJ

dx

dnnnnnn −=−=′=

−+ 11 , ( ) ( )xJxJ 10 −=′ ,

( ) ( ) ( ) ( ) ( ) ( )xYx

nxYxYxY

x

nxYxY

dx

dnnnnnn −=−=′=

−+ 11 , ( ) ( )xYxY 10 −=′ ,

( ) ( )dxxxJx

xJ ∫= 01

1, ( ) ( )dxxxY

xxY ∫= 01

1, ( ) ( ) ( )dxxxJ

xxJxJ ∫=+

202

21

20

2,

( ) ( )( )

( ) ( )xJx

xJx

nnxJxJ

dx

dnnnn 122

2 11

1+

+

−=′′= ,

Funcţii matematice în Matlab 185

( ) ( )( )

( ) ( )xYx

xYx

nnxYxY

dx

dnnnn 122

2 11

1+

+

−=′′= .

Dacă ordinul funcţiei Bessel este un multiplu impar al lui 1/2, atunci funcţia Bessel de prima speţă (ordinul întâi) poate fi exprimată, sub formă compactă, cu ajutorul funcţiilor trigonometrice elementare şi al puterilor negative, întregi şi fracţionale, ale lui x,

( ) ( ) ,cos2

,sin2

2

1

2

1 xx

xJxx

xJππ

==−

( ) ( ) ,cos2

1sin

2 ,cossin

12

2

3

2

3

+−=

−=

xxx

xJxxxx

xJππ

( ) întreg, ,cos1

sin12

2

1 nxx

Bxx

Ax

xJ nnn

+

=

+ π

iar

xB

xA nn

1 ,

1 sunt

polinoame în x

1de grad cel mult n.

Liouville a arătat că acestea sunt singurele funcţii Bessel care pot fi

exprimate prin funcţii elementare, iar toate celelalte sunt funcţii transcendente noi.

Funcţiile Bessel de prima speţă şi de ordin întreg pot fi reprezentaţi printr-o integrală definită. Astfel,

( ) ( )∫∫∫ −===−

ππ

θθ

π

θθ

θθθ

π

θ

π

θ

π 0

2

0

sin2

0

cos sincos1

2

1

2

1dnxdeedee

ixJ

inixinix

nn ,

( ) ( ) ( ) ∫∫∫−

===

1

02

2

00

01

cos2sincos

2sincos

1du

u

uxdxdxxJ

π

θθ

π

θθ

π

π

π

.

De asemenea, funcţiile Bessel de prima speţă şi de ordin întreg, ( )xJ n ,

admit reprezentarea ( ) ∫ +

=

C

n

x

n de

ixJ ζ

ζπ

ζ

ζ

1

1

2

2

1, unde C este un cerc cu centrul în

punctul 0=ζ sau o curbă simplă închisă care înconjură acest punct.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 186

8.7.4. Dezvoltarea în serie de funcţii Bessel a unei funcţii

oarecare. Ortogonalitatea funţiilor Bessel de prima speţă

şi zerourile lor.

Se poate demonstra că o funcţie oarecare poate fi exprimată sub forma

( ) ( )∑∞

=

=

ννξ xJaxf n , cu 10 ≤≤ x , adică poate fi exprimată cu ajutorul unui

număr mare de funcţii Bessel de ordinul n. În această expresie ,... ... , , 21 νξξξ sunt

rădăcinile funcţiei ( )ξnJ ordonate după mărime (n>-1), n fiind număr real.

Dacă n este real n>-1, toate zerourile funcţiei ( )xJ n sunt reale, întrucât seria

corespunzătoare are toţi coeficienţii reali. Funcţia ( ) 0=xJ n , cu n real, are o

infinitate de rădăcini reale. Valorile coeficienţilor le obţinem în modul obişnuit, înmulţind ambii

membrii ai egalităţii cu o asemenea funcţie, încât în membrul drept al egalităţii, integrând în domeniul 10 ≤≤ x , valoarea numai a unei singure integrale să rezulte diferită de zero. În acest fel, poate fi determinat coeficientul corespunnzător termenului respectiv.

Funcţiile ( ) ( ) ( ) 10 , ... , ... , , 21 ≤≤ xxJxxJxxJx nnn νξξξ , formează

o mulţime de funcţii ortogonale în domeniul 10 ≤≤ x , adică,

( ) ( ) ( ) ( ) kidxxJxJxdxxJxJx kninknin ≠== ∫∫ ,0 x 1

0

1

0

ξξξξ .

Coeficienţii dezvoltării în serie ( ) ( ) ( ) ( ) ......2211 ++++= xJaxJaxJaxf nnnnn ξξξ

îi putem obţine prin înmulţirea ambilor membrii cu funcţia ( )xxJ n νξ , integrând de

la 0 la 1 şi ţinând seama de relaţia de ortogonalitate,

( ) ( ) kidxxJxJx knin ≠=∫ ,0 1

0

ξξ , astfel că termenii din membrul drept vor fi nuli,

cu excepţia unuia singur. Prin urmare, coeficientul alν -lea al dezvoltării în serie este:

( )( )dxxJxxf

Ja n

n

ν

ν

νξ

ξ∫

=

1

02 )(2

.

8.7.5. Funcţiile Bessel modificate

În practică, nu obţinem direct formele canonice ale ecuaţiilor Laplace în coordonate cilindrice,

Funcţii matematice în Matlab 187

( ) ( ) 0)(0)()()(

0)(1)(1)(

22222

22

2

2

2

2

=−+

⇔=−++

⇔=

−++

xynxdx

dx

dx

dxxynx

dx

xdyx

dx

xydx

xyx

n

dx

xdy

xdx

xyd

ci, în general, trebuie să rezolvăm ecuaţii diferenţiale de forma:

0)()(1)(

2

2

2

2

=

−++ xy

x

nk

dx

xdy

xdx

xyd,

care, cu schimbarea de variabilă kxz = ,se reduce la forma canonică. Soluţia generală a ecuaţiei anterioare se poate scrie sub forma

)()( 21 kxJCkxJCy nn −+= sau )()( 21 kxYCkxJCy nn += , care, pentru n şi x ,iau

valori complexe.

Pentru cazul paricular 12−=k , ecuaţia anterioară devine

0)(1)(1)(

2

2

2

2

=

−−++ xy

x

n

dx

xdy

xdx

xyd,

având soluţia generală de forma,

)()( 21 xKCxICy nn += ,

unde )(xIn este funcţia Bessel modificată de speţa întâi, iar )(xKn este funcţia

Bessel modificată de speţa a doua. Aceste funcţii modificate sunt echivalentele funcţiilor Bessel )(xJ n şi

)(xYn , care diferă printr-un factor constant şi sunt date de expresiile,

( ) ( ) ( ),)( ixJiixJixI n

n

n

n

n −≡=−

( ) ( )[ ] ( ) ( )[ ]xIxIn

ixiYixJixK nnnn

n

n −=+=−

+

π

ππ

sin22)( 1 ,

fiind denumite, din această cauză şi funcţiile Bessel de argument pur imaginar. În Matlab, aceste funcţii sunt calculate cu formula bi=besseli(n,x) şi

bk=besselk(n,x), unde n este ordinul, iar x este argumentul pur imaginar. Pentru x pur imaginar, având valorile modulului x=[0:0.1:4], se reprezintă în

figura 8.4, funcţiile Bessel modificate de speţa întâi (I) şi a doua (K), de ordinul n=0,1,2, calculate cu secvenţele Matlab:

x =[0:0.001:3.5]; I_0=besseli(0,x); I_1=besseli(1,x); I_2=besseli(2,x); x1=[0.01:0.001:3.5]; K_0=besselk(0,x1); x2=[0.125:0.001:3.5]; K_1=besselk(1,x2); x3=[0.5:0.001:3.5]; K_2=besselk(2,x3); plot(x,I_0,x,I_1,'-.',x,I_2,'--',x1,K_0,x2,K_1,'-.',x3,K_2,'--').

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 188

Fig. 8.4. Funcţiile Bessel modificate

Dacă comportarea funcţiilor Bessel de speţa întâi şi a doua seamănă cu aceea a funcţiilor care descriu mişcarea oscilatorie amortizată, (ceea ce a reieşit şi din faptul că pentru valori foarte mari ale argumentului ele pot fi înlocuite cu funcţii sinus, respectiv cosinus de amplitudine descrescătoare), comportarea funcţiilor Bessel modificate se aseamănă cu aceea a funcţiilor exponenţiale.

Valorile funcţiilor Bessel modificate, pentru valori foarte mici ale argumentului (|x|<<1) sunt:

( ) 124

1

21

42

0 ≅

+

−≈

xxxI ; ( ) 0,

2!

1>

≈ n

x

nxI

n

n ;

( ) ;57722.0ln ,2

ln0 =−≈ γγx

xK ( )( )

0 , ,!12 1

≠∈−

−≈

nNnx

nxK

n

n

n ,

în care γln este constanta Euler-Mascheroni. Comportarea funcţiilor Bessel modificate, pentru valori foarte mari ale

argumentului ( ∞→x ) este dată de formulele asimtotice:

( )

πx

exI

x

20 ≈ , ( )

xe

xxK

20

π, |x|≅1;

Funcţii matematice în Matlab 189

( ) xxI

xI

2

11

)(

0

1−≈ ,

( ) xxK

xK

2

11

)(

0

1+≈ , |x|≅1.

Pentru funcţiile Bessel modificate, sunt valabile următoarele formule de recurenţă:

( ) ( ) ( ) ( ) ( ) ( )xKxKx

nxKxJxI

x

nxI nnnnnn 1111

2 ,

2−+−+

+=+−= , ( ) ( )xKxK 10 −=′ ,

( ) ( ) ( )xIxIxIdx

d100 =′= , ( ) ( )dxxxI

xxI ∫= 01

1, ( ) ( )dxxxK

xxK ∫= 01

1.

Verificarea argumentelor funcţiilor Bessel se face cu besschk, apelată sub forma [MSG,n,x,SIZ] = besschk(n,x), în care în MSG se întoarce un mesaj referitor la n şi x, specificând dacă sunt numere şi dacă sunt reale, iar în SIZ se specifică dacă au aceeaşi dimensiune, concomitent cu un mesaj dacă nu au.

8.7.6. Funcţiile lui Thomson

Pe lângă funcţiile lui Bessel, de argument pur real sau pur imaginar, întâlnim

şi funcţii de ordinul zero şi de argument xi 2

1

(respectiv 4

πi

xe ) sau xi 2

3

(respectiv

4

πi

ixe ), a căror valoare este în general complexă. Pentru aceste funcţii, cu aplicaţii practice deosebite în electrotehnică, se

folosesc notaţiile introduse de W. Thomson (lord Kelvin):

=

=+

40

40)(bei)(ber

ππii

xeIixeJxix ,

=

−=+

40

4

3

0)(ei)(kerππ

ii

xeKixeKxikx .

Ţinând seama de ( ),)( ixJixI n

n

n

= avem ( )

∑∞

=

=

0

2

24

0 2!

1

p

p

pi x

pixeI

π

,

astfel că:

( ) ( )

...2!4

1

2!2

11ReRe)(ber

8

2

4

22

1

02

3

0 −

+

−≈

=

=

xxxiJxiJx ,

( ) ( ) ( )...

2!5

1

2!3

1

2!1

1ImIm)(bei

10

2

6

2

2

22

1

02

3

0 −

+

−=

=

xxxxiJxiJx

Curbele funcţiilor ber(x) şi bei(x) sunt prezentate în figura 8.5 şi sunt

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 190

calculate în Matlab cu instrucţiunile: x=[0:0.1:10]; ber=real(besselj(0,i^0.5*x)); bei=imag(besselj(0,i^1.5*x)); plot(x,ber,'-.',x,bei); xlabel('x'); ylabel('Functiile lui Thomson').

Prin definiţie, ber(x) şi bei(x) se numesc funcţiile lui Thomson. Acestea se generalizează pentru ν oarecare prin egalităţile:

±

4

3

)(bei)(berπ

ννν

i

xeJxix ,

−=±

±

4

3

)(kei)(kerπ

ννν

i

ixeKxix ,

=+

±

4

3)1()(hei)(her

π

ν

i

xeHxix .

Fig. 8.5. Funcţiile lui Thomson ber(x) şi bei(x)

Funcţii matematice în Matlab 191

8.7.7. Funcţia Airy

Pe lângă funcţiile lui Bessel, de argument pur real sau pur imaginar, întâlnim şi funcţiile Airy, definite astfel:

• W = airy(Z) - funcţia Airy, Ai(z), a elementelor Z; • W = airy(0,Z) – identică cu airy(Z); • W = airy(1,Z) – derivate funcţiei Airy, Ai'(z); • W = airy(2,Z) – funcţia Airy de speţa a doua, Bi(z); • W = airy(3,Z) – derivate funcţiei Airy de speţa a doua, Bi'(z).

Dacă argumentul Z este o matrice, rezultatul este de acelaşi tip. Sub forma [W,IERR] = airy(K,Z), returnează în IERR şi informaţii

referitoare la rezultatul calculelor. Astfel: • ierr = 1 argument illegal (Illegal arguments); • ierr = 2 depăşire spre infinit (Overflow. Return Inf.); • ierr = 3 acurateţe inadecvată (Some loss of accuracy in argument

reduction) • ierr = 4 rezultatele sunt inadecvate (Complete loss of accuracy, z too

large); • ierr = 5 nu este convergentă (No convergence. Return NaN).

Relaţiile dintre funcţiile Airy şi Bessel modificate sunt:

( )ζ

π3/13

1Ai(z)

−⋅⋅= K

z

( ) ( )( )ζζ 3/13/13Bi(z) II

z+⋅=

unde: 2

3

3

2z⋅=ζ .

În Matlab, relaţiile sunt: Ai(z) = 1/pi*sqrt(z/3)*K_1/3(zeta) Bi(z) = sqrt(z/3)*(I_-1/3(zeta)+I_1/3(zeta))

unde zeta = 2/3*z^(3/2).

8.7.8. Funcţia eroare

Funcţia eroare, erf(x), şi complementara funcţiei eroare, erfc(x), sunt cazuri speciale ale funcţiei Gamma incomplete, definite prin relaţiile:

)5.0,(2

erf(x) 2

0

2

xPdte

x

t=⋅= ∫

π

,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 192

)erf(x12

erfc(x)0

2

−=⋅= ∫−

x

tdte

π

în care )5.0,( 2xP este funcţia Gamma incompletă, iar argumentul x trebuie să fie

real şi 0≥x . Funcţia eroare şi complementara acesteia au limitele,

0erf(0) = , 1)erf( =∞ , 1erfc(0) = , 0)erfc( =∞ , şi respectă relaţiile de simetrie :

erf(-x)erf(-x) −= , erfc(x)2erfc(-x) −= .

Calculul valorii funcţiei eroare genaralizate, pentru x şi y scalar, vector sau matrice se face cu relaţia:

)erf(xerf(y)2

erf(x)2

−=⋅= ∫−

y

x

tdte

π

.

Inversa funcţiei eroare, erfinv(y), returnează valoarea x pentru valori cunoscute ale argumentului y şi se apelează cu sintaxa x=erfinv(y). Valorile lui y trebuie să fie în intervalul [-1 1], iar x rezultă în intervalul ( )∞+∞ ,- .

Funcţia eroare, acoperitoare pentru fiecare argument x este:

erf(x)erfcx(x)2

⋅=x

e ,

care, pentru x foarte mare, este aproximată cu x

11⋅

π

.

8.7.9. Funcţia integrală exponenţială

Funcţia integrală exponenţială, expint, pentru fiecare element x>0, este definită prin:

∫∞ −

=

x

t

dtt

eexpint(x) .

O altă definiţie a funcţiei integraleexponenţială este valoarea principală a integralei Chauchy, notată Ei şi definită prin:

∫∞−

=

x t

dtt

eEi(x) .

Relaţia dintre cele două definiţii este: expint(-x+i*0) = -Ei(x) - i*pi, pentru x > 0 Ei(x) = real(-expint(-x)), pentru x > 0.

Funcţii matematice în Matlab 193

8.7.10. Polinoamele şi funcţiile Legendre asociate

În coordonate carteziene x, y, z, ecuaţia lui Laplace 0 grad div ==∆ uu , se scrie,

0

2

2

2

2

2

2

=

∂+

∂+

z

u

y

u

x

u,

iar în coordonate sferice, r, θ , ϕ , această ecuaţie are forma,

0

sin

1

sin

sin

1 22

2

2=

∂⋅⋅

∂+

∂⋅+

∂⋅⋅

∂⋅

r

Ur

r

UU

ϕθθ

θ

θθ

,

unde: ( ) ( )θϕθϕθϕθ cos ,sinsin ,cossin,, ⋅⋅⋅⋅⋅= rrrurU

este funcţia obţinută din ( )zyxu ,, prin schimbarea coordonatelor carteziene în sferice,

θϕθϕθ cosz ,sinsiny ,cossin ⋅=⋅⋅=⋅⋅= rrrx . Funcţiile ( )zyxu ,, , omogene în x, y, z, care satisfac ecuaţia lui Laplace se

numesc funcţii sferice. Gradul de omogenitate al funcţiei ( )zyxu ,, se numeşte şi ordinul funcţiei sferice.

Dacă ( )zyxu ,, este o funcţie sferică de ordinul n, datorită omogenităţii, avem

( ) ( ) ( )ϕθθϕθϕθϕθ ,cos ,sinsin ,cossin,, n

nnFrrrrurrU ⋅=⋅⋅⋅⋅⋅⋅= ,

care, introdusă în ecuaţia lui Laplace, scrisă în coordonate sferice şi simplificând cu nr , conduce la:

( ) 01

sin

1

sin

sin

12

2

2=⋅+⋅+

∂⋅+

∂⋅⋅

∂⋅ n

nn FnnFF

ϕθθ

θ

θθ

.

Funcţiile ( )ϕθ ,nF , care verifică ecuaţia Laplace de mai sus, se numesc

funcţii sferice superficiale de ordinul n, deoarece pe sfera cu centrul în origine şi de rază 1=r avem:

( ) ( )ϕθϕθ ,,,1 nFU = .

Fiecărei funcţii sferice ( ) ( )ϕθ ,,,, rUzyxu = de ordinul n îi corespunde o

funcţie sferică superficială ( )ϕθ ,nF şi, reciproc, fiecărei funcţii sferice

superficiale ( )ϕθ ,nF îi corespunde o funcţie sferică

( ) ( ) ( )ϕθϕθ ,,,,, n

nFrrUzyxu ⋅==

de acelaşi ordin n.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 194

De menţionat că schimbarea lui n în 1−−= np , lasă ecuaţia anterioară

neschimbată şi prin urmare, dacă ( ) ( )ϕθϕθ ,,, n

nFrrU ⋅= este o funcţie sferică,

atunci şi funcţia ( ) ( )ϕθϕθ ,,, 11

1 −−

−−

⋅= n

nFrrU este o funcţie sferică.

Polinoamele lui Legendre sau funcţiile lui Legendre de prima speţă sunt

funcţii sferice superficiale, care satisfac ecuaţia lui Laplace. Acestea sunt polinoame de gradul n în αcos=x , conţinând numai puteri pare sau impare, după cum n este par sau impar, iar semnele termenilor săi alternează:

( ) ( ) ( )( )

( )

kn

k

nE

k

kkn

k

nn xkn

knCxPP

22

0 !2

1225311cos −

=

−⋅

−−⋅⋅⋅⋅−== ∑

Lα ,

în care

2

nE este partea întreagă a numărului

2

n.

De remarcat că, pentru α real, [ ]1 ,1−∈x . Principalele proprietăţi ale polinoamelor lui Legendre sunt:

• pot fi exprimate prin formula Olinde-Rodrigues,

( ) ( )n

nn xxn

xP 1 d

d

!2

1 2n

n

−= ,

sau formula lui Schlafli, ca o integrală pe o curbă oarecare, C, închisă cu x, un punct interior domeniului mărginit de C,

( )( )

( )∫ +

⋅=C n

n

nnxi

xP ζ

ζ

ζ

π

d1

2

1

2

11

2

,

• satisfac relaţia de recurenţă, care permite determinarea tuturor polinoamelor, când se cunosc două dintre ele, cu indici diferind printr-o unitate, ( ) ( ) L3,2,1 ,0121 11 ==++−+

−+nnPxPnPn nnn ,

• pentru [ ]1 ,1−∈x iau valori reale în intervalul [ ]1 ,1− ,

• au toate rădăcinile reale şi distincte, cuprinse în intervalul deschis ( )1 1− ,

• polinomul lui Legendre ( )xPn este o soluţie a ecuaţiei diferenţiale a lui

Legendre,

( )[ ] ( ) ( ) ( ) 01'2"101'1 d

d 22=−−+−⇔=−−− ynnxyyxynnyx

x,

• polinoamele lui Legendre formează un sistem de funcţii ortogonale pe intervalul [ ]1 ,1− ,

Funcţii matematice în Matlab 195

( ) ( )

=

+

=⋅⋅∫−

nkn

nk

xxPxP nk pentru 12

2pentru 0

d 1

1

,

ceea ce permite să considerăm seria Fourier a unei funcţii f(x), integrabilă şi cu pătratul integrabil pe [ ]1 ,1− , faţă de sistemul de funcţii format de

polinoamele Legendre, ( )∑∞

=

0n

nn xPa cu coeficienţii Fourier generalizaţi

( ) ( ) xxPxfn

a nn d2

12 1

1

⋅⋅+

= ∫−

De menţionat că, polinomul lui Legendre ( )xPn , este o soluţie particulară a

ecuaţiei lui Legendre, ( ) ( ) 01'2"12=−−+− ynnxyyx .

Soluţia generală a ecuaţiei lui Legendre este

( ) ( ) ( ) ( )xPCxKx

xxPCzxPy nnnn ⋅+

+

+⋅⋅=⋅=

− 111

1ln ,

în care polinoamele ( )xKn 1− se determină dezvoltând funcţia

1

1ln

+

x

x în serie

de puteri.

Funcţiile ( ) ( ) ( )xKx

xxPxQ nnn 11

1ln

−+

+⋅= se numesc funcţiile lui

Legendre de speţa a doua. Aceste funcţii verifică, evident, ecuaţia lui Legendre şi satisfac aceleaşi relaţii de recurenţă ca polinoamele lui Legendre.

Funcţiile lui Legendre asociate se construiesc folosind funcţiile lui

Legendre de prima speţă şi de speţa a doua şi sunt :

( ) ( )( )

m

n

mm

mnx

xPxxP

d

d1 22

, −= ,

( ) ( )( )

m

n

mm

mnx

xQxxQ

d

d1 22

, −= ,

unde m şi n iau valorile 0, 1, 2, 3, …, iar nm ≤ . Funcţiile lui Legendre asociate sunt soluţii ale ecuaţiei diferenţiale:

( ) ( ) 01

1'2"12

22

=⋅

−++⋅−− yx

mnnyxyx

şi pot fi exprimate sintetic sub forma:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 196

( ) ( )( )

m

n

mmm

mnx

xPxxP

d

d11)( 22

, −⋅−= ,

în care n este gradul, iar m este ordinul. Calculul acestor funcţii se face în Matlab prin instrucţiunea

P=legendre(n,x), care permite calculul funcţiilor Legendre de gradul n şi ordinul m=0, 1, …, n, evaluate pentru fiecare element x. De menţionat că n trebuie să fie un scalar întreg n < 256, iar [ ]1 ,1−∈x , adică -1 <= x <= 1.

Dacă x este un vector cu lungimea L, atunci polinomul P este o matrice de dimensiune (n+1)*L. Valoarea P(m+1,i) corespunde funcţiilor Legendre asociate de gradul n şi ordinul m, evaluate în punctul x(i). În general, se returnează o matrice care are numărul de coloane egal cu lungimea vectorului x, iar numărul de linii egal cu ordinul sau mai mare cu 1 decât gradul. Fiecare linie conţine funcţiile lui Legendre de gradul n şi ordinul corespunzând liniei evaluate, pentru fiecare valoare x. Prima linie (rând) a matricei P returnate conţine polinoamele lui Legendre de ordinul m=0.

De exemplu: • legendre(2, 0.0:0.1:0.2) returnează matricea:

| x = 0 x = 0.1 x = 0.2 ------|--------------------------------------------- m = 0 | -0.5000 -0.4850 -0.4400 m = 1 | 0 -0.2985 -0.5879 m = 2 | 3.0000 2.9700 2.8800

• setul de instrucţiuni X = rand(2,4,5); N = 2; P = legendre(N,X); returnează o matrice de 3*2*4*5 şi P(:,1,2,3) este la fel ca şi cel dat de instrucţiunea legendre(N,X(1,2,3)).

Funcţia SP=legendre(n,x,’sch’) calculează funcţiile Schmidt semi-

normalizate, asociate funcţiilor Legendre, definite prin relaţia:

( )( )

( )( )

>⋅

+

−⋅⋅−

=

=0pentru

!

!21

0pentru )(

)(,

, mxPmn

mn

mxP

xSPmn

m

n

mn

De exemplu, instrucţiunea, P=legendre(2,0:0.1:0.5)

conduce la, P = -0.5000 -0.4850 -0.4400 -0.3650 -0.2600 -0.1250

Funcţii matematice în Matlab 197

0 -0.2985 -0.5879 -0.8585 -1.0998 -1.2990 3.0000 2.9700 2.8800 2.7300 2.5200 2.2500

iar instrucţiunea, P=legendre(2,0:0.1:0.5,'sch')

are ca rezultat, P = -0.5000 -0.4850 -0.4400 -0.3650 -0.2600 -0.1250 0 0.1723 0.3394 0.4957 0.6350 0.7500 0.8660 0.8574 0.8314 0.7881 0.7275 0.6495

de unde se observă diferenţa. Pentru m=1 şi n=1, ecuaţia diferenţială de gradul doi devine:

( ) 01

12'2"1

22

=⋅

−+⋅−− yx

yxyx ,

iar soluţiile, pentru x=0:0.01:1 sunt calculate cu relaţia P1=legendre(2,x), pentru funcţiile Legendre asociate şi relaţia P2=legendre(2,x,'sch'), pentru funcţiile Schmidt seminormalizate, asociate funcţiilor Legendre.

Reprezentarea grafică este redată în figura 8.6.

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-1.5

-1

-0.5

0

0.5

1

x

y

P1

P2

Fig.8.6. Soluţiile ecuaţiiei de gradul 2 cu funcţii Legendre

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 198

8.7.11. Funcţii eliptice Jacobi

Polinoamele lui Jacobi sunt de forma:

( )

( ) ( )

( )( ) ( )( ) ( )[ ]

nn

n

n

nn xbaxxn

xbax

baxJ

++

−−

+++

−−⋅

=βα

βα

ααα d

d

21

1)(

L

,

unde βα , sunt două numere reale mai mari decât –1.

Polinomul lui Jacobi )(xJ n este o soluţie a ecuaţiei diferenţiale:

( )( ) ( )( ) ( )( )[ ] ( ) 01'11" =⋅+++−⋅−++−++⋅−− ynnyaxbxybxax βαβα Totodată, polinoamele lui Jacobi, cuprind drept cazuri particulare, alte

polinoame speciale, astfel: • pentru 1 ,1 ,0 ,0 =−=== baβα se obţin polinoamele lui Legendre sub

forma Olinde-Rodrigues; • dacă b ,0 == βα , se obţine polinomul lui Laguere, până la o constantă ;

• pentru 2

,2

bba ==−= βα , se obţin polinoamele lui Hermite ;

• pentru 2

1 ,1 ,1 −===−= βαba , se obţin polinoamele lui Cebîşev.

În Matlab, funcţia [Sn,Cn,Dn] = ellipj(U,M, TOL), returnează valorile funcţiilor eliptice SN, CN şi DN, evaluate pentru fiecare element al argumentului U şi parametrului M, cu toleranţa TOL. Vectorii U şi M trebuie să aibă aceeaşi dimensiune sau unul să fie scalar, iar M are limitele 0 <= M <= 1. Toleranţa poate lipsi, fiind considerată implicit ca EPS.

Calculul integralei eliptice complete de speţa întâi, K, şi a doua, E, pentru fiecare element M, cuprins în intervalul 0 <= M <= 1, se face cu instrucţiunea [K,E] = ellipke(M, TOL), în care toleranţa Tol poate să lipsească, fiind atunci EPS.

8.7.12. Funcţia de repartiţie Laplace

Funcţia densităţii de probabilitate a repartiţiei normale este definită de relaţia

( ) 2

2

2

1z

ezf

=

π

care, în Matlab, se calculează cu secvenţa, f=1./sqrt(2*pi)*exp(-z.^2/2), unde z poate fi vector sau scalar.

Dacă [ ]10 10−∈z , ( )zf reprezintă densitatea de probabilitate cu repartiţie normală normată din figura 8.7, pentru care s-a utilizat secvenţa de instrucţiuni:

Funcţii matematice în Matlab 199

z=-10:0.1:10; f=1./sqrt(2*pi)*exp(-z.^2/2); plot(z,f); grid on; xlabel('z'); ylabel('f(z)'). Calculul funcţiei de repartiţie Laplace,

( ) ( ) ∫∫∞

∞−

∞−

−⋅

== dtt

edzzfzf2

2

1

π

foloseşte secvenţa, F=trapz(z,1./(sqrt(2*pi))*exp(-z.^2/2)) care, pentru valorile anterioare, rezultă F=1. Limita de integrare, ∞ , se poate lua un număr între -5 şi -10, fără ca, prin aceasta, să se inducă erori semnificative.

Fig. 8.7. Densitatea de probabilitate cu repartiţie normală normată

8.8. Transformări de coordonate

Dacă în unele probleme de teoria câmpurilor (termice, electrice, magnetice, barice) se utilizează un sistem de coordonate, nu întotdeauna sistemul cartezian este cel mai potrivit. De aceea, este necesar să studiem problema reprezentării funcţiilor scalare şi a funcţiilor vectoriale, precum şi a unor mărimi derivate, în coordonate oarecare. Mai mult, este necesar să putem transforma un sistem de coordonate în alt sistem de coordonate.

Fie x, y, z coordonatele carteziene ortogonale ale unui punct arbitrar P (vezi figura 8.8).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 200

Poziţia unui punct ( )0000 ,, zyxP poate fi obţinută ca intersecţia planelor

0xx = , 0yy = , 0zz = . Aceste plane se intersectează, două câte două, după

dreptele

00 , zzyy == ;

00 , xxzz == ;

00 , yyxx == ,

paralele cu axele de coordonate. Fiecărui punct 0P din spaţiu, îi este ataşat un

triedru kjirrr

, , , care este acelaşi pentru toate punctele din spaţiu.

Fig. 8.8.

În coordonate cilindrice, poziţia unui punct P este caracterizată prin z , ,ϕρ , unde ρ este distanţa de la origine la proiecţia 'P a punctului P, pe planul

xOy , ϕ este unghiul format de 'OP cu axa Ox , iar z cota lui P faţă de planul

xOy .

Punctul ( )0000 ,, zP ϕρ este intersecţia următoarelor suprafeţe: cilindru

0ρρ = , semiplanul 0ϕϕ = şi planul 0zz = (vezi figura 8.9).

Intersecţiile acestor suprafeţe, luate câte două, sunt: semidreapta ρC , pe care

variază numai ρ , cercul ϕ

C , pe care variază numai ϕ şi dreapta zC , pe care

variază numai z. Notăm cu zuuu

rrr , ,

ϕρ vectorii unitari tangenţi la aceste curbe, în 0P şi dirijaţi

în sensul crescător al variabilelor respective. Aceşti vectori sunt determinaţi în toate punctele din spaţiu, cu excepţia axei Oz , în care

ϕρuurr

, au direcţii

Funcţii matematice în Matlab 201

nedeterminate. Fiind ortogonali, doi câte doi, zuuu

rrr , ,

ϕρ formează un triedru nedegenerat,

de referinţă pentru orice punct, variabil cu punctul în care este considerat.

Fig. 8.9.

Între coordonatele cilindrice şi coordonatele carteziene avem relaţiile:

=

⋅=

⋅=

zz

y

x

ϕρ

ϕρ

sin

cos

cu πϕρ 20 ,0 <≤≥ . Funcţia Matlab care realizează această transformare, din coordonate

cilindrice în coordonate carteziene, este pol2cart. Aceasta poate fi apelată prin: [X,Y,Z] = pol2cart(TH,R,Z)

în care TH este unghiul ϕ , R este raza ρ , iar Z este înălţimea z, iar X, Y, Z sunt coordonatele carteziene. Matricele TH, R şi Z trebuie să aibă aceeaşi dimensiune (sau oricare să fie scalar);TH este dat în radiani.

De exemplu, dacă coordonatele punctului sunt TH=pi/6, R=2 şi Z=3, atunci: [X,Y,Z] = pol2cart(TH,R,Z),

conduce la X = 1.7321, Y = 1.0000, Z = 3.

Pentru plan, transformarea coordonatelor polare în carteziene se face cu instrucţiunea [X,Y] = pol2cart(TH,R), din care lipseşte Z. Coordonata Z nu suferă nici o transformare la trecerea dintr-un sistem de coordonate în altul.

Transformarea inversă, din coordonate carteziene în coordonate polare se face după relaţiile:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 202

=

=

+=

zz

x

y

yx

arctan

22

ϕ

ρ

cu ππρ <

≤≥

x

yarctan- ,0 .

Funcţia Matlab care realizează această transformare este cart2pol, care poate fi apelată prin instrucţiunea:

[TH,R,Z] = cart2pol(X,Y,Z) sau

[TH,R] = cart2pol(X,Y), în care X, Y, Z sunt coordonatele carteziene, iar TH este unghiul ϕ , R este raza

ρ , Z este înălţimea z. Matricele X, Y şi Z trebuie să aibă aceeaşi dimensiune (sau oricare să fie scalar), iar TH este returnat în radiani.

De exemplu, dacă X = 1.7321, Y = 1.0000, Z = 3, atunci prin instrucţiunea [TH,R,Z] = cart2pol(X,Y,Z), rezultă TH = 0.5236 =pi/6, R = 2.0000, Z = 3.

În coordonate sferice, un punct P, este dat prin: OPr = , unghiul θ format de OP cu axa Oz şi unghiul ϕ , pe care îl face proiecţia 'OP a lui OP , pe planul

xOy , cu axa Ox (vezi figura 8.10). În acest caz, curbele pe care variază numai unul dintre parametri sunt

următoarele: semidreapta rC ce porneşte din origine, semicercul meridian θC şi

cercul ϕ

C .

Sensul crescător al parametrilor pe aceste curbe va fi indicat, respectiv, prin vectorii unitari

ϕθuuur

rrr , , tangenţi curbelor în punctul considerat.

Aceşti vectori sunt determinaţi în toate punctele care nu aparţin axei Oz şi sunt ortogonali, doi câte doi.

Triedrul ϕθ

uuur

rrr , , poate fi considerat triedru de referinţă şi depinde de

punct. Între coordonatele sferice şi coordonatele carteziene avem relaţiile:

⋅=

⋅⋅=

⋅⋅=

θ

ϕθ

ϕθ

cos

sinsin

cossin

rz

ry

rx

cu πϕπθ 20 ,0 ,0 <≤<≤≥r . Funcţia Matlab care realizează această transformare, din coordonate sferice

Funcţii matematice în Matlab 203

în coordonate carteziene este sph2cart, apelată cu, [X,Y,Z] = sph2cart(TH,PHI,R),

în care TH este unghiul ϕ , respectiv azimutul, PSI este unghiul θ , respectiv elevaţia, R este raza r , iar X, Y, Z sunt coordonatele carteziene. Matricele TH, PHI şi R trebuie să aibă aceeaşi dimensiune (sau oricare să fie scalar), iar TH şi PSI sunt daţi în radiani.

Fig. 8.10.

De exemplu, dacă TH=pi/6, PHI= pi/4, R=2, atunci prin [X,Y,Z] = sph2cart(TH,PHI,R), se obţine X= 1.2247, Y = 0.7071, Z = 1.4142.

Transformarea inversă, din coordonate carteziene în coordonate sferice, se realizează cu relaţiile:

+

=

=

++=

22

222

arctan

arctan

yx

z

x

y

zyxr

θ

ϕ

cu πϕπθ 20 ,0 ,0 <≤<≤≥r .

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 204

Funcţia Matlab care realizează transformarea coordonatelor carteziene, în coordonate sferice, este cart2sph, apelată sub forma,

[TH,PHI,R] = cart2sph(X,Y,Z), în care X, Y, Z sunt coordonatele carteziene, TH este unghiul ϕ , respectiv

azimutul, PSI este unghiul θ , respectiv elevaţia, R este raza r . Matricele X, Y, Z trebuie să aibă aceeaşi dimensiune (sau oricare să fie scalar), iar TH şi PSI sunt returnaţi în radiani.

De exemplu, dacă X= 1.2247, Y = 0.7071, Z = 1.4142, atunci prin [TH,PHI,R] = cart2sph(X,Y,Z) se obţine TH = 0.5236 = pi/6, PHI = 0.7854 = pi/4, R = 2.0000.

8.9. Calculul produsului unor vectori

Produsul scalar al vectorilor a şi b este numărul obţinut înmulţind produsul modulelor lor cu cosinusul unghiului format de cei doi vectori (vezi figura 8.11),

cosθ⋅⋅=⋅ baba . Cel mai tipic exemplu de produs scalar a doi vectori este lucrul mecanic

produs de o forţă constantă bF = , când punctul său de aplicaţie se deplasează de

la O la A. Dacă se descompune F după direcţia OA şi perpendiculara pe această direcţie, componenta normală dă un lucru mecanic nul. Întreg lucrul mecanic al

forţei F este dat de componenta după direcţia OA, componentă ce are expresia, θθ coscos ⋅=⋅ bF . Lucrul mecanic va fi produsul dintre această componentă şi

deplasarea a=OA. Dacă 2

πθ < , lucrul mecanic este activ şi se exprimă printr-un

număr strict pozitiv, iar dacă 2

πθ > , lucrul mecanic este rezistent şi se exprimă

printr-un număr negativ. Principalele proprietăţi ale produsului scalar sunt:

• abba ⋅=⋅ - este comutativ;

• ( ) ( ) baba ⋅⋅=⋅⋅ λλ , în care λ este un scalar oarecare;

• ( ) cbcacba ⋅+⋅=⋅+ - este distributivă faţă de adunare;

• 02≥=⋅ aaa , egalitatea având loc numai dacă a=0;

• baba ⋅≤⋅ - modulul unui produs scalar este mai mic sau egal cu produsul

modulelor; • dacă produsul scalar a doi vectori este nul, atunci vectorii nenuli sunt

perpendiculari.

Considerăm vectorii a şi b , figura 8.11, exprimaţi într-un sistem de

Funcţii matematice în Matlab 205

coordonate carteziene, având ca bază vectorii i , j , k , unitari şi ortogonali, adică:

0 , 1 =⋅=⋅=⋅=⋅=⋅=⋅ ikkjjikkjjii .

Fig. 8.11.

Ţinând seama de cele de mai sus, vectorii a şi b vor avea expresiile:

, 321321 kbjbibbkajaiaa ⋅+⋅+⋅=⋅+⋅+⋅= . Înmulţind scalar aceste sume şi ţinând seama de cele anterioare, se obţine:

332211 babababa ⋅+⋅+⋅=⋅ .

Pentru ab = , avem :

23

22

21

23

22

21

2 aaaaaaaaaa ++=⇒++==⋅ .

Expresia care dă unghiul a doi vectori este:

23

22

21

23

22

21

332211cosbbbaaa

bababa

++⋅++

⋅+⋅+⋅

Calculul produsului scalar a doi vectori A şi B, care trebuie să aibă aceeaşi lungime, se face cu instrucţiunea C = dot(A,B,DIM) sau C = dot(A,B), în care lipseşte dimensiunea DIM. Dacă DIM=size(A), în vectorul C se întoarce produsul element cu element dintre A şi B; dacă DIM =1, în vectorul C se întoarce suma produsului element cu element de pe fiecare coloană, iar dacă DIM =2, se întorce suma produsului element cu element de pe fiecare linie.

Dacă A şi B sunt vectori coloană, atunci dot(A,B) este acelaşi lucru ca şi sum(A.*B).

De exemplu, dacă: A = [ 1 2 3 B = [ 7 8 9 4 5 6] 10 11 12 ]

atunci, C=dot(A,B,3), este:

=⇔

=

12*611*510*4

9*38*27*1C

725540

27167C

C=dot(A,B,1) este, [ ] [ ]72275516407C 997147C +++=⇔= ,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 206

iar C=dot(A,B,2) este:

++

++

=⇔

=

725540

27167C

167

50C .

Dacă A este de dimensiunea 1 x N, iar B de dimensiunea N x 1, atunci produsul scalar poate fi calculat şi prin relaţia sum(A’.*B) sau sum(A.*B’).

Considerând vectorii,

221 , 043 kjibkjia ⋅−⋅+⋅=⋅+⋅−⋅= , atunci produsul scalar este ab=dot(a,b)=sum(a.*b)=-5, iar unghiul dintre aceşti vectori este, alfa=acos(ab/(norm(a)*norm(b)))*180/pi = 109.4712 grade şi în care, norm(a)= sqrt(sum(a.^2)); norm(b)= sqrt(sum(b.^2)).

Considerând vectorii a şi b într-un sistem cartezian, având expresiile

anterioare, produsul vectorial al acestora este un vector c , perpendicular pe planul format de cei doi vectori, având expresia:

( ) ( ) ( ) kbabajbabaibaba

bbb

aaa

kji

bac ⋅−+⋅−+⋅−==×= 123131132332

321

321 .

Se observă că acest determinant se dezvoltă întotdeauna după prima linie şi nu are proprietăţile determinanţilor obişnuiţi.

În Matlab, produsul vectorial este dat de funcţia cross(a,b).

Sensul vectorului c este determinat de sensul trigonometric de aducere a

vectorului a spre vectorul b , sau, în general, de parcurgere a curbei închise generată de cei doi vectori.

Modulul produsului vectorial este egal cu aria paralelogramului determinat de cei doi vectori, (vezi şi figura 8.12), sau în general cu aria suprafeţei delimitate:

θsin⋅⋅=×= babac Utilitatea produsului vectorial rezidă în aceea că determină debitul de fluid

ce trece printr-o suprafaţă, delimitată de vectorii a şi b , în unitatea de timp. Produsul vectorial are următoarele proprietăţi:

• abba ×−=× - este anticomutativ;

• ( ) ( ) baba ×⋅=×⋅ λλ , în care λ este un scalar oarecare;

• ( ) cbcacba ×+×=×+ - este distributiv faţă de adunare;

• produsul vectorial a doi vectori colineari este nul, deoarece 0sin =θ ;

Funcţii matematice în Matlab 207

• baba ⋅≤× - modulul unui produs scalar este mai mic sau egal cu

produsul modulelor.

Fig. 8.12.

Produsul încrucişat, dintre vectorii A şi B, se calculează cu instrucţiunea C=cross(A,B), dar vectorii A şi B trebuie să aibă cel puţin 3 elemente, în direcţia produsului încrucişat.

Dacă A=[1 2 3; 4 5 6; 7 8 9], B=[10 11 12; 13 14 15; 16 17 18], atunci C=cross(A,B) conduce la C= [-27 -27 -27; 54 54 54; -27 -27 -27].

Considerând vectorii,

211 , 135 kjibkjia ⋅−⋅−⋅−=⋅−⋅−⋅= , atunci produsul vectorial este c=cross(a,b)=[ 5 11 -8], iar unghiul dintre aceşti vectori este alfa=asin(c/(norm(a)*norm(b)))*180/pi = [20.1838 49.3825 -33.5079] grade.

9. ANALIZA DATELOR ŞI TRANSFORMATA

FOURIER

9.1. Operatori de bază

9.1.1. Maximul şi minimul

Determinarea elementului maxim dintr-un vector se face cu funcţia max, apelată cu una dintre sintaxele:

C = max(A) - restituie cel mai mare element dintre diferitele dimensiuni ale unui sir; dacă A este un vector, atunci max(A) restituie cel mai mare element din A, iar dacă A este matrice, max(A) consideră coloanele matricei A ca fiind vectori, returnând un vector linie ce conţine elementul maxim de pe fiecare coloană;

C = max(A, B) - restituie un şir de aceeaşi dimensiune ca A şi B, cu elementele cele mai mari luate din A şi B;

C = max(A, [], dim) - restituie cel mai mare element din A, precizat de dimensiunea scalară, dim, ca de exemplu, max(A, [], 1) prezintă valoarea maximă din prima linie a lui A;

[C , I] = max (A) - găseşte indicii valorilor maxime ale lui A şi le restituie în vectorul de ieşire I.

Funcţia max ignoră elementele NaN. Pentru Z număr complex, funcţia max restituie numărul complex cu cel mai

mare modul, calculat cu max (abs(Z)).

Determinarea elementului minim dintr-un vector se face cu funcţia min, apelată cu una dintre sintaxele:

C = min(A) - restituie cel mai mic element dintre diferitele dimensiuni ale unui şir; dacă A este un vector, atunci min(A) restituie cel mai mic element din A, iar dacă A este matrice, min(A) consideră coloanele matricei A ca fiind vectori, returnând un vectorul linie ce conţine elementul minim de pe fiecare coloană;

C = min(A, B) - restituie un şir de aceeaşi dimensiune ca A şi B, cu elementele cele mai mici luate din A şi B;

C = min(A, [], dim) - restituie cel mai mic element din A, precizat de dimensiunea scalară, dim, ca de exemplu, max(A, [], 1) prezintă valoarea minimă din prima linie a lui A;

[C , I] = min (A) - găseşte indicii valorilor minime ale lui A şi le restituie în vectorul de iesire I.

Analiza datelor şi transformata Fourier 209

Funcţia min ignoră elementele NaN. Pentru Z număr complex, funcţia min restituie numărul complex cu cel mai mic

modul, calculat cu min (abs(Z)).

Dacă considerăm A=[2 8 7; 7 4 3; 1 8 9] şi B=[1 2 5; 6 7 3; 4 2 3], atunci: C=max(A) returnează C=[7 8 9], C=min(A) returnează C=[ 1 4 3], C=max(A,B) returnează C=[2 8 7; 7 7 3; 4 8 9], C=min(A,B) returnează C=[ 1 2 5; 6 4 3; 1 2 3], C=max(A, [], 2) returnează C=[8; 7; 9], C=min(A, [], 2) returnează C= [2; 3; 1], [C,I]=max(A) returnează C=[7 8 9] şi I=[2 1 3], [C,I]=min(A) returnează C=[1 4 3] şi I=[3 2 2], [C,I]=max(B) returnează C=[6 7 5] şi I=[2 2 1]; [C,I]=min(B) returnează C=[1 2 3] şi I=[1 1 2].

Dacă Z=[2+i 3-i 2+5i -4-2i], atunci, max(Z) este 2+5i, ceea ce corespunde numărului cu cel mai mare modul,

calculat cu max(abs(Z), deoarece: abs(Z)=[ 2.2361 3.1623 5.3852 4.4721]

iar, min(Z) este 2+i, ceea ce corespunde numărului cu cel mai mic modul, calculat

cu abs(min(Z)).

9.1.2. Media şi mediana

Media aritmetică, m, a unui şir de date Nxxx ,...,, 21 este dată de relaţia:

N

xxx

N

x

m N

N

k

k+++

==

∑=

...211 ,

iar în Matlab se calculează apelând funcţia mean. Funcţia mean se poate apela cu una dintre sintaxele:

m=mean(A) ce restituie valoarea medie dintre elementele diferitelor dimensiuni ale şirului A; dacă A este vector, mean(A) restituie valoarea medie a lui A, iar dacă A este matrice, mean (A) consideră coloanele lui A ca vectori, restituind vectorul coloană ce conţine elementul mediu;

m = mean (A, dim) restituie valoarea medie din elementele lui A, precizat de dimensiunea scalară, dim.

Dacă A = [1 2 4 4; 3 4 6 6; 5 6 8 8; 5 6 8 8], atunci: mean(A)=[3.5 4.5 6.5 6.5], mean(A,2) =[2.75 4.75 6.75 6.75].

Mediana, med, unui şir de date este elementul de la mijlocul acestui şir ordonat

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 210

crescător. Dacă şirul are un număr N impar de valori, atunci valoarea mediană este elementul din poziţia (N+1)/2, iar dacă şirul are un număr N par de valori, atunci valoarea mediană este media elementelor din poziţiile (N/2) şi (N/2+1), adică:

⋅=

++

+⋅=

+

=

natural.numar ,2 par, dacã ,2

2

1

2

naturalnumar 1,2 impar, dacã ,2

1

kkNN

Nx

Nx

kkNNN

x

med

Funcţia care calculează valoarea mediană a unui şir de date este median şi se poate apela cu una dintre sintaxele:

med=median(A) ce restituie valoarea mediană din elementele de diferite dimensiuni ale şirului; dacă A este vector, median(A) restituie valoarea mediană a lui A, iar dacă A este matrice, median (A) consideră coloanele lui A ca vectori, restituind un vector linie de valoare mediană;

med=median(A,dim) restituie valorile mediane ale lui A, precizate de dimensiunea scalară dim.

De exemplu, dacă A = [1 2 4 4; 3 4 6 6; 5 6 8 8; 5 6 8 8] atunci: median(A) = [ 4 5 7 7], median(A,2) = [ 3; 5; 7; 7].

9.1.3. Sortarea elementelor unui vector sau matrice

Sortarea elementelor unui vector sau matrice în ordine crescătoare se face în Matlab, apelând funcţia sort, cu una dintre sintaxele:

• B=sort(A) - sortează elementele de diferite dimensiuni ale şirului A şi aranjează aceste elemente în ordine crescătoare, dacă A este vector, iar dacă A este o matrice, sortează fiecare coloană a lui A în ordine crescătoare cu observaţia că, dacă elementele sunt numere complexe, acestea se sortează în ordinea crescătoare a modulului, abs(A), iar pentru module egale în ordinea crescătoare a unghiului de fază, angle(A) pe intervalul [-π,π];

• B=sort(A, dim) sortează elementele din A precizate de dimensiunea scalară dim, iar dacă dim este un vector, sortarea lucrează iterativ pe dimensiunile specificate, astfel că sort(A,[1 2] ) este echivalent cu (sort (A, 2), 1);

• [B,IX] = sort (A ,… ) restituie şi un sir de indici IX, cu size (IX) = size (A), iar B = A(IX), dacă A este un vector, însă dacă A este o matrice m x n, atunci fiecare coloană a lui A este un vector permutare a respectivei coloane a lui A, respectiv dat de setul de instrucţiuni:

• for j = 1:n; B(:,j) = A(IX(:,j),j); end

De exemplu sortarea unei matrice A = [ 3 7 5; 0 4 2 ] pe cele două dimensiuni şi apoi a treia oară, se returnează şi un şir de indici pentru rezultatul sortat, se face cu secvenţele:

Analiza datelor şi transformata Fourier 211

sort(A,1) = [ 0 4 2; 3 7 5]; sort(A,2) = [ 3 5 7; 0 2 4]; [B,IX] = sort(A,2), conduce la B = [ 3 5 7; 0 2 4]; IX = [ 1 3 2; 1 3 2].

Sortarea liniilor unei matrice sau vector coloană în ordine crescătoare se face cu sortrows, apelată cu una dintre sintaxele:

• B = sortrows (A) sortează liniile lui A ca pe un grup în ordine crescătoare, iar dacă elementele lui A sunt numere complexe, acestea se sortează în ordinea crescătoare a modulului, abs(A), iar pentru module egale în ordinea crescătoare a unghiului de fază, angle(A) pe intervalul [-π,π];

• B = sortrows (A, col) sortează matricea pe baza coloanelor specificate în vectorul coloană, col, spre exemplu, sortrows (A, [2 3] ) sortează coloanele lui A prin a doua coloană, şi unde acestea sunt egale, sortează mai departe la a treia coloană;

• [B,index] = sortrows(A) returnează şi un şir de indici, astfel că dacă A este un vector coloană B=A(index), iar dacă A este o matrice de m x n, atunci B= A(index,:).

Fiind dată o matrice de 5 pe 5, A = ['one ';'two ';'three';'four ';'five '], prin comanda B = sortrows(A) şi C = sortrows(A,1) se obţine:

B = [ five ; four ; one ; three ; two ], C=[ four ; five ;one ; two ; three ].

9.1.4. Sume şi produse

Suma, S, a elementelor unui vector X este dată de relaţia matematică

∑=

=

N

i

iXS1

şi se calculează în Matlab cu funcţia sum, care se poate apela cu una dintre

sintaxele: • B = sum (A) restituie suma elementelor unui şir, dacă A este vector sau,

dacă A este o matrice, un vector linie ce conţine suma elementelor matricei de pe fiecare coloană;

• B = sum(A,dim) calculează suma coloanei lui A indicată de scalarul dim; • sum(diag(X)) este urma matricei X.

Pătratul “magic” de ordinul n este dat de funcţia Matlab magic(n) şi are egală suma elementelor de pe fiecare linie, coloană şi diagonală. Pentru verificare, se consideră M=magic(5), care prin sum(M) calculează suma coloanelor, prin sum(M') calculează suma liniilor, cu sum(diag(M)), suma diagonalei principle, iar cu sum(diag(M')), suma celeilalte diagonale, rezultând valoarea fiecăreia de 65.

Suma cumulată, Sj, a unui vector X este dată de relaţia matematică

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 212

NjXS

j

k

kj ,...,2,1 ,1

==∑=

, şi se calculează în Matlab cu funcţia cumsum, apelată cu

una dintre sintaxele: • B=cumsum(A) returnează, dacă A este un vector, un vector B ce conţine

sume cumulative ale elementelor vectorului A, iar dacă A este o matrice, se returnează o matrice B de aceeaşi marime cu A, conţinând sume cumulative pentru fiecare coloană a lui A;

• B=cumsum(A,dim) returnează sume cumulative ale elementelor pentru dimensiunea, dim, specificată.

De exemplu, pentru A= [1 2 3; 4 5 6], cumsum(A,1)=[1 2 3; 5 7 9], cumsum(A,2)=[1 3 6; 4 9 15], cumsum(A)=[1 2 3; 5 7 9], iar cumsum(A,3)=A.

Produsul, P, a elementelor unui vector X este dat de relaţia matematică

∏=

=

N

i

iXP

1

şi se calculează în Matlab cu funcţia prod, care se poate apela:

• B = prod(A) restituie produsul elementelor unui şir, dacă A este vector sau, dacă A este o matrice, un vector linie ce conţine produsul elementelor matricei de pe fiecare coloană;

• B = prod(A,dim) consideră produsul dintre elementele lui A precizate de dimensiunea scalară, dim.

De exemplu, produsul de pe fiecare coloană a pătratului magic de ordinul 3, M=magic(3)=[ 8 1 6; 3 5 7; 4 9 2], este un vector B= prod(M)=[ 96 45 84 ], iar produsul elementelor din fiecare coloană se obţine cu prod(M,2) = [ 48; 105; 72].

Produsul cumulat, Pj, a unui vector X este dat de relaţia matematică

NjXP

j

k

kj ,...,2,1 ,1

== ∏=

, şi se calculează în Matlab cu funcţia cumprod, apelată cu

una dintre sintaxele: • B=cumprod(A) returnează, dacă A este un vector, un vector B ce conţine

produse cumulative ale elementelor vectorului A., iar dacă A este o matrice, se returnează o matrice B de aceeaşi mărime cu A conţinând produse cumulative pentru fiecare coloană a lui A;

• B=cumprod(A,dim) returnează produse cumulative ale elementelor pentru dimensiunea, dim, specificată.

De exemplu, pentru A= [1 2 3; 4 5 6], cumprod(A,1)=[1 2 3; 4 10 18], cumsum(A,2)=[1 2 6; 4 20 120], cumsum(A)=[1 2 3; 5 7 9], iar cumprod(A,3)=A.

Analiza datelor şi transformata Fourier 213

9.1.5. Eliminarea valorilor nedefinite sau a datelor eronate

Din operaţii matematice nedefinite, precum 0

0 sau

∞, conform convenţiilor

IEEE pentru calculul în virgulă mobilă, apare variabila specială Matlab denumită NaN

(Not-a-Number), iar din operaţii de împărţire de forma 0

1 sau depăşirea celui mai mare

număr posibil de reprezentat, din operaţii de ridicări la putere sau exponent, apare variabila Inf (Infinity). Operaţiile ce includ un operator NaN returnează operatorul NaN, iar cele care includ numai operatorul Inf returnează operatorul inf. Alteori, poate fi necesară eliminarea unor valori ce depăşesc anumite limite şi în mod deosebit eliminarea unor date statistice măsurate sau observate care nu se înscriu în plaja de erori.

Pentru calcule viitoare, atunci când este posibil, este necesară eliminarea acestor valori dintr-un set de valori, de regulă un vector.

O etapă importantă în acest proces o constituie identificarea poziţiilor ocupate de aceste valori în cadrul unui vector X. Indicii ecestor elemente sunt găsiţi cu instrucţiunea find, iar eliminarea din acest vector şi crearea unui alt vector se face prin utilizarea unor operatori logici, de regula de negare.

De exemplu: • I=find(isnan(X), identifică poziţiile ocupate de valorile NaN; • I=find(isinf(X), identifică poziţiile ocupate de valorile Inf; • I=find(X>X0), reţine numai valorile mai mari decăt X0. • X=X(~isnan(X)), elimină valorile NaN, • X=X(~isinf(X)), elimină valorile inf.

Pentru eliminarea tuturor liniilor ce conţin o valoare nedefinită, dintr-o matrice X=[4 7 8; 4 NaN inf; 2 0/0 14; 6 3 9] se utilizează secvenţa Y=X(find(~any(isnan(X)')),:), rezultând Y=[4 7 8; 6 3 9].

Eliminarea datelor eronate ce nu îndeplinesc o condiţie impusă se face în mod asemănător.

De exemplu, eliminarea coloanelor unei matrice ce conţin cel puţin un element care se abate de la valoarea medie cu mai mult de trei ori abaterea standard (legea statistică trei sigma).

Dacă X=[7 8 900; 1 5 9;7 1 2], secventa Matlab ce realizează dezideratul de mai sus este:

med=mean(X); sigma=std(X); [n,m]=size(X); e=ones(n,1);dist=abs(X-e*med); mc=dist<3*e*sigma; YY=X(:,find(all(mcond))); cel=m-length(find(all(mc))), şi cul cel este zero, toate valorile sunt bune.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 214

9.2. Caracterizarea datelor aleatoare

9.2.1. Variabilă aleatoare. Valoare medie. Deviaţie standard.

Varianţă.

În practică apar nenumărate experienţe concrete, cărora se poate ataşa un sistem de evenimente. Se numeşte sistem de evenimente o mulţime de evenimente care pot apărea dintr-o anumită experienţă. Un sistem de evenimente poate fi mulţimea tuturor evenimentelor care corespund unei experienţe date sau numai o parte oarecare a sa. Totodată, un sistem de evenimente poate fi finit sau infinit, după cum conţine un număr finit sau infinit de evenimente. Un câmp de evenimente este o mulţime ce conţine elementul sigur sau total, contrarul unui eveniment oarecare, elementul imposibil şi reuniunea unor evenimente.

După definiţia clasică, probabilitatea este raportul dintre numărul cazurilor favorabile şi numărul cazurilor posibile, în ipoteza că toate cazurile sunt egal favorabile. Astfel, probabilitatea ca la o aruncare cu zarul să apară faţa 5 este 1/6. Frecvenţa ca să apară una dintre feţele cu un număr par de puncte este 3/6=1/2.

Această definiţie clasică a probabilităţii este insuficientă, deoarece, chiar pentru câmpuri finite de evenimente, nu întotdeauna se poate vorbi de cazuri egal posibile. Astfel dacă zarul nu este complet simetric, fie din punct de vedere geometric, fie în privinta repartiţiei masei, nu mai putem presupune că apariţia oricărei feţe este egal posibilă. Frecvenţa este numărul de evenimente favorabile dintr-un şir de evenimente, iar frecvenţa relativă este raportul cazurilor favorabile şi cazurilor totale. De exemplu, luând la întâmplare 100 piese, se constată că 93 corespund standardului, iar 7 nu, sunt rebuturi. Frecvenţa absolută este 93, iar frecvenţa relativă 0.93. Repetând operaţia, obţinem alte frecvenţe, de exemplu 0.97, 0.98, 0.95, 0.94 etc. Cu cât vom repeta această operaţie de un număr mai mare de ori, cu atât vom putea aprecia mai bine că frecvenţele sunt grupate în jurul unui număr, de exemplu 0.95. Acest număr se numeşte probabilitatea ca, luând o piesă la întâmplare, acea piesă să fie reuşită.

Se numeşte variabilă aleatoare (întâmplătoare sau statistică) o funcţie X definită pe un sistem complet de evenimente. La aruncarea unui zar poate apărea una dintre cele şase feţe. Dacă notăm cu (1) evenimentul apariţiei feţei cu un punct, cu (2) apariţia feţei cu două puncte etc, atunci sistemul {(1), (2), (3), (4), (5), (6)} este un sistem complet de evenimente. Probabilităţile celor şase evenimente sunt toate egale cu 1/6. Pe acest sistem de evenimente definim o variabilă aleatoare X cu valorile

654321 ,,,,, xxxxxx . Probabilitatea cu care variabila xk ia fiecare valoare, la apariţia unui eveniment, este 1/6.

Ansamblul format din valorile variabilei aleatoare X şi probabilităţile elementelor corespunzătoare se numeşte distribuţia variabilei X şi se notează

n

n

ppp

xxxX

,...,,

,...,,

21

21 , care în exemplu anterior devine:

6

1

6

1

6

1

6

1

6

1

6

1654321

X .

Analiza datelor şi transformata Fourier 215

Se numeşte valoare medie (sau speranţă matematică) a unei variabile aleatoare X numărul:

∑∑

∑=

=

=

⋅=

=

+++

⋅++⋅+⋅

==

n

k

kkn

k

k

n

k

kk

n

nn xp

p

xp

ppp

xpxpxpxXM

1

1

1

21

2211

...

...)(

deoarece ∑=

=

n

k

kp1

1 . Se observă că valoarea medie a variabilei X este media

ponderată a valorilor sale, cu ponderile nppp +++ ...21 . Contribuţia unei valori xk

în determinarea valorii medii x este cu atât mai mare, cu cât probabilitatea pk este mai mare.

Valoarea medie x a variabilei X este cuprinsă între cea mai mică şi cea mai mare valoare pe care le ia X.

Valoarea medie de ordinul k a variabilei X se notează cu kM şi este:

( )[ ] ( )kk

nn

kkk

k

k xpxpxpXMM1

2211

1

... ⋅++⋅+⋅== . Valoarea medie de ordinul al doilea, pentru k=2,

2222

2112 ... nn xpxpxpM ⋅++⋅+⋅= se numeşte şi valoarea medie pătratică a

variabilei X. Valoarea medie de ordinul 1 (k=1) este chiar valoarea medie )(1 XMM = . Valoarea medie de ordinul k = -1 este media armonică,

1

2

2

1

11 ...

+++=

n

n

x

p

x

p

x

pM , care pentru

nppp n

1...21 ==== , devine:

nxxxM

N 1...

11

211

+++=

.

Pentru k = 0 se obţine media geometrică,

np

n

ppxxxM ⋅⋅⋅= ...21

210 , care pentru n

ppp n

1...21 ==== , se reduce la:

nnxxxM ⋅⋅⋅= ...210 .

Se numeşte abatere a variabilei X, variabila aleatoare xXU −= , care ia valorile xxu kK −= , adică:

xxuppp

uuuU kk

n

n−=

,

,...,,

,...,,

21

21 . Valoarea medie a abaterii, M(U), este nulă.

Prin urmare, M(U) nu ne poate da nici o indicaţie asupra împrăştierii valorilor xk ale variabilei X. Pentru a stabilii un indicator al împrăştierii sau dispersiei acestor valori

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 216

se poate considera variabila U , care se numeşte abatere absolută a variabilei X,

având distribuţia

n

n

ppp

uuuU

,...,,

,...,,

21

21 .

Momentul de ordinul k al variabilei X se notează cu ( )kXM şi este:

( ) întreg. ,...2211 kxpxpxpXMknn

kkk⋅++⋅+⋅=

Se numeşte moment centrat de ordinul k al variabilei aleatoare U momentul de

ordinul k al abaterii sale xXU −= , adică ( ) ∑=

⋅=

n

i

k

ii

k xpUM1

. În practica prelucării

statistice a datelor prezintă interes mai ales momentele centrate de primele patru ordine şi în special momentul de ordinul doi.

Momentul centrat de ordinul doi al variabilei X se notează cu D(X), 22 sau ),( σµXD şi se numeşte dispersia sau varianţa variabilei aleatoare X,

∑=

⋅===

n

i

ii upXD1

222 )( σµ .

Rădăcina pătrată a dispersiei, 22

22211 ... nn upupup ⋅++⋅+⋅== σµ ,

se numşte abaterea medie pătratică sau deviaţia standard a variabilei X. Dispersia (varianţa) şi abaterea medie pătratică (deviaţia standard) sunt

indicatorii cei mai utilizaţi pentru a caracteriza împrăştierea valorilor unei variabile aleatoare. Acestea dau o indicaţie asupra gradului de concentrare a valorilor unei variabile aleatoare X în jurul valorii medii.

Principalele proprietăţi şi consecinţe ale definiţiilor anterioare sunt: • dacă X şi Y sunt două variabile aleatoare independente, atunci

( ) )()( YDXDYXD +=+ ;

• pentru orice variabilă aleatoare X şi orice constantă k, ( ) )(2 XDkXkD ⋅=⋅ ;

• dacă variabilele aleatoare nXXX ,...,, 21 sunt independente şi nλλλ ,...,, 21 sunt constante, atunci

( ) )(...)()(... 22

221

212211 nnnn XDXDXDXXXD ⋅++⋅+⋅=⋅++⋅+⋅ λλλλλλ ;

• valoarea medie pătratică a unei variabile aleatoare X este mai mare decât modulul valorii sale medii, deoarece ( ) 0≥XD , rezultă

( ) ( ) xXMxXM ≥⇒≥222 , care se mai poate scrie şi

nnnn xpxpxpxpxpxp ⋅++⋅+⋅≥⋅++⋅+⋅ ...... 2121122

22211 ;

• dacă 2σ este dispersia variabilei aleatoare X, probabilitatea ca modulul

abaterii să ia valori mai mari decât un număr 0>L este mai mică decât

Analiza datelor şi transformata Fourier 217

2

2

L

σ, respectiv ( )

2

2

LLxXP

σ≤≥− (inegalitatea lui Cebîşev).

Funcţia ce calculează, în Matlab, deviaţia standard este std, care se apelează cu una dintre sintaxele:

s= std(X), unde X este un vector şi restituie deviaţia standard folosind ecuaţia

2

12

1

_

1

1

= ∑=

n

i

i xxn

s ; dacă X este un model oarecare dintr-o distribuţie

normală, s2 este cea mai bună estimare, iar dacă X este o matrice, se restituie un vector linie conţinând deviaţia standard a elementelor de pe fiecare coloană a lui X;

s= std(X, flag) pentru flag = 0, este similar cu std ( X), iar pentru flag =1, se

restituie deviaţia standard folosind ecuaţia 2

12

1

_1

−= ∑

=

n

i

i xxn

s ;

s= std(X, flag, dim) calculează deviaţia standard a coloanei matricei X precizată prin dimensiunea scalară dim.

În relaţiile de mai sus valoarea medie se calculează cu relaţia ∑=

=

n

i

ixn

x1

_ 1, unde n

este numărul elementelor. De exemplu, pentru matricea X=[ 1 5 9; 7 15 22], avem:

s = std(X,0,1) = [ 4.2426 7.0711 9.1924], s = std(X,0,2) = [ 4.000; 7.5056].

Calculul dispersiei sau al varianţei se poate face în Matlab prin apelarea funcţiei var, cu una dintre sintaxele:

• v=var(X) - restituie dispersia vectorului X, iar pentru matrice este un vector linie conţinând dispersia fiecărei coloane, luând ponderi egale cu N-1, unde N este numărul de valori;

• v=var(X,1) – calculează momentul de ordinul doi normalizat pentru N; • v=var(X,W) calculează dispersia (momentul centrat de ordinul doi) folosind

un vector de ponderi W pozitiv, având numărul de elemente egal cu numărul de linii din X, cu excepţia cazului când W = 1.

Dispersia (varianţa), calculată cu funcţia var este pătratul deviaţiei standard, calculată cu std.

Pentru caracterizarea unei distribuţii, în statistică se utilizează mediana şi dominanta, definite prin frecvenţele constatate experimental. Mediana unei variabile este valoarea pentru care funcţia de repartiţie este 1/2 şi valoarea medie a abaterilor absolute în raport cu aceasta este minimă. Valoarea variabilei care are cea mai mare

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 218

frecvenţă de apariţie se numeşte dominantă sau valoare modală.

9.2.2. Corelaţie

Pentru două variabile aleatoare X, Y, definite pe două sisteme complete de evenimente, având abaterile U şi respectiv V, valoarea medie a produsului VU ⋅ se numeşte corelaţia variabilelor X şi Y şi se notează, de regulă, cu XYC ,

)( VUMC XY ⋅= .

Între corelaţia XYC , valoarea medie a produsului YX ⋅ şi valorile medii ale celor două variabile există relaţia,

yxYXMYMXMYXMC XY ⋅−⋅=⋅−⋅= )()()()( . Principalele consecinţe ale corelaţiei sunt:

• dacă două variabile aleatoare X, Y au corelaţia nulă, atunci valoarea medie a produsului YX ⋅ este egală cu produsul yx ⋅ al valorilor lor medii şi

reciproc dacă yxYXM ⋅=⋅ )( , cele două variabile aleatoare X, Y au corelaţia nulă;

• dacă două variabile aleatoare X, Y sunt independente, corelaţia lor este nulă, dar reciproca nu este adevărată;

• dacă corelaţia XYC ete nulă, se spune că cele două variabile nu sunt corelate sau că sunt necorelate.

Coeficientul de corelaţie sau raportul de corelaţie a două variabile aleatoare X, Y este raportul,

)()(

)(22

VMUM

VUMC

YX

XY

⋅=

=

µµ

ρ ,

unde Xµ şi Yµ sunt abaterile medii pătratice ale celor două variabile X, Y.

Coeficientul de corelaţie satisface inegalităţile 11 ≤≤− ρ . Funcţia Matlab cov, calculează covarianţa definită ca,

( ) ( )[ ]221121 ),cov( µµ −⋅−= xxExx ,

unde E este probabilitatea matematică şi ii Ex=µ . Ea poate fi apelată cu una dintre sintaxele:

• C=cov(x) unde x este un vector ce returnează multiplicitatea elementelor vectorului, pentru o matrice în care fiecare linie este cunoscută şi fiecare coloană este variabilă, C este o matrice covariantă;

• diag(cov(x)) este un vector ce arată varianţa (abaterea) de pe fiecare coloană, iar sqrt(diag(cov(x)) este un vector ce prezintă abaterea standard;

• C=cov(x,y), unde x si y sunt vectori coloană de lungimi egale, este echivalent cu cov([x y])

Pentru exemplificare, considerăm A = [-1 1 2 ; -2 3 1 ; 4 0 3]. Varianţa este

Analiza datelor şi transformata Fourier 219

v=diag(cov(A))'=[ 10.3333 2.3333 1]. Comparând vectorul v cu matricea covariantă: C=cov(A)=[ 10.3333 -4.1667 3; -4.1667 2.3333 -1.5; 3 -1.5 1], se observă că elementele diagonale, C(i,i), reprezintă variabilele pentru coloanele matricei A.

Elementele ce nu sunt pe diagonală, elementele C(i,j) reprezintă covariantele coloanei i şi j.

Calculul coeficienţilor de corelaţie dintre două seturi de date se face cu funcţia corrcoef, care poate fi apelată:

• R=corrcoef(X) returnează o matrice R care este relaţia de corelare a

matricei C=cov(X), dată de relaţia ( )( )

),(),(

,,

jjCiiC

jiCjiR

= , conţinând

corelarea coeficienţilor din intrarea matricei X, ale cărei linii sunt mărimi obsevate, iar coloanele mărimi variabile, cu observaţia că corrcoef(x) este funcţia de corelaţie a zerourilor, ce reprezintă zerourile lui xcof(x,’coef’) ce se află într-un şir pătratic;

• R=corrcoef(x,y) sau R=corrcoef([x,y]), unde x şi y sunt vectori coloană; • [R,P]=corrcoef(…) returnează şi matricea P, cu p valori pentru testarea

ipotezei de corelare, fiecare valoare p dă probabilitatea unei corelaţii aleatoare, unde corelaţia corectă este zero, astfel că dacă P(i,j) este mic, de exemplu 0.05, atunci corelaţia R(i,j) este semnificativă;

• [R,P,RLO,RUP]=corrcoef(…) returnează şi matricele RLO şi RUP, cu aceeaşi marime ca şi R, conţinând limite mai mici sau mai mari decât 95% din interval pentru fiecare coeficient.

Pentru exemplificare, se prezintă secvenţa de generare a datelor aleatoare facând corelaţia dintre coloana a patra şi alte coloane.

x = randn(30,4); % date necorelate; x(:,4) = sum(x,2); % introduce corelaţia; [r,p] = corrcoef(x) % calculează corelaţia simplă şi valorile p; [i,j] = find(p<0.05); % găseşte corelaţiile semnificative; ind=[i,j] % afişează indicii liniilor şi coloanelor.

Cu acestea se obţine: r =[ 1.0000 -0.3566 0.1929 0.3457 -0.3566 1.0000 -0.1429 0.4461 0.1929 -0.1429 1.0000 0.5183 0.3457 0.4461 0.5183 1.0000]; p =[ 1.0000 0.0531 0.3072 0.0613 0.0531 1.0000 0.4511 0.0135 0.3072 0.4511 1.0000 0.0033 0.0613 0.0135 0.0033 1.0000]; ind= [ 4 2 ; 4 3 ; 2 4 ; 3 4].

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 220

Un alt exemplu este dat de găsirea coeficienţilor de corelaţie dintre funcţiile: x=4+2*t, y=4*t, z=2*cos(t), pe intervalul t=[0, 5]. Secvenţa Matlab este: t=0:0.1:5; x=4+2*t; y=4*t; z=2*cos(t); Rxy=corrcoef(x,y); Rxz=corrcoef(x,z).

Se obţine Rxy=[ 1 1 ; 1 1], Rxz = [1 -0.6405; -0.6405 1], de unde se observă că între x şi y este o dependenţă liniară, deoarece Rxy(1,2)=R(2,1)=1, iar între x şi z nu este o relaţie liniară, deoarece Rxz(1,2)=Rxz(2,1)=-0.6405≠1.

Pentru calculul unghiului dintre două subspaţii, A şi B, se utilizează funcţia subspace, apelată cu sintaxa theta = subspace(A,B), care găseşte unghiul dintre subspaţiile specificate. Dacă A şi B sunt vectori coloană de lungime unitate, se obţine acelaşi rezultat ca atunci când se foloseşte acos(A’*B). Dacă unghiul dintre două subspaţii este mic, cele două sunt aproximativ dependente lineare.

Pentru exemplificare, considerăm două subspaţii ale matricei Hadamard, ale cărei coloane sunt ortogonoale, H = hadamard(8), cu A = H(:,2:4) şi B = H(:,5:8). Cu theta = subspace(A,B) se obţine theta = 1.5708.

9.2.3. Histograme

Pentru prelucrări statistice se utilizează histogramele, care sunt un tip special de

grafice. O histogramă arată distribuţia unor valori date. Funcţia ce realizează o histogramă este hist, care se poate apela:

• n=hist(Y), care “depozitează” elementele unui vector Y în 10 “containare” egale şi restituie elementele din fiecare container ca pe un vector linie, iar dacă Y este o matrice m x p, hist consideră coloanele lui Y ca pe vectori şi restituie o matrice p x n de ordin 10, fiecare coloană n conţine rezultatele ce corespund coloanei respective din matricea Y;

• n=hist(Y,x), unde x este un vector, restituie distribuiţia dintre lungimea x, cu centrul specificat de x, spre exemplu, dacă x este un vector de 5 elemente, se distribuie elementele luiY în 5 compartimente centrate pe axa x;

• n=hist(Y,nbins), unde nbins este un scalar, folosesc nbins numere ale compartimentului.

Toate elementele dintr-un vector Y, sau dintr-o coloană a matricei Y sunt grupate în funcţie de gradul lor, iar fiecare grup este înfăţişat ca un compartiment. Histograma axei x reflectă gradul valorilor din Y, iar histograma axei y înfăţişează numărul elementelor care rămân în interiorul grupurilor; deci, histograma pe axa y aranjează de la 0 la cel mai mare număr de elemente care se află în orice compartiment.

Calcularea unei histograme se face apelând funcţia histc, cu una dintre sintaxele: • n=histc(X,edges) calculează numărul valorilor din vectorul X care se

nimeresc între elementele vectorului, vector care trebuie să conţină valori monotone, n(k) calculează valoarea X(i) dacă X(i) < edges(k+1), iar pentru X se returnează o matrice cu histograme calculate pentru fiecare coloană;

• n=histc(X,edges,dim) operează în dimensiunea dim a matricei X;

Analiza datelor şi transformata Fourier 221

• [n,bin]=histc(…) returnează, de asemenea, o matrice de m x n atunci se utilizează, pentru calcul, for j=1:N, n(k,j) = sum(bin(:,j)==k); end.

9.3. Filtrări şi convoluţii

9.3.1. Filtre digitale

Funcţia de filtrare filtrează o secvenţă de date folosind un filtru digital, care lucrează atât pentru intrările reale cât şi pentru cele complexe. Filtrarea datelor cu un filtru de impuls cu răspuns infinit (IIR) sau cu un filtru de impuls cu răspuns finit (FIR) se face cu funcţia filter. Aceasta implementează direct ecuaţia diferenţială,

)n-y(n1)()1(2-

)()1()1()2()()1()(

a⋅+−−−⋅

−−⋅+++−⋅+⋅=

a

bb

nany)a(

nnxnbnxbnxbny

L

L

sau, în transformată Z

( )( )

( )( )zX

znaza

znbzbbzY

a

b

n

a

n

b⋅

⋅+++⋅+

⋅++⋅+

=−−

−−

1)2(1

1)2()1(1

1

L

L

Dacă a(1) nu este egal cu 1, funcţia filter normează coeficientii cu a(1), iar dacă a(1) este egal cu zero, se restituie o eroare.

Apelarea funcţiei filter se face cu una dintre sintaxele : • Y = filter(b,a,X) filtrează datele din vectorul X cu filtrul caracterizat de

vectorul coeficient al numărătorului b şi de vectorul coeficient al numitorului a; iar dacă X este o matrice, funcţia filter actionază asupra coloanelor lui X;

• [Y,zf] = filter(b,a,X) returnează şi condiţiile finale, zf, a întârzierii filtrului, cu menţiunea că zf este un vector de dimensiune max(size(a),size(b)) sau o matrice cu câte o valoare pentru fiecare coloană a lui X;

• [Y,zf] = filter(b,a,X,zi) acceptă condiţii iniţiale, zi, şi returnează condiţiile finale, zf, cu menţiunea că, condiţiile iniţiale sunt un vector cu dimensiunea length max(length(a),length(b))-1;

• [...] = filter(b,a,X,[],dim) operează în dimensiunea specificată de dim.

Pentru exemplificare, se menţionează că se poate folosi funcţia filter pentru a găsi media curentă fără a folosi un for loop. Acest exemplu găseşte media curentă a unui vector cu 16 elemente, folosind o mărime de fereastră egală cu 5.

Secvenţa Matlab este, data = [1:0.2:4]'; windowSize = 5; filter(ones(1,windowSize)/windowSize,1,data),

rezultând [ 0.20; 0.44; 0.72; 1.04; 1.4; 1.6; 1.8; 2; 2.2; 2.4; 2.6; 2.8; 3; 3.2; 3.40; 3.60].

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 222

Funcţia filter2 realizează o filtrare digitală bi-dimensională, fiind apelată cu sintaxa:

• Y = filter2(h,X), filtrează datele în X cu un filtrul bi-dimensional în matricea h, calculează rezultatul, Y, folosind o corelare bidimensională şi restituie partea centrală a corelaţiei, care este de aceeaşi mărime cu X;

• Y= filter2 (h,X, 'shape') restituie acea parte din Y care este precizată de parametru de formă, 'shape', care poate fi:

� 'same' restituie partea centrală a corelaţiei, iar în acest caz, Y este de aceeaşi mărime cu X, fiind opţiunea implicită;

� 'valid' restituie doar acele părţi ale corelaţiei care sunt calculate fără vârfuri ce sunt aplatizate spre zero, iar în acest caz Y este mai mic decât X;

� 'full' restituie corelaţia bi-dimensioanla în întregime şi, în acest caz, Y este mai mare decât X.

Funcţia filter2 roteşte filtrul matricei cu 180 de grade, pentru a crea o convoluţie kernel, utilizând funcţia conv2 pentru a calcula convoluţia bidimensională a filtrului. În mod standard filter2 extrage partea centrală a convoluţiei, care are aceeaşi mărime ca matricea de intrare, şi o restituie ca fiind rezultatul convoluţiei.

9.3.2. Convoluţii

Din punct de vedere algebric, convoluţia este aceeaşi operaţie ca şi multiplicarea a două polinoame, având coeficienţii u şi v, care sunt vectori.

Funcţia ce realizează convoluţii (multiplicări) de polinoame este conv, care se apelează cu sintaxa w = conv(u,v) şi convoluţionează vectorii u şi v.

Dacă m = length (u) şi n = length (v), atunci w este un vector de lungime m+n-1 al cărui element k ,este:

)1()()( jkvjukwj

−+= ∑

Suma este pentru toate valorile lui j, ceea ce conduce la indici permişi pentru )( ju şi v(k+1-j), mai precis j = max(1,k+1-n): min(k,m). Când m=n , rezultă:

w(1) = u(1)*v(1) w(2) = u(1)*v(2)+u(2)*v(1) w(3) = u(1)*v(3)+u(2)*v(2)+u(3)*v(1) ... w(n) = u(1)*v(n)+u(2)*v(n-1)+ ... +u(n)*v(1) ... w(2*n-1) = u(n)*v(n)

Teorema convoluţiei spune, în mare, că convoluţionând două secvenţe, este similar cu a multiplica forma lor Fourier. Pentru a fi mai precis, este necesar ca cei doi vectori să tindă spre zero şi să se ignore erorile neaproximate. Astfel, dacă

X = fft([x zeros(1,length(y)-1)]),

Analiza datelor şi transformata Fourier 223

şi Y = fft([y zeros(1,length(x)-1)]),

atunci conv(x,y) = ifft(X.*Y).

Pentru a realiza o convoluţie bi-dimensională se utilizează funcţia conv2, care foloseşte o implementare formală directă a unei ecuaţii de convoluţie bi-dimensională în formă spaţială. Dacă a şi b sunt funcţii a două variabile discrete, n1 şi n2, atunci formula pentru convoluţia bi-dimensională a lui a şi b este:

∑∞

−∞=

∑∞

−∞=

−−⋅=

1 2

)22,11()2,1()2,1(k k

knknbkkannc .

În practică, conv2 calculează convoluţia pentru intervale finite şi se apelează cu una dintre sintaxele:

• C = conv2(A, B) calculează convoluţia bidimensională a matricelor A şi B, iar dacă una dintre aceste matrice descrie un filtru de impuls de răspuns bidimensional finit, celelalte matrice sunt filtrate în două dimensiuni, mărimea lui C în fiecare dimensiune este egală cu suma dimensiunilor corespunzătoare intrărilor matricei, minus unu, adică, dacă mărimea lui A este [ma,na] şi mărimea lui B este [mb,nb], atunci mărimea lui C este [ma+mb-1, na+nb-1]

• C = conv2(hcol, hrow, A) convoluţionează A prima dată cu vectorul hcol cu coloanele matricei şi apoi cu vectorul hrow cu coloanele, cu menţiunea că hcol şi hrow sunt vectori;

• C= conv2(A,B,'shape') restituie aceea parte din bi-convoluţie care este precizată de parametru de formă, 'shape', care poate fi:

� 'full' restituie întreaga convoluţie bi-dimensională; � 'same' restituie partea centrală a convoluţiei de aceeaşi mărime

cu A; � 'valid' restituie doar acele părţi ale convoluţiei care sunt

calculate fără vârfuri, ce sunt aplatizate spre zero, iar în acest caz C are marimea [ma-mb+1, na-nb+1], unde (size(A)>=size (B) ), iar în caz contrar se reîntoarce un vector vid, [].

Pentru a realiza o convoluţie N-dimensională se utilizează funcţia convn, care se apelează cu una dintre sintaxele:

• C = convn(A, B) - calculează o convoluţie N-dimensionala a vectorilor A şi B, iar mărimea rezultatului este size(A) + size (B)-1;

• C= convn(A,B,'shape') restituie o subsecţiune a convoluţiei N-dimensionale, aşa cum este precizat de parametru de formă, 'shape', care poate fi:

� 'full' restituie întreaga convolutie N-dimensională, opţiunea implicită;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 224

� 'same' restituie partea centrală a N-convoluţiei de aceeaşi mărime cu A;

� 'valid' restituie doar acele părţi ale N-convoluţiei care pot fi calculate fără a se presupune că şirul A tinde spre zero, iar dimensiunea rezultatului este max(size(A)-size(B) + 1, 0).

Realizarea deconvoluţia sau divizarea polinomială se utilizează funcţia deconv, care se apelează cu sintaxa:

[q, r] = deconv (v,u), care realizează deconvoluţia vectorilor u şi v (se împarte v la u), folosind o divizare prelungită. Câtul este restituit într-un vector q, iar restul ca un vector r, adică: v = conv (u, q) +r.

Dacă u şi v sunt vectori cu coeficienţi polinomiali, a face convoluţia celor doi este echivalent cu a înmulţi cele două polinoame, iar deconvoluţia este împărţirea polinoamelor. Rezultatul împărţirii lui v la u este câtul q şi restul r.

Pentru u = [1 2 3 4] ; v = [10 20 30]; convoluţia este c = conv(u,v) = [ 10 40 100 160 170 120 ].

Pentru a ajunge din nou la u se utilizează deconvoluţia, [q,r] = deconv(c,u)

rezultând, q = [ 10 20 30 ], r = [ 0 0 0 0 0 0] adică un cât egal cu v şi un rest egal cu zero.

Pentru a înlătura valoriile medii sau formele lineare ale vectorilor sau matricelor, de obicei pentru prelucrarea Fourier, FFT se utilizează funcţia detrend, care se poate apela

• y=detrend(x) - înlătură forma cea mai rectilinie care se potriveste vectorului x şi îl restituie în y, iar dacă x este o matrice, se înlătură forma lineară din fiecare coloană;

• y=detrend(x, 'constant'), înlătură valoarea medie din vectorul x, sau dacă x este o matrice, din fiecare coloană a matricei;

• y=detrend(x, 'linear',bp), înlătură forma continuă din vectorul x, sau dacă x este o matrice, din fiecare coloană a matricei; vectorul bp conţine indicii colţurilor (breakpoint) dintre segmentele lineare adiacente. Acesta este definit ca fiind punctul de informaţie pe care îl împart două segmente.

9.4. Transformata Fourier

9.4.1. Seria şi integrala Fourier

În studiul fenomenelor periodice din tehnică (acustică, electrotehnică, teoria reactorilor nucleari, termohidraulică) sunt întâlnite seriile trigonometrice.

Pentru orice regim tranzitoriu, răspunsul unui sistem la o excitaţie oarecare se poate cunoaşte dacă se cunoaşte expresia răspunsului, după trecerea regimului dinamic,

Analiza datelor şi transformata Fourier 225

la o excitaţie sinusoidală cunoscută, care ar acţiona în locul excitaţiei oarecare. Toate funcţiile periodice pot fi descompuse în serii trigonometrice şi, prin

extensie, mărind perioada, şi orice funcţie neperiodică. După cum se cunoaşte, se numeşte serie trigonometrică o serie de funcţii de

forma:

( )∑∞

=

⋅+⋅+

10 sincos

kkk tkbtkaa ωω

unde kk

baa ,,,0

ω sunt constante reale, iar t o variabilă reală. Deoarece funcţiile

xcos , xsin sunt periodice de perioadă π⋅2 , funcţiile tkωcos , tkωsin , cu k

număr natural, au perioada ω

π21⋅==

kk

TTk .

Prin urmare, dacă seria trigonometrică este convergentă într-un punct t0, iar suma seriei este S(t0), seria va fi convergentă şi în punctele t0 + nT, cu n întreg şi S(t0 + nT)=S(t0). Din aceasta rezultă că este suficient să cunoaştem natura seriei într-un interval [ ]T+αα , pentru a putea spune care este natura seriei pentru orice t real şi

dacă seria trigonometrică este convergentă pe intervalul [ ]T+αα , , ea va fi convergenţa pentru toate valorile reale ale lui t.

În ipoteza că a1 şi b1 nu sunt amândoi nuli, suma seriei,

( )∑∞

=

⋅+⋅+=

10 sincos)(

kkk tkbtkaatS ωω

va fi definită pe toată axa reală şi va fi o funcţie periodică de perioadă ω

π2=T , cu

T

πω

2= pulsaţia mişcării periodice.

Orice funcţie periodică f(t) se poate reprezenta printr-o serie de forma,

( )∑∞

=

⋅+⋅+=

10 sincos)(

kkk tkbtkaatf ωω ,

care, dacă coeficienţii sunt,

L,3,2,1 ,dsin)(2

,dcos)(2

,d)(1

0 ==== ∫∫∫+++

kttktfT

bttktfT

attfT

aT

k

T

k

T α

α

α

α

α

α

ωω

se numeşte serie Fourier a funcţiei f(t) chiar dacă suma seriei nu este convergentă în nici un punct sau, convergentă fiind, suma sa nu este egală cu f(t) pentru nici o valoare a lui t.

Dezvoltarea în serie Fourier a unei funcţii periodice cu perioada T este,

( )∑∞

=

⋅+⋅=

011 sincos)(

kkk tkBtkAtf ωω ,

unde T

πω

21 = este pulsaţia armonicei fundamentale, iar coeficienţii sunt,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 226

L,3,2,1 ,dsin)(2

,0

,dcos)(2

,d)(1

2

2

10

2

2

1

2

2

0

===

==

∫∫

−−

kttktfT

BB

ttktfT

AttfT

A

T

Tk

T

Tk

T

T

ω

ω

Pentru funcţia neperiodică se deduce dezvoltarea analoagă,

( ) ( ) ωωωωωω dsindcos)(00

tbtatf ∫∫∞∞

+=

în care coeficienţii, denumiţi şi densităţi spectrale ale amplitudinii, sunt:

( ) uuufbuuufa d sin1

)( ,d cos)(1

)( ⋅=⋅= ∫∫∞

∞−

∞−

ω

π

ωω

π

ω

Coeficienţii Ak şi Bk din seria Fourier reprezintă amplitudinile armonicilor superioare de ordinul k, în cosinus, respectiv sinus. În integrala Fourier amplitudinile oscilaţiilor de pulsaţie ω , în sinus, respectiv cosinus, sunt ( ) ωω da respectiv ( ) ωω db .

Mărimile ( )ωa şi ( )ωb sunt densităţile amplitudinilor, adică amplitudinile ( ) ωω da ,

respectiv ( ) ωω db , ale oscilaţiilor de pulsaţii cuprinse între ω şi ωd , raportate la ωd .

La un spectru continuu amplitudinea armonicei cu o anumită pulsaţie ω are o valoare infinit mică, iar la un spectru discret de armonice amplitudinea acestora are o valoare finită.

În concluzie, suma armonicelor în sinus, ( ) ta ωωω cosd , respectiv cosinus

( ) tb ωωω cosd , reprezintă cu atât mai exact valoarea funcţiei neperiodice, cu cât se

alege mai mic intervalul de diviziune ωd . Pentru a deduce forma complexă a seriei, respectiv a integralei Fourier, se

utilizează formulele lui Euler pentru sinus şi cosinus, obţinându-se pentru o functie f(t) periodică, relaţia:

( ) ( )( )

∑ ∫∞+

−∞=

+

=

n

T

T

utjnueuftf

2

2-

1 d2

11ω

ω

π

.

Dacă perioada T creşte la infinit, se ajunge la cazul funcţiilor neperiodice. Pentru T foarte mare pulsaţia fundamentală devine foarte mică şi se notează cu ω∆ , astfel că funcţia devine,

( ) ( )( )∑ ∫

∞+

−∞=

+

−∆

∆=

n

T

T

utjnueuftf

2

2-

d2

ω

π

.

Din aceste relaţii se observă că la o valoare determinată a lui t valoarea integralei este o funcţie de mărimea ω∆n . Considerând o axă ω pe care se iau punctele

Analiza datelor şi transformata Fourier 227

ωωωω =∆∆∆ n,,2, L , atunci în fiecare dintre aceste puncte se poate determina funcţia

( ) ( )( )

+

2

2-

d

T

T

utjueufu

ω

ϕ ,

în care t are rolul de parametru.

Suma, ( )∑+∞

−∞=

∆∆

n

tn ,ωωϕ se apropie cu atât mai mult de valoarea integralei

( )∫+∞

∞-

d, ωωϕ tu , cu cât diviziunile T

πω

2=∆ devin mai mici, astfel că, la limită, pentru

∞→T şi ωω d→∆ , suma se transformă în integrala,

( ) ( ) ( ) ωω

π

ω

π

ωωω d2

1dd

2

1

-

tjtjujejFeueuftf ⋅=⋅

= ∫∫ ∫

+∞

∞−

+∞

∞−

+∞

cu ( ) ( )∫+∞

=

-

dtetfjFujω

ω

Funcţia ( )ωjF asociată funcţiei f(t), prin relaţia anterioară, se numeşte transformata Fourier a funcţiei f(t), asocierea însăşi se numeşte transformare

Fourier, respectiv,

( ) ( ) ωω

π

ω d2

1 tjejFtf ⋅= ∫

+∞

∞−

Sunt uzuale notaţiile:

( ) ( )tfjF F=ω şi ( ) ( ) ( )ωω jFjFtf1−

= F , cu F transformata Fourier şi F

-1 inversa transfomatei Fourier sau transformata Fourier inversă.

Cu aceste notaţii sunt valabile relaţiile:

( ) ( ) 0

0tj

ejFttfω

ω−

⋅=−F , ( ) ( )0(0ωω

ω

−=⋅ jFetftj

F , ( ) ( )ωω jFjt

f n

n

n

=

d

dF .

Comportarea unui sistem liniar se descrie prin funcţia de sistem, numită şi funcţie de transfer,

( ) ( )( )ωθ

ωωj

eAjH−

⋅= Prin definiţie, această funcţie de transfer înmultită cu complexul conjugat

0

0tj

eKω

⋅ al unei excitaţii armonice pur cosinusoidale, dă complexul răspunsului

armonic de regim permanent, ( ) 0

0tj

ejHKω

ω ⋅ .

Funcţia de transfer, ( )ωjH , înmulţită cu transformata Fourier, ( )ωjF , a

funcţiei de excitaţie dă transformata Fourier a răspunsului, ( )ωjG , în condiţii iniţiale

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 228

de zero şi pentru funcţii de excitaţie nule la t<0, ( ) ( ) ( )ωωω jHjFjG ⋅= ,

denumită şi spectrul complex al răspunsului. Deoarece spectrul complex al funcţiei treaptă unitate, sau funcţia lui Dirac, este

( ) 1=tδF , funcţia de transfer nu este altceva decât transformata Fourier a

răspunsului sistemului la o excitaţie impuls Dirac, adică este transformata Fourier a funcţiei treaptă unitate.

Funcţiile Matlab X=fft(x) şi x=ifft(X) introduc transformata Fourier discretă (DFT - Discrete Fourier Fransform), X, şi inversa transformatei Fourier, x, date de vectori de lungime N, calculată printr-un algoritm de transformare Fourier rapidă (FFT - Fast Fourier Transform) :

( ) ( )( )( )11

1

−−

=

∑=kn

N

n

nxkX ω , ( ) ( )( )( )11

1

1 −−−

=

∑=kn

N

N

n

kXN

nx ω , unde N

j

N e

⋅−

=

π

ω

2

.

Relaţia dintre DFT şi coeficienţii Fourier în:

( ) ( )( )

( )( )

⋅⋅⋅+

⋅⋅⋅+= ∑

= tN

ntkkb

tN

ntkkaanx

N

k d

2sin

d

2cos

2

10

ππ,

este,

N

Xa

)1(0 = , ( )

( )

N

kXrealka

)1(2

+⋅= , ( )

( )

N

kXimagkb

)1(2

+⋅−=

unde x este lungimea N a semnalului discret eşationat la timpul t cu spaţiul dt.

Calculul transformatei Fourier discretă se face cu funcţia Matlab, fft, care se apelează cu una dintre sintaxele:

• Y=fft(X) returnează o transformată Fourier discretă (DFT) a vectorului X, dacă X este o matrice, se returnează transformata Fourier pentru fiecare coloană a matricei, iar dacă X este un şir multidimensional, se va aplica pentru prima dimensiune;

• Y=fft(X,n) returnează n puncte DFT, dacă lungimea lui X este mai mică decât n, X este completat cu zerouri, dacă lungimea lui X este mai mare decât n, şirul X va fi trunchiat, iar când X este o matrice, lungimea coloanelor se reglează în aceeaşi manieră;

• Y=fft(X,[],dim) şi Y=fft(X,n,dim) aplică operatorul FFT pentru dimensiunea dim.

O aplicaţie cunoscută a transformatelor Fourier este aceea de a găsi frecvenţa componentelor unui semnal. Considerăm frecvenţa de 1000 Hz. Generăm un semnal cuprins între 50 şi 120 Hz şi perturbat cu zgomote aleatoare:

t = 0:0.001:0.6; x = sin(2*pi*50*t)+sin(2*pi*120*t); X = x + 2*randn(size(t)); plot(1000*t(1:50),y(1:50)); title('Semnal perturbat'); xlabel('Timp [ms]'); ylabel('X'). După cum se observă din figura 9.1, este dificil să identificăm frecvenţa

Analiza datelor şi transformata Fourier 229

componentelor uitându-ne la semnalul original.

Fig.9.1. Semnalul original perturbat

Convertind domeniul de frecvenţă, transformata Fourier discretă a semnalului de zgomot, Y, este găsită pentru n=512 cu transformata Fourier rapidă (FFT):

Y = fft(X,512); Puterea spectrului, Pyy, o măsură a puterii ce variază cu frecvenţa, este

reprezentată în figura 9.2 şi a fost calculată cu secvenţa: Pyy = Y.∗ conj(Y) / 512; f = 1000*(0:256)/512; plot(f,Pyy(1:257)) ; title('Frecventa lui X'); ylabel('Puterea Pyy'); xlabel('frequency (Hz)').

Acesta reprezintă frecvenţa conţinută de un domeniu de current continuu ce include frecvenţa Nyquist, (semnalul produce vârfuri puternice).

Calcularea transformatei Fourier discrete în două dimensiuni se face cu funcţia Matlab fft2, care se apelează cu una dintre secvenţele:

• Y = fft2(X) returnează transformata Fourier discretă cu două dimensiuni (DFT) a lui X, calculate cu algoritmul transformatei Fourier rapide (FFT), iar Y are aceeaşi dimensiune cu X;

• Y = fft2(X,m,n) reduce X, sau amortizeaza X cu zerourile create de un şir de la m la n înainte de a fi transformată, iar rezultatul este de la m la n.

De menţionat că fft2(X) poate fi calculată mai simplu cu fft(fft(X).').' , prin calculul într-o dimensiune DFT a fiecarei coloane X.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 230

Calculul transformatei Fourier discrete de n dimensiuni se face cu funcţia Matlab fftn.

Pentru orice X , ifft(fft(X)) este egal cu X cu o eroare aleatoare. Dacă X este real, ifft (fft(X) ) poate să aibă mici părţi imaginare.

Fig.9.2. Puterea spectrului după transformata Fourier discretă

Algoritmul pentru ifft(X) este acelaşi ca la fft(X), exceptând semnul schimbat şi scala factorului n=length(X). Ca şi la fft, timpul de execuţie depinde de lungimea tranformatei. Este mai rapid pentru puterea a doua. Este aproape la fel de rapid pentru şiruri care au factori primi doar numere mici. Este de câteva ori mai lent pentru şiruri care sunt numere prime sau care au un număr mare de factori primi.

Funcţia fftn se apelează cu una dintre sintaxele: • Y = fftn(X) returnează transformata Fourier discretă (DFT) a lui X, calculată

cu algoritmul transformatei Fourier rapide multidimensionale (FFT), iar rezultatul Y are aceeaşi dimensiune cu X;

• Y = fftn(X,siz) amortizează X cu zerourile siz, pentru a crea un şir multidimensional de mărime egală cu cea dinaintea aplicării transformatei, iar Y are dimensiuneaz siz.

Calculul se poate face şi apelând funcţia fft pentru fiecare dimensiune, astfel: Y = X; for p = 1:length(size(X)); Y = fft(Y,[],p); end.

Calculul transformatei Fourier discretă inversă se face cu funcţia ifft, apelată cu una dinte sintaxele:

• y = ifft (X) restituie transformata Fourier inversă discretă (DFT- discret Fourier transform) a vectorului X, calculată cu algoritmul rapid al

Analiza datelor şi transformata Fourier 231

transformatei Fourier (FFT), iar dacă X este o matrice, se restituie inversa fiecarei coloane a matricei;

• y = ifft (X,n) restituie n puncte ale inversei DFT a vectorului X; • y = ifft ( X, [], dim) şi y = ifft (X,n,dim) restituie inversa DFT a lui X de pe

partea cealaltă a dimensiuni dim.

Transformata Fourier discretă inversa bidimensională se determină cu funcţia ifft2, care se apelează cu sintaxele:

• Y = ifft2 (X) restituie transformata Fourier discretă inversă bidimensională (DTF) a lui X, calculată cu un algoritm rapid al transformatei Fourier (FFT), rezultatul Y este de aceeaşi dimensiune cu X;

• Y = ifft2 (X, m ,n ) restituie inversa transformatei Fourier m pe n a matricei X.

Pentru orice X, ifft2(fft2(X)) este egală cu X cu o eroare aleatoare. Dacă X este real, ifft2(fft2(X) ) poate să aibă mici părţi imaginare.

Algortimul pentru ifft2(X) este acelaşi ca şi la fft2(X), exceptând semnul schimbat şi scala factorilor [m,n] = size (X). Timpul de execuţie pentru ifft2 depinde de lungimea transformării. Este mai rapidă pentru puterea a doua, este aproape la fel de rapidă pentru şiruri care au doar factori primi numere mici. Este ceva mai lentă pentru şiruri care sunt numere prime sau care au factori primi numere mari.

Inversa multidimensională a transformatei Fourier discrete este dată de funcţia ifftn, apelată cu sintaxele:.

• Y = ifftn (X) restituie inversa n-dimensională a transformatei Fourier discrete (DFT) a lui X, calculată cu un algoritm rapid multidimensional a transformatei Fourier (FFT-Fast Fourier Transform), iar rezultatul, Y, este de aceeaşi dimensiune cu X;

• Y = ifftn (X,siz) îl tinde pe X spre zero, sau îl trunchiază, pentru a crea un şir mutidimensional de marime siz, înainte de a realiza tranformata inversă, iar dimensiunea rezultatului Y este siz.

Funcţia ifftn(X) este echivalentă cu următoarea secvenţă Matlab: Y = X; for p = 1:length(size(X)); Y = ifft(Y,[],p); end.

Aceasta calculează inversa unidimensională din cadrul fiecărei dimensiuni a lui X. Timpul de calcul pentru ifftn depinde de lungimea transformatei; este mai rapid pentru puterea a doua, este aproape la fel de rapid pentru şiruri care au factori primi cât mai mici şi este puţin mai lentă pentru şiruri de numere prime sau care au factori primi numere mari.

Deplasarea componentei de frecvenţă zero a transformatei Fourier discretă la centrul spectrului se realizează cu funcţia fftshift, care se apelează cu sintaxele:

• Y=fftshift(X) rearanjează ieşirile lui fft, fft2 şi fftn, deplasând componenta

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 232

de frecvenţă zero în centrul şirului, fiind utilă în vizualizarea unei transformate Fourier cu componentă de frecvenţă zero, în mijlocul spectrului; pentru vectori, fftshift (X) schimbă jumătatea stângă cu cea dreaptă a lui X, pentru matrice schimbă cadranele 1 şi 3 din X cu cadranele 2 şi 4, iar pentru şiruri cu mai multe dimensiuni, schimbă “jumatăţile de spaţii” din X din cadrul fiecărei dimensiuni;

• Y=fftshift(X,dim) aplică operaţia fftshift în cadrul dimensiunii dim.

Deplasarea inversei transformatei Fourier discretă la centru se face cu funcţia ifftshift, acre se apelează cu sintaxa:

• ifftshift(X) inversează rezultatele lui fftshift, dacă X este un vector, inverssând jumătatea stangă cu cea dreapta a lui X, iar pentru matrice, inversează primul cadran cu al treilea şi al doilea cadran cu al patrulea şi dacă X este un şir multidimensional, se inversează “jumatăţile de intervale” ale lui X din fiecare dimensiune;

• ifftshift( X, dim) aplică operaţia ifftshift în cadrul dimensiunii dim.

10. MAXIMELE ŞI MINIMELE UNEI FUNCŢII

Punctele de maxim sau minim local se numesc puncte de maxim sau minim

relativ sau puncte de extrem ori extremum relativ şi, în general, sunt punctele în care se anulează prima derivată. Un punct de minim local (sau maxim local) nu este în mod necesar un punct de minim (sau maxim) absolut, adică nu este un punct în care funcţia ia valoarea cea mai mică (sau cea mai mare) din interval.

10.1. Maximele şi minimele unei funcţii de o variabilă

Pentru o funcţie oarecare RIf →: , cu RI ⊂ interval, spunem că :

• punctul Ix ∈0 este un punct de maxim (local) pentru f, dacă există o

vecinătate V a lui 0x , astfel încât ( ) ( )0xfxf ≤ , pentru orice

IVx I∈ ; • punctul Ix ∈0 este un punct de minim (local) pentru f, dacă există o

vecinătate V a lui 0x , astfel încât, ( ) ( )0xfxf ≥ , pentru orice

IVx I∈ .

Punctele de maxim sau minim local sunt puncte de maxim sau minim relativ, denumite şi puncte de extremum relativ, ; un punct de maxim local (sau minim local) nu este în mod necersar un punct de maxim absolut (sau minim absolut), adică este un punct în care funcţia ia valoarea cea mai mare( sau cea mai mică).

Conform teoremei lui Fermat, dacă o funcţie RIf →: are derivată într-un

punct, 0x , din interiorul intervalului I şi dacă 0x este punct de maxim sau minim

local pentru funcţia f, atunci derivata sa este nulă în punctul 0x , 0)( 0'

=xf . Dacă

punctul 0x este unul dintre capetele intervalului I, punctul 0x poate fi punct de

extremum, fără ca derivata să se anuleze în punctul 0x . De menţionat că reciproca teoremei lui Fermat nu este în general adevărată, adică o funcţie derivabilă într-un punct 0x , care are derivata nulă în punctul 0x , nu are în punctul 0x în mod necesar un extremum.

Pentru o funcţie RIf →: , continuă pe intervalul [a, b], cu a < b şi derivabilă pe intervalul (a, b), pentru care f(a)=f(b), conform teoremei lui Rolle există un punct ( )bac ,∈ , astfel încât 0)( =′ cf , respectiv un punct de extremum local.

Punctele de extremum, dintr-un interval în care f este derivabilă, se găsesc printre punctele în care se anulează derivata întâi. Într-un astfel de punct 0x , în care funcţia este continuă, avem :

• un punct de minim, dacă derivata la stânga punctului 0x este negativă,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 234

iar la dreapta lui 0x este pozitivă;

• un punct de maxim, dacă derivata la stânga punctului 0x este pozitivă,

iar la dreapta lui 0x este negativă;

• nu este punct de extremum dacă derivata are acelaşi semn la stânga şi la dreapta punctului 0x .

Condiţiile necesare şi suficiente de extremum se obţin cu ajutorul derivatelor de ordin superior. Dacă o funcţie f este derivabilă de 1+n ori, 2≥n într-un punct Ix ∈0 , astfel încât,

( ) ( ) ( ) ( ) 0,0,,0,0 0)(

0)1(

00 ≠==′′=′−

xfxfxfxfnn

L ,

atunci 0x este :

• punct de maxim dacă n=2m şi ( ) 00)(

<xfn ;

• punct de minim dacă n=2m şi ( ) 00)(

>xfn ;

• punct de inflexiune doar dacă n=2m+1 şi ( ) 00)(

<xfn .

Pentru determinarea minimului unei funcţii de o singură variabilă, în Matlab, se utilizează funcţia fminbnd. Funcţia utilizează algoritmul de interpolare parabolic. La versiunile anterioare, Release 12 (Matlab 6), se utiliza funcţia fmin. Funcţia fminbnd se apelează cu una dintre sintaxele :

• x = fminbnd(fun,x1,x2) returnează valoarea x, pentru care funcţia descrisă de fun are valoarea minimă în intervalul x1 < x < x2;

• x = fminbnd(fun,x1,x2,options) minimizează, ţinând seama de parametrii de optimizare specificaţi în structura options, care sunt, în general, precizaţi de utilizator prin funcţia optimset; aceste opţiuni sunt: Display (poate fi 'off', când nu apare pe display nimic, 'iter', când este afişată fiecare iteraţie, 'final', când se afişează ultima iteraţie sau opţiunea standard 'notify', când se dau informaţii dacă soluţia nu converge), TolX (eroarea acceptată pentru soluţie), MaxFunEval (numărul maxim de funcţii de evaluare alocat) şi MaxIter (numărul maxim de iteraţii dorite);

• x = fminbnd(fun,x1,x2,options,P1,P2,...) transferă argumentele adiţionale P1, P2 etc., funcţiei obiectiv, fun(x,P1,P2,...) şi, dacă nu sunt setate opţiuni, se utilizează vectorul gol, [];

• [x,fval] = fminbnd(...) returnează valorile funcţiei obiectiv, fval, cu care este calculată funcţia fun, în punctul x;

• [x,fval,exitflag] = fminbnd(...) returnează un indicator, exitflag, care descrie conditiile de ieşire şi care poate fi: >0 – dacă funcţia converge la soluţia x, 0 – dacă a fost depăşit numărul maxim de funcţii de evaluare, <0 – dacă funcţia nu converge la soluţia x;

• [x,fval,exitflag,output] = fminbnd(...) returnează indicatorul output,

Maximele şi minimele unei funcţii 235

care dă informaţii referitoare la algoritmul utilizat, numărul de funcţii de evaluare şi numărul de iteraţii.

Pentru exemplificare se determină coordonatele minimului funcţiei,

( ) 5223−⋅−+= xxxxf

în intervalul (0, 1). Secvenţa Matlab poate fi: f = inline('x.^3+x^2-2*x-5'); x = fminbnd(f, 0, 2);

rezultând punctul de minim, x= 0.5486 şi valoarea minimă a funcţiei f(x)= -5.6311.

10.2. Maximele şi minimele unei funcţii de p variabile

Pentru o funcţie oarecare ( )p

p RIxxxf →:,,, 21 L , cu pRI ⊂ interval,

spunem că : • punctul ( ) Iaaa p ∈,,, 21 L este un punct de minim local al funcţiei,

( )pxxxf ,,, 21 L , dacă există o vecinătate V a lui ( )paaa ,,, 21 L , astfel

încât, pentru orice ( ) IVxxx p IL ∈,,, 21 , să fie adevărată relaţia

( ) ( )pp aaafxxxf ,,,,,, 2121 LL ≥ ;

• punctul ( ) Iaaa p ∈,,, 21 L este un punct de maxim local al funcţiei,

( )pxxxf ,,, 21 L , dacă există o vecinătate V a lui ( )paaa ,,, 21 L , astfel

încât, pentru orice ( ) IVxxx p IL ∈,,, 21 , să fie adevărată relaţia

( ) ( )pp aaafxxxf ,,,,,, 2121 LL ≤ .

Maximele şi minimele, aşa cum sunt definite, sunt maxime sau minime locale sau relative şi se mai numesc şi extreme relative.

Pentru o funcţie ( )pxxxf ,,, 21 L , definită pe pRI ⊂ , care are în punctul

( )paaa ,,, 21 L un extremum şi derivate parţiale, atunci în acest punct derivatele

parţiale se anulează, ( ) ( ) ( ) 0,,,,,0,,,,0,,, 212121 21

=′=′=′pxpxpx aaafaaafaaaf

pLLLL .

Soluţiile sistemului,

0,,0,021

=

∂=

∂=

px

f

x

f

x

fL ,

formează mulţimea punctelor staţionare ale funcţiei ( )pxxxf ,,, 21 L .

Se observă că, pe mulţimea punctelor staţionare diferenţiala de ordinul întâi se anulează, ( ) 0,,,d 21 =pxxxf L , şi reciproc, punctele care anulează diferenţiala

de ordinul întâi sunt puncte staţionare. Punctele de extremum ale funcţiei

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 236

( )pxxxf ,,, 21 L se găsesc printre punctele staţionare ale ei.

Pentru o funcţie ( )pxxxf ,,, 21 L , definită pe pRI ⊂ , derivabilă parţial de

trei ori pe I şi punctul ( )paaa ,,, 21 L o soluţie a sistemului

0,,0,021

=

∂=

∂=

px

f

x

f

x

fL ,

dacă pentru orice ( )

ji

p

ijxx

aaafA

∂∂

=

,,, 212

L numerele:

• 111 A=∆ , 2221

12112

AA

AA=∆ , ... ,

pppp

p

p

p

AAA

AAA

AAA

21

22221

11211

LLLL

L

L

=∆ , sunt pozitive

atunci funcţia ( )pxxxf ,,, 21 L are în punctul ( )paaa ,,, 21 L un minim;

• 111*

A−=∆ , 2221

12112

*

AA

AA=∆ , ... , ( )

pppp

p

p

p

AAA

AAA

AAA

21

22221

11211

* 1LLLL

L

L

−=∆ , sunt

pozitive, atunci funcţia ( )pxxxf ,,, 21 L are în punctul ( )paaa ,,, 21 L un

maxim.

Pentru determinarea minimului unei funcţii de mai multe variabile în vecinătatea unui vector de start, 0x , în Matlab se utilizează funcţia fminsearch. Funcţia utilizează algoritmul simplex Nelder-Mead. La versiunile anterioare, Release 12 (Matlab 6), se utiliza funcţia fmins. Funcţia fminsearch se apelează cu una dintre sintaxele :

• x = fminsearch (fun,x0) returnează un vector x, care este o minimizare locală a lui fun, în vecinătatea vectorului de start x0;

• x = fminsearch (fun,x0,options) minimizează ţinând seama de parametrii de optimizare specificaţi în structura options, care sunt, în general, precizaţi de utilizator prin funcţia optimset; aceste opţiuni sunt: Display (poate fi 'off', când nu apare pe display nimic, 'iter', când este afişată fiecare iteraţie, 'final', când se afişează ultima iteraţie, sau opţiunea standard 'notify', când se dau informaţii dacă soluţia nu converge), TolX (eroarea acceptată pentru soluţie), MaxFunEval (numărul maxim de funcţii de evaluare alocat) şi MaxIter (numărul maxim de iteraţii dorite);

• x = fminsearch (fun,x0,options,P1,P2,...) transferă argumentele

Maximele şi minimele unei funcţii 237

adiţionale P1, P2 etc., funcţiei obiectiv, fun şi dacă nu sunt setate opţiuni, se utilizează vectorul gol, [];

• [x,fval] = fminsearch (...) returnează valorile funcţiei obiectiv, fval, cu care este calculată funcţia fun în punctul x;

• [x,fval,exitflag] = fminsearch (...) returnează un indicator, exitflag, care descrie conditiile de ieşire şi care poate fi: >0 – dacă funcţia converge la soluţia x, 0 – dacă a fost depăşit numărul maxim de funcţii de evaluare, <0 – dacă funcţia nu converge la soluţia x;

• [x,fval,exitflag,output] = fminsearch (...) returnează indicatorul output

care dă informaţii referitoare la algoritmul utilizat, numărul de funcţii de evaluare şi numărul de iteraţii.

Un exemplu clasic pentru testarea minimizării multidimensionale este funcţia banana a lui Rosenbrock,

( ) ( ) ( )2

1

221221 1100, xxxxxf −+−⋅=

care are minimul 0, în punctul (1,1). Punctul tradiţional de plecare pentru căutarea soluţiei, x0, este (-1.2,1).

Funcţia se poate da ca o funcţie Matlab, de tip „m” prin secvenţa, function f = banana(x); f = 100*(x(2)-x(1)^2)^2+(1-x(1))^2, iar prin, [x,fval] = fminsearch(@banana,[-1.2, 1]) rezultă x = [1.0000 1.0000 ] şi fval =8.1777e-010, ceea ce indică faptul că minimul a fost găsit cu o eroare foarte mică, ce tinde spre zero.

Modificarea locaţiei punctului de minim în punctul [a, a2], se face prin

adăugarea unui parametru a funcţiei banana iniţiale, astfel: function f = banana(x,a); if nargin < 2, a = 1; end ; f = 100*(x(2)-x(1)^2)^2+(a-x(1))^2; Transferarea opţiunilor prin funcţia optimset se realizează cu secvenţa,

[x,fv,ex,out]=fminsearch(@banana, [-1.2, 1],optimset('TolX',1e-8), sqrt(2)); care transferă funcţiei banana parametrul a=sqrt(2) şi găseşte minimul cu mai multă acurateţe, rezultând:

x = 1.4142 2.0000 fval = 2.4034e-018 ex = 1 op = iterations: 128 funcCount: 247 algorithm: 'Nelder-Mead simplex direct search',

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 238

ceea ce arată punctul de minim al funcţiei, x, valoarea funcţiei obiectiv, fval, faptul că funcţia converge la soluţie, ex=1>0, numărul de iteraţii, 128, numărul de funcţii de evaluare, 247 şi algoritmul utilizat, 'Nelder-Mead simplex cu căutare directă.

10.3. Calculul zerourilor funcţiilor de o variabilă reală

Calculul zerourilor unei funcţii de o variabilă reală este, în esenţă, găsirea

valorilor variabilei pentru care valoarea funcţiei este zero. Pentru aceasta, se

porneşte de la constatarea că, dacă pentru o valoare x0, funcţia este f(x0)=0, atunci

semnul funcţiei pentru un x<x0 diferă de semnul funcţiei pentru x<x0 , funcţia

schimbând semnul.

Ca o regulă generală, se consideră o valoare oarecare x0 şi se caută zeroul cel

mai apropiat de această valoare, considerând un interval ce include punctul x0 şi

micşorând acest interval, până la eroarea dorită. Căutarea soluţiei se poate face prin

metoda tangentei sau a lui Newton, metoda secantei, metoda bisecţiei, metoda de

interpolare pătratică inversă.

În Matlab, calculul zerourilor unei funcţii de o variabilă reală se face cu funcţia fzero, care se apelează cu una dintre sintaxele:

• x = fzero (fun,x0) returnează zeroul funcţiei fun, cel mai apropiat de vecinătatea valorii scalare de start, x0, iar dacă nu se găseşte un punct în care funcţia schimbă semnul, se afişează NaN, cu menţiunea că, x0 poate fi un vector cu două dimensiuni, care dă intervalul în care funcţia schimbă semnul şi atunci, în mod cert, se va găsi un zero al funcţiei ;

• x = fzero (fun,x0,options) caută zeroul, ţinând seama de parametrii de optimizare specificaţi în structura options, care sunt, în general, precizaţi de utilizator prin funcţia optimset; aceste opţiuni sunt Display (poate fi 'off', când nu apare pe display nimic, 'iter', când este afişată fiecare iteraţie, 'final', când se afişează ultima iteraţie sau opţiunea standard 'notify', când se dau informaţii dacă soluţia nu converge), TolX (eroarea acceptată pentru soluţie);

• x = fzero (fun,x0,options,P1,P2,...) transferă argumentele adiţionale P1,

P2 etc., funcţiei obiectiv, fun şi dacă nu sunt setate opţiuni, se utilizează vectorul gol, [];

• [x,fval] = fzero (...) returnează valorile funcţiei obiectiv, fval, cu care este calculată funcţia fun, în punctul x;

• [x,fval,exitflag] = fzero (...) returnează un indicator, exitflag, care descrie condiţiile de ieşire şi care poate fi: >0 – indică dacă funcţia are

Maximele şi minimele unei funcţii 239

un zero, <0 – nu are soluţie, funcţia nu se anulează sau se anulează la infinit;

• [x,fval,exitflag,output] = fzero (...) returnează indicatorul output, care dă informaţii referitoare la algoritmul utilizat, numărul de funcţii de evaluare şi numărul de iteraţii.

Se reaminteşte că zerourile unui polinom pot fi calculate şi cu funcţia roots. Pentru exemplificare, se determină zeroul funcţiei f(x)=sinx, cel mai apropiat

de x0=3. Deoarece funcţia considerată este predefinită în Matlab, rezultatul se obţine cu secvenţa,

X=fzero(‘sin’,3)

rezultând: X=3.1416.

10.4. Rezolvarea sistemelor de ecuaţii nelineare

Rezolvarea unui sistem de ecuaţii neliniare de forma 0)( =XF , unde X poate fi sub forma unui vector sau o matrice, prin metoda celor mai mici pătrate, se realizează cu funcţia fsolve, care se apelează cu una dintre sintaxele:

• x = fsolve(fun,x0) consideră soluţiile iniţiale, de pornire, x0 şi rezolvă ecuaţia descrisă de fun;

• x = fsolve(fun,x0,options) minimizează funcţia fun, ţinând seama de parametrii de optimizare, specificaţi în structura options;

• x = fsolve(fun,x0,options,P1,P2,...) transferă funcţiei fun parametrii P1,

P2, … de care aceasta depinde, iar în cazul când opţiunile sunt cele predefinite, în locul lui options se introduce o matrice goală, [ ];

• [x,fval] = fsolve(fun,x0) calculează şi valoarea funcţiei obiectiv fval, cu care s-a găsit soluţia x, a funcţiei fun;

• [x,fval,exitflag] = fsolve(...) calculează valoarea exitflag, care descrie condiţia de ieşire;

• [x,fval,exitflag,output] = fsolve(...) returnează o structură de ieşire output, care conţine informaţiile referitoare la metoda de optimizare;

• [x,fval,exitflag,output,jacobian] = fsolve(...) calculează Jacobianul funcţiei fun, pentru soluţia x.

Funcţia fun descrie sistemul de ecuaţii ce urmează a fi rezolvat, având ca

parametrii de intrare vectorul x şi ca parametrii de ieşire, vectorul F. Funcţia fun poate fi specificată şi chemând o funcţie definită anterior, respectiv cu sintaxa:

x = fsolve(@myfun,x0) unde myfun este funcţia Matlab definită anterior, ca de exemplu F = myfun(x).

Dacă se doreşte calcularea Jacobianului, atunci trebuie stabilit parametrul „on”, cu ajutorul secvenţei:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 240

options = optimset('Jacobian','on') şi funcţia fun trebuie să returneze, ca al doilea argument, matricea J, conţinând valorile Jacobianului, la soluţia x.

În cazul în care se urmăreşte calcularea funcţiei obiectiv şi a Jacobianului pentru soluţia x, secvenţa Matlab este

function [F,J] = myfun(x) F = ... if nargout > 1 J = ... end Dacă funcţia fun returnează un vector (o matrice), având m componente şi x

are lungimea n, unde n este dimensiunea lui x0, atunci Jacobianul, J, este o matrice de dimensiune mxn, unde J(i,j) este derivata parţială a funcţiei F(i), în raport cu x(j).

Parametrul de ieşire existflag , descrie convergenţa sistemului, având următoarele valori de ieşire:

• >0 - funcţia a convers către soluţia x; • 0 - numărul maxim de evaluări ale funcţiei şi iteraţii a fost depăşit; • <0 - funcţia nu a convers către o soluţie.

Structura output, conţine informaţiile legate de optimizare, având următoarele

specificaţii: • iterations - returnează numărul de iteraţii; • funcCount - numărul de evaluări ale funcţiei; • algorithm - algoritmul utilizat; • cgiterations – numărul de iteraţii, Preconditioned Conjugate Gradients

(PCG) (pentru algoritmi de mari dimensiuni); • stepsize - pasul de simulare folosit în final (pentru algoritmi de mari

dimensiuni); • firstorderopt - măsura optimalităţii de primul grad (pentru algoritmi de

mari dimensiuni). Pentru probleme de mari dimensiuni, optimalitatea de primul grad este norma la infinit a gradientului g=J

TF.

Pentru exemplificare, se consideră sistemul de ecuaţii:

2

1

21

21

2

2x

x

exx

exx

=+−

=−

care, pentru rezolvare în Matlab ,la o soluţie iniţială x0=[-5 -5], se scrie

02

022

1

21

21

=−+−

=−−

x

x

exx

exx

Maximele şi minimele unei funcţii 241

Funcţia Matlab care descrie ecuaţiile de mai sus este function F = myfun(x) F = [2*x(1) - x(2) - exp(-x(1)); -x(1) + 2*x(2) - exp(-x(2))];

Stabilizindu-se algoritmul de optimizare, secvenţa funcţiei fsolve este x0 = [-5; -5; options=optimset('Display','iter'); [x,fval] = fsolve(@myfun,x0,options)

care afişează numărul de iteraţii necesare pentru ca sistemul să conveargă şi celelalte caracteristici specificate în output.

Valorile lui x şi ale funcţiei fval sunt: x = 0.5671 0.5671.

fval = 1.0e-006 * -0.4059 -0.4059.

11. CALCULE NUMERICE CU POLINOAME

11.1. Polinoame. Funcţii raţionale.

Funcţiile elementare sunt funcţii relativ simple, cu care se construiesc majoritatea funcţiilor compuse întâlnite în aplicaţii.

Polinomul este cea mai simplă funcţie elementară, cu o singură variabilă şi poate fi exprimat prin următoarea formă generală:

12

11

21

1

1

1)(+−

+

=

−+

+⋅+⋅++⋅++⋅+⋅=⋅= ∑ nnnk

knn

n

i

ini AxAxAxAxAxAxAxP LL

unde x este variabila, reală sau complexă, iar Ai, sunt coeficienţii polinomului, reali sau complecşi.

Polinomul este o funcţie olomorfă (derivabilă) pe orice domeniu mărginit. În Matlab, polinoamele sunt reprezentate printr-un vector linie, care conţine

coeficienţii în ordinea descrescătoare a puterilor variabilei, având indicii de la 1 la n-1, cum se observă şi din relaţia de mai sus.

De exemplu, reprezentarea Matlab a polinomului,

ixxxxp ⋅++⋅+⋅+⋅+⋅= 265432 2341

este dată de vectorul, p1=[2 3 4 5 6+2i ].

Se numeşte funcţie raţională un cât de două polinoame,

( )

12

11

21

12

11

21

)(

)(

+−

+−

+⋅+⋅++⋅++⋅+⋅

+⋅+⋅++⋅++⋅+⋅

==

pppk

kpp

nnnk

knn

BxBxBxBxBxB

AxAxAxAxAxA

xQ

xPxR

LL

LL

În particular, dacă Q(x) este de gradul zero, R(x) se reduce la un polinom, deci şi polinomul este o funcţie raţională. Se spune că polinomul este o funcţie

raţională întreagă. Presupunem că polinoamele P(x) şi Q(x) nu au rădăcini comune, deci fracţia

R(x) este ireductibilă. Fie a, b, ..., l, rădăcinile polinomului Q(x) şi λβα ,,, L , ordinele lor de

multiciplitate. Polinomul Q(x), poate fi descompus în factori sub forma,

( ) ( ) ( ) ( ) plxbxaxBxQ =+++−⋅⋅−⋅−⋅= λβαλβα

LL ;1 şi atunci funcţia R(x),

( )

( ) ( ) ( )λβα

lxbxaxB

AxAxA

xQ

xPxR n

nn

−⋅⋅−⋅−⋅

++⋅+⋅

==+

L

L

1

11

21

)(

)(,

este definită pentru orice x, de modul finit, cu excepţia punctelor a, b, ..., l, în care numitorul ia valoarea zero.

Calcule numerice cu polinoame 243

În orice domeniu mărginit, funcţia raţională nu are alte singularităţi decât punctele în care numitorul ia valoarea zero, puncte în care funcţia nu este definită. Aceste singularităţi, de fapt rădăcinile polinomului de la numitor, sunt poli, care, în cazul de mai sus, sunt a, b, ..., l. Ordinul de multiciplitate al fiecărui pol este egal cu ordinul de multiciplitate al rădăcinii respective, care, în cazul de mai sus, sunt

λβα ,,, L . Funcţiile raţionale nu au alte singularităţi în tot planul, inclusiv în punctul de

la infinit, decât poli.

11.2. Operaţii cu polinoame

Cum polinomul este o funcţie elementară, pentru două polinoame P1(x) şi P2(x), sunt valabile operaţiile de la funcţii, respectiv:

� suma a două polinoame este tot un polinom, P(x)=P1(x)+P2(x); � diferenţa a două polinoame este tot un polinom, P(x)=P1(x)-P2(x); � produsul a două polinoame este tot un polinom, P(x)=P1(x) x P2(x); � câtul a două polinoame este tot un polinom, P(x)=P1(x) : P2(x).

Operaţiile aritmetice de adunare şi scădere a polinoamelor presupun adunarea şi scăderea coeficienţilor de acelaşi ordin.

Esenţial, pentru a opera cu polinoame în Matlab, este faptul ca polinoamele să aibă acelaşi ordin, adică lungimea vectorilor coeficienţilor să fie aceeaşi. Din această cauză, polinomului cu grad mai mic i se vor completa coeficienţii cu zero.

Dacă, de exemplu,

( ) 1432 2341 +⋅+⋅+⋅= xxxxp , ( ) xxxxp ⋅+⋅+⋅= 232 23

2 , polinomul sumă este,

( ) ( ) ( ) 12752 23421 +⋅+⋅+⋅+⋅=+= xxxxxpxpxps ,

iar polinomul diferenţă este,

( ) ( ) ( ) 122 23421 +⋅−++⋅=−= xxxxxpxpxpd .

În Matlab, pentru a opera vectorii corespunzători lui p1 şi p2 sunt: p1 = [ 2 3 4 0 1]; p2= [0 2 3 2 0 ];

astfel încât să poată să se efectueze, ps = p1+p2 = [ 2 5 7 2 1 ] şi pd = p1-p2 = [ 2 1 1 -2 1 ].

Înmulţirea sau împărţirea unui polinom cu un scalar constă în mutiplicarea coeficienţilor acestuia cu un scalar, respectiv în înmulţirea unui vector, al coeficienţilor polinomului cu scalarul respectiv.

Prin urmarea pentru a înmulţi polinomul P cu scalarul k, pentru a obţine polinomul Pk, adică:

( )∑∑+

=

−+

+

=

−+

⋅⋅=⋅⋅=

1

1

11

1

1)(n

i

ini

n

i

inik xAkxAkxP

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 244

se înmulţesc numai coeficienţii polinomului cu scalarul k. Deoarece asupra scalarului k nu s-a făcut nici o restricţie, putem presupune că

acesta este de forma r

k1

= şi prin urmare, operaţia de înmulţire cu k este identică

cu operaţia de împărţire a polinomului P(x) la r. În Matlab, înmulţirea polinomului p1 cu k=3, pentru a obţine polinomul p3,

se scrie: p1 = [ 2 3 4 0 1]; k=3; p3 = k*p1 = [6 9 12 0 3 ],

iar înmulţirea cu 5

11==

rk , respectiv împărţirea la r=5, se scrie:

p1 = [ 2 3 4 0 1]; k=1/5; p3 = k*p1 sau p3 = p1 / r = [0.4 0.6 0.8 0 0.2].

Înmulţirea a două polinoame, ( )xu , ( )xv este echivalentă unei operaţii de convoluţie.

Funcţia ce realizează convoluţii (multiplicări) de polinoame este conv, care se apelează cu sintaxa, w = conv(u,v) şi convoluţionează vectorii u şi v.

Dacă m = length (u) şi n = length (v), atunci w, este un vector de lungime m+n-1, al cărui element k ,este:

)1()()( jkvjukwj

−+= ∑

Suma este pentru toate valorile lui j, ceea ce conduce la indici permişi pentru u( j ) şi v(k+1-j), mai precis j = max(1,k+1-n): min(k,m). Când m=n , rezultă:

w(1) = u(1)*v(1) w(2) = u(1)*v(2)+u(2)*v(1) w(3) = u(1)*v(3)+u(2)*v(2)+u(3)*v(1) ... w(n) = u(1)*v(n)+u(2)*v(n-1)+ ... +u(n)*v(1) ... w(2*n-1) = u(n)*v(n)

Apelarea practică, în Matlab, pentru a înmulţi polinomul p1 cu polinomul p2, pentru a obţine polinomul pm se face cu secvenţa,

p1 = [ 2 3 4 0 1]; p2= [0 2 3 2 0 ]; pm=conv(p1,p2), obţinând,

pm = [0 4 12 21 18 10 3 2 0 ] ceea ce corespunde, matematic, polinomului ( )xpm ,

( ) ( ) ( ) xxxxxxxxpxpxpm ⋅+⋅+⋅+⋅+⋅+⋅+⋅=⋅= 23101821124 23456721

Conform teoremei împărţirii cu rest a două polinoame, oricare ar fi polinoamele, u şi 0≠v , există polinoamele unice, q şi r, astfel încât,

vrrqvu grad grad , <+⋅= , Polinomul u se numeşte deîmpărţit, v împărţitor, q cât şi r rest.

Calcule numerice cu polinoame 245

Împărţirea sau divizarea a două polinoame este echivalentă unei operaţii de deconvoluţie, pentru care în Matlab, se utilizează funcţia deconv, care se apelează cu sintaxa:

[q, r] = deconv (v,u), care realizează deconvoluţia vectorilor u şi v (se împarte v la u), folosind o divizare prelungită. Câtul este restituit într-un vector q, iar restul ca un vector r, adică: v = conv (u, q) +r.

Dacă u şi v sunt vectori cu coeficienţi polinomiali, a face convoluţia celor doi este echivalent cu a înmulţi cele două polinoame, iar deconvoluţia este împărţirea polinoamelor. Rezultatul împărţirii lui v la u este câtul q şi restul r.

Pentru, u = [1 2 3 4] ; v = [10 20 30];

convoluţia este, c = conv(u,v) = [ 10 40 100 160 170 120 ]. Pentru a ajunge din nou la u, se utilizează deconvoluţia, [q,r] = deconv(c,u)

rezultând, q = [ 10 20 30 ], r = [ 0 0 0 0 0 0]

adică un cât egal cu q=v şi un rest r egal cu zero.

11.3. Evaluarea polinoamelor

Evaluarea polinoamelor este strâns legată de evaluarea funcţiilor. La funcţii, evaluarea se poate face într-un punct, lucrând cu scalari sau în mai multe puncte, lucrând vectorial sau cu tablouri.

Lucrând scalar, evaluarea polinomului 132)( 23+⋅++⋅= xxxxf , pentru

x=2, se realizează cu secvenţa Matlab: x=2; f=2*x^3+x^2+3*x+1;

rezultând f=27. În cazul lucrului cu tablouri, ce constituie specificitatea Matlab, programul se

execută mai rapid decât ansamblul calculelor pentru fiecare valoare scalară în parte, dar, în acest caz, sintaxa evaluării presupune plasarea unui punct înaintea operatorilor înmulţire, împărţire sau ridicare la putere. Dimensiunea matricei în care se returnează valorile polinomului este identică cu cea a matricei care conţine punctele în care se face evaluarea. Secvenţa de evaluarea a polinomului f(x), pentru x=[-2 -1 0 1 2 3], în acest caz este:

x = [-2 -1 0 1 2 3]; f = 2.*x.^3+x.^2+3.*x+1; rezultând, f = [-17 -3 1 7 27 73 ].

De menţionat că punctele de evaluare x pot să aparţină unui interval, fiind distribuite uniform pe acesta şi astfel, polinomul se evaluează pe un interval, a-b, cu pasul dorit, x = a:pas:b.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 246

Special pentru evaluarea polinoamelor se utilizează funcţia polyval, care se apelează cu una dintre sintaxele:

• y = polyval (p, x) restituie valoarea unui polinom de grad n evaluat la x, argumentul de intrare p este un vector de lungime n+1, ale cărui elemente sunt coeficienţii în ordine descrescatoare a puterilor polinomului ce este evaluat, iar x poate fi o matrice sau un vector şi atunci, funcţia polyval evaluează p la fiecare element a lui x;

• y = polyval (p, x, [], mu) foloseşte ( ) 21 /ˆ µµ−= xx în locul lui x, calculat

funcţie de µ1= mean (x) şi µ2 = std (x), funcţia calculând opţional şi parametrii de centrare şi de gradare mu = [µ1, µ2] ;

• [y, delta] = polyval (p, x, S) şi [ y, delta] = polyval (p, s, S, mu) folosesc structura de ieşire opţională S, generată de polyfit pentru a produce erorile estimate, y ± delta; dacă erorile din datele de intrare ale funcţiei polyfit sunt independente, cu o variaţie constantă, atunci y ± delta conţine cel puţin 50 % din anticipări.

Pentru evaluarea polinomului ( ) 123 2++= xxxp , în punctele x = 5, 7, 9 se

utilizează secvenţa, p = [3 2 1]; v=polyval(p,[5 7 9]),

rezultând, v = [ 86 162 262].

Evaluarea unei matrice polinomiale se face cu funcţia polyvalm, care se apelează:

• Y = polyvalm (p, X) calculează un polinom în sensul unei matrice, fiind acelaşi lucru cu a substitui matricea X, în polinomul p.

Matricele Pascal sunt formate din triunghiul Pascal al coeficienţilor binomiali. Mai jos, este prezentată o matrice Pascal de ordinul 4,

X = pascal(4) ; X = [ 1 1 1 1 ; 1 2 3 4 ; 1 3 6 10 ; 1 4 10 20 ], la care polinomul său caracteristic poate fi produs cu funcţia poly,

p = poly(X) ; p = [ 1 -29 72 -29 1 ],

care reprezintă polinomul 1297229 234+−+− xxxx

De menţionat că matricea Pascal are o proprietate specială şi anume, aceea că vectorul coeficienţilor unui polinom caracteristic este “palindromic”, adică este la fel şi înainte şi înapoi.

Calcularea acestui polinom, matricea Pascal, element cu element, nu este foarte important, dar calculul în sensul unei matrice este important, conducând la o matrice cu toate elementele zero şi aceasta este verificarea teoremei Cayley- Hamilton, ce spune că o matrice satisface propria sa ecuaţie caracteristică.

Calcule numerice cu polinoame 247

11.4. Calculul rădăcinilor sau al coeficienţilor

polinomului când se cunosc rădăcinile

Prin definiţie, un număr C∈α se numeşte rădăcină a polinomului P(x), dacă şi numai dacă 0)( =αP . Numărul α se numeşte rădăcină multiplă de ordinul

p a polinomului 0)( ≠xP , dacă şi numai dacă ( )p

x α− divide pe P, iar ( )1+

−p

x α nu-l divide pe P. Dacă p=1, rădăcina se numşte simplă, iar dacă p=2 ea se numeşte rădăcină dublă.

Pentru un polinom oarecare, P(x), calculul rădăcinilor este echivalent cu rezolvarea ecuaţiei P(x)=0. Dacă polinomul P(x) este de gradul n, atunci va avea n rădăcini, care pot fi reale sau complexe.

Atunci când coeficienţii polinomului sunt numere reale, rădăcinile complexe sunt perechi de numere complexe conjugate. Orice polinom de grad impar are cel puţin o rădăcină reală. Numărul rădăcinilor reale simple este egal cu numărul de variaţii de semn ale şirului lui Rolle, al polinomului P. Şirul lui Rolle se construieşte punând în ordine crescătoare de la ∞− la ∞+ , rădăcinile derivatei

polinomului, 'P , inclusiv punctele de la infinit.

Determinarea rădăcinilor polinomului se face, în Matlab, cu funcţia roots, care se apelează cu sintaxa,

r = roots(c) în care c, este vectorul coeficienţilor polinomului, iar r, vectorul conţinând rădăcinile polinomului. Vectorul coeficienţilor polinomului, c, conţine coeficienţii unui polinom, ordonaţi în ordine descrescatoare a puterilor. Dacă c are n+1

componente, polinomul pe care îl reprezintă este de forma: 11 ...+

+++ nn

ncscsc .

De exemplu, polinomul:

27726 23−⋅−⋅− sss

este reprezentat în MATLAB prin vectorul, c = [1 -6 -72 -27] Rădăcinile acestui polinom sunt restituite într-un vector coloană, astfel: r = roots(p) r = 12.1229 -5.7345 -0.3884.

Dacă se cunosc rădăcinile unui polinom, atunci determinarea coeficienţilor se face cu funcţia Matlab poly, care se apelează cu sintaxa c = poly(r), r fiind vectorul, rădăcini ale polinomului, iar c fiind vectorul, coeficienţii polinomului.

Apelată cu sintaxa, p = poly (A)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 248

unde A este o matrice de n x n, ce restituie un vector rând ale cărui n+1 elemente sunt coeficienţii polinomului caracteristic, ( )AIs −⋅det . Coeficienţii sunt ordonaţi în ordinea descrescătoare a puterilor; dacă un vector c, are n+1 componente,

polinomul pe care îl reprezintă este 11 ...+

+++ nn

ncscsc .

Matlab afişează polinoamele ca vectori rând, conţinând coeficienţii ordonaţi descrescător, în funcţie de puteri. Ecuaţia caracteristică a matricei:

A = [ 1 2 3 ; 4 5 6 ; 7 8 0 ], este restituită într-un vector rând de funcţia p = poly(A), rezultând,

p = [ 1 -6 -72 -27 ] Rădăcinile acestui polinom sunt restituite într-un vector coloană de funcţia

roots, r = roots(p),

rezultând r = [ 12.1229 ; -5.7345 ; -0.3884 ]. Funcţiile roots şi poly sunt funcţii reciproce, care realizează trecerea de la

coeficienţii polinomului, la rădăcini sau de la rădăcini la coeficienţii polinomului. Pentru ca cele două funcţii să fie reciproce, este necesar ca valoarea coeficientului celui mai mari puteri să fie 1.

Pentru a exemplifica aceasta se consideră polinomul,

5342)( 234+⋅+⋅−⋅+= xxxxxP .

Rădăcinile polinomului sunt aflate cu secvenţa de instrucţiuni, C = [ 1 2 -4 3 5]; r = roots(C),

rezultând r = [ -3.3345 ; 1.0410 + 0.9605i ; 1.0410 - 0.9605i ; -0.7474]. Revenirea la coeficienţii polinomului se face prin, C1=poly(r), obţinându-se: C1 = [1.0000 2.0000 -4.0000 3.0000 5.0000 ] identic cu C. Evaluând polinomul P(x), definit de vectorul C, al coeficienţilor, în punctele

definite de rădăcinile r, cu secvenţa V=polyval(C,r) se obţine V= [ 0 0 0 0 ], ceea ce confirmă faptul că r, sunt rădacinile polinomului.

11.5. Reziduuri

Dacă z=a este un pol sau un punct singular izolat al funcţiei f(z), într-o coroană circulară Raz <−<ε , cu 0>ε arbitrar de mic, funcţia f(z) este

olomorfă, cu atât mai mult dacă f(z) este de forma unui polinom. Fie Γ , un cerc cu centrul în a şi de rază ρ , conţinut în această coroană circulară, R<< ρε .

Prin definiţie, valoarea integralei ( )∫Γ zzf d înmulţită cu i⋅π2

1 se numeşte

reziduul funcţiei f(z), relativ la polul sau punctul singular esenţial izolat z=a, şi se

notează )( rez af , adică ( )∫Γ⋅

= zzfi

af d 2

1)( rez

π

. În loc de reziduul relativ la

Calcule numerice cu polinoame 249

punctul a, se mai spune uneori reziduul în punctul a. Reziduul unei funcţii f(z), relativ la punctul a, se poate obţine întotdeauna din

dezvoltarea în serie Laurent în jurul punctului a, fie că acesta este un pol al funcţiei, fie că este un punct singular esenţial izolat. Seria Laurent a funcţiei f(z) este,

( )( )

( )∫∑Γ +

+∞

−∞=

±±=

−⋅

=−⋅= L,2,1,0 ,d 2

1cu ,)(

1k

a

f

icazczf

kkk

k

k ζ

ζ

ς

π

.

Dacă k=-1, rezultă 1)( rez−

= caf , unde c-1 este coeficientul lui az −

1 din

dezvoltarea în serie Laurent a funcţiei f(z) în jurul punctului a. Calculul reziduului relativ la un pol se poate face şi pe alte căi. Dacă a este un pol al funcţiei f(z) şi p este ordinul său de multiciplitate,

conform definiţiei polului, funcţia ( ) ( ) ( )zfazzp

⋅−=ϕ are în z=a un punct ordinar

şi ( ) 0≠zϕ , iar reziduul devine:

( )

( ) ( )( )

( )( ) ( )[ ]

( )

( )( ) ( ) ( )[ ]

===

−⋅

>

=

=

−⋅=

Γ =

Γ =

1 ,a-z d 2

1

1 ,a-z!1

1

!1

1d

2

1

)( rez

az

1-p

az1

pzfazaz

z

i

pzfp

ap

zaz

z

iaf

p

pp

p

ϕϕ

π

ϕϕ

π.

După cum rezultă din relaţia de mai sus, pentru calculul reziduului este necesară simplificarea cu z-a, care uneori poate fi dificilă.

De aceea, se preferă ca f(z) să se scrie ca un cât de două funcţii, g(z) şi h(z),

olomorfe într-o vecinatate a punctului a, respectiv )(

)()(

zh

zgzf = .

Funcţia Matlab, residue, transformă câtul polinoamelor într-o reprezentare a reziduurilor polilor şi înapoi. Aceasta se poate apela cu una dintre sintaxele:

• [r,p,k] = residue(b,a) găseşte reziduurile, polii şi termenii direcţi ai unei dezvoltări parţiale, a unei fracţii, a unui raport între cele 2 polinoame, b(z)

şi a(z), de forma ( )

( ) 12

31

21

12

31

21

+

−−

+

−−

++++

++++

=

nnnn

m

mmm

azazaza

bzbzbzb

za

zb

L

L, unde bj şi aj

sunt elementele de ordinul j ale vectorilor de intrare b şi a, iar r este vectorul coloană al reziduurilor, p este vectorul coloană al polilor şi k este vectorul linie al termenilor liberi;

• [b,a] = residue(r,p,k) returnează coeficienţii polinoamelor b şi a, numărător şi numitor, al căror raport are rezidurile r, polii p, şi termenii liberi k.

Dacă nu există poli multipli, atunci:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 250

( )

( )( )zk

pz

r

pz

r

pz

r

za

zb

n

n+

++

+

= ...2

2

1

1 ,

şi numărul de poli n este n = length(a)-1 = length(r) = length(p). Coeficientul termenului liber este nul dacă length(b) < length(a), iar în caz

contrar, acesta are dimensiunea: length(k) = length(b)-length(a)+1. Dacă p(j) = …= p (j+m-1) este un pol cu gradul de multiplicitate m, atunci

dezvoltarea va include şi termenii de forma ( ) ( )

m

j

mj

j

j

j

j

pz

r

pz

r

pz

r

++

+

−++ 1

2

1 ... .

Pentru calculul efectiv, se obţin mai întâi polii cu ajutorul funcţiei roots. Apoi, dacă fracţia nu este corespunzătoare, este găsit termenul direct k, folosind funcţia deconv, care realizează o divizare polinomială. În cele din urmă, reziduurile sunt determinate calculând polinomul cu rădăcinile individuale găsite. Pentru rădăcini care se repetă, funcţia residue apelează funcţia internă resi2, care calculează reziduurile în locurile în care acestea se găsesc.

Din punctul de vedere al calculului numeric, dezvoltarea parţială a unei fracţii a unui polinom reprezintă o problemă pusă greşit. Dacă polinomul de la numitor a(z), este în apropiere de un polinom cu mai multe rădăcini, atunci schimbări minore, inclusiv erori întâmplătoare, pot să provoace schimbări majore în polii şi reziduurile calculate.

Pentru exemplificarea modului de lucru a funcţiei residue, se consideră fracţia a două polinoame, exprimată astfel:

( )

( ) 384

72353

23

++−

+−+=

zz

zzz

za

zb.

Prin urmare, b=[ 5 3 -2 7], a=[-4 0 8 3] şi atunci [r,p,k]=residue(b,a), conduce la: r = [ -1.4167 ; -0.6653 ; 1.3320], p = [ 1.5737; -1.1644; -0.4093], k = -1.25.

Aplicând transformarea inversă, [b,a] = residue(r,p,k), se obţine, b = [ -1.25 -0.75 0.50 -1.75], a = [ 1.00 -0.00 -2.00 -0.75 ],

iar rezultatul poate fi exprimat ca: 75.000.2

75.150.075.025.1

)(

)(3

23

−⋅−

−⋅+⋅−⋅−=

zz

zzz

za

zb.

11.5.1. Utilitare pentru funcţii de transfer

Modelul de stare liniar, sub formă vectorială, a unui sistem dinamic este:

⋅+⋅=

⋅+⋅=

)()(

)()(

tuDxCty

tuBxAtx&

unde: A – matricea de stare; B – matricea stare intrare; C – matricea stare ieşire; u – perturbaţia; t – timpul.

Transformarea parametrilor unui sistem dinamic în funcţie de transfer se realizează cu ss2tf, care se apelează cu sintaxa:

Calcule numerice cu polinoame 251

[N,D] = ss2tf(A,B,C,D,iu), unde vectorul N, conţine coeficienţii numărătorului, iar vectorul D, coeficienţii numitorului, în ordinea descrescătoare a puterilor.

Funcţia ss2tf transformă sistemul dinamic,

⋅+⋅=

⋅+⋅=

uDxCy

uBxAx&

în funcţia de transfer H, ( ) ( )

( )AIs

AIsCBAIsDBAIsC

sD

sNsH

−⋅

−⋅−⋅+−⋅=+⋅−⋅==

det

detdet)(

)(

)()( 1 .

Funţia tf2ss realizează transformarea inversă şi se apelează cu sintaxa: [A,B,C,D] = tf2ss(N,D).

Transformarea unui sistem într-o funcţie de transfer de tip „z”, zero-poli,

( )( ) ( )

( )( ) ( )n

n

pspsps

zszszsk

sp

szsH

−−−

−−−==

L

L

21

21

)(

)()(

se face cu funcţia ss2zp, care se apelează, [z,p,k] = ss2zp(A,B,C,D,u).

Funţia zp2ss realizează transformarea inversă şi se apelează cu sintaxa: [A,B,C,D] = zp2ss(z,p,k)

Transformarea funcţiei parametrilor în poli-zerouri, respectiv din forma,

mmm

nnn

asasa

bsbsb

sa

sbsH

+⋅++⋅

+⋅++⋅==

−−

−−

11

1

11

1

)(

)()(

L

L

în forma, ( )( ) ( )

( )( ) ( )n

n

pspsps

zszszsk

sp

szsH

−−−

−−−==

L

L

21

21

)(

)()(

se realizează cu funcţia tf2zp, care se apelează cu sintaxa: [z,p,k] = tf2zp(b,a)

Transformarea inversă este realizată de funcţia zp2tf, care se apelează cu sintaxa:

[b,a] = zp2tf(z,p,k).

11.6. Derivata unui polinom

Polinomul, fiind cea mai comună funcţie, este derivabil într-un punct x0, dacă limita,

( )( )xf

xx

xfxf

xx

'

0

0 )(lim

0

=

,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 252

există în R şi este finită. Funcţia Matlab, polyder, returnează derivatele unui polinom şi se poate

apela cu una dintre sintaxe: • D = polyder (C), unde C este vectorul linie al coeficienţilor polinomului,

în ordinea descrescătoare a puterilor variabilei, iar D este vectorul linie al coeficienţilor polinomului derivat;

• D = polyder (A, B), returnează în vectorul D(x), derivatele produsului

)()( xBxA ⋅ , astfel ca ( ) )()()()()()()( 'xBxAxBxAxBxAxD ′⋅+⋅′=⋅= ;

• [M, N] = polyder (A, B), returnează în vectorii M şi N, coeficienţii

numărătorului şi numitorului derivatei raportului polinoamelor )(

)(

xB

xA,

respectiv, 2

''

))((

)()()()(

)(

)(

)(

)(

xB

xBxAxBxA

xB

xA

xN

xM ⋅−⋅=

= .

Pentru calculul derivatei polinomului P(x)=x3+2x

2+3x+4, secvenţa Matlab

este: P=[1 2 3 4] ; D=polyder(P),

obţinându-se D=[3 4 3], respectiv polinomul P’(x)=3x

2+4x+3.

Derivata produsului ( ) ( )xxxx ⋅+⋅+⋅+⋅ 2963 22 este obţinută cu secvenţa: a = [3 6 9]; b = [1 2 0]; k = polyder(a,b),

rezultând k = [ 12 36 42 18 ], care reprezintă polinomul 18423612 23+++ xxx .

Integrarea polinomului din punct de vedere analitic se face cu funcţia polyint, care se poate apela:.

• polyint(p,k) restituie un polinom reprezentând integrala polinomului p, folosind o constantă scalară de integrare, k;

• polyint (p), presupune constanta de integrare k = 0.

12. INTERPOLAREA ŞI APROXIMAREA

DATELOR

12.1. Căutarea în tabele

La ora actuală, din ce în ce mai mulţi parametri ai unor echipamente şi dispozitive sunt normalizaţi şi prezentaţi tabelar, astfel încât, de multe ori, este necesară căutarea valorilor în tabele de date. Cu atât mai mult, tabelele sunt utilizate în calcule economice.

Operaţia prin care, o anumită valoare este citită dintr-un tabel existent, este cunoscută sub denumirea de căutarea în tabele.

Pentru calculele termodinamice se utilizează frecvent tabelele termodinamice de proprietăţi. În aceste tabele, parametrii termodinamici pot fi exprimaţi în funcţie de o singură mărime (de regulă presiune sau temperatură) – domeniul saturat, sau funcţie de doi parametri (de obicei presiunea şi temperatura) – domeniul apei sau al aburului.

Căutarea datelor în aceste tabele unidimensionale se realizează cu funcţia table1, care se apelează cu sintaxa:

Z = table1 (tab, x), unde x este valoarea pentru care se citesc datele din tabelul tab.

Tabelul tab trebuie să fie organizat ca o matrice, care are în prima coloană valorile lui x (abcisa ordonată crescător), iar cele n variabile oarecare sunt în coloanele de la 2 la n + 1. Dacă valoarea x se găseşte între două valori din prima coloană a tabelului tab, funcţia returnează o valoare interpolată liniar.

Pentru a utiliza funcţia table1, prima coloană a tabelului unidimensional din care se citesc datele trebuie să fie monotonă, iar valoarea lui x trebuie să se afle între prima şi ultima valoare din prima coloană a acestuia, adică între xmin şi xmax.

Fiind dat tabelul,

x -5 -3 -1 0 2 5 7 10 15 y 14 12 9 7 4 8 10 15 20

Pentru a citi valorile y, care corespund lui x1 = -3 şi x2 = 6, din tabelul unidimensional de mai sus, se creează matricea coloană M, care are ca primă coloană elementele lui x, ordonate crescător, iar a doua coloană elementele lui y, în ordinea de asociere cu x. Citirea din acest tabel al valorilor y1 şi y2, ce corespund lui x1 şi x2, se face cu instrucţiunile:

M = [-5 -3 -1 0 2 5 7 10 15 ; 14 12 9 7 4 8 10 15 20]; y1=table1(M',-3); y1=table1(M',6),

obţinându-se: y1 = 12, y2 = 9, din care se observă că pentru valorile ce nu se regăsesc

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 254

în tabel, se utilizează o interpolare liniară. De menţionat că în ultimele variante de Matlab s-a renunţat la această

funcţie, fiind înlocuită cu interp1 sau interp1q.

Căutarea datelor în tabele bidimensionale se face cu funcţia table2 care se apelează cu sintaxa:

Z = table2 (tab, x, y), în care tab este tabelul bidimensional ,din care se citesc datele corespunzătoare perechii x şi y.

Tabelul bidimensional tab, din care se citesc datele, trebuie să fie organizat ca o matrice, care are în prima coloană valorile x (ordonate crescător), iar în prima linie valorile y (ordonate crescător). Celelalte elemente din tabel sunt valorile Z, asociate perechilor (x, y), iar elementul Z(1, 1) = 0.

Dacă valoarea x sau y se găseşte între două valori din prima coloană sau linie a tabelului tab, funcţia table2 returnează o valoare interpolată liniar.

Fie tabelul bidimensional,

y x

1 2 3 4 5

1 7 9 11 13 15 2 8 10 14 15 17 3 4 5 8 4 6 4 1 5 7 9 11

Formarea acestui tabel se poate face cu M=[0 1 2 3 4 5; 1 7 9 11 13 15; 2 8 10 14 15 17; 3 4 5 8 4 6; 4 1 5 7 9 11],

iar căutarea valorilor ce corespund perechilor x=2, y=3 şi x=3.5, y=2.5, se face cu table2(M,2,3); table2(M,3.5,2.5),

rezultând valoarea 14 şi respectiv 6.25, de unde se verifică faptul că, pentru valori intermediare se procedează la o interpolare liniară.

Pentru a utiliza funcţia table2, prima linie şi prima coloană a tabelului bidimensional M, din care se citesc datele, trebuie să fie monotone. Valorile utilizate pentru x trebuie să se afle între prima şi ultima valoare din prima coloană (între xmin şi xmax), iar cele pentru y trebuie să se afle între prima şi ultima valoare din prima linie (între ymin şi ymax).

De menţionat că în ultimele variante de Matlab s-a renunţat la această funcţie, fiind înlocuită cu interp2, care este o funcţie de interpolare bidimensională.

Interpolarea datelor este similară căutării în tabele, cu deosebirea că, pentru valori intermediare se folosesc alte metode de estimare, altele decât cea liniară utilizată în cadrul căutării în tabele.

Interpolarea şi aproximarea datelor 255

12.2. Interpolarea datelor

Multe metode numerice se referă la calculul unor funcţii prin elaborări de tabele de valori discrete sau prin rezolvări aproximative ale unor ecuaţii funcţionale, prin algoritmi adaptaţi convenabil, în care un rol deosebit îl au controlul propagării erorilor, viteza de convergenţă, ca şi stabilitatea algoritmilor respectivi. În plus, pentru calculele dinamice şi de conducere în timp real a proceselor energetice, timpul de calcul este foarte important.

În multe astfel de probleme se folosesc instrumente matematice profunde, chiar dacă acestea se traduc în ultimă instanţă în programe de efectuare succesivă a câtorva operaţii fundamentale aritmetice sau logice. Un loc aparte, în cadrul metodelor numerice, îl au interpolările de funcţii, utilizate curent în diverse tipuri de măsurători şi prelucrări de date.

Pentru un interval fixat, RI ∈ şi pxxxx <<<< L210 puncte aparţinând lui

I, se poate defini o funcţie teoretică RIf →: , ale cărei valori iy , sunt cunoscute

numai în nodurile ix , pixfy ii ≤≤= 0 ),( .

Orice funcţie RIF →: astfel încât, ( ) piyxF ii ≤≤= 0 , , se numeşte

funcţie de interpolare a lui f, sau echivalent, funcţie de interpolare asociată tabelei

de p+1 valori,

0x 1x 2x ... px

0y 1y 2y ... py

Evident că o astfel de funcţie nu este unică, iar graficul ei trece prin punctele ( ) piyx ii ≤≤0 ,, . De exemplu, în cazul interpolării liniare, graficul lui F este linia

poligonală cu vârfurile ( ) piyx ii ≤≤0 ,, . O altă funcţie de interpolare asociată tabelei anterioare este polinomul lui

Lagrange de interpolare, care este un polinom P, de pP ≤ grad , cu coeficienţi

reali, astfel încât ( ) piyxP ii ≤≤= 0 , şi ( ) )(xPxf ≅ pentru orice Ix ∈ . Se demonstrează uşor că polinomul Lagrange de interpolare, asociat unei

tabele de valori, există şi este unic. Pentru orice j, pj ≤≤0 , notând

cu jL polinomul

( )( ) ( )( ) ( )

( ) ( )( ) ( )njjjjjj

njj

jxxxxxxxx

xxxxxxxxxL

−−−−

−−−−

=

+−

+−

LL

LL

110

110 ,

atunci polinomul Lagrange ( )xP , asociat tabelei de interpolare este

( ) ( )∑=

⋅=

p

j

jj xLyxP0

.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 256

Un avantaj al reprezentării prin polinoamele Lagrange o constituie faptul că polinoamele jL depind numai de alegerea nodurilor de interpolare, dar la adăugarea

unor noi noduri, calculul lui jL trebuie refăcut, ceea ce este un defect.

Polinomul jL depinde de x, ca şi polinomul ( )xP , şi, prin urmare, funcţia de

aproximare este un polinom de x, pentru care se pot apoi calcula valorile în orice punct x, nu numai în noduri, ci şi „între noduri”, justificând astfel termenul de „interpolare”.

Pentru tabela, 0 1 2 4 1 0 0 -3

avem 3,0,0,1,3 3210 −===== yyyyp şi

( )( )( )( )

( )( )( )

( )( )( )

( )( )( ) 8

8147

421

421 23

302010

3210

−⋅+⋅−−=

−−−

−−−=

−−−

−−−=

xxxxxx

xxxxxx

xxxxxxxL ,

( )( )( )( )

( )( )( )

( )( )

3

42

312101

3201

−−=

−−−

−−−=

xxx

xxxxxx

xxxxxxxL ,

( )( )( )

4

412

−−−=

xxxxL , ( )

( )( )

24

213

−−=

xxxxL .

Cu acestea, polinomul de interpolare este

( ) ( ) ( )4854

1)(3)( 23

300

−+−=−=⋅=∑=

xxXxLxLxLyxP

p

j

jj .

Pe baza algoritmului de mai sus, se poate scrie relativ uşor o funcţie care să interpoleze prin metoda polinoamelor lui Lagrange.

În ultimii ani a apărut o noţiune nouă, strâns legată de interpolarea polinomială, anume cea de funcţie spline, polinomială pe porţiuni şi suficient de netedă. Mai precis, dacă [ ]baI ,= este un interval şi bxxxa n =<<<=∆

+110: L

este o diviziune cu n noduri interioare, o funcţie RIs →: se numeşte „spline” de

ordinul k ( 1≥k ), relativ la ∆ , dacă funcţia s este de clasă )(1IC

k − şi în orice

interval [ ]1,+ii xx , cu ni ≤≤0 , s coincide cu un polinom (funcţie polinomială) cu

coeficienţi reali de grad k. Ca urmare, orice polinom este funcţie spline, nu şi reciproc. De exemplu,

pentru R∈α fixat, funcţia

( )

pentru 0,

pentru ,

>−=

α

αα

x

xxf

k

este spline de ordinul k şi nu este polinom, deoarece are o infinitate de zerouri, fără a fi funcţie nulă.

Deoarece mulţimea funcţiilor spline, de ordinul k, relativ la o diviziune

Interpolarea şi aproximarea datelor 257

bxxxa n =<<<=+110 L , este un spaţiu vectorial real de dimensiune 1++ kn ,

pentru determinarea unei funcţii spline se impun 1++ kn condiţii. Aplicând acest fapt, rezultă că, dacă RIf →: este o funcţie de clasă

)(1IC

k − , atunci există o funcţie spline unică s, de ordin 2k-1, astfel încât să fie verificate următoarele n+2k condiţii:

( ) ( ) ( ) ( )

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

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

=′=′=

=′=′=

==

−−

−−

bfbsbfbsbfbs

afasafasafas

xfxsxfxs

kk

kk

nn

)1()1(

)1()1(11

,,,

,,,

,,

L

L

L

.

Aproximarea ( ) ( )xsxf ≅ pentru orice Ix ∈ este mult mai precisă decât cea cu polinoame Lagrange.

Funcţia Matlab spline realizează interpolarea cubică spline şi se apelează cu sintaxa:

yy = spline(x,y,xx), în care x sunt valorile în care este dată funcţia, un interval [a, b] mai rar, y valorile funcţiei sau însăşi funcţia, xx este o diviziune interioară bxxxa n =<<<=∆

+110: L cu n noduri, iar yy sunt valorile funcţiei spline calculate în punctele xx, interioare intervalului [a, b]. Vectorul x specifică punctele în care este dată valoarea lui y şi trebuie să fie ordonate crescător. Dacă y este o matrice, atunci interpolarea este realizată pentru fiecare linie a lui y şi, în acest caz, length(x) trebuie să fie egal cu size(y, 2) , iar yy este size(y, 1) cu length(xx ).

Această funcţie este opusul funcţiei interp(x, y, xx, 'spline’ ), care realizează interpolarea pentru fiecare coloană a matriciei y şi la care, length(x) trebuie să fie egal cu size(y,1), iar yy-ul, care rezultă, are length (xx) cu size(y,2).

Dacă y conţine două valori în plus decât numărul de intrări ale lui x, atunci prima şi ultima valoare ale lui y sunt folosite ca pantă pentru funcţia 'spline' cubică. Cu alte cuvinte:

f(x) = y(:,2:end-1), df(min(x)) = y(:,1), df(max(x)) = y(:,end)

Pentru exemplificare, se generează o curbă sinus, apoi se realizează o curbă spline pe o reţea mai fină de 4 ori şi se trasează graficul din figura 12.1. Secvenţa Matlab este:

x = 0:10; y = sin(x); xx = 0:.25:10; yy = spline(x,y,xx); plot(x,y,'o',xx,yy); xlabel('x') ; ylabel('y').

Următorul exemplu ilustrează folosirea canelurilor complete, acolo unde sunt recomandate pantele finale. Sunt impuse pante egale cu zero la capatele interpolantului, la valori ale unei anumite distribuţii,

x = -4:4; y = [0 .15 1.12 2.36 2.36 1.46 .49 .06 0]; cs = spline(x,[0 y 0]); xx = linspace(-4,4,101); plot(x,y,'o',xx,ppval(cs,xx),'-') ; xlabel('x') ; ylabel('y'),

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 258

având graficul redat în figura 12.2.

Fig. 12.1. Interpolarea spline a funcţiei sin

Fig. 12.2. Interpolarea spline cu pante finale

Extrapolarea populaţiei SUA, la nivelul anului 2000, pe baza datelor de recensământ, din perioada 1900÷1990 ,se face cu secvenţa:

t = 1900:10:1990; p = [ 75.995 91.972 105.711 123.203 131.669 ... 150.697 179.323 203.212 226.505 249.633 ]; spline(t,p,2000),

rezultând 270.606 persoane. După cum se observă din acest exemplu, xx pot fi şi punctele în care se calculează funcţia spline.

Interpolarea şi aproximarea datelor 259

Secvenţa Matlab, x = pi*[0:.5:2]; y = [0 1 0 -1 0 1 0; 1 0 1 0 -1 0 1]; pp = spline(x,y); yy = ppval(pp, linspace(0,2*pi,101)); plot(yy(1,:),yy(2,:),'-b',y(1,2:5),y(2,2:5),'or'), axis equal

generează graficul din figura 12.3 sub forma unui cerc, cu 5 puncte: y(:,2),...,y(:,6) notate cu o- uri. Se observă că y-ul conţine cu două valori mai multe decât x, iar acestea, y(: , 1) şi y ( : , end) sunt folosite ca pante finale.

Fig. 12.3. Interpolarea spline a unui cerc prin 5 puncte

Evaluarea polinomului de interpolare spline, în nodurile reţelei, se face cu funcţia ppval, apelată cu,

v = ppval (pp, xx) care restituie valoarea în punctele xx ale polinomului conţinut de pp, aşa cum este construit de funcţia spline.

Apelat sub forma, v = ppval (xx, pp)

restituie acelaşi rezultat, dar poate fi folosit şi pentru a fi chemat ca funcţie argument de către alte funcţii, ca de exemplu fminbnd, fzero şi quand.

Pentru exemplificare, comparăm rezultatele integrării funcţiei cos, a = 0; b = 10; int1 = quad(@cos,a,b,[],[]),

care are ca rezultat, int1 = -0.5440, cu rezultatul integrarii polinomului pp, ce aproximează funcţia cos prin interpolarea spline a valorilor x şi y,

x = a:b; y = cos(x); pp = spline(x,y); int2 = quad(@ppval,a,b,[],[],pp), având ca rezultat,

int2 = -0.5485,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 260

cu observaţia că int1 calculează integrala funcţiei cosinus pe intervalul [a, b], în timp ce int2 furnizează integrala pe acelaşi interval, dar a polinomului pp.

Interpolarea periodică utilizează polinoame Hermite de interpolare şi se realizează cu funcţia pchip, care se apelează cu una dintre sintaxele:

• yi=pchip(x,y,x) restituie vectorul yi, ce conţine elemente ce corespund elementelor lui xi, determinate prin metoda interpolării spline cubice dintre vectorul x, vectorul punctelor de calcul, şi vectorul y, vectorul datelor y cunoscute, iar dacă y este o matrice, atunci interpolarea este efectuată pentru fiecare coloană a lui y şi yi, length(xi)-x-size(y,2);

• pp=pchip(x,y) returnează o structură polinomială, care este folosită de funcţia ppva1, unde x poate fi un vector linie sau coloană, y este un vector linie sau coloană cu aceeaşi lungime ca şi x, sau o matrice cu coloane length(x).

Funcţia pchip găseşte valori ale funcţiei interpolate, de la baza P(x) la punctele intermediare, ca de exemplu:

• pe fiecare subinterval xk ≤ x ≤ xk+1, P(x) este o interpolare cu polinoame Hermite cubice, care dau valori şi pante precise pentru cele două puncte mărginaşe;

• P(x) interpolează y, de exemplu P(xj)=yj, şi prima derivată P’(x) este continuă, derivata a doua P”(x) este probabil necontinuă, putând sări la xj;

• pantele pentru xj sunt alese astfel încât, P(x) conservă forma şi ţine cont de monotonicitate, ceea ce înseamnă că, pe intervalele în care datele sunt monotone, există P(x), iar în punctele în care variabila are punct de extrem local, P(x) nu există.

De menţionat că, dacă y este o matrice, P(x) se aplică pentru fiecare coloană a lui y.

Comparând funcţia spline cu funcţia pchip se desprind următoarele: • polinoamele spline S(x,) sunt construite în acelaşi mod ca şi P(x); • spline alege pantele xj diferite, cu alte cuvinte făcând ca S”(x) continuă,

dar determină un rezultat incert, pentru S”(x) continuă; • spline determină multe rezultate corecte, dacă datele conţin o funcţie

incertă; • pchip nu depăşeşte cea mai mică oscilaţie, dacă data este incertă; • pchip este mai puţin costisitoare, ca timp de calcul, de reglat; • cele două funcţii sunt la fel de costisitoare de evaluat.

Pentru compararea funcţiei spline cu pchip, respectiv a interpolării spline cubică cu cea cu polinoamele lui Hermite, se prezintă grafic în figura 12.4, atât valorile iniţiale, cât şi funcţiile spline s şi pchip p, realizate cu secvenţa Matlab:

Interpolarea şi aproximarea datelor 261

x = -3:3; y = [-1 -1 -1 0 1 1 1]; t = -3:.01:3; p = pchip(x,y,t); s = spline(x,y,t); plot(x,y,'o',t,p,'-',t,s,'-.') ; legend('date','p - pchip','s - spline',4); xlabel('x'); ylabel('y').

Fig. 12.4. Comparea interpolării cu funcţiile spline şi pchip

Realizarea unei interpolări de tip unidimensional sau pe baza unui tabel, se face cu funcţia interp1, care poate fi apelată cu una dintre secvenţe:

• yi = interp1(x,y,xi) restituie vectorul yi, ce conţine elementele corespunzătoare lui x,i determinate prin metoda interpolării cubice dintre vectorul x, care specifică abscisa şi y, care specifică ordonata, iar dacă y este o matrice, atunci interpolarea este executată pentru fiecare coloană a lui y, rezultând un yi cu length(xi)-x-size(y,2);

• yi = interp1(y,xi) presupune că x=1:N, unde N este lungimea vectorului y sau size(y,i), pentru cazul când y este matrice;

• yi = interp1(x,y,xi, 'method') interpolează folosind următoarele metode, o 'nearest' - interpolarea vecinilor cei mai apropiaţi; o 'linear' - interpolare lineară, care este metoda implicită, când nu se

specifică; o 'spline' - interpolare spline cubică; o 'pchip' - interpolarea cubică cu polinoamele lui Hermite; o 'cubic' – asemenea cu 'pchip'; o 'v5cubic' – interpolare cubică utilizată în versiunea Matlab 5;

• metodele 'nearest', 'linear' şi 'v5cubic' returnează NaN pentru fiecare element a lui xi, care este în afara intervalului lui x, dar toate celelalte metode extrapolează şi în afara intervalului de valori;

• yi = interp1(x,y,xi,method,'extrap') foloseşte metode speciale pentru

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 262

interpolarea în afara intervalului; • yi = interp1(x,y,xi,method,extrapval) determină o valoare scalară în

afara intervalului de valori, NaN şi 0 sunt adesea folosite pentru extrapval.

Funcţia interp1 este o comandă de interpolare între puncte. Ea găseşte valori pentru punctele intermediare, pentru o dimensiune a funcţiei f(x). Funcţia f(x) este redată în figura 12.5, prezentând şi relaţia dintre vectorii x, y, xi şi yi.

Fig. 12.5. Compararea interpolării cu funcţiile spline şi pchip

Interpolarea este acelaşi lucru cu căutarea în tabele. În acest sens, tabelul este [x, y] şi căutarea în elementele lui xi şi x este realizată de interp1, care este ajutată de locaţia lor şi returnează valori yi, ce sunt interpolate în elementele lui y.

Funcţia yi = interp1(x,y,xi)

lucrează asemănător cu interp1, dar este mai rapidă decât aceasta, pe spaţii neuniforme, deoarece nu verifică intrările. Pentru folosirea interp1q, x trebuie să fie vector coloană descrescător monoton şi y trebuie să fie un vector coloană sau matrice ,având lungimea liniei length(x).

Pentru exemplificare, se generează un traseu sinusoidal prin 11 puncte şi apoi se interpolează, pentru o abscisă mai fină, cu 41 puncte, cu secvenţa

x = 0:10; y = sin(x); xi = 0:.25:10; yi = interp1(x,y,xi); plot(x,y,'o',xi,yi) ; gtext('linear'); hold on; yi = interp1(x,y,xi,'spline'); plot(x,y,xi,yi) ; xlabel('x') ; ylabel('y') ; gtext('spline');

rezultând curba din figura 12.6. Pentru doi vectori, reprezentând recensământul din anii 1900 pâna în 1990 ai

populaţiei SUA, în milioane de oameni, t = 1900:10:1990; p = [ 75.995 91.972 105.711 123.203 131.669... 150.697 179.323 203.212 226.505 249.633];

Interpolarea şi aproximarea datelor 263

expresia p75=interp1(t,p,1975) interpolează între datele din recensământ, pentru a afla populatia din 1975, obţinând p75= 214.8585.

Fig.12.6. Comparaţia între metoda 'linear' şi 'spline'

Uneori este mai convenabil să gândim interpolarea ca un tabel, unde datele sunt stocate într-un singur tabel. Dacă proporţiile recensământului sunt stocate într-un tabel simplu, de 5 pe 2,

tab = [ 1950 150.697 1960 179.323 1970 203.212 1980 226.505 1990 249.633 ]

atunci populatia din 1975, obţinută din tabel, din matricea tab, este: p = interp1(tab(:,1),tab(:,2),1975) p = 214.8585.

Interpolarea unidimensională, folosind metoda transformatei Fourier (FFT - Fast Fourier Transform) se realizează cu funcţia interpft, apelată cu una dintre sintaxele:

• y=interpft(x,n) calculează un vector y, ce conţine valorile periodice ale funcţiei x, alcătuită din n egalităţi;

• y=interpft(x,n,dim) calculează doar pentru dimensiunile specificate. Dacă length(x)=m şi x este în intervalul dx, atunci noua selecţie pentru y este

dy=dx*m/n. De reţinut este faptul că n nu poate fi mai mic decât m. Dacă x este o matrice, interpft calculează pe coloana lui x, returnând

matricea y cu acelaşi număr de coloane ca şi x, dar cu n linii. Funcţia interpft foloseşte metoda FFT. Vectorul originar x este transformat

într-un domeniu Fourier, folosind fft şi apoi se transformă înapoi, în mai multe puncte.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 264

Pentru exemplificare, se consideră datele obţinute cu funcţia cosinus pentru

10 paşi pe perioadă,

⋅⋅=

10

2cos

ky

π şi se interpolează pentru un k dublu,

verificând apoi valorile obţinute. Aceasta se realizează cu secvenţa, k= 0 : 9; x = cos (2*pi*k/10); y1 = interpft (x, 20); k1 = 0 : 19; y2 = cos (2*pi*k1/20); d = max (y1 - y2) ;

şi se obţine rezultatul: d = 3.3307e-016. Diferenţa maximă între valorile interpolate şi cele reale este egală cu ordinul

de mărime al celui mai mic număr reprezentabil în calculator. Interpolarea datelor în două dimensiuni, se realizează cu funcţia interp2,

care se apelează cu una dintre sintaxe: • ZI=interp2(X,Y,Z,XI,YI) returnează matricea ZI, ce conţine elementele

corespunzătoare lui XI şi YI şi este determinată din interpolarea în două dimensiuni, a funcţiei specifice a matricei X, Y şi Z, cu observaţia că X şi Y trebuie să fie monotone şi regulate, ca şi cum ar fi produse de funcţia meshgrid, iar matricele X şi Y specifică punctele la care se cunoaşte data Z, iar în afara intervalului valorile returnate sunt NaN; Xi şi YI pot fi matrice, în cazul în care se returnează valorile lui Z, corespunzatoare punctelor (XI(i,j),YI(i,j));

• ZI=interp2(Z,XI,YI) presupune X=1:n şi Y=1:m, unde [m,n]=size(Z); • ZI=interp2(Z,ntimes) dezvoltă Z, prin interpolări dintre fiecare element,

funcţionând ca o iteraţie recursivă, ntimes; • ZI=interp2(Z) comanda este similară cu interp2(Z,1); • ZI=interp2(X,Y,Z,XI,YI,'method') interpolează folosind următoarele

metode, o 'nearest' - interpolarea vecinilor cei mai apropiaţi; o 'linear' - interpolare bilineară, care este metodă implicită, când nu

se specifică; o 'spline' - interpolare spline cubică; o 'cubic' - interpolare bicubică.

Funcţia interp2 realizează interpolarea dintre puncte. Dacă găseşte valori cu două dimensiuni a funcţiei f(x,y) calculează valoarea dintre puncte, după cum se prezintă în figura 12.7.

Fig.12.7. Interpolarea cu interp2

Interpolarea şi aproximarea datelor 265

Interpolarea face acelaşi lucru ca şi căutarea în tabel, dar în acest caz tabelul este tab=[NaN,Y:X,Z] şi interp2 foloseşte valorile XI în X, YI în Y, şi se obţine ZI, în Z.

Pentru exemplificare, se interpolează maximul unei funcţii, cu o reţea mai fină şi se prezintă în figura 12.8,

[X,Y] = meshgrid(-3:.25:3); Z = peaks(X,Y); [XI,YI] = meshgrid(-3:.125:3); ZI = interp2(X,Y,Z,XI,YI); mesh(X,Y,Z), hold, mesh(XI,YI,ZI+15); hold off axis([-3 3 -3 3 -5 20]).

Fig.12.8. Interpolarea maximului unei funcţii

În variantele anterioare de Matlab, mai existau funcţiile: interp4, care interpola după o lege biliniară, funcţia interp5, care interpola după o lege bicubică şi table2, care realiza căutarea în tabele bidimensionale. În versiunile mai noi, aceste funcţii au fost înlocuite de către interp2.

Interpolarea valorilor tridimensionale sau căutarea în tabele tridimensionale, se realizează cu funcţia interp3, care se apelează cu una dintre sintaxele:

• VI=interp3(X,Y,Z,V,XI,YI,ZI), unde X, Y, Z specifică punctele unde este dat V, interpolează pentru a găsi VI, valorile funcţiilor tridimensionale V, la punctele vectorilor XI, YI şi ZI, iar XI, YI, ZI trebuie să fie vectori de aceeaşi dimensiune; argumentele vectorilor care nu au aceeaşi mărime sau amândoi sunt vectori linie sau coloană, sunt trecuţi prin meshgrid, creat de vectorul Y1, Y2, Y3;

• VI=interp3(V,XI,YI,ZI) presupune X=1:N, Y=1:M, Z=1:P, unde [M,N,P]=size(V);

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 266

• VI=interp3(V,ntimes) dezvoltă V prin interpolări dintre fiecare element, funcţionând ca o iteraţie recursivă ntimes;

• VI=interp3(V), comanda este similară cu interp3(V,1); • ZI=interp3(X,Y,Z,XI,YI,'method') interpolează folosind următoarele

metode: o 'linear' - interpolare bilineară, care este metoda implicită, când nu

se specifică; o 'nearest' - interpolarea vecinilor cei mai apropiaţi; o 'cubic' - interpolarea cubică; o 'spline' - interpolare spline.

În afara domeniului specificat, funcţia interp3 returnează NaN. Pentru exemplificare, se generează cu funcţia Matlab flow, profilul unui jet

submersibil într-un rezervor infinit, se stabilesc punctele de calcul egal distanţate pe cele trei direcţii, cu meshgrid şi apoi se vizualizează fiecare volum (fagure), cu funcţia slice, fiind redat şi în figura 12.9,

[x,y,z,v] = flow(10); [xi,yi,zi] = meshgrid(.1:.25:10,-3:.25:3,-3:.25:3); vi = interp3(x,y,z,v,xi,yi,zi); % V is 31-by-41-by-27 slice(xi,yi,zi,vi,[6 9.5],2,[-2 .2]),shading flat;xlabel('x');ylabel('y'); zlabel('z');

Fig.12.9. Interpolarea cu interp3

Interpolarea în spaţii n-dimensionale sau căutarea în tabele n-dimensionale se realizează cu funcţia interpn, care se apelează cu una dintre sintaxele:

• VI=interpn(X1,X2,X3,...,V,Y1,Y2,Y3,...) interpolează, pentru a afla VI, valorile funcţiei multidimesionale V, la punctele Y1, Y2, Y3 etc. şi este chemată cu 2*N+1 argumente;

• VI=interpn(V,Y1,Y2,Y3,...) presupune X2=1:size(V,2), X3= 1:size(V,3),

Interpolarea şi aproximarea datelor 267

etc. • VI=interpn(V,ntimes) dezvoltă V, prin interpolări dintre fiecare element,

funcţionând ca o iteraţie recursivă ntimes, • VI=interpn(V), comanda este similară cu interpn(V,1); • ZI=interpn(X,Y,Z,XI,YI,'method') interpolează folosind următoarele

metode: o 'linear' - interpolare bilineară, care este metoda implicită, când nu

se specifică; o 'nearest' - interpolarea vecinilor cei mai apropiaţi; o 'cubic' - interpolarea cubică; o 'spline' - interpolare spline.

Vectorii X1, X2, X3 etc. specifică punctele la care este dat V. În afara intervalului, se returnează NaN. Vectorii Y1, Y2, Y3 etc. trebuie să aibă aceeaşi dimensiune. Dacă vectorii nu au aceeaşi mărime sau au orientare mixtă (de exemplu amândoi vectori linie sau vectori coloană), se apelează funcţia ngrid, pentru a crea Y1, Y2, Y3 etc.

Funcţia interpn lucrează bine pentru orice tablou n-dimensional, începând de la n ≥2.

Interpolarea prin metoda distanţei inverse a datelor, funcţie de două variabile, se realizează cu funcţia griddata, care se apelează:

• ZI=griddata(x,y,z,XI,YI) caută o suprafaţă de forma z=f(x,y,) a datei oarecare, specificate de spaţiul vectorilor (x,y,z) şi interpolează această suprafaţă la puncte specificate de (XI,YI), pentru a produce ZI;

• [XI,YI,ZI]=griddata(x,y,z,xi,yi) returnează interpolarea matricei ZI şi calculează matricele XI şi YI, formate din vectori linie xi şi vectori coloană, yi;

• […]=griddata(…, 'method') utilizează o metodă specificată de interpolare, unde 'method' poate fi: o 'linear' - metoda implicită, care utilizează interpolarea liniară,

bazată pe triunghiuralizarea Delaunay; o 'cubic' - interpolare cubică bazată pe triunghiuri Delaunay; o 'nearest' - interpolarea vecinilor celor mai apropiaţi cu triunghiuri

Delaunay; o 'v4' -interpolarea cu metoda reţelei.

Valorile matricei Zi, corespund elementelor matricelor Xi şi Yi. XI, poate fi un vector linie, iar, în cazul acesta, este specificată o matrice cu coloane constante. Similar, YI poate fi un vector coloană şi atunci, este specificată o matrice cu linii constante.

Xi şi YI pot fi matrice, şi, în acest caz, griddata returnează valorile corespunzătoare punctelor (XI(i,j),YI(i,j)).

Pentru exemplificare, se consideră 100 puncte aleatoare între -2.0 şi +2 şi se

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 268

afişează în figura 12.10 funcţia 22 yx

exz−−

⋅= , exprimată cu secvenţa, rand('seed',0); x = rand(100,1)*4-2; y = rand(100,1)*4-2; z = x.*exp(-x.^2-y.^2);

unde x, y şi z sunt acum vectori ce conţin date şi se defineşte o reţea de date, ti = -2:.25:2; [XI,YI] = meshgrid(ti,ti); ZI = griddata(x,y,z,XI,YI);

cu care se trasează graficul, mesh(XI,YI,ZI), hold; plot3(x,y,z,'o'), hold off; xlabel('x'); ylabel('y'); zlabel('z').

Fig.12.10. Interpolarea cu griddata

Interpolarea datelor 3-D sau hipersuprafeţe, se face cu funcţia griddata3, care se apelează similar ca şi griddata.

De exemplu, w = griddata3(x, y, z, v, xi, yi, zi)

construieşte o hipersuprafaţă w=f(x,y,z) de date, în spaţiul definit de vectorii (x, y, z, v) şi interpolează această hipersuprafaţă, în puncte specificate de (xi,yi,zi), pentru a produce w, care este de aceeaşi mărime ca xi, yi şi zi. Punctele (xi,yi,zi) sunt de obicei uniforme, fiind realizate cu meshgrid .

Interpolarea datelor n-D sau n-suprafeţe, se face cu funcţia griddatan, care se apelează similar ca şi griddata. Cu sintaxa,

yi = griddatan(X, y, xi) se determină o hipersuprafaţă y=f(X) de date în spaţiul vectorilor (X,y) şi interpolează această hipersuprafaţă, în punctele specificate de xi, pentru a determina yi. Punctele specificate xi, pot fi neuniforme.

X, este de dimensiunea m-n, reprezentând m puncte în spaţiul n-D. Vectorul y este de dimensiunea a m-a, reprezentând m valori ale hipersuprafeţei f(X).

Interpolarea şi aproximarea datelor 269

Vectorul xi este de mărimea p-n, reprezentând p puncte în spaţiul n-D. Vectorul yi, este de lungime p, ce aproximează valorile lui f(xi). Hipersuprafeţele trec întotdeauna prin punctele (X,y). De cele mai multe ori, xi este o reţea uniformă, realizată prin meshrid.

12.3. Aproximarea datelor prin regresie polinomială

Pentru ca o aproximare oarecare să fie considerată “cea mai bună”, suma pătratelor distanţelor de la fiecare punct, la curba aproximată, trebuie să fie minimă. Cu această condiţie, este posibil ca nici un punct al setului de date să nu se gasească pe curba aproximată, ceea ce separă net, aproximarea de interpolare, la care unele puncte sunt situate pe curbă.

La baza majorităţii metodelor de aproximare stă metoda celor mai mici pătrate, care consideră că cea mai bună aproximare este aceea pentru care suma pătratelor erorilor este minimă,

( ) ( )∑=

=−=

n

icidi xxx

1

2,, minϕ

unde dix , , sunt valorile date (cunoscute), iar cix , sunt valorile calculate.

Regresia polinomială este o aproximare a unui set de date printr-un polinom de forma:

∑=

−−

++++==

n

inn

nninaxaxaxaxaxp

01

110 ...,)(

Dacă setul de date are n elemente, toate datele se află pe curba de „aproximare”. Pentru un grad al polinomului mai mic decât numărul de date, aproximarea este cu atât mai bună, cu cât gradul polinomului este mai apropiat de numărul de date. Utilizarea unui polinom de aproximare, cu grad mai mare decât setul de date, poate conduce la erori de aproximare considerabile.

Determinarea celei mai bune aproximări a unui set de date (x, y), cu un polinom de ordin n, foloseşte funcţia polyfit şi se apelează cu una dintre sintaxele:

• p=polyfit(x,y,n) găseşte coeficienţii polinomului p(x), de grad n, care se potriveşte cu datele de intrare p(x(i)), în punctul y (i), iar rezultatul p, este un vector linie, de lungime n+1, conţinând coeficienţii polinomului în ordine descrescătoare a puterilor,

( ) 11

21 ...+

++++= nn

nnpxpxpxpxp

• [p,S]=polyfit(x,y,n) restituie coeficienţii p şi o structură S, pentru a se folosi cu funcţia polyval, în scopul obţinerii erorii estimate care, dacă erorile din datele de intrare y sunt independente de constanta variabilei, produce erori ce conţin cel puţin 50 % din cele prezise;

• [p,S,mu]=polyfit(x,y,n) găseşte ceoficienţii polinomului în 2

1ˆµ

µ−=

xx ,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 270

unde µ1= mean(x) şi µ2 = std (x), mu este un vector cu două elemente [µ1,µ2], iar aceste transformări de centrare şi gradare îmbunătăţesc proprietăţile numerice, atât ale polinomului, cât şi al algoritmului de ajustare.

Pentru exemplificare, se consideră ajustarea funcţiei de eroare, erf(x), printr-un polinom în x. Întâi, se produce un vector de x puncte, aflat în intervalul [0, 2.5], iar apoi se calculează funcţia erf (x) în aceste puncte,

x = (0: 0.1: 2.5)'; y = erf(x); Coeficienţii polinomului de gradul 6 sunt calculaţi cu p=polyfit(x,y,6),

rezultând p = [ 0.0084 -0.0983 0.4217 -0.7435 0.1471 1.1064 0.0004], care sunt 7 coeficienţi, iar cu aceştia polinomul este:

0004.01064.11471.07435.04217.00983.00084.0)( 23456+++−+−= xxxxxxxf

Pentru a se vedea cât de bine este ajustat, se calculează polinomul în punctele iniţiale, cu funcţia f = polyval(p,x), sau în Matlab:

f=p(1).*x.^6+p(2).*x.^5+p(3).*x.^4+p(4).*x.^3+p(5).*x.^2+p(6).*x+p(7). Se formează un tabel, care afişează datele ajustarea şi eroarea, cu

instrucţiunea, table=[x y f y-f],

rezultând : table = [ 0 0 0.0004 -0.0004

0.1000 0.1125 0.1119 0.0006 0.2000 0.2227 0.2223 0.0004 0.3000 0.3286 0.3287 -0.0001 0.4000 0.4284 0.4288 -0.0004 0.5000 0.5205 0.5209 -0.0004 0.6000 0.6039 0.6041 -0.0002 ... ... ... ... 1.9000 0.9928 0.9925 0.0003 2.0000 0.9953 0.9951 0.0002 2.1000 0.9970 0.9969 0.0001 2.2000 0.9981 0.9982 -0.0001 2.3000 0.9989 0.9991 -0.0003 2.4000 0.9993 0.9995 -0.0002 2.5000 0.9996 0.9994 0.0002]

Deci, în acest interval, ajustarea este bună între trei şi patru cifre. În afara acestui interval, graficul arată o deteriorare rapidă a comportării polinomului, după cum se observă din figura 12.11, realizată cu secvenţa Matlab: x=(0: 0.1: 5)'; y=erf(x); f=polyval(p,x); plot(x,y,'o',x,f,'-') ; axis([0 5 0 2]); xlabel('x'); ylabel('y'); gtext(y); gtext('y'); gtext('f').

Interpolarea şi aproximarea datelor 271

Fig.12.11. Interpolarea cu polyfit

Algoritmul de realizare a funcţiei polifyt formează matricea Vandermonde, ale cărei elemente sunt puteri ale lui x,

jn

iji xv−

=,

apoi foloseşte operatorul ‘ \ ‘ pentru a rezolva ecuaţia Vp ≅ y.

12.4. Analiză geometrică utilizată în interpolare

După cum am arătat anterior, o serie de funcţii de interpolare, de două sau mai multe dimensiuni, utilizează triunghiularizarea Delaunay.

Fiind dat un set de puncte, triunghiularizarea Delaunay este un set de linii, care conectează fiecare, punct cu punctul său vecin, fiind legată de diagrama Voronoi, în sensul că cercul care delimitează triunghiul Delaunay are centrul în vârful poligonului Voronoi, după cum se observă din figura 12.12.

Fig.12.12. Triunghiul lui Delaunay şi poligonul Voronoi

Funcţia delaunay se apelează cu TRI = delaunay (x, y)

Şi, pentru punctele date, definite de vectorii x şi y, restituie un set de triunghiuri astfel

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 272

încât, nici un punct să nu fie conţinut în oricare dintre triunghiurile care este delimitat de cerc. Pentru fiecare linie a matriciei m x 3, TRI defineşte un astfel de triunghi şi conţine indicii, în x şi în y. Dacă punctele sunt coliniare sau x este zero, triunghiurile nu pot fi calculate, iar delaunay restituie o matrice goală.

Pentru vizualizarea triunghiurilor Delaunay se foloseşte una dintre funcţiile, • triplot - afişează triunghiurile definite de matricea TRI de m x 3; • trisurf - afişează fiecare triunghi definit de matricea TRI, m x 3, ca o

suprafaţă în spaţiul 3-D, iar pentru a vedea un spaţiu 2-D, se pot da valori constante pentru dimensiunea a 3-a unui vector, ca de exemplu,

trisurf(TRI,x,y,zeros(size(x))); • trimesh - afişează fiecare triunghi definit de matricea TRI de m x 3, ca o

reţea în spatiul 3- D, iar pentru a vizualiza o suprafaţă în spatiul 2-D, se poate introduce un vector, cu unele valori constante, pentru dimensiunea a 3-a, ca de exemplu trimesh(TRI,x,y,zeros(size(x))).

Pentru exemplificare, se trasează triunghiularizarea Delaunay pentru 10 puncte aleatoare şi se compară cu diagrama Voronoi, realizată pentru aceleaşi puncte, redată în figura 12.13 şi realizată cu secvenţa Matlab:

rand('state',0); x = rand(1,10); y = rand(1,10); TRI=delaunay(x,y); subplot(1,2,1); trimesh(TRI,x,y,zeros(size(x))); view(2); axis([0 1 0 1]); hold on; plot(x,y,'o'); set(gca,'box','on');hold off

[vx, vy] = voronoi(x,y,TRI); subplot(1,2,2); plot(x,y,'r+',vx,vy,'b-'); axis([0 1 0 1])

Fig.12.13. Comparaţie între triunghiul lui Delaunay şi poligonul Voronoi

Interpolarea şi aproximarea datelor 273

Realizarea unor tetraedre Delaunay în spaţiu 3-D, se face cu funcţia delaunay3, care se apelează cu sintaxa:

TES = delaunay3(x,y,z) şi se restituie o matrice TES, în care fiecare rând conţine indicii punctelor în (x, y, z), care realizează un tetraedu în spaţiul tridimensional discretizat (x, y, z). TES este o matrice de dimensiune “n-feţe”-x-4, unde “n-feţe” este numărul faţetelor în discretizare, iar x, y şi z sunt vectori de mărimi egale. Dacă punctele date sunt coliniare sau dacă x, y sau z definesc un număr insuficient de puncte, triunghiurile nu pot fi calculate, iar funcţia delaunay3 restituie o matrice goală.

Discretizarea Delaunay n dimensională se realizează cu funcţia delaunayn, apelată cu

T = delaunayn(X), care calculează un set de discretizări n-dimensionale, astfel încât nici un punct din X să nu fie conţinut în vreo sferă circumscrisă acestuia. X este o matrice m-x-n, reprezentând m puncte în spatiul n- D, iar fiecare coloană a lui T conţine indicii din X.

Găsirea triunghiularizăii Delaunay pentru punctele vecine se face cu funcţia dsearch, care se poate apela:

• K=dsearch (x,y TRI,xi,yi) când restituie indicii din x şi y ai celui mai apropiat punct de punctul (xi, yi), având nevoie de o triunghiularizare TRI a punctelor x, y, obţinută cu funcţia delaunay, iar dacă xi şi yi sunt vectori, atunci K este un vector de aceeaşi mărime;

• K=dsearch(x,y,TRI,xi,yi,S) foloseşte o matrice S, în loc de a calcula de fiecare dată,

S = sparse(TRI(:,[1 1 2 2 3 3]),TRI(:,[2 3 1 3 1 2]),1,nxy,nxy), unde nxy = prod(size(x))

Căutarea triunghiularizării Delaunay pentru punctele vecine din spaţiul n-

D, se realizează cu funcţia dsearchn, care se apelează cu: • k=dsearchn(X,T,XI) sau k=dsearchn (X,T,XI, outval ) restituie indicii k,

ai celui mai apropiat punct în X, pentru fiecare punct în XI, numai dacă un punct se situează în afara înfăşurătoarei convexe, iar dacă XI (J,:) este în afara înfăşurătoarei convexe, atunci lui k(J,) îi este atribuită o valoare exterioară scalară dublă (Inf este adesea folosit pentru valori exterioare);

• k=dsearchn(X,XI ) realizează căutarea fără a folosi discretizarea cu tetraedre şi se realizează mai repede, cu mult mai puţină memorie;

• [k,d]=dsearchn(X, …) restituie, de asemenea, distanţa d, până la cel mai apropiat punct, D fiind un vector coloană de lungime p.

Căutarea triunghiului Delaunay închis se realizează cu funcţia tsearch, care se apelează,

T=tsearch(x,y,TRI,xi,yi) restituie un indice în rândurile TRI pentru fiecare

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 274

punct din xi, yi şi restituie NaN, pentru toate punctele care se află în afara înfăşurătoarei convexe. Necesită o triunghiularizare TRI, cu funcţia Delaunay a punctelor x, y.

Căutarea triunghiurilor Delaunay în n- D se face cu funcţia tsearchn, care se apelează:

• t=tsearchn(X,TES,XI) restituie indicii t, ai discretizării, care închide TES pentru fiecare punct din XI, cu X o matrice m-x-n, reprezentând m puncte în spaţiul n-D, iar XI este o matrice p–x-n, reprezentând p puncte în spaţiul n-D;

• [t,P]=tsearchn(X,TES,XI) restituie, de asemenea, o coordonată P, din XI, care este o matrice de p pe n+1.

Înfăşurarea convexă a punctelor din spaţiu se realizează cu funcţia convhull, care se apelează:

• K=convhull(x,y) restituie indicii din x şi vectorii y, ai punctelor din înfăşurătoarea convexă;

• [K,A]=convhull(x,y) restituie şi aria, A, a înfăşurătoarei convexe.

Pentru a trasa graficul ieşirilor funcţiei convhull, se utilizează funcţia plot, rezultând figura 12.14, realizată cu secvenţa:

xx = -1:.05:1; yy=abs(sqrt(xx)); [x,y]=pol2cart(xx,yy); k = convhull(x,y); plot(x(k),y(k),'r-',x,y,'b+') ; xlabel('x') ; ylabel('y').

Fig.12.14. Înfăşurătoarea convexă cu convhull

Înfăşurătoarea convexă în spaţiul n-D se realizează cu funcţia convhulln, care se apelează:

• K=convhulln(X) restituie indicii K, ai punctelor din X, care cuprind

Interpolarea şi aproximarea datelor 275

faţetele înfăşurătoarei convexe a lui X, cu X o matrice m-x-n, reprezentând m puncte în spaţiul n-D, iar dacă înfăşurătoarea convexă are un număr p de faţete, atunci K este de dimensiunea p-x-n;

• [K,V]=convhulln(X) restituie, de asemenea, volumul V al înfăşurătoarei convexe.

Se consideră un set de puncte coplanare P. Pentru fiecare punct Px, din setul P, se poate trasa o frontieră, care să cuprindă toate punctele intermediare care se gasesc mai aproape de Px, nu şi de P. Acest gen de frontieră se numeşte poligon

Voronoi, iar toate poligoanele Voronoi, pentru un anumit set de puncte, formează diagrama Voronoi.

Diagrama Voronoi se realizează cu funcţia voronoi, care se poate apela cu una dintre sintaxele:

• voronoi(x,y) trasează celulele de delimitare a diagramei Voronoi, pentru punctele x, y, iar celulele care conţin un punct la infinit, nu sunt limitate şi nu pot fi trasate;

• voronoi(x,y,TRI) foloseşte triunghilarizarea dată TRI, fără a o calcula prin intermediul funcţiei delaunay;

• voronoi(…,'LineSpec') trasează diagrama cu culori şi stil, al liniilor specificate;

• [vx,vy]=voronoi(...) restituie capetele finite ale marginilor Voronoi în vx şi vy, astfel încât plot(vx,vy,'-',x,y,'.') să creeze diagrama Voronoi.

Pentru exemplificare, se foloseşte funcţia voronoi, pentru a trasa diagrama Voronoi pentru 10 puncte generate aleator, redată în figura 12.15: rand('state',5); x=rand(1,10); y=rand(1,10); voronoi(x,y); xlabel('x'); ylabel('y').

Fig.12.15. Diagrama Voronoi trasată cu funcţia fără argumente de ieşire

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 276

Trasarea diagramei Voronoi prin utilizarea capetelor finite ale marginilor Voronoi, pentru aceleaşi 10 puncte, se realizează cu secvenţa:

rand('state',5); x = rand(1,10); y = rand(1,10); [vx, vy] = voronoi(x,y); plot(x,y,'r+',vx,vy,'b-'); axis equal; xlabel('x'); ylabel('y'),

şi este redată în figura 12.16.

Fig.12.16. Diagrama Voronoi trasată prin utilizarea capetelor finite

Trasarea diagramei Voronin în spaţiul n-D se realizează cu funcţia voronoin, care se apelează cu,

[V,C]=voronoin(X) care restituie capetele Voronoi V şi celulele Voronoi C, ale diagramei Voronoi corespunzătoare lui X, unde V, este un vector n-dimensional, iar C, este o celulă vector, unde fiecare element conţine indicii din V ai capetelor, corespunzătoare celulei Voronoi. X este o matrice de dimensiune m-x-n, reprezentând m puncte în n-D, unde n > 1 şi m > = n+1.

Prima linie din V, este un punct la infinit. Dacă orice indice dintr-o celulă care aparţine unui şir de celule este 1, atunci celula Voronoi corespunzătoare conţine primul punct în V, un punct care tinde la infinit. Acest lucru înseamnă că, celula Voronoi nu este limitată.

Identificarea punctelor din cadrul unui domeniu poligonal se realizează cu funcţia inpolygon, care se apelează cu sintaxa,

IN=inpolygon(X,Y,xv,yv), şi restituie o matrice IN, de aceaşi dimensiune cu X şi Y. Fiecărui element din IN îi este atribuită una dintre valorile 1, 0.5, 0, depinzând de faptul, dacă punctul (X(p,q),Y(p,q)) este în interiorul domeniului poligonal, ale cărui limite sunt specificate de vectorii xv şi yv. În particular, IN(p,q)=1, dacă (X(p,q),Y(p,q)) este în interiorul poligonului, IN(p,q)=0.5, dacă (X(p,q),Y(p,q)) este pe frontiera poligonului şi IN(p,q)=0, dacă

Interpolarea şi aproximarea datelor 277

(X(p,q),Y(p,q)) se situează în afara poligonului. Pentru identificarea punctelor în cadrul unui spaţiu poligonal definit de L = linspace(0,2.*pi,6); xv = cos(L)';yv = sin(L)';

se utilizează secvenţa, xv = [xv ; xv(1)]; yv = [yv ; yv(1)]; x = randn(250,1); y = randn(250,1); in = inpolygon(x,y,xv,yv); plot(xv,yv,x(in),y(in),'r+',x(~in),y(~in),'bo'); xlabel('x') ; ylabel('y'),

rezultând figura 12.17.

Fig.12.17. Identificarea punctelor în cadrul unui domeniu poligonal

Funcţia rectint returnează aria dreptunghiulară de intersecţie şi se apelează cu sintaxa:

area = rectint(A,B), unde cele două dreptunghiuri intersectate sunt specificate cu A şi B.

În cazul în care A si B specifică doar un dreptunghi, atunci aria de intersecţie rezultată va fi un scalar.

De asemenea, A şi B pot fi matrice, unde fiecare linie reprezintă un vector de poziţie. În acest caz, aria este o matrice, ale cărei elemente sunt date de intersecţia tuturor dreptunghiurilor specificate de A, cu toate dreptunghiurile specificate de B. Dacă A este o matrice de dimensiune n-x-4 şi B de m-x-4, atunci aria este o matrice de n-x-m, unde aria (i, j) este aria intersecţiilor dreptunghiurilor specificate de linia i, a matricei A şi linia j, a matricei B.

Un vector de poziţie, este un vector de 4 elemente [x, y, width, height], unde punctul definit de x şi y specifică un colţ al dreptunghiului, iar width şi height

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 278

definesc mărimea unităţilor de pe axele x, respectiv y.

Funcţia polyarea restituie aria unui poligon şi se apelează cu una dintre sintaxele:

• A = polyarea(X,Y) restituie aria poligonului specificat de limitele vectorilor X şi Y. Dacă X şi Y sunt matrice de aceeaşi dimensiune, atunci funcţia polyarea restituie aria poligoanelor definite de coloanele X şi Y. Dacă X şi Y sunt matrice multidimensionale, polyarea va restitui aria poligoanelor din prima dimensiune, nesingulară a lui X şi Y.

• A = polyarea(X,Y,dim) operează de-a lungul dimensiunii specificată de scalarul dim.

Pentru determinarea ariei unui poligon definit de, L = linspace(0,2.*pi,6); xv = cos(L)';yv = sin(L)';

se utilizează secvenţa, xv = [xv ; xv(1)]; yv = [yv ; yv(1)]; A = polyarea(xv,yv); plot(xv,yv); title(['Area = ' num2str(A)]); axis image

rezultând figura 12.18.

Fig.12.18. Determinarea ariei unui poligon utilizând funcţia polyarea

13. DERIVAREA ŞI DIFERENŢIEREA NUMERICǍ A

FUNCŢIILOR

Calculul cu diferenţe finite este folosit pe scară extrem de largă în analiza numerică. Formează baza a numeroase procese de calcul şi este utilizat în deducerea multor formule. În cazul ecuaţiilor diferentiale ordinale şi parţiale, care apar ca expresie a unor fenomene diverse în ştiinţă şi tehnică, nu întotdeauna este posibilă soluţia analitică şi atunci, acestea se convertesc în ecuaţii cu diferenţe finite. În aceste calcule apar implicit, derivate şi diferenţe finite, care pot fi calculate numeric.

13.1. Diferenţă finită

Fie )(xy o funcţie reală, definită pe mulţimea ℜ , a numerelor reale sau o

mulţime ℜ⊂I . Submulţimea I poate fi un interval sau o reuniune de intervale şi poate fi formată din puncte discrete, în număr finit sau infinit.

Considerăm o mulţime ρ , de puncte echidistante,

( ) 0h ;,...,2,, >⋅+⋅++= hmxhxhxxρ

pe care o vom numi reţea unidimensională. Punctele hmxhxhxx ⋅+⋅++ ,...,2,, se numesc noduri, iar h pasul reţelei.

Vom presupune că mulţimea ρ este inclusă în mulţimea pe care )(xy este definită şi notăm cu

hmxhxhxx yyyy⋅+⋅++

,...,,, 2

valorile funcţiei în nodurile hmxhxhxx ⋅+⋅++ ,...,2,,

Prin definiţie, xhx yy −+

se notează

xhxx yyyxy −=∆=∆+

)(

şi se numeşte diferenţa finită de ordinul întâi a funcţiei )(xy în punctul x sau,

pe scurt, diferenţa funcţiei )(xy . Diferenţa diferenţelor de ordinul întâi,

xhxx yyyxy ∆−∆=∆=∆+

22 )( , se numeşte diferenţa de ordinul al doilea şi, în general, diferenţa deferenţelor de ordinul n-1,

xn

hxn

xnn

yyyxy11)( −

+

∆−∆=∆=∆ ; mn ≤ ,

se numeşte diferenţa de ordinul n a funcţiei )(xy , în punctul x. Se observă că diferenţa de ordinul întâi, în punctul x, se construieşte cu

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 280

valorile funcţiei în x şi hx + , iar pentru calculul diferenţei de ordinul al doilea este necesar să cunoaştem valorile funcţiei în punctele x, hx + , hx ⋅+ 2 , etc.

Dacă funcţia )(xy este definită în toate punctele hnx ⋅+ , unde n=0, 1, 2, …,

atunci )(xy admite diferenţe de orice ordin.

Diferenţa de ordinul n a funcţiei )(xy , în punctul x, este dată de egalitatea,

( )( )

( )( ) x

n

hpnxp

n

p

hnxnhnxn

yyCyCyxy 1...1...)( 11

−++−++−=∆−+−+⋅+

unde ( )!!

!

pnp

nC

pn

= sunt coeficienţii binomiali.

Pe baza relaţiei de mai sus se poate calcula diferenţa de ordinul n a funcţiei )(xy , în punctul x, dacă se cunosc valorile funcţiei în punctele x, hx + , hx ⋅+ 2 ,

..., hnx ⋅+ şi reciproc, dacă se cunoaşte valoarea funcţiei )(xy , în punctul x şi diferenţele sale, până la ordinul n, în acest punct, se poate calcula valoarea funcţiei în punctul hnx ⋅+ .

Între valorile funcţiei )(xy , în punctele x şi hnx ⋅+ , există relaţia,

xn

xpp

nxnxhnx yyCyCyy ∆++∆++∆+=⋅+

......1 .

Dată fiind, pentru funcţia )(xy , o reţea

( ) 0h ;,...,2,, >⋅+⋅++= hmahahaar

cu schimbarea de variabilă Xhx ⋅= , se obţine o nouă funcţie, ( )XhyXY ⋅=)( , cu

proprietatea că în nodurile reţelei, ( )h

abmbbbbrr =+++= ;,...,2,1, ia aceleaşi

valori ca )(xy , în nodurile reţelei r, hnanb yY⋅++

= , şi din acest motiv se preferă

reţele cu pasul 1=h . În acest caz,

( )( )

( )( ) x

n

pnx

p

n

p

nxnnx

nyyCyCyxy 1...1...)( 1

1−++−++−=∆

−+−++,

( ) x

n

nxxn

xpp

nxnxnx yyyyCyCyy ∆+=⇔∆++∆++∆+=++

1 ......1 .

Regulile de bază pentru calculul diferenţelor finite sunt: • dacă )(xω este o funcţie periodică, de perioadă egală cu pasul h ,al reţelei sau

dacă )(xω se reduce la o constantă, diferenţa sa este nulă în toate punctele

reţelei, oricare ar fi reţeaua de pas h, 0=−=∆+ xhxx ωωω ,

• pentru două funcţii, )(xy şi )(xz , definite pe mulţimi din care fac parte

nodurile x şi 1+x şi o funcţie periodică, ( )xω , de perioadă 1 sau o constantă, avem egalităţile:

• xxxx zyzy ∆+∆=+∆ )( ,

• xxxx yy ∆⋅=⋅∆ ωω )( ,

• xxxxxxxx zyyzzyzy ∆⋅∆+∆⋅+∆⋅=⋅∆ )( ,

Derivarea şi diferenţierea numerică a funcţiilor 281

• ( ) 1+

∆⋅−∆⋅

=

∆+⋅

∆⋅−∆⋅

=

xx

xxxx

xxx

xxxx

x

x

zz

zyyz

zzz

zyyz

z

y.

Diferenţele pentru câteva funcţii uzuale sunt:

• diferenţa de ordinul întâi a funcţiei nxxy =)( , respectiv puterile

naturale ale variabilei x, este ∑=

⋅=−+=∆

n

k

knkn

nnnxCxxx

1

)1( , de unde

rezultă că diferenţa de primul ordin a unui polinom de gradul n este de gradul n-1, iar prin analogie, diferenţa de grad k a unui polinom de grad n, nk ≤ , este un polinom de gradul n-k şi diferenţa de ordinul n, a unui polinom de grad n, este o constantă;

• diferenţele de ordinul întâi ale funcţiilor factorial de ordinul n şi –n,

( ) ( ) ( )( ) ( )

1...2)1(

1 ;1...2)1(

+−−⋅+⋅

=+−−⋅+⋅=∆

nxxxxFnxxxnxF

nn

sunt:

( ) ( ) );( );(11

xFnxFxFnxFnnnn −−−

⋅−=∆⋅=∆

• diferenţele de diverse ordine ale funcţiei 1a , ≠x

a se obţin imediat,

( ) ( ) ( ) 1 , ... ,1 ,1 221 xnxnxxxxxxaaaaaaaaaaa ⋅−=∆⋅−=∆⋅−=−=∆

+

şi pentru o funcţie ( )xϕ avem, ( ) ( ) ( ) ( ) ( ) ( ) 1 xxxxxx

aaaaaϕϕϕϕϕϕ

−=−=∆∆++

• pentru o funcţie arbitrară, ( )xϕ , definită în nodurile x şi 1+x ale reţelei, diferenţele de primul ordin ale funcţiilor trigonometrice şi hiperbolice sunt

( )( )

( )( )

∆+⋅

∆=∆

2cos

2sin2sin

xx

xx

ϕϕ

ϕϕ ,

( )( )

( )( )

∆+⋅

∆−=∆

2sin

2sin2cos

xx

xx

ϕϕ

ϕϕ ,

( )( )

( )( )

∆+⋅

∆=∆

2ch

2sh2sh

xx

xx

ϕϕ

ϕϕ ,

( )( )

( )( )

∆+⋅

∆=∆

2sh

2sh2ch

xx

xx

ϕϕ

ϕϕ ,

care, pentru ( ) βαϕ +⋅= xx , devin

( )

+

+⋅=+⋅∆ βα

αβα

2

1cos

2sin2sin xx ,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 282

( )

+

+⋅−=+⋅∆ βα

αβα

2

1cos

2sin2cos xx ,

( )

+

+⋅=+⋅∆ βα

αβα

2

1ch

2sh2sh xx ,

( )

+

+⋅=+⋅∆ βα

αβα

2

1sh

2sh2ch xx .

Considerăm o funcţie reală de două variabile, ( )yxz , , definită pe o mulţime 2

ℜ⊂I . Mulţimea I poate fi un domeniu bidimensional sau o reuniune de domenii,

sau poate fi o mulţime discretă de puncte din 2ℜ , finită sau infinită.

Se numeşte reţea bidimensională o mulţime de puncte din 2ℜ∈ijM ,

denumite nodurile reţelei, având coordonatele de forma, ( ) njmikjyhixM ij , ... ,2 ,1 ,0 ; , ... ,2 ,1 ,0 ;, ==⋅+⋅+ .

Dacă kh ≠ , reţeaua se numeşte dreptunghiulară. Printr-o transformare analogă celei din cazul reţelei unidimensionale, YkyXhx ⋅=⋅= , , se obţine o reţea pătratică având pasul h.

Dacă kh = reţeaua se numeşte pătratică, iar h se numeşte pasul reţelei. Se vor considera implicit, numai reţele pătratice având pasul h=1, iar nodurile

reţelei aparţin mulţimii ,I pe care este definită funcţia ( )yxz , .

Notăm 1, ++ yixz , valoarea funcţiei ( )yxz , , în nodul ijM .

Diferenţele finite parţiale de ordinul întâi (pe scurt, diferenţe finite) ale funcţiei ( )yxz , , în punctul ( )yx, sunt:

• în raport cu x: yxxyxx zzz ,1, −+=∆ ,

• în raport cu y: zzz yxyxy −=∆+1,, .

Diferenţele parţiale de ordinul al doilea ale funcţiei ( )yxz , , în punctul ( )yx, , se definesc prin egalitaţile :

( ) yxyxyxyxxxyxxzzzzz ,,1,2,,

2 22 +⋅−=∆∆=∆++

,

( ) yxyxyxyxxxyxyzxzzz ,1,2,,,

2 22 +⋅−=∆∆=∆++

( ) yxyxyxyxxxyxxy zxzzzz ,,1,2,,2

+⋅−=∆∆=∆++

În Matlab, evaluarea diferenţei dintre elementele succesive ale unui vector sau ale unei coloane dintr-o matrice se realizează cu funcţia diff, care se poate apela cu una dintre sintaxele:

• Y= diff(X), calculează diferenţa dintre elementele adiacente lui X; dacă X

Derivarea şi diferenţierea numerică a funcţiilor 283

este un vector, atunci Y este [X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)], un vector al diferenţelor între elementele adiacente, cu un element mai puţin decât X, iar dacă X este o matrice, atunci Y este o matrice cu diferenţele liniilor, [X(2:m,:)-X(1:m-1,:)], unde m este numărul de linii ale matricei X;

• Y= diff(X,n) foloseşte funcţia diff recurent de n ori, rezultând a n-a diferenţă, astfel, diff (X,2) este similar cu diff (diff (X) );

• Y=diff (X,n,dim) este a n-a diferenţă calculată în dimensiunea matricei X, precizată de scalarul dim; dacă gradul lui n este mai mare sau egal cu lungimea dimensiunii, atunci diff restituie un şir de valori gol.

Din moment ce funcţia diff reduce lungimea lui X, din dimensiunea dim, este posibil să se specifice un ordin n, suficient de mare, pentru a reduce dim la o singură dimensiune (size (X, dim) = 1).

Pentru exemplificare, se calculează diferenţele de ordinul 1 şi 2 ale vectorului X=[1 4 5 9], rezultând Y = diff(X) = [ 3 1 4], Z = diff(Y) = [ -2 3] şi diff(Z)=5.

Dacă considerăm matricea X=[3 6 8; 7 0 4], atunci diff(X,1,1)=[ 4 -6 -4 ], iar diff(X,1,2) = [ 3 2 ; -7 4 ].

Se poate efectua şi diferenţa dintr-un număr la o putere, ca de exemplu diff((1:10).^2), care are ca rezultat 3:2:19.

Verificarea faptului că diferenţiala lucrează corect matematic se poate face calculând cosinusul prin derivarea sinusului, ca de exemplu,

h = .001; x = 0:h:pi; diff(sin(x.^2))/h care apropximează, cu o eroare absolută de 0.01, funcţia 2*cos(x.^2).*x (cu observaţia că derivata are un element mai puţin).

13.2. Derivarea numerică

Derivata unei funcţii se introduce cel mai sugestiv, pornindu-se de la viteza unui punct material în mişcarea liniară, astfel că, generalizând, derivata unei funcţii

( )xf , este raportul dintre variaţia funcţiei şi variaţia lui x,

( ) ( ) ( )00'

0

)00

' )(()(lim

0

xDfxfdx

xdf

xx

xfxfxf x

xx===

=→

,

cu menţiunea că derivata într-un punct este un număr. Totodată, derivata funcţiei ( )xf , Ix ∈ , într-un punct Ix ∈0 , cu I, intervalul

pe care este definită funcţia, este egală cu tangenta trigonometrică a unghiului pe care îl face tangenta la grafic în punctul ( ))(, 00 xfx , cu axa Ox ; aceasta este interpretarea geometrică a derivatei.

Punctele cu derivata zero sunt puncte critice şi pot reprezenta, fie o regiune orizontală a funcţiei, fie un punct de maxim sau minim local al funcţiei. Dacă derivata a doua în punctul critic este pozitivă, atunci valoarea funcţiei în punctul respectiv este un minim local, iar dacă derivata a doua în punctul critic este

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 284

negativă, atunci valoarea funcţiei în acel punct este un maxim local. Dacă derivata este infinită ( +∞ sau −∞ ), atunci dreapta este paralelă cu axa Oy.

Principalele reguli de derivare, într-un punct din intervalul domeniului, sunt : • derivata sumei unui număr finit de funcţii derivabile este egală cu suma

derivatelor fiecărei funcţii (poate să fie şi operatorul minus, nu numai plus între funcţii);

• dacă funcţiile ( )xf şi ( )xg sunt derivabile, atunci funcţia ( ) )(xgxf ⋅ este

derivabilă şi ( ) )(')()()(')]([ 0000'

0 xgxfxgxfxgxf xx ⋅+⋅=⋅ = , iar

( )

)(

)()(')()('

)( 02

0000

'

0

xg

xfxgxgxf

xg

xfxx

⋅−⋅

=

= ;

• derivata funcţiei compuse ( ) ( )( )xufxF = este ( ) ( )( ) )( 0'

0'

0' xuxufxF ⋅= ;

• derivata funcţiei inverse este )(

1)(

0'0

1'

xfyf =

şi 1)()( 0'

0

1'

=⋅

xfyf ;

• derivatele funcţiilor trigonometrice sunt: ( ) xx sincos '−= , ( ) xx cossin '

= ,

( )x

x2

'

cos

1 tg = , ( )

xx

2

'

sin

1ctg

−= ;

• derivata funcţiei logaritmice este ( )ax

x xxa ln

11log

0

'0 ⋅== ;

• derivata funcţiei exponenţiale este ( ) aaa xx ln'

⋅= ;

• derivatele funcţiilor hiperbolice sunt ( ) xee

xxx

ch2

sh '=

−=

,

( ) xee

xxx

sh2

ch '=

+=

, ( )xe

ex

x

x

22

2'

ch

1

1

1th =

+

−= , ( )

xe

ex

x

x

22

2'

sh

1

1

1cth −=

+= ;

• derivatele funcţiilor circulare inverse sunt ( )2

'

1

1arcsin

xx

= ,

( )2

'

1

1 arccos

xx

−= , ( )

2

'

1

1 arctg

xx

+

= , ( )2

'

1

1 arcctg

xx

+

−= ;

• derivatele funcţiilor hiperbolice inverse sunt ( )2

'

1

1argsh

xx

+

= ,

( )2

'

1

1argth

xx

= , iar funcţiile argch şi argcth au formule diferite pe

intervalele ]0,(−∞ şi ),0[ +∞ ;

• derivata unei matrice A de m x n , cu elemente funcţii derivabile este dx

xdA )(,

iar( )

dx

xdB

dx

xdA

dx

xBxAd )()()()( +=

+,

Derivarea şi diferenţierea numerică a funcţiilor 285

( ))(

)()(

)()()(xA

dx

xdBxB

dx

xdA

dx

xBxAd×+×=

×, )(

)()(

)( 11

xAdx

xdAxA

dx

xdA××−=

.

De menţionat că derivarea numerică, faţă de derivarea analitică, amplifică micile erori, cu consecinţa îndepărtării de soluţia analitică.

Precizia estimării derivatei depinde de distanţa dintre punctele utilizate pentru calcul, crescând cu micşorarea distanţei dintre punctele succesive.

Totodată, calculul numeric al derivatei ( )xf ' într-un punct, kx , se poate face:

• cu diferenţe regresive sau diferenţă înapoi, ( )

1

)1'()(

=

kk

kk

xx

xfxfxf ;

• cu diferenţe progresive sau diferenţă înainte, ( )

kk

kk

xx

xfxfxf

=

+

+

1

)1'()(

;

• cu diferenţe centrale sau diferenţă centrală, ( )

11

)11'()(

−+

−+

=

kk

kk

xx

xfxfxf .

Pentru exemplificare, se calculează derivata funcţiei:

400525123 2345+⋅+⋅+⋅−⋅−= xxxxxy

pe intervalul [-4, 4], utilizând aproximarea cu diferenţe finite şi calculul matematic. Funcţia derivată matematic este

55036125 234'+⋅+⋅−⋅−⋅= xxxxy .

Programul Matlab corespunzător, prin care se afişează funcţia şi derivata, precum şi punctele critice, este:

x=-4:0.1:4; y=x.^5-3.*x.^4-12.*x.^3+25.*x.^2+5.*x+400; yprim=5.*x.^4-12.*x.^3-36.*x.^2+50.*x+5 ; df=diff(y)./diff(x) ; xd=x(2 :length(x); pr=df(1:length(df)-1).*df(2:length(df)); pcrit=xd(xd(find(pr<0)); plot(x,y,'r',xd,df,'b'); hold on; plot(xd,yprim(2:end)-df,'b').

Funcţia find este utilizată pentru a determina indicii elementelor la care derivata schimbă semnul, fiind utilizaţi ulterior pentru afişarea poziţiilor la care sunt localizate punctele critice.

Diferenţa dintre calculul numeric şi matematic, cât şi punctele critice, situate la x=[ -2.4 -0.1 1.2 3.6], sunt vizualizate pe graficul din figura 13.1.

Dacă se doreşte calculul derivatei cu diferenţe centrate, atunci secvenţa de

calcul Matlab este: x=-4:0.1:4; y=x.^5-3.*x.^4-12.*x.^3+25.*x.^2+5.*x+400; df=y(3:length(y))-y(1:length(y)-2); dx=x(3:length(x))-x(1:length(x)-2); dy=df./dx; xd=x(2:length(x)-1); pr=df(1:length(df)-1).*df(2:length(df)); pcrit=xd(find(pr<0)+1); plot(x,y,'r',xd,df,'b').

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 286

Fig.13.1. Funcţia, derivata sa şi diferenţa dintre calculul numeric şi exact

Fără a da demonstraţia, trebuie menţionat faptul că eroarea de trunchiere la calculul derivatei de ordinul doi este minimă atunci când se utilizează diferenţa centrată, motiv pentru care este de preferat întotdeauna când este posibil.

Atunci când datele sunt discrete, pentru calculul derivatei se recomandă găsirea anterioară a funcţiei ce aproximează aceste date, printr-o metodă de interpolare şi apoi, calculul derivatei.

Pentru calculul diferenţialelor şi al derivatelor de ordin superior se utilizează

dezvoltarea în serie Taylor a funcţiei şi mai mult, se utilizează dezvoltarea în serie Stirling,

( )( )

−∆⋅

+⋅⋅+∆⋅−∆⋅=

++ ...24

53

2

1 21 nnn

nin nnn

hxf

care calculează derivata printr-o formulă în patru puncte, şi în care:

ii xxh −=+1 - pasul de divizare,

)()( 1 iii xfxfy −=∆+

- deferenţele de ordinul 1,

iii yyy ∆−∆=∆+1

2 - diferenţele de ordinul 2,

iii yyy2

123

∆−∆=∆+

- diferenţele de ordinul 3 ;

iii yyy3

134

∆−∆=∆+

- diferenţele de ordinul 3 .

Derivarea şi diferenţierea numerică a funcţiilor 287

Luând în consideraţie numai diferenţele finite până la ordinul 4, primele derivate sunt :

( )

∆⋅−∆⋅+∆⋅−∆⋅= iiiii yyyy

hxf

432'

4

1

3

1

2

11

( )

∆⋅+∆−∆⋅= iiii yyy

hxf

4322

''

24

111.

Pentru exemplificare, se poate scrie programul care calculează primele două derivate ale funcţiei logaritm natural, log, în punctul x=10, având următoarea structură:

x=10:0.1:20; h=x(2)-x(1); y=log(x); dy1=diff(y); dy2=diff(dy1); dy3=diff(dy2); dy4=diff(dy3); d1f=1./h.*(dy1(1)-dy2(1)./2+dy3(1)./3-dy4(1)./4); d2f=1./h.^2.*(dy2(1)-dy3(1)+11./12.*dy4(1));

obţinându-se d1f = 0.1 şi d2f = -0.01.

13.3. Aproximarea numerică a gradientului

După cum se cunoaşte, se numeşte gradientul funcţiei U(x,y,z) sau gradientul câmpului scalar U şi se notează grad U, funcţia vectorială:

z

Uk

y

Uj

x

UiU

∂⋅+

∂⋅+

∂⋅=

rrr grad ,

în care U(x,y,z) este o funcţie reală, definită pe 3RX ∈ şi derivabilă pe X. Vectorul

( )000 ,, grad zyxU , este normal la suprafaţa de nivel, în punctul ( )000 ,, zyxU .

Dacă se introduce operatorul z

ky

jx

i∂

∂⋅+

∂⋅+

∂⋅=∇

rrr, numit operatorul

nabla sau operatorul Hamilton, atunci se poate scrie : UU ∇= grad .

În general, gradientul unei funcţii scalare ϕ , oarecare, după o direcţie oarecare, n, se obţine luând diferenţa funcţiei între două puncte învecinate, pe direcţia respectivă, împărţind această diferenţă la distanţa dintre cele două puncte şi, în final, se ia valoarea limită a acestui raport,

( )( ) ( )

n

rnr

nn

−∆+=

→∆

rrrϕϕ

ϕ0

lim grad .

Funcţia Matlab, care permite determinarea gradientului unei funcţii oarecare F, de N variabile (spaţiu N dimensional), este gradient, care se poate apela cu una dintre sintaxele :

• FX=gradient(F,DX), unde F este un vector, restituie gradientul uni-dimensional, FX, a lui F, care corespunde derivatei parţiale pe direcţia x,

xF ∂∂ / , DX este pasul de eşantionare, care se consideră 1, dacă este omis; • [FX,FY] = gradient(F,DX,DY), unde F este o matrice, restituie

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 288

componentele x şi y ale gradientului bidimensional, astfel că, FX corespunde lui xF ∂∂ / , derivata parţială pe direcţia lui x (pe coloană), FY corespunde lui

yF ∂∂ / , derivatei parţiale pe direcţia lui y ( pe linie), iar DX este pasul de eşantionare pe direcţia x şi DY este pasul de eşantionare pe direcţia y; dacă sunt omişi, DX=DY=1;

• [FX, FY, FZ…] = gradient (F,...), unde F are N dimensiuni, restituie cele n componente ale gradientului lui F;

• DYX=gradient(Y) sau dYX=gradient(Y,DY) returnează un vector, care conţine derivata numerică dY/dX, a funcţiei scalare Y.

Pentru a reprezenta grafic gradientul, care este o funcţie vectorială, este preferată funcţia Matlab quiver, ce reprezintă grafic mici săgeţi (vectori orientaţi), la fiecare pereche (X,Y) a matricelor X şi Y şi se apelează cu una dintre sintaxele:

quiver(X,Y,DX,DY), quiver(X,Y,DX,DY,S), quiver(DX,DY). Perechile (DX, DY) din matricele DX, DY, determină direcţia şi modulul

câmpului de vectori orientaţi. Dacă X şi Y sunt vectori, X corespunde coloanelor lui DX şi DY, iar Y corespunde liniilor acestora (X trebuie să aibă lungimea egală cu numărul de coloane, iar Y cu numărul de linii).

Dacă X şi Y sunt omişi, se consideră X = 1 : n şi Y = 1 : m, unde m este numărul de linii al matricelor DX (DY), iar n numărul de coloane al acestora.

Argumentul S, care este un scalar, permite aplicarea unui factor de scală, lungimii vectorilor orientaţi, de pe reprezentarea grafică. Se pot folosi toate tipurile de linii sau culori, specificate de instrucţiunea plot.

Pentru exemplificare, se reprezintă grafic gradientul unui câmp de vectori

asociat funcţiei: 22

),( yxxeyxz

−−= , în domeniul X x Y = [-3, 3] x [-3, 3].

Programul Matlab este : xp=-3:0.1:3; yp=-3:0.1:3; [x,y]=meshgrid(xp,yp); z=x .*exp(-x.^2-y.^2); [px,py]=gradient(z,0.1,0.1); contour(x,y,z) ; hold on ;

quiver(x,y,px,py,1.5,'g') ; hold off ; xlabel('x') ; ylabel('y'), obţinându-se reprezentarea grafică din figura 13.2.

Dacă în locul funcţiei scalare U(x,y,z), avem o funcţie vectorială ),,(),,(),,(),,( zyxRkzyxQjzyxPizyxV ⋅+⋅+⋅=

rrrr,

definită pe 3RX ∈ , cu valori scalare în 3

R , derivabilă parţial pe X, se poate defini divergenţa funcţiei ),,( zyxV

r sau divergenţa câmpului vectorial V

rşi se notează

Vr

div ,funcţia scalară,

Vz

R

y

Q

x

PV

rr⋅∇=

∂+

∂+

∂= div .

Se numeşte rotorul funcţiei vectoriale Vr

sau rotorul câmpului vectorial Vr

şi se notează V

rrot funcţia vectorială

Derivarea şi diferenţierea numerică a funcţiilor 289

∂−

∂⋅+

∂−

∂⋅+

∂−

∂⋅=

y

P

x

Qk

x

R

z

Pj

z

Q

y

RiV

rrrrrot .

Fig.13.2. Reprezentarea grafică a gradientului unui câmp de vectori.

De menţionat că,divergenţa unui vector oarecare, indiferent de sistemul de coordonate, se defineşte ca

AVV

V

A

Vd

1lim div

0⋅

= ∫→∆

rr,

care ne spune că, pentru a obţine divergenţa unui vector într-un punct, trasăm o suprafaţă închisă oarecare în jurul punctului şi, pe această suprafaţă, formăm integrala de suprafaţă a vectorului, a cărei valoare o împărţim la volumul delimitat, iar pentru raportul astfel obţinut trecem la limită, în timp ce ne apropiem cu suprafaţa trasată de punctul respectiv.

Rotorul unui vector oarecare, în coordonate generale, se defineşte ca

( ) lVA

V

L

Ad

1limrot

0n ⋅

= ∫→∆

rr,

adică, componenta rotorului unui vector, după o direcţie oarecare, se obţine într-un punct, dacă înconjurăm cu o curbă punctul respectiv, într-un plan perpendicular pe direcţia respectivă, formăm integrala vectorului, de-a lungul acestei curbe, a cărei valoare o împărţim la suprafaţa delimitată şi apoi, trecem la limită raportul astfel

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 290

obţinut, în timp ce ne apropiem cu curba respectivă în mod nelimitat de punct. Sensul pozitiv al integralei se ia după regula burghiului drept.

Divergenţa câmpului Vr

rot , este o funcţie identic nulă pe domeniul de definiţie, dacă P, Q, R au derivate de ordinul doi continue, 0rot div =V

r.

Divergenţa câmpului , U grad nu mai este nulă,

UUz

U

y

U

x

U

z

Uk

y

Uj

x

Ui ∆=∇⋅∇=

∂+

∂+

∂=

∂⋅+

∂⋅+

∂⋅

2

2

2

2

2

2

divrrr

,

unde operatorul ∆ , definit ca:

2

2

2

2

2

2

zyx ∂

∂+

∂+

∂=∇⋅∇=∆

se numeşte “laplasian” sau operatorul lui Laplace, aici dat în coordonate carteziene. Acesta apare în rezolvarea ecuaţiei lui Laplace, ce dă distribuţia potenţialului (termic, electric, chimic), fără surse interioare.

13.4. Aproximarea numerică a Laplasianului

Pentru calculul numeric al Laplasianului, în Matlab, se utilizează funcţia del2. Dacă matricea U este privită ca o funcţie ),( yxu , exprimată la un moment dat pe o reţea pătrată, atunci 4*del2(U) este o diferenţă finită aproximativă a operatorului diferenţial Laplace, aplicat lui u :

+=

∇=

2

2

2

22

4

1

4 dy

ud

dx

udul

unde:

( )ijijijijiij

uuuuul −+++=−+−+ 1,1,,1,14

1

este în interiorul reţelei. În cazul nodurilor care aparţin marginilor sau colţurilor (care au numai trei şi respectiv două noduri vecine), media este calculată numai cu aceste noduri, utilizând o extrapolare cubică pentru punctele care lipsesc.

Pentru funcţii de mai multe variabile ,...),,( zyxu , del2(U) este:

+++=

∇= ...

2

1

2 2

2

2

2

2

22

dz

ud

dy

ud

dx

ud

NN

ul

unde N este numărul de variabile din u. Funcţia del2 se apelează cu una dintre sintaxele :

• L = del2(U), unde U este un şir multidimensional, restituie o aproximaţie a

luiN

u

2

∆, unde N este numărul de dimensiuni ale lui u, N=ndimns(u);

• L = del2(U,h), unde h este un scalar, utilizează h ca distanţă (spaţiul) dintre puncte, pe fiecare direcţie;

Derivarea şi diferenţierea numerică a funcţiilor 291

• L = del2(U,hx,hy), cu U , un şir dreptunghiular, utilizează intervalul precizat de hx şi hy; dacă hx este un scalar, el determină intervalul dintre puncte pe direcţia x, iar dacă hx este un vector, trebuie să fie de lungime (u,2) şi specifică coordonatele punctelor pe direcţia x; în mod similar, dacă hy este un scalar, el determină intervalul dintre puncte pe direcţia y, iar dacă hy este un vector, trebuie să fie de lungime (u,1) şi specifică coordonatele punctelor pe axa y;

• L = del2(U,hx,hy,hz,…), unde U este multidimensional, utilizează intervalele determinate de hx, hy, hz,….

Matricea L are aceeaşi mărime ca U, cu fiecare element egal cu diferenţa dintre un element a lui U şi media celorlalţi termeni vecini cu el.

Dacă matricea U este asociată funcţiei ),( yxu , evaluată în nodurile unei reţele cu pas constant, atunci:

D=4*del2(U) este aproximarea cu diferenţe finite a operatorului diferenţial Laplace aplicat lui u, adică ∆2 = ∂2u/∂x2 + ∂2u/∂y2 .

Pentru exemplificare, se consideră funcţia 22),( yxyxu += , care are

4=∆u şi pentru această funcţie, 4*del2(U) este de asemnea, 4. Secvenţa Matlab este :

[x,y] = meshgrid(-4:4,-3:3); U = x.*x+y.*y ; V = 4*del2(U) ;

rezultând, U = [ 25 18 13 10 9 10 13 18 25 20 13 8 5 4 5 8 13 20 17 10 5 2 1 2 5 10 17 16 9 4 1 0 1 4 9 16 17 10 5 2 1 2 5 10 17 20 13 8 5 4 5 8 13 20 25 18 13 10 9 10 13 18 25] V = [ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ].

14. INTEGRAREA NUMERICǍ A FUNCŢIILOR

Integrarea numerică este utilizată foarte des în calculele inginereşti, fie pentru calculul unor integrale propriu-zise, fie pentru integrarea numerică a ecuaţiilor diferenţiale.

Calculul numeric al unei integrale, denumit şi cuadratură, se poate face prin aproximarea funcţiei de integrat printr-o altă funcţie, pentru care integrala se cunoaşte sau se poate calcula uşor, sau prin aproximarea funcţiei printr-un set de funcţii liniare sau parabolice, pe porţiuni.

14.1. Calculul cu aproximaţie al integralelor definite

Metodele aproximative de calcul ale integralei definite au ca principiu înlocuirea curbei )(xfy = , în intervalul de integrare [a, b], cu o curbă mai simplă

)(xgy = , deci :

)d )(d )(

b

a

b

a∫∫ ≅ xxgxxf

unde curba )(xgy = , este o funcţie în scară, o linie poligonală (metoda dreptunghiului, metoda trapezelor, metoda tangentelor), un lanţ de parabole, (metoda lui Simpson) sau polinomul de interpolare al lui Lagrange. Ideea fundamentală, de obţinere a unei soluţii aproximative, este de a scrie integrala sub forma,

∑∫ ⋅⋅≅

j

jjhwxfxxf )(d )(

b

a unde

jw , sunt ponderi asociate cu procesul de integrare. Relaţia este cunoscută ca

formula prin cuadraturi şi un procedeu posibil de generare este cu polinoame Lagrange.

14.1.1. Metoda dreptunghiurilor

Pentru funcţia de integrat, )(xfy = , pe intervalul de integrat [a, b], se pot lua

subintervale egale, n

abxx

kk

−=−

+1 , astfel încât

bxxxxxxxannkk

<<<<<<<<<<−+ 11210 ......

iar metoda dreptunghiurilor constă în a aproxima integrala definită ∫=

b

a

d )( xxfI ,

cu o sumă Riemann. Aproximarea se poate face prin două formule :

Integrarea numerică a funcţiilor 293

[ ])(...)()()( 1211 −++++⋅

−≅

nxfxfxfaf

n

abI ,

[ ])()(...)(( 1212 bfxfxfxfn

abI

n++++⋅

−≅

−,

astfel că, dacă funcţia este crescătoare pe interval, atunci I1 aproximează prin lipsă, iar I2 prin exces.

În metoda dreptunghiurilor, se înlocuieşte arcul )(xfy = , cu o funcţie în

trepte, iar eroarea de calcul ( )

n

abA

2−

≤ , cu )('sup xfAbxa ≤≤

= .

14.1.2. Metoda trapezelor

Metoda trapezelor constă în a aproxima integrala definită ∫=

b

a

d )( xxfI , prin

semisuma valorilor I1 şi I2, calculate anterior,

[ ])()(2...)(2)(2)(22 121

21 bfxfxfxfafn

abIII

ntr+⋅++⋅+⋅+⋅

−=

+

≅−

care, după prelucrări, se poate scrie :

⋅++⋅

−≅ ∑

=

1

1

)(2)()(2

n

iitr

xfbfafn

abI

În metoda trapezelor, se înlocuieşte arcul de curbă )(xfy = , cu o coardă, iar

eroarea de calcul ( )

2

3

12 n

abB

−≤ , cu )(sup ''

xfBbxa ≤≤

= .

14.1.3. Metoda tangentelor

În această metodă, se aproximează pe fiecare subinterval [ ]1,+kk

xx , arcul de

curbă )(xfy = , cu tangenta la curbă, luându-se numărul diviziunilor pare (n=2m) şi se duce tangenta la curbă în punctele de abscisă x2k+1, tangentă pe care o mărginim la dreptele paralele cu axa Oy, duse prin punctele (x2k , 0) şi (x2k+1 , 0),

astfel încât, aria trapezului este dată de ( ) )()()(2 12222 ++

⋅−

=+⋅

kkkxf

m

abxfxf

m

ab.

Însumând pentru toate ariile elementare, obţinem,

( ) ( ) ( )[ ]1231

b

atan ...d )(

−+++⋅

−≅= ∫ m

xfxfxfm

abxxfI

14.1.4. Metoda lui Simpson

În metoda lui Simpson se ia o medie ponderată a valorilor aproximative,

obţinute prin metoda trapezelor şi a tangentelor, anume 3

2 tanIII tr

Sims

+⋅

= .

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 294

Formula lui Simpson, luând numărul de diviziuni par, n=2m, este :

( ) ( ) ( ) ( ) ( ) ( ) ( )[ ]bfxfxfxfxfxfafm

abI

mmSims+++++++⋅

−≅

−− 1222321 42...4246

În metoda lui Simpson se aproximează curba în intervalul [ ]222 ,+kk

xx , printr-

un arc de parabolă CxBxAy +⋅+⋅=2 , care trece prin punctele curbei de abscise

x2k , x2k+1 , x2k+2 , iar eroarea de calcul ( )

4

5

2880 m

abC

−≤ , cu )(sup xfC

IV

bxa ≤≤

= .

14.1.5. Aproximarea prin interpolare

Considerăm că intervalul de interpolare [a, b], se poate împărţi în n subintervale oarecare,

bxxxxxann

=<<<<<=−1210 ... ,

în care, funcţia f(x) ia valorile, )(),(),...(),( 11 bfxfxfaf

n−.

În această metodă, funcţia de integrat f(x), se aproximează cu polinomul Ln , de interpolare, al lui Lagrange, care trece prin cele n+1 puncte,

( )( ) ( )( ) ( )( )nn

xfxxfxxfx ,,...,,,, 1100 a cărui expresie este,

( ) ( ) ( )nnn

xfXxfXxfXL ⋅++⋅+⋅= ...1100 , cu

( ) ( ) ( )

( ) ( ) ( )nkkk

n

k

kxxxxxx

xxxxxx

xxX

−⋅⋅−⋅−

−⋅⋅−⋅−

=

K

K

10

101.

Dacă înlocuim pe f(x) în , ∫b

a

d )( xxf cu )(xLn

, obţinem,

( )

( ) ( ) ( )

( ) ( ) ( )

∫∑−

−⋅⋅−⋅−

−⋅⋅−⋅−

=

=

b

a

10

010

d xxx

xxxxxx

xxxxxx

xfI

k

nn

knkkk

kK

K

şi s-a redus calculul integralei definite, la integrarea unor polinoame. Printr-o schimbare de variabilă, integralele pot fi obţinute independent de

punctele de diviziune şi intervalul de integrare, astfel încât: ( ) ( ) tabxabtax dd ⋅−=⇒−⋅+= ,

( ) ( ) ( )abtaxabtaxabtaxnn

−⋅+=−⋅+=−⋅+= ,,, 1100 L . Prin urmare,

10 110 =<<<<<− nn

tttt L , şi

( ) ( ) ( ) ( )kikikk

ttabxxttabxx −⋅−=−−⋅−=− ,,L

astfel încât, integrala I devine ( )∫∑=

⋅=

1

00

d ttTYIk

n

kk

, unde,

Integrarea numerică a funcţiilor 295

( ) ( )

( ) ( ) ( ) ( ) ( )nkkkkkkk

k

ktttttttttt

xfabY

−⋅⋅−⋅−⋅⋅−⋅−

⋅−

=

+−KK 1110

,

( ) ( ) ( ) ( ) ( ) ( )nkkk

tttttttttttT −⋅⋅−⋅−⋅⋅−⋅−=+−

KK 1110 ,

în care ( )tTk

, sunt polinoame de gradul n , în t.

Pentru diverse valori ale lui n, s-au calculat integralele ( )∫=

1

0

' d ttTTkk

şi

coeficienţii ( ) ( ) ( ) ( ) ( )

nkkkkkkk

k

ktttttttttt

TA

−⋅⋅−⋅−⋅⋅−⋅−

=

+−KK 1110

'

, astfel încât, prin

intermediul acestora, ce se găsesc calculaţi, aproximarea integralei se reduce la

calculul sumei ( ) ( )∑=

⋅⋅−

n

kkk

xfAab0

.

14.1.6. Calculul numeric al integralelor pe intervale infinite

În definiţia anterioară a integralei definite ∫b

a

d )( xxf , am presupus că limitele

a şi b sunt finite, iar funcţia f(x) este mărginită pe [a, b]. Dacă unul sau amândouă numerele a şi b sunt infinite, integralele sunt de

forma,

∫∞

a

d )( xxf , ∫∞

b

-

d )( xxf , ∫+∞

∞-

d )( xxf ,

care se pot reduce cu uşurinţă la cazul ∫∞

=

a

d )( xxfI .

Pentru calculul integralelor de acest tip, presupunem că integrala are sens sau

că este convergentă, dacă ∫∞→

A

a

d )(lim xxfA

există şi este finită, pentru funcţia f(x),

definită pe intervalul [ ]+∞,a şi integrabilă pe intervalul [a, A], pentru orice A>0. O integrală care nu este convergentă, se spune că este divergentă sau că nu

are sens.

Calculul integralelor convergente de tipul ∫∞

=

a

d )( xxfI , se poate face :

• prin schimbarea variabilei, astfel încât intervalul infinit [ ]+∞,a , să se transforme într-un interval finit, de exemplu, [ ]ba, , şi apoi, se evaluează prin una dintre metodele expuse anterior;

• prin separarea integralei în două integrale, ∫∫∫∞∞

+=

baa

d )(d )(d )( xxfxxfxxfb

, iar

apoi calculul se poate face: • neglijând termenul integrală infinită, dacă b este suficient de mare,

astfel încât ∫∫ >>

bb

xxfxxf2

ba

d )(d )( ;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 296

• aproximând forma asimptotică a lui f(x) , printr-o funcţie )()( xfxg ≅ , care, pentru x suficient de mare, permite calculul analitic al integralei funcţiei g(x).

14.1.7. Calculul numeric al integralelor funcţiilor cu singularităţi

Singularităţile sunt puncte ale unui interval mărginit, pentru care funcţia este

infinită, ca de exemplu integrala ∫−

1

0 1

d

x

x. Pentru aceste cazuri se recomandă :

• eliminarea singularităţilor, atunci când este posibil, prin schimbarea de variabile, integrarea prin părţi etc;

• folosirea metodei Simpson, cu excluderea singularităţilor, prin înlocuirea limitei 1 cu ε−1 , cu ε suficient de mic;

• folosirea cuadraturii, bazate pe aproximarea funcţiei cu polinoame.

14.1.8. Integrarea dublă numeric

În multe situaţii, se întâlnesc integrale duble definite, având aplicabilitate la calculul ariei unui domeniu plan, ariei unei suprafeţe din spaţiu, volumului corpurilor, centre de greutate ale plăcilor, momente de inerţie.

O integrală dublă este

∫ ∫∫∫ ===

b a

DD

xyxfySyxfyxyxfIIa 0

d ),(d d),(dd),(

unde f, este funcţia de integrat, x şi y sunt variabilele de integrare, D este domeniul de integrare, considerat dreptunghiular, [ ] [ ]bax 0,y , ,0 ∈∈ .

Vom considera pasul de integrare egal cu h, pe ambele subdomenii ale domeniului D. Considerăm că I este numărul de subintervale spaţiale pe intervalul [0, a] şi J numărul de subintervale spaţiale pe intervalul [0, b], care, evident, vor

avea lărgimea, hJ

b

I

ahh

yx==== .

Dacă integrala dublă se calculează prin metoda trapezului, atunci :

( ) ∑∑∑∑= =

=

=

++++⋅⋅=+++⋅≅

I

i

J

jjiji

J

j

I

ijijijiji

hwfffffh

II0 0

2

,,

1

0

1

0,11,11,,

2

1 4

în care ponderile ji

w , , asociate procesului de integrare, sunt 1/4, 2/4 şi 4/4, după

cum nodul respectiv este punct de colţ, punct de margine sau punct interior. Aplicând formula lui Simpson, integrala dublă este :

( )( )

∑∑

∑∑

= =

=

=

+−−++−−++++−−−

⋅⋅=

++++++++⋅≅

I

i

J

jjiji

J

j

I

ijijijijijijijijiji

hwf

fffffffffh

II

0 0

2

,,

1

1

1

1,11,1,11,,111,11,11,11,1

2

2 1649

unde ponderile ji

w , , iau acum valori diferite de cele anterioare.

Integrarea numerică a funcţiilor 297

14.2. Funcţii Matlab pentru integrarea numerică

Funcţia trapz, realizează calculul numeric al integralei prin metoda trapezelor. Se apelează cu una dintre sintaxele:

• Z=trapz(Y) estimează aproximativ integrala lui Y pe intervalul unitate, iar pentru a calcula integrala pe alte intervale, se înmulţeste intervalul cu Z; pentru vectori, Z este un vector ce conţine integrala lui Y, iar dacă Y este o matrice, Z este un vector coloană, ce integrează fiecare coloană;

• Z=trapz(X,Y) calculează integrala lui Y, ţinând cont de X; dacă X este un vector coloană şi Y un şir a cărui primă dimensiune este length(X), trapz(X,Y) operează pe dimensiune;

• Z=trapz(…,dim) integrează pe dimensiunea lui Y, specificată de scalarul dim; lungimea lui X trebuie să fie la fel cu size(Y,dim).

Functia trapz presupune că integrantul este dat prin valori numerice, în noduri echidistante ale intervalului de integrare. Dacă funcţia de integrat este descrisă sub forma analitică )(xfy = , în primul rând, se creează cei doi vectori, care conţin valorile perechilor abscisă-ordonată (x-y).Acest lucru se realizează prin evaluarea funcţiei f(x), cu un pas adecvat pentru x şi apoi se aplică funcţia trapz.

Pentru exemplificare, se calculează numeric integrala ∫x

dxx0

)sin( , care are

valoarea exactă 2. Secvenţa Matlab este : X = 0:pi/100:pi; Y = sin(X); Z = pi/100*trapz(Y), rezultând 1.9998. Pentru un interval neuniform avem: X = sort(rand(1,101)*pi); Y=sin(X); Z = trapz(X,Y), rezultând 1.9981.

Pentru integrarea numerică cumulativă se utilizează funcţia cumtrapz, care utilizează tot metoda trapezelor şi se apelează cu una dintre sintaxele :

• Z=cumtrapz(Y) estimează aproximativ integrala cumulativă a lui Y, prin metoda trapezelor, pe intervalul unitate şi pentru a calcula integrala pe alte intervale, se înmulţeşte intervalul cu Z; pentru vectori, Z este un vector ce conţine integrale cumulative ale lui Y, iar pentru matrice, Z este o matrice de aceeaşi dimensiune cu Y, cu integralele cumulative calculate pe fiecare coloană;

• Z=cumtrapz(X,Y) calculează integrale cumulative ale lui Y, respectiv ale lui X, folosind metoda trapezelor; X si Y trebuie să fie vectori de aceeaşi lungime sau X trebuie să fie un vector coloană şi Y un şir de dimensiune length(X); dacă X este un vector coloană şi Y este un şir, a cărui primă dimensiune este length(X), cumtrapz(X,Y) operează în această dimensiune;

• Z= cumtrapz(X,Y,dim) sau Z=cumtrapz(Y,dim) integrează în dimensiunea lui Y, specificată de dimensiunea scalară dim; lungimea lui X trebuie să fie aceeaşi cu size(Y,dim).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 298

Pentru exemplificare, se consideră Y = [0 1 2; 3 4 5], aplicând Z=cumtrapz(Y,1) rezultă,

Z=[ 0 0 0 ; 1.5000 2.5000 3.5000], iar aplicând Z=cumtrapz(Y,2) rezultă,

Z=[ 0 0.5000 2.0000 ; 0 3.5000 8.0000 ].

Dacă integrantul este exprimat sub forma unei funcţii analitice, se utilizează pentru integrare funcţiile Matlab quad şi quadl sau mai vechi, quad8. Dacă funcţia de integrat este descrisă prin valori numerice, se aproximează mai întâi acestea, printr-o funcţie, utilizând o metodă de interpolare şi apoi aceasta va fi scrisă în sintaxa MATLAB, ca fişier de tip M.

Funcţia quad utilizează metoda Simpson aplicată recursiv adaptivă, având o eroare de 10-6, în versiunile mai noi şi de 10-3 în versiunile mai vechi, unde, pentru îmbunătăţirea toleranţei, se utiliza quad8, care se bazează pe o cuadratură prin metoda Newton-Cotes, în 8 puncte. Acum, aceasta cheamă practic funcţia la apelare, quadl.

Mai nou, pentru o evaluare mai bună, cu eroare relativă de 10-6, se utilizează funcţia quadl, ce are la bază metoda de cuadratură recursivă adaptivă Lobatto.

Funcţiile quad şi quadl pot trata unele singularitaţi, care se găsesc la unul dintre capetele intervalului de integrare, însă nu rezolvă singularitaţile care se găsesc în interiorul intervalului. Nici una dintre funcţiile quad, quad8, quadl nu

poate rezolva integrale cu singularităţi, de genul : ∫1

0

1dx

x. Acestea trebuie aduse la

forma unor funcţii simple, fără singularităţi.

Sintaxele de apelare a funcţiilor quad…, înţelegând prin aceasta quad, quadl sau eventual quad8, sunt :

• q = quad...('fun',a,b), returnează rezultatul integrării numerice a funcţiei fun, între limitele a şi b; funcţia fun poate fi dată sub forma unei expreii, funcţie obiect, funcţie de tip M sau vector şi, în acest caz, returnează un vector de valori;

• q = quad...('fun',a,b,tol), iterează până când eroarea relativă este mai mică decât eroarea relativă tol, care în variantele noi este implicit 1e-6, iar în cele vechi 1e-3, iar dacă tol este sub forma unui vector de două dimensiuni, tol=[rel_tol abs_tol], atunci afişează toleranţa relativă, rel_tol şi toleranţa absolută, abs_tol;

• q = quad...('fun',a,b,tol,trace), în plus, controlează, prin trace, afişarea pe ecran a valorilor intermediare;

• q = quad...('fun',a,b,tol,trace,p1,p2,...) adaugă argumentele p1, p2 funcţiei fun(x,p1,p2…), iar pentru a utiliza valorile implicite pentru tol şi trace se foloseşte matrice vidă, ca de exemplu, quad ...(('fun',a,b,[ ],[ ],p1,p2).

Pentru a preveni un ciclu infinit, atât quad cât şi quadl au limita de

Integrarea numerică a funcţiilor 299

recursivitate 10. Atingerea acestei limite duce la afişarea mesajului "Recursion level limit reached in quad. Singularity likely " şi setează q=inf.

Funcţia fun se poate da : • direct ca o expresie, Q = quad('1./(x.^3+x.^2-x-2)',-1,2), rezultând -0.2632; • sub forma unei funcţii obiect, F=inline('1./(x.^3-2*x-5)'); Q= quadl(F,0,2),

rezultând Q= - 0.4605; • sub forma unei funcţii de tip M, definind anterior funcţia function y = myf(x); y = 1./(x.^3-2*x-5); şi apoi Q = quadl('myf',0,2);

Pentru rezolvarea numerică a integralelor duble se foloseşte funcţia

dblquad, care se poate apela cu una dintre sintaxele : • result=dblquad('fun',xmin,xmax,ymin,ymax), returnează rezultatul integrării

duble a funcţiei fun(x,y), unde x, aparţine intervalului [xmin xmax] şi y, aparţine intervalului [ymin ymax], funcţia fun putând fi precizată prin una dintre metodele de la funcţia quad;

• result=dblquad('fun',xmin,xmax,ymin,ymax,tol) specifică toleranţa tol, care are valoarea implicită 1e-6;

• result=dblquad('fun',xmin,xmax,ymin,ymax,tol,metod) specifică metoda de integrare, care în mod normal este quadl sau se poate face o funcţie de integrare de către utilizator, având grijă ca argumentele să fie transmise în aceeaşi ordine ca şi la quadl;

• result=dblquad('fun',xmin,xmax,ymin,ymax,tol,metod,p1,p2,...) adaugă argumentele p1, p2 funcţiei fun(x,p1,p2…), iar pentru a utiliza valorile implicite pentru tol şi metod se foloseşte matrice vidă, ca, de exemplu, dblquad ...(('fun',a,b,[ ],[ ],p1,p2..) sau

dblquad(fun,xmin,xmax,ymin,ymax,1.e-6,@quad,p1,p2,...).

Integrarea funcţiei [ ] [ ]πππ ,0 ,2, ,cossin ∈∈⋅+⋅ yxyxxy se face utilizând următoarea secvenţă :

Q = dblquad(inline('y*sin(x)+x*cos(y)'), pi, 2*pi, 0, pi), rezultând Q = -9.8696, x fiind un vector, iar y un scalar.

15. REZOLVAREA NUMERICǍ A ECUAŢIILOR

DIFERENŢIALE

15.1. Ecuaţii diferenţiale. Soluţia generală. Soluţii particulare

Istoric, ecuaţiile diferenţiale au apărut din necesitatea modelării matematice a fenomenelor din fizică, chimie şi inginerie. Mai recent, aceste ecuaţii diferenţiale apar în modelele din medicină, biologie, antropologie şi calculul probabilităţilor.

O ecuaţie diferenţială este o ecuaţie care conţine funcţia şi una sau mai multe derivate ale acesteia. Ecuaţia este o ecuaţie diferenţială ordinară (ODE), dacă funcţia necunoscută depinde numai de o variabilă independentă.

Câteva exemple de ecuaţii diferenţiale ordinare (ODE) sunt,

• ecuaţia creşterii: )()( tGtFdt

du⋅= ;

• ecuaţia pendulului: )()sin(2

2

tFl

g

dt

d=θ⋅+

θ;

• ecuaţia van der Pol: ( ) 0122

2

=+⋅+⋅ε+ ydt

dyy

dt

yd;

• ecuaţia oscilatorului LRC: )(2

2

tEC

E

dt

dQR

dt

QdL =+⋅+⋅ ;

• ecuaţia Riccati: 0)()()( 2=+⋅+⋅+ tRytQyxP

dt

dy sau

0)()()( 2=+⋅+⋅+ tRytQyxP

dt

dy

în care: t este variabila independentă, iar pQyu ,,,,θ , sunt variabilele dependente.

O ecuaţie diferenţială de ordinul n, este o relaţie de forma,

( )( ) 0,,,, =′n

yyyxF L ,

în care n se numeşte ordinul ecuaţiei diferenţiale, ( )( )nyyyxF ,,,, L′ este o funcţie

reală definită pe [ ]1 , , +

⊂×n

RYYba , având argumente variabila reală [ ]bax ,∈ , iar

y este o funcţie reală, având derivate până la gradul n, ( )nyyy ,,, L′′′ .

O ecuaţie diferenţială se spune că este de ordin superior, dacă ordinul său, n, este mai mare sau egal cu 2.

O funcţie ( )xy ϕ= , derivabilă de n ori pe [ ]ba , , se numeşte soluţie pe [ ]ba , , dacă verifică ecuaţia,

( ) ( )( )

( )( ) 0,,,, =ϕϕ′ϕ xxxxFn

L

Rezolvarea numerică a ecuaţiilor diferenţiale 301

pentru orice [ ]bax ,∈ .

Funcţia ( )nCCCx ,,,, 21 Lϕ este soluţia generală a ecuaţiei diferenţiale de ordinul

n, ( )( ) 0,,,, =′n

yyyxF L , studiată într-un domeniu [ ]yxD ,⊃ , dacă ϕ este o soluţie a

ecuaţiei şi dacă, prin alegerea convenabilă a constantelor nCCC ,,, 21 L , funcţia

( )nCCCx ,,,, 21 Lϕ , se transformă în orice soluţie a ecuaţiei diferenţiale, al cărui grafic se află în domeniul D. Soluţia generală a unei ecuaţii diferentiale se numeşte şi integrală

generală a ecuaţiei considerate. Soluţia generală a unei ecuaţii diferenţiale de ordinul n, poate fi dată şi :

• implicit, printr-o relaţie de forma ( ) 0,,,,, 21 =nCCCyxR L , care este denumită, de obicei, integrală generală;

• parametric, printr-un sistem ( )

( )

ψ=

ϕ=

n

n

CCCty

CCCtx

,,,,

,,,,

21

21

L

L.

Se numeşte soluţie particulară a ecuaţiei diferenţiale ( )( ) 0,,,, =′n

yyyxF L , o

funcţie ( )xy*

ϕ= , [ ]bax ,∈ şi ( ) Dyx ∈ , , care se obţine din soluţia generală, dând

valori particulare constantelor nCCC ,,, 21 L . Graficul unei soluţii particulare este o curbă plană, numită curbă integrală.

Se numeşte integrală intermediară a ecuaţiei diferenţiale de ordinul n, ( )( ) 0,,,, =′n

yyyxF L , o ecuaţie diferenţială de ordin kn − , care conţine 1≥k

constante arbitrare, ( )( ) 0,,,,,,,, 21 =′Ψ−

kkn

CCCyyyx LL şi care este verificată de

integrala generală. În particular, dacă 1=k , obţinem integrala primă, având forma ( )( ) 0,,,,, 1

=′Φ−

Cyyyxn

L . Cunoaşterea unei integrale intermediare simplifică rezolvarea ecuaţiei iniţiale

deoarece, în acest caz, ecuaţia ce trebuie rezolvată este de ordin mai mic, anume kn − . În particular, cunoaşterea a n integrale prime, distincte, este echivalentă cu cunoaşterea soluţiei generale.

Operatorul linear, specific ecuaţiilor diferenţiale este definit ca

( ) ( ) ( ) ( )xax

xax

xax

xaL nnnnn +⋅++⋅+⋅=−− d

d

d

d

d

d11

1-n

1

n

0 L

şi are următoarele proprietăţi : [ ] [ ] [ ]2121 yLyLyyL nnn +=+ ;

[ ] [ ] . , constCyLCyCL nn =⋅=⋅ O ecuaţie de forma

( )( )

( )( )

( ) ( ) ( ) )()(11

10 xfyLxfyxayxayxayxa nnnnn

=⇔=⋅+′⋅++⋅+⋅−

L se numeşte ecuaţie diferenţială de ordinul n, lineară şi neomogenă.

O ecuaţie de forma

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 302

( )( )

( )( )

( ) ( ) 0)(011

10 =⇔=⋅+′⋅++⋅+⋅−

yLyxayxayxayxa nnnnn

L , se numeşte ecuaţie diferenţială de ordinul n, lineară şi omogenă.

Pentru o ecuaţie diferenţială de ordinul n,

( )( ) 0,,,, =′n

yyyxF L nu este întotdeauna necesar să se găsească soluţia generală, deoarece o ecuaţie dată, corespunde unui anumit fenomen fizic.

O anumită soluţie a ecuaţiei diferenţiale, care descrie un fenomen fizic concret, trebuie să verifice atât ecuaţia, cât şi să îndeplinească anumite condiţii, care o determină în mod unic. Sunt două tipuri de condiţii : condiţii iniţiale, care apar în problemele numite, probleme cu valori iniţiale (IVP – initial value problem) şi condiţii la margine, care apar în problemele la limită (BVP – boundary value problem).

În general, se cere o soluţie a ecuaţiei date, astfel încât pentru 0xx = , funcţia y şi

derivatele ei ( )1,,, −′

nyyy L , să ia valori date dinainte 110 ,,,

−naaa L ,

10)1(

1000 )( , ,)( ,)(−

==′= nn

axyaxyaxy L , Problema determinării soluţiei y(x), care îndeplineşte aceste condiţii iniţiale se numeşte problema lui Cauchy. Pentru o ecuaţie diferenţială lineară de ordinul n, omogenă, există o singură soluţie y(x), care în punctul [ ]bax ,0 ∈ , satisface condiţiile iniţiale. Soluţia unei ecuaţii diferenţiale neomogene se obţine, adăugând la soluţia ecuaţiei omogene, o soluţie particulară (oarecare) a ecuţiei neomogene.

Problemele practice de rezolvare a ecuaţiilor diferenţiale cu condiţiile iniţiale pot fi grupate astfel:

• probleme cu valori iniţiale, la care se cunosc valorile funcţiilor yi , în zona de început a domeniului de definiţie, rezolvarea acestora furnizând informaţii despre comportamentul funcţiilor yi , în zona de sfârşit a domeniului de definiţie;

• probleme cu valori iniţiale şi finale, în care sunt cunoscute valorile funcţiilor yi , în zonele de început şi sfârşit ale domeniului de definiţie, rezolvarea completând informaţiile referitoare la aceste funcţii, în zonele din interiorul domeniului de definiţie.

Orice ecuaţie diferenţială de ordin superior poate fi transformată în seturi de ecuaţii diferenţiale de ordinul întâi, dacă se face schimbarea de variabilă D’Alambert-

Euler, )(xpy =′ , unde p(x) este funcţia necunoscută, iar y este variabila independentă

)( pyy = . Pentru cazul ecuaţiei diferenţiale de ordinul doi care are forma generală

( ) )(xnyxmy =′+′′ , efectuarea schimbării de variabile duce la stabilirea relaţiilor :

Rezolvarea numerică a ecuaţiilor diferenţiale 303

)(xpy =′ , pxmxnppxmxnp

p⋅−=′⇔⋅−= )()()()(

d

d,

unde m(x) şi n(x) , sunt funcţii oarecare cunoscute. Generalizând, pentru cazul unei ecuaţii sau sistem de ecuaţii de gradul n,

schimbarea de variabile, aplicată secvenţial, produce modificarea sistemului până la forma generală,

( ) niyyyxqy ni ,,1 ,,,,, 21 LL ==′ ,

unde, funcţiile iq , sunt considerate cunoscute.

Problemele care se reduc la ecuaţii diferenţiale ordinare de ordinul întâi sunt, în mod necesar, de tipul problemelor cu condiţii iniţiale, care sunt extrem de numeroase în calculele inginereşti.

Ecuaţia fundamentală a dinamicii punctului material are forma vectorială, FaM =⋅

unde a este acceleraţia punctului de masă M, iar F este rezultanta forţelor care lucrează asupra punctului considerat.

În cazul punctului material care descrie o dreaptă, pe care o luăm ca axă Ox, ecuaţia de mişcare devine,

=⋅ t

t

xxX

t

xM ,

d

d,

d

d2

2

,

unde X, este componenta forţei F după axa Ox, care depinde, în general, de poziţia punctului mobil, de viteza lui şi de timp. Aceasta este o ecuaţie diferenţială de ordinul al doilea.

Dacă X nu depinde de poziţia punctului x, atunci ecuaţia de mişcare devine,

=⋅ t

t

xX

t

xM ,

d

d

d

d2

2

şi cu substituţia t

xv

d

d= , ecuaţia se transformă în,

( ) ),(, d

d notatii altecu tyFyMtvX

t

vM =′⋅ →←=⋅ , adică o ecuaţie diferenţială de gradul

întâi. De aici mai rezultă că, reciproc, orice ecuaţie diferenţială de gradul (ordinul) întâi

reprezintă o anumită mişcare a unui punct material. Prin urmare, un sistem de ecuaţii diferenţiale ordinare de ordinul întâi, se poate

prezenta sub forma,

),( ),(d

)(dtyFyMytF

t

tyM =′⋅⇔=⋅ ,

şi de cele mai multe ori, matricea M este normalizată, M=1, astfel că, forma cea mai frecventă este:

),( ),(d

)(dtyFyytF

t

ty=′⇔= .

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 304

15.2. Rezolvarea numerică a ecuaţiilor difenţiale ordinare

(ODE)

Soluţia analitică a ecuaţiei difereţiale ),( tyFyM =′⋅ , poate fi obţinută doar în unele cazuri simple, pentru majoritatea situaţiilor aceasta obţinându-se cu mare dificultate. Din acest motiv, se caută metode mai uşoare, care să conducă la găsirea soluţiei.

La ora actuală, se cunosc trei categorii de medode pentru rezolvarea ecuaţiilor diferenţiale ordinare cu condiţii iniţiale, respectiv:

• metode analitice, prin care se obţin aşa numitele soluţii închise; • metode bazate pe convertirea ecuaţiei diferenţiale în ecuaţie cu

diferenţe finite de ordinul întâi, căreia i se caută soluţia analitică sau o soluţie pseudo-închisă;

• integrarea numerică a ecuaţiei diferenţiale, care apelează la metode numerice şi conduce la soluţii numerice, numite şi soluţii

deschise.

Metodele numerice de rezolvare a ecuaţiilor diferenţiale pot fi divizate în două clase:

• metode monopas sau metode de autopornire, la care, comportamentul funcţiei la pasul curent este obţinut din comportamentul funcţiei la pasul precedent, care, pentru început, rezultă din condiţia iniţială 00 )( yty = ;

• metode multipaşi sau metode de continuare, la care este necesară cunoaşterea funcţiei y în punctele precedente punctului în care se caută soluţia şi, pentru aceasta, este necesară utilizarea pentru început, a unei metode monopas.

Practic, soluţiile numerice ale ecuaţiilor diferenţiale se bazează pe dezvoltarea în serie Taylor a funcţiei.

Pentru o problemă care se reduce la rezolvarea unei ecuaţii diferenţiale de forma: ),( tyFy =′ ,

cu condiţia iniţială 00 )( yty = , dezvoltarea în serie Taylor a funcţiei )(ty , în 0tt = este

( ) ( ) ( ) L+−⋅

′′′

+−⋅

′′

+−⋅′+=3

002

00

000 !3

)(

!2

)()()()( tt

tytt

tytttytyty .

Valoarea funcţiei, 1+ny , la momentul 1+nt , în funcţie de valoarea funcţiei, ny , la

momentul nt este

L+⋅

′′′

+⋅

′′

+⋅′+=+

321 !3!2

hy

hy

hyyy nnnnn ,

Rezolvarea numerică a ecuaţiilor diferenţiale 305

unde nn tth −=+1 .

Exemple tipice de metode monopas sunt metodele Euler şi Runge Kutta. În metoda Runge-Kutta, soluţia la pasul 1+nt este obţinută funcţie de ny , ),( nn ytF , iar F(t,y) este

evaluată la paşi intermediari între nt şi 1+nt , exclusiv. Creşterea preciziei se datorează numărului mai mare de puncte în care se evaluează F, faţă de cazul seriei Taylor, când se evalua doar în punctul nt . Toate metodele monopas sunt explicite.

Metodele multipas, care au o precizie mai mare, necesită cunoaşterea valorilor L,, 21 −− nn yy şi L,, 21 −− nn FF . Se disting metode explicite şi implicite. Dacă F este o

funcţie nelineară de y, pentru a obţine soluţia la fiecare pas, metodele implicite necesită rezolvarea unor sisteme de ecuaţii nelineare, crescând timpul de calcul, dar asigură avantajul stabilităţii numerice a soluţiei.

15.2.1. Concepte analitice

Pentru rezolvarea numerică a ecuaţiilor diferenţiale ordinare (ODE), este uzuală clasificarea acestora în :

• ecuaţii de ordinul întâi - ecuaţii de ordin superior; • o singură ecuaţie - sisteme de ecuaţii; • lineare - nelineare; • autonome - neautonome sau cuplate; • omogene - neomogene; • valori iniţiale - valori la limită.

În continuare, se va face analiza acestor categorii analitice, din punctul de vedere al

influenţării metodelor de calcul. Aproape orice ODE de ordin superior, pentru început, se reduce la un sistem de

ecuaţii diferenţiale ordinare de primul ordin. Dacă avem o ecuaţie de ordinul n,

( ))1()( ,,,, −′=

nnyyytfy L

şi notăm

niyyi

i ,,2,1 , )1(L==

− , putem scrie:

1,,2,1 ),,,( , 11 −==′

=′

+niyytfyyy nnii LL .

Pentru sisteme neautonome, ty =0 şi atunci 1 0 =′

y . Pentru sistemele autonome,

niniygy iii ,,2,1 ,,2,1 ),( LL ===′

unde 1)(0 =iyg . În acest mod, sistemele de ecuaţii de ordin superioar se transformă în sisteme de

ecuaţii de primul ordin, după izolarea derivatei de ordin superior şi tratarea acesteia, în sensul înlocuirii cu o ecuaţie sau sistem de ordinul întâi.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 306

Metodele de calcul a sistemelor lineare şi nelineare nu sunt foare diferite, dar, în mod uzual, timpul de calcul aferent sistemelor nelineare este considerabil mai mare. Pentru a creşte viteza de calcul, sistemele de ecuaţii nelineare se linearizează,

jijii yABy ⋅+=′

unde ijA este o matrice costantă de (n+1) x (n+1), iar iB este un vector constant de

lungime n+1. Sistemul linearizat se revolvă şi apoi, cu noile valori ale lui ijA şi iB ,

se repetă liniarizarea, până când se îndeplineşte condiţia de acurateţe. Distincţia dintre ODE omogene şi neomogene este fără importanţă pentru calculele

numerice, cu excepţia problemelor cu condiţii la margine. Termenul neomogen este important pentru a obţine soluţia corectă şi, relativ neimportant, în stabilitatea numerică şi

acurateţea analizei. În multe cazuri, utilizând transformarea kjkji BAyx ⋅+=−1 , ecuaţia

diferenţială se transformă în ecuaţia omogenă jiji xAx ⋅=′ , care, pentru generalizarea

analizei, este un sistem linear, omogen jiji yAy ⋅= .

Considerând că ijA are n+1 valori proprii, nii ,,2,1,0,)( L=λ că ijA este matricea

diagonală a valorilor proprii şi matricea ijS , a vectorilor proprii, atunci kiki ySz1−

= şi

nizz iii ,,2,1,0,)( L=⋅λ=′ .

Deci, cu excepţia ecuaţiilor rigide (stiffness), pentru ecuaţiile de ordin superior sau sistemele de ecuaţii, metodele de rezolvare şi analiza acestora sunt similare celor pentru o singură ecuaţie de ordinul întâi. De notat că soluţiile unui sistem linear sunt

nicez i

t

ii L,2,1,0 ,)(

==λ

sau, funcţie de dependenţa originală a variabilelor,

i

t

ikkiki ceSzSz i )(λ

== sau n

t

in

t

i

t

ii ceSceSceSz n )()1()0(

1100λλλ

+++= L . Condiţiile iniţiale, valori iniţiale sau valori la margine sau pe frontieră, sunt foarte

importante pentru alegerea metodelor de rezolvare. Deoarece câteva metode utilizate pentru rezolvarea problemelor pe frontieră se bazează pe problemele cu valori iniţiale, vom analiza pentru început problemele cu valori iniţiale.

15.2.2. Concepte numerice

În analiza diverselor metode utilizate în rezolvarea ecuaţiilor diferenţiale ordinare sunt folosite următoarele concepte numerice:

• acurateţea - corespunde erorilor globale de trunchiere, care pot fi de amplitudine sau de fază;

• rigiditatea (stiffness) - dificultăţile de integrare a sistemelor de ecuaţii sau ecuaţiilor de ordin mare, atunci când raportul dintre cea mai mare valoare proprie şi cea mai mică valoare proprie este foarte mare;

• stabilitatea – asociată menţinerii soluţiei la o valoare finită, pentru orice

Rezolvarea numerică a ecuaţiilor diferenţiale 307

pas al calculului şi, din acest punct de vedere, putem avea: � schemă numerică stabilă – soluţiile numerice rămân finite, la orice

modificare a pasului de timp; � schemă numerică instabilă – soluţiile numerice sar la valori infinite, la

orice modificare a pasului; � schemă numerică condiţionată stabil – soluţiile numerice rămân finite,

la o modificare în limite reduse a pasului; • convergenţa – atunci când soluţiile ecuaţiilor numerice se apropie de

soluţia exactă, o dată ce dimensiunea intervalului h tinde spre zero, dar nu este obligatoriu să se găsească soluţia exactă ;

• consistenţa – atunci când diferenţa dintre soluţia exactă şi numerică tinde spre zero, independent de modul de a tinde spre zero al intervalului de discretizare.

15.2.3. Metode mono-pas sau uni-pas

Ecuaţiile diferenţiale sunt ecuaţii fără „memorie”, adică valorile lui y(t), pentru t< ti

nu afectează direct valorile lui y(t), la t<ti. Unele metode numerice au „memorie”, iar altele nu. Metodele uni-pas sau mono-pas sunt cele mai simple şi nu au memorie.

Pentru a găsi soluţia ecuaţiei difenţiale ordinare, ODE, de gradul întâi pe intervalul [a, b] , se iau t puncte egal spaţiate. Fie n un întreg pozitiv, astfel că, pasul sau dimensiunea subintervalului este nihiatnabh i ,,1,0 , ,)( L=⋅+=−= . Dacă a<b, h este pozitiv şi avem integrarea înainte, iar dacă a>b, h este negativ şi avem integrarea înapoi.

Forma generală a metodelor mono-pas este, ( ) ),( ,,( 001 tyyythyy nnnn =∆⋅+=

+

unde ∆ este funcţia care caracterizează metoda. Erorile locale de trunchiere,

( )1+phO , sunt proporţionale cu ordinul termenilor omişi din dezvoltarea în serie a

funcţiei, p+1 şi intervalul h.

Metoda Euler ia în consideraţie dezvoltarea în serie Taylor a funcţiilor, termenii conţinând derivate de ordinul doi sau mai mare fiind neglijaţi.

Negljind derivatele de ordin mai mare ca unu şi folosind notaţiile 0tth −= ,

),( 000 tyFF = , pentru lungimea subintervalului se obţine,

),( )()()( 0000000 hFyyhtyFyyhtytyty ⋅+=⇒⋅+=⇒⋅′+= , de unde se deduce relaţia de recurenţă:

1- 0 , 1 NnhFyy nnn ≤≤⋅+=+

. Deşi este foarte simplă, această metodă duce la erori mari, datorită acumulării

secvenţiale a erorilor rezultate din trunchierea dezvoltării în serie Taylor, astfel că metoda este mai mult didactică, pentru înţelegerea metodelor mai evoluate de rezolvare a ecuaţiilor diferentiale. Eroarea dată de toţi termenii care se omit, O, este proporţională cu

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 308

h2, respectiv O(h

2).

Metoda Euler modificată ia în consideraţie valoarea medie a derivatei, pe un subinterval. Considerarea doar a valorii derivatei la capătul din stânga al acestuia este principala sursă de eroare. Astfel, după ce 1- 0 , 1 NnhFyy nnn ≤≤⋅+=

+, a fost

utilizat pentru primul subinterval, cu ajutorul lui t1 şi y1 corespunzător, pe care-l notăm )1(

1 y , se determină F1 , la capătul din dreapta şi se face media ( ) 2/ 10 FF + . Aceasta se

consideră a fi 0F , în ecuaţia iniţială şi se reia calculul, obţinând o valoare îmbunătaţită a

lui y1, pe care o notăm cu )2(1 y . Dacă este cazul, procesul se repetă de un număr de p ori,

înainte de a trece la următorul subinterval, unde se procedează în acelaşi mod. Cu această perfecţionare, metoda este foarte utilizată. Metoda se mai numeşte şi metoda implicită

într-un pas sau metoda punctului mijlociu, fiind aplicată sistemelor rigide. Relaţia de recurenţă este,

( ) ( ),2,2 ,,

1,- 0 ,

121

21

KyhtFhKytFhK

NnKyy

nnnn

jn

++⋅=⋅=

≤≤+=+

Eroarea dată de toţi termenii care se omit este proporţională cu h3, respectiv O(h3).

Pentru rezolvarea problemelor rigide (stiff) se aplică metoda lui Euler implicită, care are la bază relaţia,

),( 111 +++⋅+= nnnn ytFhyy .

În schema implicită, obţinerea soluţiei este mai dificilă, cu atât mai mult dacă f este nelineară, dar metoda este mai stabilă.

O altă metodă de autopornire, dar cu o eroare de trunchiere considerabil mai mică, este metoda Runge-Kutta, care face integrarea tot pe subintervale. Unul dintre principalele avantaje ale metodei constă în faptul că se aplică uşor, pentru orice tip de ecuaţie de ordinul întâi şi permite chiar varierea pasului reţelei.

Considerând subintervalul de discretizare dintre nt şi 1 +nt , metoda utilizează

estimarea valorii funcţiei, atât la capele subintervalului, cât şi la mijlocul acestuia. Sunt cunoscute două submetode Runge-Kutta:

• metoda Runge-Kutta de ordinul 2 , la care sunt trunchiaţi termenii conţinând derivate de ordin superior lui trei, din dezvoltarea în serie Taylor a funcţiei şi care are la bază relaţiile de recurenţă,

( )

( ) ( ),, ,,

1,- 0 ,5.0

121

211

KyhtFhKytFhK

NnKKyy

nnnn

nn

++⋅=⋅=

≤≤+⋅+=+

Eroarea este proporţională cu h3, respectiv O(h3);

• metoda Runge-Kutta de ordinul 4 , la care sunt trunchiaţi termenii conţinând derivate de ordin superior lui cinci, din dezvoltarea în serie Taylor a funcţiei.

Rezolvarea numerică a ecuaţiilor diferenţiale 309

( )

( ) ( )

( ) ( )., ,2,2

,2,2 ,,

1,- 0 ,2261

3423

121

43211

KyhtFhKKyhtFhK

KyhtFhKytFhK

NJnKKKKyy

nnnn

nnnn

nn

++⋅=++⋅=

++⋅=⋅=

≤≤+++⋅+=+

Eroarea este proporţională cu h5, respectiv O(h5).

De menţionat că mărirea preciziei metodei nu este posibilă. Din relaţiile de recurenţă se observă că, pentru determinarea funcţiei y în punctele reţelei de discretizare, nu este nevoie decât de valoarea funcţiei în punctul precedent.

15.2.4. Metode multi-pas

Metodele multi-pas sunt metode de continuare şi deci, necesită aplicarea unor metode uni-pas, care să permită cunoaşterea valorilor L,, 21 −− nn yy şi L,, 21 −− nn FF . Prin aceasta, metodele se consideră că sunt „cu memorie”.

Relaţia de bază a metodelor multi-pas, aici cu m paşi, este

0),(0

110

1 =⋅⋅−⋅ ∑∑=

−+−+

=

−+

m

iinini

m

iini ytFbhya ,

fiind definită pentru un număr de m paşi şi de parametrii ai şi bi. O reducere a generalizării este atunci când .10 =a Dacă 00 =b , metoda este explicită, altfel este implicită. De notat că algoritmii multi-pas necesită evaluarea numai a unei noi funcţii, la fiecare pas.

Sunt foarte multe metode multi-pas, grupate în familii de metode, în care fiecare membru al familiei găseşte soluţia, cu o anumită acurateţe. Cele mai populare familii sunt familiile Adams-Bashforth, Adams-Moulton, Gear.

Metodele Adams-Bashforth consideră 11 −=a , 00 =b - adică algoritmul este

explicit şi Kiai L,3,2 ,0 == , unde K este ordinul, respectiv m=K. Relaţiile, în funcţie de ordin, sunt:

• Ordinul întâi: ),(1 nnnn ytFhyy ⋅+=+

;

• Ordinul secund: ( )111 ,(),(32

1−−+

−⋅+= nnnnnn ytFytFhyy ;

• Ordinul trei: ( )),(5,(16),(2312

122111 −−−−+

+−⋅+= nnnnnnnn ytFytFytFhyy ;

• Ordinul patru:

−+

+−

⋅+=

−−−−

−−

+

),(9),(37

,(59),(55

24

1

3322

111

nnnn

nnnnnn

ytFytF

ytFytFhyy ;

• Ordinul cinci:

+

−+

+−

⋅+=

−−

−−−−

−−

+

),(251

),(1274),(2616

,(2774),(1901

720

1

44

3322

11

1

nn

nnnn

nnnn

nn

ytF

ytFytF

ytFytF

hyy ;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 310

• Ordinul şase:

−+

−+

+−

⋅+=

−−−−

−−−−

−−

+

),(475),(2877

),(7298),(9982

),(7923),(4277

1440

1

5544

3322

11

1

nnnn

nnnn

nnnn

nn

ytFytF

ytFytF

ytFytF

hyy .

Metodele Adams-Moulton consideră 11 −=a , 00 ≠b - adică algoritmul este

implicit şi 1,3,2 ,0 −== Kiai L , unde K este ordinul, respectiv m=K. Relaţiile, în funcţie de ordin, sunt:

• Ordinul întâi: ),( 111 +++⋅+= nnnn ytFhyy ;

• Ordinul secund: ( )nnnnnn ytFytFhyy ,(),(2

1111 −⋅+=

+++;

• Ordinul trei: ( )),(,(8),(512

111111 −−+++

−+⋅+= nnnnnnnn ytFytFytFhyy ;

• Ordinul patru:

+−

−+

⋅+=

−−−−

++

+

2211

111

,(),(5

),(19),(9

24

1

nnnn

nnnnnn

ytFytF

ytFytFhyy ;

• Ordinul cinci:

−+−

−+

⋅+=

−−

−−−−

++

+

),(19

),(106),(2646

),(646),(251

720

1

33

2211

11

1

nn

nnnn

nnnn

nn

ytF

ytFytF

ytFytF

hyy ;

• Ordinul şase:

+−

−+−

−+

⋅+=

−−−−

−−−−

++

+

),(27),(173

),(482),(798

),(1427),(475

1440

1

4433

2211

11

1

nnnn

nnnn

nnnn

nn

ytFytF

ytFytF

ytFytF

hyy ;

Metodele Gear consideră 00 ≠b - adică algoritmul este implicit şi 0=ib ,

Ki L,3,2,1 = , unde K este ordinul, respectiv m=K. Relaţiile, în funcţie de ordin, sunt:

• Ordinul întâi: ),( 111 +++⋅+= nnnn ytFhyy ;

• Ordinul secund: ( )),(243

11111 ++−+

⋅+−+= nnnnnn ytFhyyyy ;

• Ordinul trei: ( )),(6291811

111211 ++−−+

⋅++−+= nnnnnnn ytFhyyyyy ;

• Ordinul patru:

⋅+−

−+−

+=

++−

−−

+ ),(123

163648

25

1

113

211

nnn

nnn

nnytFhy

yyyyy ;

• Ordinul cinci:

⋅++

+−+−

+=

++−

−−−

+ ),(6012

75200300360

137

1

114

3211

nnn

nnnn

nnytFhy

yyyyyy ;

Rezolvarea numerică a ecuaţiilor diferenţiale 311

• Ordinul şase:

⋅+−+

+−+−

+=

++−−

−−−

+ ),(601072

225400450360

147

1

1154

3211

nnnn

nnnn

nnytFhyy

yyyyyy ;

15.2.5. Sisteme de ecuaţii diferenţiale ordinare de gradul întâi

Un sistem de ecuaţii diferenţiale de ordin superior poate fi transformat într-un sistem de ecuaţii diferenţiale de ordinul întâi, prin introducerea unor funcţii necunoscute.

Rezolvarea unui sistem de n ecuaţii diferenţiale de ordinul întâi se poate reduce la rezolvarea unei ecuaţii diferentiale de ordinul n şi invers.

Rezolvarea unei ecuaţii diferenţiale de ordinul n se poate reduce la rezolvarea unui sistem de ecuaţii diferenţiale de ordinul întâi.

Un sistem ODE se poate scrie generic sub forma:

0)0( ),,(y yyytf ==′ ,

unde y, este un vector de elemente iy şi ),,,,,( 321 myyyytf L , este vector funcţie, cu elementele fi.

Din punctul de vedere al soluţiilor numerice, sistemele ODE sunt extensii înainte ale tehnicii aplicate unei singure ODE. De exemplu, aplicând schema explicită Euler, avem:

( ) miyyyytfhyyn

mnnnnn

i

n

i ,,3,2,1 ,,,,, )()(3

)(2

)(1

)()()1(LL =⋅+=

+ . Expresia din partea dreaptă poate fi calculată utilizând datele de la pasul anterior

astfel că, fiecare determinare se face prin avansarea calculului înainte, în sensul creşterii lui t. Din punct de vedere conceptual, aceasta este singura deosebire fundamentală dintre soluţionarea numerică a sistemelor, faţă de o singură ecuaţie.

O categorie aparte de sisteme ODE o reprezintă sistemele de ecuaţii lineare cu coeficienţi constanţi, pentru care se pune problema rigidităţii (stiffness),

0)0( , yyyAdt

dy=⋅= ,

unde A este o matrice de n x n , a constantelor. Sistemul este de n ecuaţii lineare cu n funcţii necunoscute, cu coeficienţi constanţi, omogen.

Pentru ca sistemul să fie determinat, să aibă soluţii, trebuie ca toate valorile proprii ale lui A să aibă partea reală negativă, analog cu cazul unei singure ecuaţii, y⋅λ=′y ,

când partea reală a lui λ , trebuie să fie negativă. Aplicând schema Euler ,explicită, sistemului ODE avem

( ) nnnn yAhIyAhyy ⋅⋅+=⋅⋅+=+1 sau ( ) 00 yByAhIy

nn

n ⋅=⋅⋅+= , unde I, este matricea identitate. Pentru a avea soluţii numerice stabile, pentru cazul

lui n mare, trebuie ca matricea nB să fie finită. Din algebra lineară rezultă că,

pentru aceasta, trebuie ca valorile proprii ale lui B, să aibă modulul mai mic sau cel mult egal cu unitatea. Valorile proprii ale lui B sunt ii h λ⋅+=σ 1 , unde iλ , sunt valorile proprii ale matricei A.

Prin urmare, pentru stabilitatea numerică, trebuie să avem:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 312

max

211

i

i hhλ

≤⇒≤λ⋅+ .

Dacă rangul magnitudinii valorilor proprii este mare, de exemplu 1minmax >>λλ≡ iiiiS , unde S ,se numeşte raportul de rigiditate (stiffness ratio) şi

soluţiile se caută pentru o variaţie largă a variabilei independente t, avem aşa numitele sisteme rigide (stiff). Acestea apar în situaţii reale, în care sunt cuplate sisteme cu timpi diferiţi de răspuns la excitaţii exterioare, ca de exemplu: un sistem mecanic compus din două părţi, una foarte rigidă şi cealaltă foarte flexibilă; amestecul a două substanţe chimice cu rate de reacţie foarte diferită; strat limită.

În general, astfel de sisteme nu pot fi rezolvate prin scheme directe ci necesită aplicarea unor metode implicite care, la rândul lor, conduc la necesitatea rezolvării unui sistem algebric de ecuaţii nelineare, pentru care se aplică procedurile de calcul iterativ, precum metoda Newton-Raphson.

Pentru rezolvare, sistemele de ecuaţii diferenţiale nelineare sunt supuse tehnicii de

linearizare. Pentru un sistem ODE, la fiecare moment este necesară rezolvarea sistemului de ecuaţii algebrice,

( ) ( )( ))()()()1()()()1( ,,22

nnnnnnnytfytfA

hI

hyy +

−+=

++ , mn L,3,2,1 =

în care I, este matricea identitate, iar A este matricea Jacobian, recalculată la fiecare pas,

=

m

mmm

m

m

n

dy

df

dy

df

dy

df

dy

df

dy

df

dy

df

dy

df

dy

df

dy

df

A

L

MLMM

L

L

21

2

2

2

1

2

1

2

1

1

1

)( .

15.2.6. Probleme cu condiţii la margine

Problemele cu condiţii la margine (pe frontieră sau la limită) conduc, în mod necesar, la ecuaţii diferenţiale de ordinul doi sau mai mare. Dintre acestea, ecuaţiile de ordin impar, cu număr diferit de condiţii la cele două margini ale intervalului de definiţie sunt, de regulă, greu de soluţionat numeric şi sunt transformate, de obicei, în ecuaţii de ordin par, fie prin integrare, fie prin derivare.

Considerăm o ecuaţie de ordinul doi cu condiţii la margine, ( )yyxfy ′=′′ ,, , 0)0( yy = , LyLy =)( ,

unde f, este o funcţie arbitrară. Sunt cunoscute două tehnici pentru rezolvarea problemelor cu condiţii la margine:

Rezolvarea numerică a ecuaţiilor diferenţiale 313

� schimbarea variabilei – tehnică utilizată de metodele standard pentru problemele cu valori iniţiale, precum metodele Runge-Kutta;

� metode directe – bazate pe discretizarea puternică înainte şi transformarea ecuaţiilor cu derivate, în ecuaţii diferentiale şi apoi, rezolvând sistemul algebric astfel format.

15.2.7. Probleme cu valori proprii

În cazul în care ecuaţia diferenţială de ordinul doi cu condiţii la margine este omogenă, caz frecvent întâlnit, ca de exemplu ecuaţia lui Helmholtz,

0 2=⋅+′′ yky , ,0)1()0( == yy

apare o problemă cu valori proprii, Nnnkn ,,2,1 , L=π⋅=

şi vectori proprii, )sin()( xnxyn ⋅π⋅= .

Punând 22- xk ∆⋅=λ , sistemul se poate scrie sub forma 0)-(A =⋅⋅λ yI , în care I este maticea identitate, A este aşa numita matrice Stieltjes,

=

200

02 1

012

L

MLMM

L

L

A , iar

=

−1

2

1

Ny

y

y

yM

.

15.3. Funcţii Matlab pentru rezolvarea ODE

Funcţiile Matlab pentru rezolvarea ecuaţiilor diferenţiale ordinare, ODE, încep cu sintaxa ode,urmată de numere şi litere, care să precizeze tipul metodei folosite, astfel că, în continuare, le numim generic, funcţii funode şi sunt prezentate în tabelul 15.1.

Toate funcţiile ode pot rezolva ecuaţii de tipul,

),( ),(d

)(dtyFyMytF

t

tyM =′⋅⇔=⋅ ,

iar funcţiile ode15s, ode23s, ode23t şi ode23tb pot rezolva şi ecuaţii de forma

),()( ),(d

)(d)( tyFytMytF

t

tytM =′⋅⇔=⋅ .

Funcţiile ode se apelează cu una dintre sintaxele: • [T,Y] = funode('F',interval,y0), unde Y este matricea soluţiilor, în care

fiecărui rând îi corepunde un moment de timp din vectorul coloană T , F o funcţie de variabile t şi y, interval este intervalul de integrare, [to tfinal], iar pentru a obţine soluţii în anumite momente (de exemplu toate crescătoare), intervalul este de forma [t0 t1 t2 …

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 314

tfinal], şi y0 este vectorul condiţiilor iniţiale; • [T,Y] = funode('F',interval,y0,optiuni) face acelaşi lucru ca şi precedenta,

cu diferenţa că parametrii impliciţi de integrare au fost înlocuiţi cu „opţiuni”, un argument creat cu funcţia odeset, care include toleranţa erorii relative, TelTol=1e-3 şi un vector al erorii absolute, AbsTol, ce are toate elementele egale cu 1e-6;

• [T,Y] = funode('F',interval,y0,optiuni,p1,p2,...) transferă funcţiei F parametrii opţionali p1,p2,….

Funcţii Matlab pentru ODE Tabel 15.1.

Funode Metoda

numerică

Tipul de

problemă

Complexitatea

ecuaţiei

Toreranţa Utilizare

ode45 Runge-Kutta

nerigide (nonstiff)

medie mică în mod uzual, se recomandă a se încerca prima dată

ode23 Runge-Kutta

nerigide (nonstiff)

mică mare pentru toleranţe mari ale erorii sau rezolvarea ecuaţiilor cu complexitate medie

ode113 Adams-Bashfort-Moulton

nerigide (nonstiff)

variabilă mică - medie

când se doreşte o anumită toleranţă pentru erori.

ode15s diferenţe rigide (stiff)

variabilă mică - medie

când calculul cu ode45 durează prea mult

ode23s Rosenbrock modificată

rigide (stiff)

mică mare când se doresc toleranţe mai mari în ce priveşte eroarea, la rezolvarea sistemelor cu complexitate mare

ode23t Runge-Kutta

semi - rigide

medie mică când complexitatea ecuaţiei este moderată

ode23tb rigide (stiff)

mică mare toleranţe mari ale erorii, la rezolvarea sistemelor complexe

Ode45 se bazează pe formula Runge-Kutta(de gradul 4, 5) cu adaptarea Dormand-Prince şi rezolvă ecuaţiile într-un singur pas. Ode23 se bazează pe formula Runge-Kutta(de gradul 2, 3), cu adaptarea Bogacki-Shampine şi rezolvă ecuaţiile prin mai mulţi paşi. Ode15s se bazează pe formula diferenţială numerică, NDFs şi necesită mai mulţi paşi pentru rezolvare. Ode23s se bazează pe formula modificată Rosembrock şi rezolvă într-un singur pas. Ode23t se bazează pe formula Runge Kutta.

Pentru funcţiile ode15s si ode23s, care sunt nişte funcţii de complexitate mare,

Jacobianul matricei y

F

d

d are o mare influenţă asupra preciziei rezolvării şi de aceea, se

Rezolvarea numerică a ecuaţiilor diferenţiale 315

setează J constant pe „on”, dacă Jacobianul y

F

d

d este constant.

Fiecare funcţie funode acceptă numai anumiţi parametri pentru a lucra corect, sau pot fi specificaţi, dar sunt ignoraţi în rezolvare. Parametrii acceptaţi sunt redaţi în tabelul

15.2.

Funcţii Matlab pentru ODE Tabel 15.2.

Parametri ode45 ode23 ode113 ode15s ode23s ode23t ode23tb

RelTol, AbsTol OutputFcn, OutputSel,

Refine, Stats

Events MaxStep, InitialStep JConstant, Jacobian, JPattern, Vectorized -- -- --

Mass MassConstant

-- --

-- --

-- --

--

--

--

MaxOrder, BDF -- -- -- --

Pentru a crea sau schimba opţiunile implicite pentru funcţiile funode, se foloseşte funcţia odeset, care se apelează cu una dintre sintaxe:

• opţiuni = odeset ('nume1',valoare1,'nume2',valoare2,...) creează o structură de opţiuni, în care argumentele nume1, nume2,… primesc valorile valoare1, valoare2,…, argumentele nespecificate sunt iniţializate automat, cu o matrice goală, [ ] şi este suficient să scriem numai caracterele de început, care identifică în mod unic numele argumentelor, fără a se ţine cont dacă, caracterele sunt litere mari sau mici (nu e „case sensitive”);

• opţiuni = odeset (optiunivechi,'nume1',valoare1,...) schimbă conţinutul unei structuri vechi de opţiuni, creată anterior;

• opţiuni = odeset (optiunivechi,optiuninoi) modifică o structură de opţiuni vechi, combinând-o cu una nouă;

• odeset singur, fără nici o specificaţie, afişează toate argumentele precum şi valorile lor posibile: AbsTol: [ positive scalar or vector {1e-6}], BDF: [ on | {off} ], Events: [ on | {off} ], InitialStep: [ positive scalar ], Jacobian: [ on | {off} ], JConstant: [ on | {off} ], JPattern: [ on | {off} ], Mass: [ on | {off} ], MassConstant: [ on | {off}], MaxOrder: [ 1 | 2 | 3 | 4 | {5} ], MaxStep: [ positive scalar ], OutputFcn: [ string ], OutputSel: [ vector of integers ], Refine: [ positive integer ], RelTol: [ positive scalar {1e-3} ], Stats: [ on | {off} ], Vectorized: [ on | {off} ].

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 316

15.3.1. Rezolvarea Matlab a ecuaţiilor diferenţiale

Pentru rezolvarea ecuaţiilor diferenţiale cu funcţiile funode, din Matlab este necesară scrirea expresiei funcţiei F şi a soluţiei iniţiale, y, care depinde de elementele funcţiei.

Forma Matlab a funcţiei F este: function ydot=F(t,y) y(1) = expresie 1; y(2) = expresie 2; y(3) = expresie 3; ydot = [ y(1); y(2); y(3) ]

Forma pentru vectorul soluţii ,y0 este, de exemplu, [2; 0 ; 1], ceea ce reprezintă: y(1)0 = 2, y(2)0 = 0, y(3)0 = 1.

Pentru ODE de ordin superior este necesară transformarea acestora în ODE de ordinul 1. De exemplu, pentru funcţia f(t, y, y', y'',..., yn-1), se definesc,

y1 = y ; y2 = y' ; y3 = y''; ... , yn = yn-1; Y=[ y1 , y2 , y3 , yn ]

astfel că, f(t, y, y', y'',..., yn-1) = f(t, y1 , y2 , y3 , y

n) ; Y'=f(t,Y) se scriu expresiile,

y1' = y2 ; y2' = y3 ; y3 '= y4 ; ... ; yn ' = yn ; şi în final, funcţia F:

function ydot=F(t,y) expresie 1: y1' = y2 ; expresie 2: y2' = y3 ; expresie 3: y3 '= y4 ; ….. ... ; expresie n-1: yn ' = yn ; ydot = [ expresie 1; expresie 2; expresie 3; ….; expresie n-1 ].

Pentru a scrie funcţia odef1.m, care să rezolve ecuaţia y''' + y'' + y' =0,se urmează paşii:

Pasul 1: se definesc y1 = y ; y2 = y' ; y3 = y'' ; Pasul 2: se scriu expresiile y1'= y2 ; y2' = y3 ; y3''' = - y'' -y' = -y3 - y2 ; Pasul 3: se srie funcţia odef1: % Function odef1.m function ydot=odef1(t,y) % ydot = [y(2);y(3); -y(3)-y(2)]; T1=y(2) ; T2=y(3) ; T3=-y(3) - y(2); ydot = [ T1 ; T2 ; T3 ]; Rezolvarea acestei ecuaţii pe intervalul ti=[0 20] , cu soluţia iniţială y0= [10;1;0],

precum şi plotarea soluţiilor, se realizează cu următoarea secvenţă de program: y0=[10;1;0]; ti=[0 20]; [t,y]=ode45('odef1',ti,y0);

Rezolvarea numerică a ecuaţiilor diferenţiale 317

subplot(3,1,1); plot(t,y(:,1)); xlabel('t'); ylabel('dy/dt'); subplot(3,1,2); plot(t,y(:,2)); xlabel('t'); ylabel('d^2y/dt^2'); subplot(3,1,3); plot(t,y(:,3)); xlabel('t'); ylabel('d^3y/dt^3').

Graficul este reprezentat în figura 15.1.

Fig.15.1. Rezolvarea ecuaţiei odef1

Un exemplu de sistem cu complexitate mică este un sistem de ecuaţii care descriu mişcarea unui corp rigid , asupra căruia nu acţionează forţe exterioare, dat de ecuaţiile,

321 yyy ⋅=′ ; 312 yyy ⋅−=′ ; 213 51.0 yyy ⋅⋅−=′ ;

0)0(1 =y ; 1)0(2 =y ; 1)0(3 =y . Pentru rezolvare se creează o funcţie fişier .M :

function dy = rigid(t,y) dy = zeros(3,1); % a column vector dy(1) = y(2) * y(3); dy(2) = -y(1) * y(3); dy(3) = -0.51 * y(1) * y(2); dy=[dy(1); dy(2); dy(3)];

În acest exemplu vom schimba toleranţa erorii cu comanda odeset şi vom rezolva, pe intervalul [0 12], cu vectorul de condiţii iniţiale [0 11], la momentul 0.

options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]); [t,y] = ode45('rigid',[0 12],[0 1 1],options); plot(t,y(:,1),'-r',t,y(:,2),'b-.',t,y(:,3),'g.'); ylabel('dy/dt , d^2y/dt^2 , d^3y/dt^3 '); xlabel('t'); gtext('dy/dt') ; gtext('d^2y/dt^2') ; gtext('d^3y/dt^3').

Graficul funcţiei este redat în figura 15.2. Un exemplu de sistem cu grad de complexitate mare sunt ecuaţiile Van der Pol,

ecuaţii ce descriu oscilaţiile

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 318

21 yy =′ ; ( ) 12212 11000 yyyy −⋅−⋅=′ ; 0)0(1 =y ; 1)0(2 =y .

Fig.15.2. Graficul funcţiei rigid

Pentru rezolvare se creează o funcţie fişier .M : function dy = vdp1000(t,y) dy = zeros(2,1); dy(1) = y(2); dy(2) = 1000*(1 - y(1)^2)*y(2) - y(1);

Se folosesc toleranţele absolute şi relative implicite (1e-3 şi respectiv 1e-6) şi vom rezolva pe intervalul [0 3000], cu vectorul de condiţii initiale [0 2], la momentul 0.

[t,y] = ode15s('vdp1000',[0 3000],[2 0]); plot(t,y(:,1),'-o'); ylabel('dy/dt') ; xlabel('t');

Graficul primei derivate se prezintă în figura 15.3.

Fig.15.3. Graficul primei derivate a ecuaţiei Van der Pol

16. CREAREA ŞI CONTROLUL GRAFICELOR

16.1. Crearea şi controlul figurilor

Aceste funcţii sunt : figure, gcf, clf, shg, close, refresh, openfig. Funcţia figure creează o nouă figură şi poate fi apelată simplu figure, cu care

se creează o figură, denumită implicit figura 1, sau figure( nr.) prin care se creează o figură cu numărul nr., după care se returnează controlul. De exemplu, figure(20) deschide o figură cu numărul 20.

Găsirea numărului ultimei figuri deschise se obţine cu instrucţiunea, N=gcf,

care returnează numărul ultimei figuri, respectiv N=20. Ştergerea unei figuri, în sensul a ceea ce are desenat, se relizează cu

instrucţiunea clf. Dacă sunt deschise mai multe figuri şi se doreşte ştergerea unei figuri având un anumit număr, num, atunci comanda este clf(num). Resetarea tuturor datelor dintr-o figură se execută prin clf reset, care restabileşte toate obiectele din axele curente şi proprietăţile axelor, cu excepţia poziţiei, la valorile implicite.

Deschiderea ultimei figuri apelate sau trasate se obţine prin comanda shg. Închiderea unei figuri se realizează prin comanda close, care poate fi apelată

sub forma: • close, prin care se închide ultima figură; • close(num), prin care se închide figura numărul num; • close('nume'), prin care se închide figura având numele nume; • close all, prin care se închid toate figurile deschise; • close all hidden, prin care se închid toate deschiderile windows făcute.

Verificarea dacă o anume figură a fost închisă sau nu se realizează cu comanda status=close(num), care returnează 1, dacă figura numărul num este închisă şi 0, dacă nu a fost închisă.

Reâmprospătarea unei figuri se obţine cu comanda refresh. Deschiderea unei figuri specifice Matlab, având extensia fig. se execută cu

comanda openfig, care poate fi apelată: • openfig('nume.fig', 'new') sau openfig('nume.fig') ; are ca efect

deschiderea figurii cu numele nume şi extensia fig; • openfig('nume.fig', 'reuse') are ca efect deschiderea unei copii a figurii

cu numele nume şi extensia fig.

Verificarea dacă o anume figură a fost deschisă sau nu se realizează cu comanda F=openfig('nume.fig'), care returnează 1, dacă figura numărul num este închisă, şi 0, dacă nu a fost închisă.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 320

16.2. Proprietăţile obiectului figure

Proprietăţile obiectului figură, figure, pot fi specificate la crearea acesteea, prin includerea perechilor nume-valoare_proprietate sau, ulterior, prin identificarea obiectului şi folosirea funcţiilor set şi get.

În continuare sunt prezentate proprietăţile acceptate pentru obiectul figure şi valorile posibile ale fiecărei proprietăţi.

1. Children - vector_identificatori Această proprietate este un vector al identificatorilor obiectelor, vector_identificatori, reprezentate în axe. Obiectele derivate ale axelor sunt axele, elementele de control ale interfeţelor grafice şi meniurile.

2. Color - culoare Proprietatea Color specifică culoarea folosită pentru fondul ferestrei grafice a figurii. Culoarea poate fi specificată utilizând un vector al valorilor RGB sau un nume de culoare predefinită în Matlab. Valoarea implicită a acestei culori este cea a culorii de fond a ferestrei grafice (background).

3. Colormap - matrice m x 3 Această proprietate este o matrice m x 3 a ponderii culorii fundamentale (RGB) care defineşte o culoare individuală. Comenzile grafice ataşează fiecărui triplet câte o valoare, culorile fiind apelate prin indicii corespunzători. Spre exemplu, indexul 1 specifică primul triplet RGB, indexul 2 specifică al doilea triplet RGB ş.a.m.d. Matricea de culoare poate avea orice lungime, însă trebuie să aibă trei coloane. Matricea de culoare a figurii implicite are 64 de culori predefinite. Aceasta poate fi înlocuită prin orice altă matrice definită de utilizator sau dintre cele predefinite. Pentru definirea matricei de culoare trebuie specificată intensitatea culorii roşu în prima coloană (Red), a culorii verde (Green) în a doua şi a culorii albastru (Blue) în a treia coloană. Intensitatea culorilor este un număr real cuprins între 0.0 şi 1.0. Valoarea 0 indică lipsa componentei respective, iar valoarea 1 indică intensitatea maximă a acesteia. Astfel, tripletul [0 0 0] reprezintă culoarea negru, [1 1 1] reprezintă culoarea alb, [0.5 0.5 0.5] reprezintă culoarea gri, iar [127/255 1 212/255] este aquamarine.

4. CurrentAxes - identificator_axe Prin această proprietate este posibilă returnarea identificatorului axelor curente ale figurii, identificator_axe, care este identic cu identificatorul obţinut prin funcţia gca. În toate figurile care au axe copii, acest identificator este acela al axelor curente. Axele pot fi făcute curente folosind funcţiile axes şi set. Dacă nu există axe copil într-o figură, se pot

Crearea şi controlul graficelor 321

crea unele cu comanda h=get(gcf,'CurrentAxes'), care returnează şi identificatorul h.

5. CurrentMenu - identificator_meniu Această proprietate conţine identificatorul celui mai recent meniu selectat. Dacă se specifică un singur identificator pentru meniuri, identificator_meniu, cu mai mult de o opţiune, este necesară o apelare a acestei proprietăţi, pentru a vedea care meniu a fost apelat.

6. CurrentObject -identificator_obiect Prin această proprietate se returnează identificatorul obiectului, identificator_obiect, care se găseşte la punctul curent, CurrentPoint. În cazul obiectelor multiple suprapuse, obiectul selectat este cel care a fost primul plasat în figură. Se poate utiliza această proprietate pentru a determina ordinea în care au fost plasate obiectele grafice într-o figură.

7. CurrentCharacter - caracter Această proprietate returnează ultima tastă apăsată în figura curentă, care se poate citi cu instrucţiunea get(gcf,'CurrentCharacter').

8. CurrentPoint - [ x y ] Proprietatea returnează coordonatele poziţiei în care a fost apăsat sau eliberat butonul mouse-ului pe figură (fereastra grafică). Coordonatele punctului curent sunt măsurate din colţul stânga jos al ferestrei grafice, în unităţi precizate de proprietatea Units, cu o comandă de forma get(gcf,'CurrentPoint'). Proprietatea se poate folosi şi pentru a urmări locul şi numărul de puncte selectate cu mouse-ul în fereastra grafică, prin diferenţă.

9. InvertHardcopy - on sau off Această proprietate are efect numai la tipărirea ferestrei grafice. Deoarece fondul ferestrei grafice a Matlab este implicit de culoare neagră, pentru a tipări la imprimantă pe un fond alb, se foloseşte această proprietate InvertHardcopy. Dacă InvertHardcopy este on, Matlab converteşte fondul reprezentării grafice la culoarea alb şi axele, subdiviziunile, etichetele axelor etc., la culoarea negru. Această proprietate nu are efect asupra culorilor folosite pentru celelalte obiecte grafice din reprezentare. Dacă InvertHardcopy este off, care este valoarea implicită, se tipăreşte fereastra grafică aşa cum apare pe ecran.

10. MenuBar - none sau figure Proprietatea permite controlul în bara superioară de meniuri a ferestrei

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 322

grafice. Dacă este stabilită pe figure valoarea implicită, la partea superioară a ferestrei grafice se găseşte bara de meniuri, iar dacă este stabilită pe none, bara de meniuri lipseşte. Setarea se realizează prin funcţia set(gcf,'MenuBar',['figure']) sau set(gcf,'MenuBar',['none']), iar găsirea stării se execută prin comanda get(gcf,'MenuBar').

11. MinColorMap - scalar

Această proprietate stabileşte numărul de culori folosite de matricea de culoare printr-o instrucţiune de forma set(gcf,'MinColorMap',scalar), în care scalar are valoarea implicită 64.

12. Name - caractere Proprietatea permite afişarea şirului de caractere menţionat, caractere, în bara de titlu a ferestrei grafice. Implicit, acest şir de caractere este gol, fiind afişat numai: Figure No.1, pentru prima figură deschisă şi continuând cu creşterea progresivă a numărului cu ferestrele grafice deschise. Dacă se precizează acest şir de caractere, spre exemplu, „EXEMPLIFICARE”, atunci se va afişa Figure No.1: „EXEMPLIFICARE”. Comanda necesară pentru aceasta este: set(gcf,'Name','EXEMPLIFICARE').

13. NextPlot - new sau add sau replace Această proprietate este utilizată de funcţiile grafice de dificultate redusă: plot, plot3, fill, fill3, precum şi de funcţiile grafice-M: mesh, surf, bar etc., şi precizează modul cum se construieşte următorul grafic. Opţiunea new creează o fereastră grafică nouă, înainte de a afişa reprezentarea grafică. Opţiunea implicită, add, utilizează pentru reprezentarea grafică figura curentă, iar opţiunea replace şterge toate proprietăţile figurii anterioare, precum şi toţi copiii figurii, cu excepţia poziţiei (Position). Comanda subplot utilizează implicit această proprietate, subplot(1,1,1) stabilind NextPlot la replace.

14. NumberTitle - on sau off

Proprietatea afişează şirul de caractere Figure No.n, unde n este numărul figurii, dacă este on (valoare implicită) sau nu-l afişează, dacă este off. Comenzile sunt set(gcf,'NumberTitle', 'on'), pentru afişare şi respectiv set(gcf,'NumberTitle', 'off'), pentru neafişare.

15. PaperOrientation - portrait sau landscape Această proprietate precizează orientarea figurii pe pagină la tipărire. Orientarea portrait este implicită şi are dimensiunea cea mai mare a paginii pe vericală, iar landscape este cu dimensiunea cea mai mare pe orizontală.

16. PaperPosition - [ oriz vert lung lat ] Proprietatea precizează localizarea dreptunghiului în care se tipăreşte

Crearea şi controlul graficelor 323

figura pe pagină, dreptunghi definit prin matricea de poziţie, poz= [ oriz vert lung lat ] unde: oriz, vert sunt distanţele, pe orizontală şi verticală, de la colţul stânga jos al paginii până la colţul stânga jos al dreptunghiului care definesc figura; lung, lat sunt dimensiunile dreptunghiului, lungimea şi lăţimea, care definesc figura. Comanda este de forma set(gcf,'PaperPosition',[1 2 3 4]). Elementele vectorului poz sunt date în unităţile de măsură specificate de proprietatea PaperUnits.

17. PaperSize - [ lung lat ] Această proprietate conţine dimensiunile tipului de pagină, PaperType, măsurată în unităţi specificate de PaperUnits. Proprietatea se utilizează numai la citire, iar comanda este: get(gcf,'PaperSize'), rezultând dimensiunile paginii, lungimea, lung şi respectiv lăţimea, lat.

18. PaperType - usletter sau uslegal sau a4letter Proprietatea este folosită pentru a scala figura trimisă la imprimantă pe o pagină usletter cu dimensiunile 21.59 x 27.94 cm (8.5 x 11 in), care este valoarea implicită, pe o pagină uslegal cu dimensiunile 21.59 x 35.56 cm (8.5 x 14 in), sau pe o pagină a4letter cu dimensiunile 21 x 29.7 cm (8.3 x 11.7 in).

19. PaperUnits - inches sau centimeters sau normalized sau points Această proprietate specifică unităţile de măsură utilizate pentru stabilirea poziţiei figurii pe pagină (PaperPosition) şi a dimensiunii paginii (PaperSize). În toate cazurile, măsurarea se face din colţul stânga jos al paginii. Unităţile normalizate, normalized, transformă colţul stânga jos al paginii în coordonatele (0, 0), iar colţul din dreapta sus în (1.0, 1.0). Unitatea points este egală cu 0.0353 centimetri, iar celelalte unităţi de măsură sunt unităţi absolute, fiind inches, inches, sau centimetri, centimeters.

20. Parent - identificator Proprietatea este folosită numai la citit, sub forma get(gcf,'Parent') şi returnează identificatorul, identificator, obiectului rădăcină, care este părinte al obiectului figură. Identificatorul obiectului rădăcină este întotdeauna 0.

21. Pointers - arrow sau crosshair sau fullcrosshair sau ibeam sau

watch sau topl sau topr sau botl sau

botr sau left sau right sau top sau

bottom sau circle sau cross sau fleur sau

custom Această proprietate permite stabilirea semnului grafic folosit drept cursor

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 324

pentru a indica poziţia mouse-ului în fereastra grafică. Sunt posibile următoarele cursoare: valoarea implicită de săgeată (arrow), cruce redusă (crosshair), cruce pe toată dimensiunea figurii (fullcrosshair), un I (ibeam), clepsidră (watch), săgeată dublă înclinată spre stânga (topl sau botl), săgeată dublă înclinată spre dreapta (topr sau botl), săgeată dublă orizontală (left sau right), săgeată dublă verticală (top sau bottom), cerc (circle), cruce dublă (cross), cruce cu săgeţi (fleur) sau sub forma unui şurubel (custom). Modul de modificare este cu comanda set(gcf,'Pointer',['tip']), în care tip este una dintre valorile de mai sus.

22. Position - poz=[oriz vert lung lat] Prin această proprietate se specifică mărimea şi localizarea ferestrei grafice pe ecran, definită prin vectorul de poziţie, poz=[oriz vert lung lat], în care oriz, vert sunt distanţa pe orizontală şi pe verticală, de la colţul din stânga jos al ecranului până la colţul din stânga jos al ferestrei grafice, iar lung, lat sunt dimensiunile ferestrei grafice. Elementele vectorului poz sunt date în unităţi de măsură specificate de proprietatea Units. Pentru a determina poziţia ferestrei grafice curente se poate utiliza funcţia get, get(gcf,'Position'), returnând vectorul de poziţie poz, iar pentru a muta fereastra în altă poziţie se foloseşte funcţia set, de exemplu, set(gcf,'Position',[100 200 225 150]).

23. Resize - on sau off

Dacă proprietatea este on, valoare implicită, dimensiunea ferestrei grafice se poate modifica cu mouse-ul, iar dacă este off nu se poate modifica.

24. Type - şir_caractere Prin proprietatea Type se identifică tipul de obiect grafic. De exemplu, pentru obiectul figură, şirul de caractere, şir_caractere, este întotdeauna figure.

25. Units - pixels sau normalized sau inches sau centimeters sau points Această proprietate specifică unităţile de măsură utilizate pentru interpretarea dimensiunilor şi localizarea datelor. În toate cazurile măsurarea se face din colţul stânga jos al ferestrei grafice. Unităţile normalizate transformă colţul stânga jos al ferestrei grafice în coordonatele (0, 0), iar colţul din dreapta sus în (1.0, 1.0). Unitatea points este egală cu 1/72 inch, adică 0.0353 centimetri, iar celelalte unităţi de măsură sunt unităţi absolute. Proprietatea afectează proprietăţile CurentPoint şi Position. Specificarea perechilor nume-valoare proprietate, la crearea unui obiect, trebuie făcută înaintea specificării proprietăţilor care utilizează aceste unităţi.

Crearea şi controlul graficelor 325

26. UserData - matrice

Proprietatea UserData este orice matrice asociată obiectului, care poate să nu fie folosită, dar poate fi vizualizată folosind funcţia get.

27. Visible - on sau off

Această proprietate determină dacă obiectul este vizibil pe ecran, cazul on, sau nu este vizibil, cazul off. Valoarea implicită este on. Dacă Visible este off atunci fereastra grafică nu este afisată.

16.3. Crearea şi controlul axelor

Crearea axelor într-o poziţie dorită se face cu instrucţiunea H=subplot(m,n,p) sau H=subplot(mnp), unde fereastra figurii este de axe m x n, iar p dă modul de aşezare a figurii în planul general, returnat în H. Cel mai frecvent se utilizează subplot(mnp).

De exemplu, considerând x=1:0.1:10 şi y=x.^0.25, cu secvenţa, subplot(121);plot(x,y);xlabel('x');ylabel('y')

se obţine graficul din figura 16.1, cu secvenţa,

subplot(122);plot(x,y);xlabel('x');ylabel('y') se obţine graficul din figura 16.2,

cu secvenţa, subplot(211);plot(x,y);xlabel('x');ylabel('y')

se obţine graficul din figura 16.3, cu secvenţa, subplot(212);plot(x,y);xlabel('x');ylabel('y')

se obţine graficul din figura 16.4, cu secvenţa,

subplot(221);plot(x,y);subplot(222);plot(x,y) se obţine graficul din figura 16.5, iar cu secvenţa, x1=1:0.1:10;y1=x1.^0.25;x2=10:0.1:20;y2=x2.^0.5;x3=100:1:200;y3=log(x3); subplot(221);plot(x1,y1);subplot(222);plot(x2,y2);subplot(212);plot(x3,y3); se obţine graficul din figura 16.6.

De menţionat că, în locul trasării graficului variaţiei lui y funcţie de x, se poate trasa pentru fiecare subgrafic o altă funcţie, după cum rezultă şi din figura

16.6. Resetarea datelor se face cu comanda clf reset.

Funcţia axes creează obiecte grafice axe şi acceptă perechile nume/valoare_proprietate ca argumente de intrare.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 326

Aceste proprietăţi, care controlează diferite aspecte ale obiectului axe, pot fi stabilite sau citite utilizând funcţiile set şi get.

O proprietate importantă a obiectului axe este poziţia (Position), care defineşte localizarea axelor în interiorul ferestrei grafice.

Crearea axelor la poziţii impuse se realizează cu comanda axes('position',poz), în care poz este poziţia dată, ca un vector de 4 mărimi sub forma poz=[oriz vert lung lat], în care oriz, vert sunt distanţele pe orizontală şi pe verticală, de la colţul din stânga jos al figurii până la colţul din stânga jos al axelor de coordonate, iar lung, lat sunt dimensiunile axelor.

De exemplu, cu secvenţa, poz=[0.1,0.3,0.2,0.4] h=axes('position',poz)

se produce figura 16.7, în care 0.1,0.3 sunt distanţele pe orizontală şi pe verticală de la colţul din stânga jos al figurii până la colţul din stânga jos al axelor de coordonate, iar 0.2 şi 0.4 sunt lungimea , respectiv înălţimea pe axe.

Elementele vectorului poz sunt date în unităţile de măsură specificate de proprietatea Units. Programul Matlab utilizează implicit unităţile normalizate, la care (0,0) este colţul stânga-jos, iar (1,1) este colţul din dreapta-sus al ferestrei grafice.

Fig.16.1. Reprezentarea subplot(121)

Crearea şi controlul graficelor 327

Fig.16.2. Reprezentarea subplot(122)

Fig.16.3. Reprezentarea subplot(211)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 328

Fig.16.4. Reprezentarea subplot(212)

Fig.16.5. Reprezentarea subplot(221);plot(x,y);subplot(222);plot(x,y)

Crearea şi controlul graficelor 329

Fig.16.6. Reprezentarea subplot(221);plot(x,y);subplot(222);plot(x,y);subplot(212);plot(x,y)

Fig.16.7. Reprezentarea axes

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 330

Dacă se tastează numai axes, atunci se deschide o nouă figură cu axele unitare şi cu centrul axelor în (0,0).

Prin comanda h=axes, se creează axe pe întreaga fereastră şi se returnează identificatorul de control h, care în acest caz este h= 7.0090.

Funcţia axes(h) creează un obiect axe curent cu identificatorul de control h. De menţionat că funcţia axes este o funcţie relativ simplă pentru crearea

obiectului axe. Obiectele axe (axes) sunt copii (children) ai obiectelor figură (figure) şi părinţi (parents) ai obiectelor imagine (image), linie (line), suprafaţă (surface) şi text (text). Obiectele axe definesc cadrul de referinţă în interiorul căruia sunt orientate obiectele copil.

Pentu obţinerea identificatorului axelor curente se utilizează funcţia gca (get

curent axes). Aceasta se apelează cu sintaxa: h=gca. Prin axe curente se înţeleg axele reprezentării grafice din fereastra activă, în

care funcţiile plot, title, surf, mesh etc. reprezintă grafic rezultatele. Fiecare figură are o axă curentă. Orice schimbare în figura curentă determină funcţia gca să returneze identificatorul de control al noii figuri curente. Pentru a schimba axele curente sau pentru a crea altele noi, se folosesc funcţiile axes sau subplot. Identificatorul de control se foloseşte apoi asociat cu funcţiile get sau set pentru a observa sau modifica proprietăţile obiectelor axe.

Funcţia cla şterge axele curente (toţi copiii – children) şi se apelează cu una dintre sintaxele:

• cla – care şterge toate obiectele (linii, texte, module obiect, suprafeţe şi imagini) din axele curente;

• cla reset – care iniţializează la valorile implicite toate obiectele din axele curente, precum şi toate proprietaţile axelor, cu excepţia poziţiei.

Pentru scalarea axelor se utilizează funcţia axis, care se poate apela cu una dintre sintaxele:

• axis[xmin xmax ymin ymax], ce stabileşte scalarea axelor unei reprezentări grafice ,2D, curente, la valorile precizate de scalarii: xmin, xmax,

ymin, ymax; • axis[xmin xmax ymin ymax zmin zmax], care stabileşte scalarea axelor

unei reprezentari grafice, 3D, curente, la valorile precizate de scalarii: xmin,

xmax, ymin, ymax, zmin, zmax; • axis[xmin xmax ymin ymax zmin zmax cmin cmax], care stabileşte

scalarea axelor unei reprezentari grafice 3D curente, la valorile precizate de scalarii: xmin, xmax, ymin, ymax, zmin, zmax şi scalarea culorilor între cmin şi cmax (vezi funcţia caxis);

• V=axis – returnează un vector linie care conţine limitele reprezentării grafice curente, iar vectorul V are 4 elemente pentru reprezentările 2D, 6

Crearea şi controlul graficelor 331

componente pentru reprezentările 3D şi 8 componente pentru reprezentările 3D şi setarea culorii;

• axis('auto') – autoscalează reprezentarea grafică curentă, alegând cele mai bune limite, astfel încât să fie reprezentată integral;

• axis('manual') – menţine limitele curente, memorând graficul curent şi toate proprietăţile graficelor şi adaugă graficul peste cel curent;

• axis('tight') – setează limitele axelor la valorile datelor, setare care, de regulă, este implicită;

• axis('fill') – setează limitele axelor şi PlotBoxAspectRatio, astfel încât axele devin poligonale, dar are efect numai dacă PlotBoxAspectRatio sau DataAspectRatioMode sunt setate manual;

• axis('ij') – realizează reprezentarea grafică în coordonate matriciale, cu originea sistemului de coordonate în colţul din stânga sus; axa i este verticală şi orientată de sus în jos, iar axa j este orizontală şi orientată de la stânga la dreapta, ca în figura 16.8;

• axis('xy') – realizează reprezentarea grafică în coordonate carteziene, cu originea sistemului de coordonate în colţul din stânga jos; axa x este orizontală şi orientată de la stânga la dreapta, iar axa y este verticală şi orientată de jos în sus;

• axis('equal') – realizează reprezentarea grafică cu aceeaşi scală pe toate axele, ceea ce face ca, de exemplu, sphere(25) să arate ca o sferă şi nu ca un elipsoid;

• axis('image') –realizează reprezentarea grafică cu aceeaşi scală pe toate axele, cu excepţia faptului că se face o plotare bine ajustată la date;

• axis('square') – stabileşte axele curente la o formă pătrată; • axis('normal') – reface starea normală a axelor şi anulează orice restricţie

introdusă anterior, referitoare la scalare sau unităţi de măsură; • axis('off') – şterge etichetele axelor graficelor; • axis('on') – reface etichetele axelor graficelor; • [s1,s2,s3]=axis('state') – returnează trei şiruri de caractere care indică

starea curentă a proprietăţilor axelor, după cum urmează: � s1 = 'auto' sau 'manual' ; � s2 = 'on' sau 'off' ; � s3 = 'xy' sau 'ij' .

Fără argumente de ieşire, comanda axis (s1,s2,s3) reface proprietăţile axelor la valorile indicate de cele trei şiruri de caractere, cu observaţia că valoarea implicită este axis('auto', 'on','xy').

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 332

Fig.16.8. Reprezentarea axis('ij')

Trasarea unei reţele (grid) pe grafic, respectiv a unei reţele de linii verticale şi orizontale pe un grafic 2D sau 3D, pentru facilitarea citirii datelor, se face cu funcţia grid, apelată cu sintaxa grid on sau grid off. Dacă funcţia grid este setată on, pe grafic sunt reprezentate liniile reţelei, iar dacă este off, acestea sunt eliminate. Funcţia grid stabileşte proprietăţile Xgrid, Ygrid şi Zgrid ale obiectului axe curente.

Funcţia box realizează o demarcaţie a axelor, putând fi apelată cu: • box sau box on - când adaugă o demarcaţie a axelor, ca în figura 16.9; • box off – când nu adaugă o demarcaţie a axelor curente.

Reţinerea („memorarea”) graficului curent, pentru a adăuga peste acesta următoarele reprezentări grafice, se realizează cu funcţia hold, care se apelează cu una dintre sintaxele:

• hold on sau hold – memorează graficul curent şi toate proprietăţile axelor, adăugând următoarele grafice peste cel curent, iar proprietatea NextPlot a ambelor obiecte, figură şi axe, este stabilită la add;

• hold off – returnează starea iniţială, prin care fiecare comandă plot şterge graficul anterior şi proprietăţile axelor înainte de a desena un nou grafic, iar proprietatea NextPlot a ambelor obiecte, figură şi axe, este stabilită la replace.

Dacă în fereastra grafică există mai multe subferestre grafice, fiecare dintre acestea are o stare a funcţiei hold, stabilită ca proprietate a obiectelor figură sau

Crearea şi controlul graficelor 333

axe.

Fig.16.9. Reprezentarea box on

Testarea stării funcţiei hold se face cu funcţia ishold, care returnează 1, dacă hold este activă (adică suprapune reprezentările grafice) şi 0, dacă este dezactivată (adică fiecare nouă reprezentare o şterge pe cea anterioară).

Pentru a găsi modul de scriere (aspectul datelor) pe axele curente se utilizează funcţia daspect, care se poate apela cu una dintre sintaxele:

• as=daspect – găseşte aspectul datelor pe axele curente; • daspect([X Y Z]) – setează aspectul datelor; • daspect('mode') – setează aspectul datelor în funcţie de 'mode', care

poate fi 'auto' sau 'manual'. De menţionat că funcţia daspect setează datele în proprietatea axelor

DataAspectRatio sau găseşte datele din proprietatea axelor DataAspectRatioMode. Pentru a plota caseta cu aspectul datelor se utilizează funcţia pbaspect, care

se poate apela cu una dintre sintaxele: • pbar=pbaspect – găseşte caseta cu aspectul datelor pe axele curente; • pbaspect(X Y Z]) – setează caseta cu aspectul datelor; • pbaspect('mode') – setează caseta cu aspectul datelor în funcţie de

'mode', care poate fi 'auto' sau 'manual'. De menţionat că funcţia daspect setează datele în proprietatea axelor

PlotBoxAspectRatio sau găseşte datele din proprietatea axelor PlotBoxAspectRatioMode.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 334

Pentru a realiza un „zoom”, adică o mărire a unei figuri 2D, se utilizează funcţia zoom, care poate fi apelată cu una dintre sintaxele:

• zoom(factor) – realizează un zoom (mărire) a axelor curente de atâtea ori cât este specificat în factor;

• zoom sau zoom on– creează condiţiile unei stări zoom, care permite ca la fiecare acţionare a butonului stânga mouse să se facă un zoom având factor=2 (dublare), iar la acţionarea butonului dreapta mouse o revenire tot cu factor=2;

• zoom off – anulează starea de zoom; • zoom xon sau zoom yon – creează condiţiile de zoom pe axa x sau axa y; • zoom reset – resetează starea de zoom; • zoom(figură,opţiune) – aplică funcţia zoom pentru figura figură, iar

opţiune poate fi una dintre cele de mai sus (on,off,xon,xoff,reset). Funcţia caxis stabileşte limitele între care se scalează matricea de culoare

pentru reprezentarea grafică.

16.4. Proprietăţile obiectului grafic axe

Proprietăţile obiectului axe pot fi specificate la crearea acestora, prin includerea perechilor nume-valoare proprietate sau mai târziu, prin folosirea funcţiilor set şi get.

În continuare sunt prezentate principalele proprietăţi acceptate pentru

obiectul grafic axe şi valorile posibile ale fiecărei proprietăţi.

1. AspectRatio - [raport_axe, raport_date] Această proprietate controlează raportul celor două axe la reprezentările 2D, care specifică:

� raport_axe – raportul dintre lungimea axelor verticale şi lungimea axelor orizontale;

� raport_date – raportul dintre lungimea unităţii axei verticale şi lungimea unităţii axei orizontale.

Programul Matlab utilizează implicit raportul specificat în raport_axe, pentru care se umple cel mai bine dreptunghiul definit prin proprietatea Position. La crearea axelor cu raport_date specificat, se schimbă limitele unei axe şi se menţine raportul lungimilor specificat în raport_axe, dar aceste schimbări nu afectează proprietatea limitelor Xlim, Ylim sau Zlim. Aceste rapoarte sunt numere în intervalul [0, ∞). Ambele rapoarte sunt implicit NaN, adică rapoarte nespecificate. La prima folosire, se aleg automat cele mai bune rapoarte, care realizează o reprezentare încadrată corespunzător în fereastra grafică.

2. Box - on sau off

Această proprietate specifică dacă graficul este încadrat de un dreptunghi, pentru reprezentări 2D sau de un cub, pentru reprezentări 3D.

Crearea şi controlul graficelor 335

3. Children - vector_identificatori Această proprietate este un vector al identificatorilor obiectelor, vector_identificatori, reprezentat în axe. Obiectele derivate (copil) ale axelor pot fi imagini, linii, suprafeţe şi text.

4. Clim -[Cmin, Cmax] Această proprietate determină modalitatea după care se transformă valorile datelor în matricea de culoare. Programul Matlab transformă valoarea minimă în prima culoare a matricei de culoare şi valoarea maximă în ultima culoare a matricei de culoare. În acest caz, întregul interval al matricei de culoare este asociat întregului interval al datelor de intrare. Există posibilitatea schimbării acestei transformări prin setarea lui Cmin, la valoarea primei culori dorite din tabela culorilor şi a lui Cmax, la ultima culoare dorită din această tabelă. În acest caz, datele de intrare mai mici decât Cmin şi mai mari decât Cmax sunt omise, devenind transparente. Uneori însă, este utilă reprezentarea numai într-o zonă a intervalului de culoare, rezervând pentru alte reprezentări un anumit interval, folosindu-se numai o porţiune din matricea de culoare. Această proprietate acţionează asupra obiectelor suprafaţă, nu şi asupra imaginilor, liniilor şi textului.

5. ClimMode - auto sau manual

Valoarea implicită a lui ClimMode este auto şi programul Matlab calculează limitele valorilor axelor de culoare, pe care le transmite în întregime axelor copil. Dacă ClimMode este setat manual, atunci limitele axelor de culoare se schimbă prin setarea proprietăţii Clim, la valoarea dorită.

6. Color - Culoare sau non

Această proprietate prexizează culoarea folosită pentru a umple aria definită prin proprietatea Position, care dă fondul reprezentării grafice din axele curente sau cele specificate. Culoarea, Culoare, poate fi specificată utilizând un vector al valorilor RGB sau un nume de culoare predefinită în Matlab. Valoarea implicită, non, a acestei culori, este cea a culorii de fond a ferestrei grafice.

7. ColorOrder - matrice m x 3 sau valori RGB

Această proprietate defineşte ordinea culorilor folosite de reprezentările grafice, fiind o matrice m x 3 sau valori RGB. În cazul în care culorile liniilor reprezentărilor grafice realizate cu funcţiile de tip plot sau plot3 nu sunt specificate, atunci se aleg, ciclic, culorile predefinite, în ordinea: galben – mov - albastru_marin – roşu – verde – albastru.

8. GridLineStyler - tip_linie Prin această proprietate se defineşte tipul de linie, tip_linie, folosită pentru desenarea liniilor grid. Sunt acceptate următoarele tipuri de linii: linie continuă (-), linie întreruptă (--), linie punct (- .) şi linie din puncte (:). În paranteze sunt prezentate simbolurile acestor tipuri de linii.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 336

9. NextPlot - new sau add sau replace Această proprietate este folosită de toate funcţiile care utilizează obiectul axe, precum plot, plot3, fill, fill3, mesch, surf, bar etc. Opţiunea new creează noi axe, înainte de a face o reprezentare grafică, iar opţiunea add adaugă noi obiecte la axele curente. În mod implicit, este luată opţiunea replace, care şterge axele curente şi creează altele noi, în aceeaşi poziţie. Dacă funcţia hold este setată off, proprietatea NextPlot este stabilită la opţiunea replace, iar dacă hold este on, atunci NextPlot este setată pe add.

10. Parent - identificator Proprietatea este utilizată numai la citirea identificatorului obiectului axe, identificator, care este părintele obiectului figură, cu funcţia gca, care returnează şi identificatorul axelor curente ale figurii.

11. Position - poz=[oriz vert lung lat] Prin această proprietate se defineşte vectorul de poziţie, poz=[oriz vert

lung lat], în care oriz, vert sunt distanţele pe orizontală şi pe verticală, de la colţul din stânga jos al figurii până la colţul din stânga jos al axelor de coordonate, iar lung, lat sunt dimensiunile axelor.

12. TickLengtht - vector [2D 3D] Această proprietate specifică lungimea liniuţei care divizează axele, ca raport al dimensiunilor axelor. Proprietatea este descrisă de un vector cu două elemente, primul pentru reprezentările 2D, iar al doilea pentru reprezentările 3D. Valorile implicite sunt [0.01 0.0025].

13. TickDir - in sau out

Prin această proprietate se specifică dacă liniile care marchează diviziunile axei sunt orientate spre interior – valoare implicită, in, sau spre exterior, out.

14. Type - şir_caractere Prin proprietatea Type se identifică tipul de obiect grafic. De exemplu, pentru obiectul axe, şirul de caractere, şir_caractere, este întotdeauna axes.

15. Units - pixels sau normalized sau inches sau centimeters sau points Această proprietate specifică unităţile de măsură utilizate pentru interpretarea proprietăţii Position. În toate cazurile măsurarea se face din colţul stânga jos al ferestrei grafice. Unităţile normalizate transformă colţul stânga jos al ferestrei grafice în coordonatele (0, 0), iar colţul din dreapta sus în (1.0, 1.0). Unitatea points este egală cu 1/72 inch, adică 0.0353 centimetri.

16. UserData - matrice

Proprietatea UserData este orice matrice asociată obiectului, care poate să nu fie folosită, dar poate fi vizualizată folosind funcţia get.

Crearea şi controlul graficelor 337

17. View - [az elv] Această proprietate stabileşte punctul de observare al reprezentării grafice 3D, caracterizat prin azimut, az, care dă unghiul de rotire în plan orizontal şi prin înălţimea, elv, care dă unghiul cu planul orizontal. Ambele unghiuri, az şi elv, sunt date în grade. Valorile pozitive ale azimutului au semnificaţia unei rotiri în sensul acelor de ceasornic în jurul axei z. Valorile pozitive ale înălţimii permit o vedere de deasupra obiectului, iar valorile negative, o vedere de sub obiect.

18. Visible - on sau off

Proprietatea determină dacă obiectul este vizibil pe ecran, cazul on, sau nu este vizibil, cazul off. Valoarea implicită este on. Dacă Visible este off atunci liniile axelor, marcajele de divizare şi etichetele nu sunt vizibile, însă copiii obiectelor axe nu sunt afectaţi.

Pentru controlul axelor (X, Y şi Z) sunt specifice o serie de proprietăţi, care sunt prezentate în continuare, împreună cu valorile specifice.

Prezentarea s-a făcut numai pentru axa X, dar acestea sunt identice şi pentru axele Y şi Z prin înlocuirea lui X cu Y şi respectiv Z.

1. XColor - culoarea Această proprietate setează culoarea axei X, a liniilor de divizare, a etichetelor care marchează diviziunile şi a liniilor reţelei acesteia.

2. XDir - normal sau reverse Valoarea implicită a acestei proprietăţi este normală, normal, şi stabileşte direcţia de creştere a valorilor numerice pe axa X, de la stânga la dreapta, iar valoarea reverse inversează această direcţie.

3. XGrid - on sau off Dacă această proprietate este on, atunci sunt reprezentate linii reţea perpendiculare pe axa X, în dreptul fiecărei diviziuni a acesteia. Valoarea implicită este off, fără linii reţea.

4. Xlabel - text_identificator Proprietatea este identificator al obiectului text utilizat pentru etichetarea axei X. Pentru a avea un identificator, trebuie creat un obiect text_identificator, ca de exemplu: set(gca,'xlabel',text(0.5,-0.2,'Axa X')) , în care 0.5 semnifică faptul că textul Axa X apare la mijlocul axei (la 0.5 de colţul stânga jos), iar -0.2 semnifică faptul că este sub axa X la 0.2 unităţi normalizate. O metodă mult mai simplă pentru plasarea etichetei axei X este funcţia xlabel.

5. XLim - [ Xmin Xmax] Această proprietate precizează valorile mimimă, Xmin, şi maximă, Xmax, ale axei X, valori care pot fi pozitive sau negative.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 338

6. XLimMode - auto sau manual Dacă proprietatea XlimMode este stabilită pe auto, atunci reprezentarea se face cu autoscalare, iar dacă este pe manual, atunci zonele selectate se reprezintă manual.

7. XScale - linear sau log Proprietatea stabileşte modul de scalare al axei X, care poate fi linear, linear, sau logaritmic, log.

8. Xtick - auto sau manual Această proprietate specifică localizarea şi valoarea diviziunilor pe axa X. De exemplu, dacă: set(gca,'Xtick', [0 0.25 0.5 0.75 1]), atunci se stabilesc diviziuni ale axei X elementele 0, 0.25, 0.5, 0.75, 1. De menţionat că axa X este în unităţi normalizate de la 0 la 1.

9. XtickMode - auto sau manual Dacă proprietatea XtickMode este stabilită pe auto, atunci distanţele dintre divizori sunt calculate automat, iar în caz contrar, acestea trebuie precizate manual, ca în exemplul de la punctul anterior.

16.5. Crearea obiectului grafic linie şi proprietăţile

acestuia

Pentru crearea obiectului linie se foloseşte funcţia grafică line, care se poate apela cu una dintre sintaxele:

• h=line(x,y), care adaugă liniile din vectorii x şi y în planul axelor curente, iar dacă x şi y sunt matrici, se trasează câte o linie pentru fiecare coloană;

• h=line(x,y,z), care creează linii în cordonate 3D; • h=line('Propriet','valoare', …), asociază o anume proprietate, Propriet,

cu valoarea valoare.

Obiectele linie sunt copii ai obiectelor axe. Liniile sunt elemente fundamentale folosite pentru realizarea graficelor, contururilor şi marginilor suprafeţelor. Funcţia line acceptă ca argumente de intrare perechile nume-valoare proprietate. Aceste proprietăţi, care controlează diferite aspecte ale obiectului linie, sunt descrise în continuare şi pot fi stabilite utilizând funcţia set şi citite, utilizând funcţia get.

Perechile (x,y) sau (x,y,z) pot fi urmate de perechile nume-valoare proprietate, pentru a specifica proprietăţile suplimentare ale obiectului linie. Pentru modificarea unui obiect linie creat anterior, coordonatele pot fi omise, specificându-se numai perechile nume-valoare proprietate.

Crearea şi controlul graficelor 339

Dacă se foloseşte ca argument de ieşire, funcţia returnează un identificator h, folosit pentru controlul caracteristicilor obiectului linie.

Proprietăţile obiectului linie pot fi specificate la crearea acestuia, prin includerea perechilor nume-valoare proprietate sau ulterior, prin identificarea obiectului şi folosirea funcţiilor set şi get.

În continuare, se prezintă lista proprietăţilor acceptate de obiectul grafic

linie şi valorile posibile ale fiecărei proprietăţi.

1. Children - vector_identificatori Obiectul linie nu are copii, astfel încât această proprietate este întotdeauna o matrice goală.

2. Clipping - on sau off Dacă această proprietate este on, valoare implicită, atunci orice porţiune de linie din afara zonei definită de dreptunghiul axelor nu va fi afişată, iar dacă este off , se va afişa.

3. Color - Culoare Proprietatea specifică culoarea folosită pentru trasarea liniei. Culoarea, Culoare, poate fi specificată utilizând un vector al valorilor RGB sau un nume de culoare predefinită în Matlab.

4. EraseMode - normal sau background sau xor sau none Această proprietate controlează metodele folosite de Matlab pentru desenarea şi ştergerea liniilor, fiind utilizată cu precădere pentru crearea secvenţelor de animaţie în care, pentru a obţine efectele dorite, este necesar controlul individual al modului de redesenare a fiecărui obiect. Modul normal, care este valoarea implicită, afectează întreaga zonă afişată şi permite obţinerea unei imagini foarte bune, dar necesită mult timp. Celelalte moduri sunt rapide, dar rezultă imagini calitativ mai slabe. Setarea se face cu comanda: set(line,'Erasemode','normal').

5. LineStyle - sau -- sau : sau -. sau + sau o sau * sau . sau x Prin această proprietate se defineşte tipul de linie sau marker care este folosit pentru trasarea obiectului linie. Sunt acceptate următoarele tipuri de linii şi markere: linie continuă (-), linie întreruptă (--), linie punct (-.), linie din puncte (:), punct (.), cerc (o), plus(+), steluţă (*) şi x (x). În paranteze sunt prezentate simbolurile acestor tipuri de linii şi markere.

6. LineWidth - gros Această proprietate precizează grosimea, gros, a liniilor cu care se face reprezentarea. Valoarea implicită este de 1 punct, respectiv 0.0353 centimetri sau 1/72 inch.

7. MarkerSize - dim Proprietatea precizează dimensiunea marcajelor şi se aplică numai dacă proprietatea LineStyle este stabiltă pe: cerc (o), plus(+), punct (.), steluţă

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 340

(*) şi x (x). Dimensiunea implicită este 6 puncte (1 punct = 0.0353 cm =1/72 in).

8. Parent - identificator Această proprietate returneză identificatorul, identificator, părintelui obiectului linie, care este întotdeauna un obiect axe.

9. Type - şir_caractere Prin proprietatea Type se identifică tipul de obiect grafic numai la citire, apelând get. De exemplu, pentru obiectul linie, şirul de caractere, şir_caractere, este întotdeauna line.

10. UserData - matrice Proprietatea UserData este orice matrice asociată obiectului şi poate fi văzută folosind funcţia get.

11. Visible - on sau off Această proprietate determină dacă obiectul este vizibil pe ecran, cazul on, sau nu este vizibil, cazul off. Valoarea implicită este on.

12. Xdata - vector

13. Ydata - vector

14. Zdata - vector Proprietăţile Xdata, Ydata şi Zdata specifică datele utilizate pentru a genera liniile. Dacă datele sunt sub forma unor matrici, pentru fiecare coloană se trasează câte o linie, dar trebuie ca toate coloanele sa aibă acelaşi număr de linii.

16.6. Crearea obiectului grafic text şi proprietăţile

acestuia

Pentru crearea unui obiect text, care se poate adăuga la o reprezentare grafică, se foloseşte funcţia text, ce se poate apela cu una dintre sintaxele:

• h=text(x,y,’textul’) - adaugă şirul de caractere textul, în poziţia specificată de coordonatele (x, y) ale axelor curente, date în unităţi ale acestora;

• h=text(x,y,z, ’textul’) – adaugă caracterele textul în poziţia precizată de coordonatele 3D;

• h=text – returnează un vector coloană al identificatorilor obiectelor text, câte unul pentru fiecare obiect text;

• h=text('Propriet','valoare', …) asociază o anume proprietate, Propriet, cu valoarea valor.

De menţionat că funcţia text este de nivel înalt, atunci când este folosită direct pentru a adăuga texte pe un grafic, sau de nivel scăzut, atunci când creează obiecte text.

Crearea şi controlul graficelor 341

Obiectele text sunt copii ai obiectelor axe. Funcţia text creează obiecte grafice text şi acceptă perechile nume - valoare proprietate, ca argumente de intrare. Aceste proprietăţi, care controlează diferite aspecte ale obiectului figură, sunt descrise mai jos şi pot fi setate sau citite, utilizând funcţiile set şi get.

Perechile (x,y) sau (x,y,z) pot fi urmate de perechile nume - valoare proprietate pentru a specifica proprietăţi suplimentare ale obiectului text. De asemenea, coordonatele pot fi omise, precizându-se numai perechile nume - valoare proprietate, pentru modificarea unui obiect creat anterior.

Proprietăţile obiectului text pot fi specificate la crearea acestuia, prin includerea perechilor nume - valoare proprietate sau ulterior, prin identificarea obiectului şi folosirea funcţiilor set şi get.

În continuare, se prezintă lista proprietăţilor acceptate de obiectul grafic

text şi valorile posibile ale fiecărei proprietăţi.

1. Children - vector_identificatori Obiectul text nu are copii, astfel încât această proprietate este întotdeauna o matrice goală.

2. Clipping - on sau off Dacă această proprietate este on, atunci orice porţiune de text din afara zonei definită de dreptunghiul axelor va fi afişată, iar dacă este off , valoarea implicită, nu se va afişa.

3. Color - Culoare Proprietatea specifică culoarea folosită pentru text. Culoarea, Culoare, poate fi specificată utilizând un vector al valorilor RGB sau un nume de culoare predefinită în Matlab. Valoarea implicită a culorii este alb.

4. Extend - poz=[orizontal vertical lung lat] Această proprietate precizează poziţia şi dimensiunile dreptunghiului care încadrează şirul de caractere (textul). Specificarea acestuia se face cu un vector de forma poz=[orizontal vertical lung lat], în care:

� orizontal şi vertical sunt distanţele, pe orizontală şi verticală, de la colţul din stânga jos al dreptunghiului care defineşte figura, până la colţul din stânga jos al dreptunghiului care încadrează textul;

� lung şi lat sunt dimensiunile dreptunghiului care încadrează textul.

Elementele vectorului poz sunt date în unităţi de măsură specificate de proprietatea Units.

5. FontAngle - normal sau italic sau oblique

Această proprietate precizează modul de scriere: normal, adică drept (valoare implicită), italic – italicul cunoscut, sau oblique, respectiv înclinat, care de fapt nu diferă de italic. Setarea unui anumit tip de scriere se face cu o comandă de forma set(text(5,1.3,'textul'),'FontAngle',['italic']),

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 342

în care x=5 şi y=1.3.

6. FontName - numefont Proprietatea stabileşte numele fontului folosit de obiectul text, fiind unul dintre cele gestionate de Windows, şi care se găseşte în subdirectorul său, System.

7. FontSize - dimfont Această proprietate stabileşte dimensiunea fontului folosit de obiectul text.

8. FontStrikeThrough - on sau off Dacă această proprietate este on, atunci textul este afişat tăiat cu o linie, iar dacă este off, valoare implicită, atunci textul apare normal.

9. FontUnderline - on sau off

Dacă această proprietate este on, atunci textul este afişat, subliniat cu o linie, iar dacă este off, valoare implicită, atunci textul apare normal.

10. FontWeight - light sau normal sau demi sau bold Această proprietate precizează grosimea liniilor folosite pentru scrierea textului, care pot fi subţire (light), normală (normal), semibold (demi), sau bold (bold).

11. HorizontalAlignment - left sau center sau right

Proprietatea precizează tipul de aliniere a textului pe orizontală faţă de punctul menţionat de proprietatea Position, aliniere care poate fi: la stânga (left), centrată (center), sau la dreapta (right).

12. Parent - identificator Această proprietate returneză identificatorul, identificator, obiectului axe, care este părinte al obiectului text.

13. Position - poz=[ x y z ] Prin această proprietate se precizează poziţia textului în 3D (dacă z lipseşte el este considerat zero). Unităţile folosite sunt cele precizate pentru proprietatea Units.

14. Rotation - rotire

Această proprietate stabileşte orientarea textului la una dintre cele şapte posibile: 0, ±90, ±180, ±270 (în realitate specifică numai patru orientări diferite). Setarea unei rotaţii se face cu o comandă de forma set(text(5,1.3,'textul'),'FontAngle',['italic'],'Rotation',-180).

15. String - şir_caractere Proprietatea defineşte şirul de caractere, şir_caractere, care urmează să fie afişat de obiectul text.

16. Type - şir_caractere Prin proprietatea Type se identifică tipul de obiect grafic, care este în acest caz întotdeauna text.

Crearea şi controlul graficelor 343

17. Units - pixeli sau normalized sau inches sau centimeters sau points Această proprietate specifică unităţile de măsură utilizate pentru interpretarea proprietăţii Position. În toate cazurile, măsurarea se face din colţul stânga jos al ferestrei grafice. Unităţile normalizate transformă colţul stânga jos al ferestrei grafice în coordonatele (0, 0), iar colţul din dreapta sus în (1.0, 1.0). Unitatea points este egală cu 1/72 inch, adică 0.0353 centimetri, iar celelalte unităţi de măsură sunt unităţi absolute.

18. UserData - matrice Proprietatea UserData este orice matrice asociată obiectului şi poate fi văzută folosind funcţia get.

19. VerticalAlignment - top sau cap sau middle sau baseline sau bottom Această proprietate specifică tipul de aliniere a textului pe verticală faţă de punctul menţionat de proprietatea Position. Implicit, textul este centrat (middle). O posibilă comandă pentru fixarea aranjării pe verticală este set(text(1,1,1,'textul'),'VerticalAlignment',['top'],'Position',[4.9 1.2 1]).

20. Visible - on sau off

Această proprietate determină dacă obiectul este vizibil pe ecran, cazul on, sau nu este vizibil, cazul off. Valoarea implicită este on.

16.7. Crearea obiectului grafic suprafaţă şi proprietăţile

acestuia

Pentru crearea unui obiect grafic suprafaţă se foloseşte funcţia surface, care se poate apela cu una dintre sintaxele:

• h=surface(x,y,z,C) – care pentru x =[1 2 3 4 5; 6 7 8 9 10], y=x.^2.75, z=x.*y şi C = [ 0.1 0.25 0.4 0.6 0.75; 0.94 1.13 1.33 1.50 1.7] este reprezentată în figura 16.10;

• h=surface(x,y,z) – reprezentată, pentru aceleaşi valori, în figura 16.11; • h=surface(z,C) – reprezentată, pentru aceleaşi valori în figura 16.12; • h=surface(C) – reprezentată în figura 16.13, pentru valorile lui C date de C =

[ 0.1 0.25 0.4 0.6 0.75; 0.94 1.13 1.33 1.50 1.7]; • h=surface – se returnează un identificator al caracteristicilor obiectului creat; • h=surface('Propriet','valoare', …) asociază o anume proprietate, Propriet, cu

valoarea valoare. De menţionat că funcţia surface este de nivel scăzut pentru crearea obiectelor

suprafaţă, z(x,y), care sunt copii ai obiectelor axe, unde x şi y sunt vectorii coordonate, iar indicii matricei culoare sunt precizaţi de matricea C.

Dacă matricea de culoare este omisă, se consideră C=z, deci culoarea este proporţională cu înălţimea. Limitele axelor x şi y sunt date de elementele din matricile x şi y, iar dinamica scalei de culoare este precizată în matricea C.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 344

Funcţia surface acceptă perechile 'Propriet', 'valoare' ca argumente de intrare. Aceste proprietăţi, prin care se pot controla diferite aspecte ale obiectului, pot fi stabilite sau citite, după ce obiectul a fost creat, utilizând funcţiile set şi get.

Dacă x este un vector de lungime n, y un vector de lungime m, iar C o matrice m x n, colţurile fiecărei zone a suprafeţei sunt precizate de tripletele (x(j),y(i),z(i,j)), unde x este asociat coloanelor matricei z, iar y este asociat liniilor acesteia.

Fig.16.10. Funcţia surface(x,y,z,C)

Fig.16.11. Funcţia surface (x,y,z)

Crearea şi controlul graficelor 345

Fig.16.12. Funcţia surface(z,C)

Fig.16.13. Funcţia surface(C)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 346

În continuare se prezintă lista proprietăţilor acceptate de obiectul grafic

suprafaţă (surface) şi valorile posibile ale fiecărei proprietăţi.

1. CData - matrice

Această proprietate precizează culoarea pentru fiecare punct al matricei ZData. Dacă matricea CData nu are aceeaşi dimensiune cu ZData, atunci suprafaţa este tratată ca o textură.

2. Children - vector_identificatori Obiectele suprafaţă nu au copii, astfel încât această proprietate este întotdeauna o matrice goală.

3. Clipping - on sau off Dacă această proprietate este on, valoarea implicită, atunci orice porţiune de suprafaţă din afara zonei definită de dreptunghiul axelor va fi afişată, iar dacă este off, nu se va afişa.

4. EdgeColor - Culoare sau non sau flat sau interp

Prin această proprietate se precizează culoarea marginilor ariilor rectangulare definite de matricea ZData, funcţie de opţiune: o singură culoare pentru toate marginile ariilor elementare (Culoare), transparente (non), o aceeaşi culoare pentru fiecare margine de arie elementară (flat), sau o trecere graduală prin interpolarea lineară a culorilor din nodurile reţelei elementare a suprafeţei (interp). Valoarea implicită este flat.

5. FaceColor - Culoare sau non sau flat sau interp Prin această proprietate se precizează culoarea suprafeţei şi modul de colorare a ariilor rectangulare definite de matricea ZData, funcţie de opţiune: o singură culoare pentru toate ariile elementare (Culoare), transparente (non), o aceeaşi culoare pentru fiecare arie elementară (flat), sau o trecere graduală prin interpolarea lineară a culorilor din nodurile reţelei elementare a suprafeţei (interp). Valoarea implicită este flat.

6. LineStyle - tip linie Această proprietate determină tipul de linie pentru reprezentarea reţelei care defineşte suprafaţa, respectiv liniile de separare dintre ariile elementare. Sunt acceptate următoarele tipuri de linii: linie continuă (-), linie întreruptă (--), linie punct (-.), linie din puncte (:). În paranteze sunt prezentate simbolurile acestor tipuri de linii.

7. MeshStyle - both sau row sau column Proprietatea precizează care dintre liniile reţelei de separare a suprafeţelor elementare se trasează: toate (both), numai cele corespunzătoare axei x (row) sau numai cele corespunzătoare axei y (column). Sunt acceptate următoarele tipuri de linii: linie continuă (-), linie întreruptă (--), linie punct (-.), linie din puncte (:). În paranteze sunt prezentate simbolurile acestor tipuri de linii.

Crearea şi controlul graficelor 347

8. Parent - identificator Această proprietate returneză identificatorul, identificator, obiectului suprafaţă, care este un obiect axe.

9. Type - şir_caractere Prin proprietatea Type se identifică tipul de obiect grafic, care este în acest caz întotdeauna surface.

10. UserData - matrice Proprietatea UserData este orice matrice asociată obiectului şi poate fi văzută folosind funcţia get.

11. Visible - on sau off

Această proprietate determină dacă obiectul este vizibil pe ecran, cazul on, sau nu este vizibil, cazul off, caz în care liniile axelor, marcajele de divizare şi etichetele nu sunt afectate. Valoarea implicită este on.

12. XData - vector sau matrice

Proprietatea XData este un vector sau o matrice care specifică poziţia (coordonata) pe axa x a elementului corespunzător din matricea ZData.

13. YData - vector sau matrice

Proprietatea YData este un vector sau o matrice care specifică poziţia (coordonata) pe axa y a elementului corespunzător din matricea ZData.

13. ZData - matrice

Proprietatea ZData este o matrice care precizează poziţia (coordonata) pe axa z a punctelor suprafeţei.

16.8. Crearea obiectului grafic imagine şi proprietăţile

acestuia

Pentru crearea sau afişarea unui obiect grafic imagine se foloseşte funcţia image, care se poate apela cu una dintre sintaxele:

• h=image – returnează un identificator de control al caracteristicilor obiectului creat;

• h=image(C) – afişează matricea C ca imagine, în care fiecare element al acestei matrice stabileşte culoarea unei zone dreptunghiulare a imaginii, cu precizarea că, culoarea unei zone este determinată prin asocierea la fiecare element al matricei C a unui indice al matricei de culoare curente, iar pentru C=[1 6.7272 20.5156 45.2548 83.5925; 138.0117 210.8723 304.4370 420.8883 562.3413] este reprezentată în figura 16.14;

• h=image(x,y,C) – afişează aceeaşi imagine ca image, cu limitele precizate de vectorii x şi y;

• h=image('Propriet','valoare', …) asociază o anume proprietate, Propriet, cu valoarea valoare.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 348

Fig.16.14. Funcţia image(C)

Functia image este atât o instrucţiune de nivel înalt pentru afişarea imaginilor, cât şi una de nivel scăzut pentru crearea obiectelor imagine. Obiectul imagine este copil al obiectului axe.

Matlab afişează imaginea prin transformarea fiecărui element al matricei cu colormap. Funcţia image creează obiecte grafice de tip imagine şi acceptă perechile 'Propriet', 'valoare' ca argumente de intrare. Aceste proprietăţi, prin care se pot controla diferite aspecte ale obiectului, pot fi stabilite sau citite, după ce obiectul a fost creat, utilizând funcţiile set şi get.

Matricea argument poate fi urmată de perechile 'Propriet', 'valoare', pentru a specifica proprietăţile suplimentare ale imaginii sau poate fi omisă, specificându-se numai proprietăţile care se doresc a fi modificate.

În continuare se prezintă lista proprietăţilor acceptate de obiectul grafic

imagine (image) şi valorile posibile ale fiecărei proprietăţi.

1. CData Este matricea cu datele de culoare a fiecărui element al imaginii. Funcţia image(C) atribuie C la CData. Fiecare element al matricei CData specifică culoarea unei zone dreptunghiulare a imaginii. Elementele din CData sunt utilizate ca indici asociaţi unei matrice de culoare curentă. Valorile zecimale sunt rotunjite la cel mai mic întreg, iar valorile din afara intervalului [1, length(colormap)] sunt omise, zona fiind transparentă.

2. Clipping - on sau off Dacă această proprietate este on, valoarea implicită, atunci orice porţiune

Crearea şi controlul graficelor 349

de imagine din afara zonei definită de dreptunghiul axelor va fi afişată, iar dacă este off, nu se va afişa.

3. Parent - identificator

Prin această proprietate se transmite identificatorul de control, identificator, al părintelui axelor imaginii. Axele sunt întotdeauna părinţi ai imaginii.

4. Type - şir_caractere Prin proprietatea Type se identifică tipul de obiect grafic, care este în acest caz întotdeauna image.

5. UserData - matrice

Proprietatea UserData este orice matrice asociată obiectului şi poate fi văzută folosind funcţia get.

6. Visible - on sau off Această proprietate determină dacă obiectul este vizibil pe ecran, cazul on, sau nu este vizibil, cazul off. Valoarea implicită este on.

7. XData matrice[1 n] Proprietatea XData este o matrice care specifică poziţia (coordonata) pe axa x a elementului corespunzător din matricea ZData.

8. YData - matrice[1 m] Proprietatea YData este o matrice care specifică poziţia (coordonata) pe axa y a elementului corespunzător din matricea ZData.

16.9. Crearea obiectului grafic rectangular,

rectangular -rotunjit sau elipsă

Pentru crearea sau afişarea unui obiect grafic rectangular, rectangular- rotunjit sau elipsă, se foloseşte funcţia rectangle, care se poate apela cu una dintre sintaxele:

• h=rectangle – care adaugă un obiect grafic rectangular la axele curente; • h= rectangle('Position',poz) – care adaugă un obiect grafic rectangular

(dreptunghi) în poziţia dată de vectorul poz, ca în figura 16.15, în care vectorul de poziţie este poz=[0.1,0.3,0.2,0.4];

• h=rectangle('Curvature',[x y]) – prin care se adaugă, la axele curente, un obiect grafic dreptunghiular, pentru x=y=0, un obiect grafic rectangular-rotunjit, pentru 0<x=y<1, sau o elipsă, pentru x=y=1, ca în figura 16.16.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 350

Fig.16.15. Funcţia rectangle('Position',poz)

Fig.16.16. Funcţia rectangle('Curvature',[x y])

16.10. Controlul caracteristicilor grafice

Pentru controlul caracteristicilor grafice se folosesc următoarele funcţii Matlab:

• set - care stabileşte proprietăţile obiectelor; • get - găseşte şi returnează proprietăţile obiectelor; • reset - resetează pentru iniţializare proprietăţile obiectelor; • delete - şterge obiectele grafice;

Crearea şi controlul graficelor 351

• gco - găseşte caracteristicile obiectului curent; • gcbo - găseşte caracteristicile obiectului curent chemat; • gcbf - găseşte caracteristicile figurii curente chemate; • drawnow - completează reprezentarea grafică şi o actualizează; • findobj - găseşte obiectele pentru valorile proprietăţilor specificate; • copyobj - face o copie a obiectelor grafice şi a copiilor acestora; • isappdata - verifică dacă aplicaţia definită de date există; • getappdata - găseşte valorile aplicaţiei definite de date; • setappdata - stabileşte aplicaţia definită de date; • rmappdata - şterge aplicaţia definită de date; • closereq - figura închisă la cererea funcţiei; • newplot - stabileşte proprietatea NewPlot a obiectelor figură şi axe; • ishandle - găseşte caracteristicile graficelor.

Stabilirea proprietăţilor obiectelor se realizează cu funcţia set, care se poate

apela cu una dintre sintaxele: • set(h) – care returneză o listă cu toate proprietăţile obiectului cu

identificatorul h, precum şi valorile acceptate de acestea; • v=set(h,'Nume_proprietate') – care returnează o listă cu toate valorile

posibile ale proprietăţii specificate; • v=set(h,'Nume_proprietate',Valoare) – prin care se modifică proprietatea la

valoarea dată, putând fi trecute în listă mai multe seturi de Nume proprietate şi valori.

Funcţia set se poate utiliza deci, pentru modificarea valorii proprietăţilor obiectului al cărui identificator este h, cu excepţia proprietătilor care numai se citesc. Se acceptă ca valori de proprietate, 'Nume_proprietate', şirurile de caractere:

'default' - se utilizează valorile predefinite; 'factory' - utilizează valorile date de Valoare; 'remove' - şterge valorile date de Valoare.. Pentru stabilirea valorilor implicite ale proprietăţilor obiectului, se

concatenează cuvântul default cu tipul de obiect şi numele proprietăţii. De exemplu, pentru a stabili culoarea axelor din figura curentă la valoarea implicită, se utilizează instrucţiunea: set(gcf,'DefaultAxesColor',[1 1 1]).

Pentru h=plot(x,y), cu funcţia set(h) se obţin proprietăţile: Color EraseMode: [ {normal} | background | xor | none ] LineStyle: [ {-} | -- | : | -. | none ] LineWidth Marker: [ + | o | * | . | x | square | diamond | v | ^ | > | < | pentagram | hexagram | {none} ]

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 352

MarkerSize MarkerEdgeColor: [ none | {auto} ] -or- a ColorSpec. MarkerFaceColor: [ {none} | auto ] -or- a ColorSpec. XData YData ZData

ButtonDownFcn: string -or- function handle -or- cell array Children Clipping: [ {on} | off ] CreateFcn: string -or- function handle -or- cell array DeleteFcn: string -or- function handle -or- cell array BusyAction: [ {queue} | cancel ] HandleVisibility: [ {on} | callback | off ] HitTest: [ {on} | off ] Interruptible: [ {on} | off ] Parent Selected: [ on | off ] SelectionHighlight: [ {on} | off ] Tag UIContextMenu UserData Visible: [ {on} | off ]

Citirea valorilor curente ale proprietăţilor unui obiect se realizează cu funcţia

get, care se apelează cu una dintre sintaxele: • get(h) – care returneză o listă cu toate proprietăţile obiectului cu

identificatorul h; • v=get(h,'Nume_proprietate') – care returnează valoarea curentă a proprietăţii

specificate a obiectului cu identificatorul h.

Pentru a obţine valoarea implicită a proprietăţii Color a obiectului figură se utilizează următoarea instrucţiune:

get(0,'DefaultFigureColor'), rezultând,

ans= 0.8000 0.8000 0.8000 Lista completă a tuturor valorilor curente pentru obiectele descendente (copii)

ale obiectului cu identificatorul h, se obţine cu instrucţiunea: get(0,'Default'),

rezultând, ans = defaultFigurePosition: [232 258 560 420]

Crearea şi controlul graficelor 353

defaultTextColor: [0 0 0] defaultAxesXColor: [0 0 0] defaultAxesYColor: [0 0 0] defaultAxesZColor: [0 0 0] defaultPatchFaceColor: [0 0 0] defaultPatchEdgeColor: [0 0 0] defaultLineColor: [0 0 0] defaultFigureInvertHardcopy: 'on' defaultFigureColor: [0.8000 0.8000 0.8000] defaultAxesColor: [1 1 1] defaultAxesColorOrder: [7x3 double] defaultFigureColormap: [64x3 double] defaultSurfaceEdgeColor: [0 0 0]

Să considerăm reprezentarea grafică, rezultată din secvenţa: surf(peaks) text(26,50,7,'Valoarea maxima'),

prezentată în fig. 16.17.

0

10

20

30

40

50

0

20

40

60

-10

-5

0

5

10

Valoarea maxima

Fig.16.17. Reprezentare grafică peaks

Pentru citirea liniilor 1 şi 2 ale identificatorului h al obiectului, se foloseşte secvenţa:

h=get(gca,'Children')

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 354

a=get(h(1),'Type') b=get(h(2),'Type')

obţinându-se, a =text b=surface. Pentru stabilirea culorilor obiectului „text”, cu identificatorul h(1), se

foloseşte instrucţiunea: set(h(1),'Color',[1 0 0]),

iar pentru obţinerea listei proprietăţilor suprafeţei, precum şi a valorilor curente ale acesteia, se foloseşte instrucţiunea get(h(2)).

În urma rulării instrucţiunii anterioare, get(h(2)), se obţine: AlphaData = [1] AlphaDataMapping = scaled CData = [ (49 by 49) double array] CDataMapping = scaled EdgeAlpha = [1] EdgeColor = [0 0 0] EraseMode = normal FaceAlpha = [1] FaceColor = flat LineStyle = - LineWidth = [0.5] Marker = none MarkerEdgeColor = auto MarkerFaceColor = none MarkerSize = [6] MeshStyle = both XData = [ (1 by 49) double array] YData = [ (49 by 1) double array] ZData = [ (49 by 49) double array] FaceLighting = flat EdgeLighting = none BackFaceLighting = reverselit AmbientStrength = [0.3] DiffuseStrength = [0.6] SpecularStrength = [0.9] SpecularExponent = [10] SpecularColorReflectance = [1] VertexNormals = [ (49 by 49 by 3) double array] NormalMode = auto BeingDeleted = off ButtonDownFcn =

Crearea şi controlul graficelor 355

Children = [] Clipping = on CreateFcn = DeleteFcn = BusyAction = queue HandleVisibility = on HitTest = on Interruptible = on Parent = [100.001] Selected = off SelectionHighlight = on Tag = Type = surface UIContextMenu = [] UserData = [] Visible = on Iniţializarea tuturor proprietăţilor axelor sau figurilor la valorile implicite,

cu excepţia poziţiei, se realizează cu funcţia reset, care se apelează cu sintaxa: reset(h),

unde h este identificatorul de control al caracteristicilor proprietăţilor. Spre exemplu: reset(gca) – iniţializează proprietăţile axelor curente; reset(gcf) – iniţializează proprietăţile figurii curente.

Ştergerea ferestrelor grafice sau a obiectelor din acestea, definite de identificatorul h, se realizează cu funcţia delete, care se apelează cu sintaxa:

delete(h). Dacă identificatorul este al obiectului figură, fereastra grafică este închisă

fără confirmare, iar obiectul este şters.

Ştergerea figurii curente din fereastra windows se poate face şi cu funcţia closereq.

Pentru actualizarea şi completarea unei reprezentări grafice, realizată în mai multe etape, se foloseşte funcţia drawnow, apelată cu sintaxa drawnow.

Reactualizarea reprezentării grafice este determinată de: � revenirea prompterului Matlab; � folosirea comenzii pause; � executarea comenzii getframe; � executarea comenzii drawnow.

Pentru trecerea la o nouă figură, atunci când se utilizează funcţiile de nivel scăzut pentru crearea obiectelor grafice, se foloseşte funcţia newplot, care este un

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 356

antet al identificatorului proprietăţii, Nextplot, a fişierelor grafice de tip M, care se apelează cu sintaxa:

h=newplot. Funcţia newplot realizează:

• deschiderea unei figuri noi, dacă proprietatea NextPlot a obiectului figură este „New”;

• ştergerea şi iniţializarea figurii curente, dacă proprietatea NextPlot a obiectului figură este „Replace”;

• deschiderea unei axe noi, dacă proprietatea NextPlot a obiectului axe este”New”;

• ştergerea şi iniţializarea axelor curente, dacă proprietatea NextPlot a obiectului axe este „Replace”.

16.11. Înregistrarea şi printarea reprezentărilor grafice

Pentru înregistrarea şi printarea imaginilor grafice se utilizează următoarele funcţii Matlab:

• print – tipăreşte graficele direct la imprimantă sau le salvează într-un fişier; • printopt – returnează configuraţia locală a imprimantei; • orient – returnează orientarea paginii pe care se face imprimarea. • • Sintaxa de apelare a funcţiei print pentru tipărire este: • print – prin care se trimite conţinutul ferestrei grafice curente la imprimanta

implicită; • print – tip_driver - opţiune nume_fişier; • print - nume_fişier – salvează reprezentarea din fereastra grafică curentă în

fişierul nume_fişier şi în formatul corespunzător imprimantei implicite. Dacă există deja un fişier cu numele menţionat, prin această opţiune se înlocuieşte cel vechi. Cu opţiunea –append, noua reprezentare grafică este adăugată la vechiul conţinut. În cazul în care nu este precizată extensia fişierului care se salvează, acesta va lua extensia .ps sau .eps, funcţie de tipul imprimantei specificat prin parametrul opţional – tip_driver.

Tipurile de drivere, – tip_driver, acceptate direct sub Windows sunt: -dwin – trimite conţinutul ferestrei grafice la imprimanta curentă monocrom; -dwinc – trimite conţinutul ferestrei grafice la imprimanta curentă color; -dmeta – trimite conţinutul ferestrei grafice în clipboard, în format Metafile; -dbitmap – trimite conţinutul ferestrei grafice în clipboard, în format bitmap; -dsetup – deschide caseta de dialog Print Setup, care permite stabilirea

parametrilor imprimantei, dimensiunea, sursa şi orientarea hârtiei, fără a tipări fereastra grafică;

-v – deschide caseta de dialog Print Setup, care permite stabilirea numai a

Crearea şi controlul graficelor 357

parametrilor imprimantei, fără a tipări fereastra grafică. Tipurile de drivere, – tip_driver, Postscrip disponibile sunt:

-dps – Postscript pentru imprimante monocrom; -dpsc – Postscript pentru imprimante color; –dps2 – Level 2 Postscript pentru imprimante monocrom; –dpsc2 – Level 2 Postscript pentru imprimante color; -deps – Encapsulated Postscript (EPSF); -depsc – Encapsulated Color Postscript (EPSF); –deps2 – Encapsulated Level 2 Postscript (EPSF); –depsc2 – Encapsulated Level 2 Color Postscript (EPSF).

Suplimentar, pentru GhostScript, sunt posibile următoarele tipuri de drivere: –dlaserjet – imprimanta de tipul HP LaserJet; –dljetplus – imprimanta de tipul HP LaserJet+; –dljet2p – imprimanta de tipul HP LaserJet IIP; –dljet3 – imprimanta de tipul HP LaserJet III; –dcdeskjet – imprimanta de tipul HP DeskJet 500C cu 1 bit/pixel color; –dcdjcolor – imprimanta de tipul HP DeskJet 500C cu 24 bit/pixel color; –dcdjmono – imprimanta de tipul HP DeskJet 500C mono; –ddeskjet – imprimanta de tipul HP DeskJet şi Deskjet Plus; –dpaintjet – imprimanta de tipul HP PaintJet printer color; –dpjetxl – imprimanta de tipul HP PaintJet XL printer color; –dbj10e – imprimanta de tipul Canon BubbleJet BJ10e; –dln03 – imprimanta de tipul DEC LN03 printer; –depson – imprimanta de tipul Epson-compatibil (9 sau 24 pini); –deps9high – imprimanta de tipul Epson-compatibil 9 pini cu rezoluţie mărită; –depsonc – imprimanta de tipul Epson LQ-2550 şi Fujitsu 3400/2400/1200

color; –dgif8 – fişier format GIF 8 biţi color; –dpcx16 – fişier format PCX (tip vechi), EGA/VGA 16 culori; –dpcx256 – fişier format PCX (tip nou) 256 culori.

De menţionat că la variantele mai vechi de Matlab, se schimbă la tipărire culoarea neagră a fondului figurii în alb şi culoarea albă a axelor şi a etichetelor în negru. Variantele noi au făcută deja această schimbare.

Pentru stabilirea orientării paginii pe care se face imprimarea conţinutului unei ferestre grafice se utilizează funcţia orient, care se apelează cu una dintre sintaxele:

• orient – returnează modul de imprimare pe pagină; • orient landscape – stabileşte modul de tipărire pe pagină, cu latura mică

orientată pe verticală, iar reprezentarea grafică ocupă întreaga pagină;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 358

• orient portrait – stabileşte modul de tipărire pe pagină, cu latura mare orientată pe verticală, iar reprezentarea grafică ocupă un dreptunghi cu laturile în raportul 4/3, plasat la jumătatea paginii;

• orient tall – stabileşte modul de tipărire pe pagină, cu latura mare orientată pe verticală (similar cu portrait), iar reprezentarea grafică ocupă întreaga pagină;

• orient rotated – realizează o rotire a figurii ce trebuie tipărită, iar reprezentarea grafică ocupă întreaga pagină.

Înregistrările reprezentărilor grafice care să poată fi introduse ulterior în documente se pot transmite în Cliboard, cu una dintre opţiunile: print –dbitmap sau print –dmeta, de unde sunt preluate şi prelucrate cu Paintbrush-ul sau cu un alt utilitar destinat acestui scop.

Preluarea reprezentărilor grafice din Cliboard, cu Paintbrush-ul, se face astfel:

- se dă comanda print –dbitmap sau print –dmeta din Matlab, funcţie de reprezentarea care se doreşte preluată din fereastra grafică curentă;

- se apelează Paintbrush-ul, fără părăsirea Matlab-ului; - se foloseşte opţiunea PASTE din mediul principal EDIT; - se salvează reprezentarea grafică.

Pentru printare mai sunt posibile şi următoarele funcţii utilitare:

bwcontr – care imprimă o figură numai în alb şi negru; hardcopy – care salvează figura pe hard-disk sub unul din formatele dps,-deps,-

dps2,-deps2,-dill,-dhpgl; nodither – modifică figura pentru bicolor sau starea iniţială, fiind apelată cu

nodither(STATE,FIG), în care STATE poate fi 'save' sau 'restore'; savtoner – modifică printarea figurii pentru consum minim de toner; noanimate – modifică figura pentru a fi statică la printare.

17. REPREZENTĂRI GRAFICE ÎN DOUĂ

DIMENSIUNI

17.1. Grafice de bază X-Y (2D)

Pentru reprezentarea datelor în coordonate lineare se utilizează funcţia plot, care se poate apela prin:

• plot(x,y) – care reprezintă grafic vectorul y funcţie de vectorul x, cu următoarele precizări:

� dacă x este un scalar şi y un vector, de lungime n=length(y), se trasează un număr n de puncte discontinui pe axa y, în dreptul valorii x, ca în figura 17.1, trasată pentru x=1 şi y=1:10, cu plot(x,y);

� dacă x este un vector şi y un alt vector, atunci lungimea celor doi vectori trebuie să fie aceeaşi, n=length(x)=length(y) şi se trasează graficul variaţiei continue a lui y funcţie de x, ca în figura 17.2, trasată pentru x=1:10 şi y=x.^1.25, cu plot(x,y);

� dacă x este un vector şi y o matrice, atunci nl=length(x) trebuie să fie egal cu m din [n,m]=size(y), şi se trasează graficul variaţiei continue a fiecărei coloane a lui y funcţie de x, ca în figura 17.3, trasată pentru x=1:10 şi y=[x; x.^1.25], cu plot(x,y);

� dacă x şi y sunt matrice, de aceeaşi dimensiune (size(x)=size(y)), se reprezintă coloanele lui y funcţie de coloanele lui x, ca în figura 17.4, trasată pentru

x=[ 1 1 ; 2 2; 3 3; 4 4; 5 5] şi y=[1.000 7.4767; 2.3784 5.6569; 3.9482 3.9482; 5.6569 2.3784; 7.4767 1.0000] , cu plot(x,y);

• plot(y) – care reprezintă grafic argumentul y funcţie de indici cu următoarele precizări:

� dacă argumentul y este complex, atunci plot(y) este echivalent cu plot(real(y),imag(y)), ca de exemplu pentru y= [1+i 2+1.4142i 3+1.7321i 4+2i 5+2.2361i 6+2.4495i 7+2.6458i 8+2.8284i 9+3i 10+3.1623i]; rezultă figura 17.5;

� dacă y este vector (linie sau coloană), funcţia plot trasează graficul y=y(i), unde i=1, 2, …, n este numărul de ordine al elementului y;

� dacă y este o matrice de m x n, funcţia plot trasează graficele yj=yj(i), unde i=1, 2, …, n este numărul de ordine al elementului yj de pe coloana j, cu j=1, 2, …, m;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 360

• plot(x1,y1,x2,y2, …, xn,yn) – reprezintă grafic simultan mai multe grafice în acelaşi sistem de coordonate, respectiv y1=f(x1), y2=f(x2), …yn=f(xn);

• plot(x,y,’linie-tip’) – apare specificat tipul de linie şi culoare utilizată, după cum se specifică în tabelul 17.1.

Fig. 17.1. Graficul y vector şi x scalar

Deci, graficele se pot reprezenta utilizând linii, markere şi culori după codul din tabelul 17.1.

Tabelul 17.1

Tipuri de linii, markere şi culori utilizate la trasarea graficelor

Culori Markere tip Linii tip

y galben . punct - continuă m mov o cerc : punctată c albastru deschis x x -. prin puncte r roşu + plus (+) -- întreruptă g verde * * b albastru s pătrat w alb d romb k negru v triunghi cu vărful în jos ^ triunghi cu vărful în sus < triunghi cu vărful la stânga > triunghi cu vărful la dreapta p stea cu 5 colţuri h stea cu 6 colţuri

Reprezentări grafice în doua dimensiuni 361 361

Pentru reprezentările grafice, se asociază fiecărei caracteristici un şir de 1÷3 caractere, dintre cele menţionate mai sus.

Fig. 17.2. Variaţia lui y vector funcţie de x vector

Fig. 17.3. Variaţia lui y matrice funcţie de x vector

Aceste şiruri de caractere trebuie cuprinse între apostrofuri şi menţionate în combinaţia culoare-marker sau culoare-linie-tip. Dacă se precizează o singură caracteristică (marker, linie sau culoare), cea de-a doua este selectată automat de calculator.

Dacă nu se specifică culoarea, Matlab-ul foloseşte implicit galben. Pentru

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 362

grafice multiple se utilizează succesiv primele şase culori din tabel.

Fig. 17.4. Variaţia lui y matrice funcţie de x matrice

Fig. 17.5. Reprezentarea grafică a numărului complex y

Funcţia plot returnează un vector coloană al identificatorilor de control al caracteristicilor obiectelor linie. Obiectele linie create cu plot sunt copii ai axelor curente.

Perechile (x,y) pot fi urmate de perechile parametru/valoare, pentru a specifica proprietăţile suplimentare ale liniilor.

Reprezentări grafice în doua dimensiuni 363 363

Pentru reprezentările grafice în coordonate logaritmice sau semilogaritmice se utilizează funcţiile loglog, semilogx, semilogy, care se apelează astfel:

• loglog(x,y) – reprezintă grafic pe log(y) funcţie de log(x), adică scalează ambele axe, utilizând logaritmul în baza 10;

• semilogx(x,y) – reprezintă grafic pe y funcţie de log(x), adică scalează numai axa x , utilizând logaritmul în baza 10;

• semilogy(x,y) – reprezintă grafic pe log(y) funcţie de x, adică scalează numai axa y, utilizând logaritmul în baza 10.

Modul de utilizare al acestor funcţii este la fel ca acela al funcţiei plot. De exemplu, dacă se doreşte reprezentarea în coordonate semilogaritmice, pe axa y, a funcţiei y=10x, unde x=0:10, atunci programul Matlab este:

x=0:10;y=10.^x;semilogy(x,y,'<-b'); ylabel('log(y)'); xlabel('x'), iar graficul este prezentat în figura 17.6.

Fig. 17.6. Reprezentarea grafică a funcţiei y=10x în coordonate semilogaritmice (axa y)

În grafic se evidenţiază reprezentarea cu linie continuă şi marcarea cu triunghiuri cu vârful la stânga, iar culoarea este albastră. În plus, s-a utilizat xlabel şi ylabel pentru marcarea coordonatelor x şi, respectiv, log(y).

Reprezentarea în coordonate polare se face cu funcţia polar, care se apelează cu una dintre sintaxele: polar(teta,r) sau polar(teta,r,’linie-tip’), în care r este raza, iar teta este unghiul în radiani. Modul de folosire al opţiunii linie-tip este identic cu cel pentru funcţia plot.

Pentru reprezentarea în coordonate polare ale funcţiei f(x)=sin(t)cos(t), cu t=0:2*pi, se utilizează secvenţa Matlab:

t=0:0.1:2*pi; f=sin(t).*cos(t); polar(t,f); xlabel('t') ; ylabel('f=sin(t)cos(t)');

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 364

şi se obţine reprezentarea din figura 17.7.

Fig. 17.7. Reprezentarea în coordonate polare

Trasarea pe acelaşi grafic a lui y1 funcţie de x1 cu axa y1 la stânga şi a lui y2 funcţie de x2 cu axa y2 la dreapta se face cu plotyy(x1,y1,x2,y2), iar reprezentarea grafică este în figura 17.8.

Pentru trasare s-a considerat x1=0:0.1:10;y1=x1.^2; x2=0:0.1:10;y2=x2.^0.2.

Fig. 17.8. Reprezentarea cu funcţia plotyy

Reprezentări grafice în doua dimensiuni 365 365

Funcţia plotyy(x1,y1,x2,y2,'fun') utilizează funcţia fun pentru plotare, care poate fi o funcţie internă pentru plotare precum: plot, semilogx, semilogy, loglog, stem, care acceptă sintaxa H=fun(x,y).

Dacă se doreşte utilizarea pentru axele din stânga şi dreapta a două moduri diferite, se utilizează funcţia plotyy(x1,y1,x2,y2,'fun1', 'fun2'), unde pentru perechea (x1,y1) se utilizează fun1(x1,y1), iar pentru perechea (x2,y2) se utilizează fun2(x2,y2).

Funcţia [ax,h1,h2]=plotyy(x1,y1,x2,y2,'fun1', 'fun2'), permite returnarea locului unde sunt create axele în ax(1), pentru axa din stânga, în ax(2), pentru axa din dreapta şi a obiectelor grafice în h1 şi h2.

De exemplu, pentru x1=0:0.1:10; y1=x1.^2; x2=0:0.1:10; y2=x2.^0.2;

comanda, [ax,h1,h2]=plotyy(x1,y1,x2,y2,'semilogy','stem'), returnează, ax = 100.0056 101.0193 h1 = 3.0334 h2 = 102.0118 103.0167 iar graficul este redat în figura 17.9.

Fig. 17.9. Reprezentarea cu funcţia plotyy(x1,y1,x2,y2,'semilogy','stem')

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 366

17.2. Adnotări pe grafice

Pentru adnotarea şi editarea graficelor se poate utiliza pachetul Plotedit. Pentru a se intra în modul de editare se tastează comanda plotedit on, sau simplu plotedit, ceea ce deschide fereastra de plotare cu meniul corespunzător, care permite să se insereze etichete pentru axe, titlul graficului, legenda, bara de culoare, linii, text, axe şi să se regleze luminozitatea. Orice deschidere a unei figuri Matlab, având extensia fig, permite editarea acesteia.

Ieşirea din modul de editare se face prin comanda plotedit off.

Adăugarea unei legende la un grafic se face prin comanda legend. Cea mai comodă şi comună apelare este dată în exemplul de mai jos,

x = 0:.2:12; plot(x,bessel(1,x),x,bessel(2,x),x,bessel(3,x)); legend('First','Second','Third',0);

reprezentat în figura 17.10.

0 2 4 6 8 10 12-0.4

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

0.6

First

Second

Third

Fig.17.10. Plasarea legendei pe grafic

De menţionat că „0” semnifică faptul că se alege cel mai bun plasament al legendei pe grafic, care să nu intre în contradicţie cu datele. În locul valorii „0” se mai pot utiliza: 1 sau lipsă, ceea ce poziţionează legenda în partea dreaptă superioară în interior; 2, ce poziţionează legenda în partea stângă superioară în interior; 3, care plasează legenda în partea de jos stânga şi în interior; 4, ce plasează legenda în partea inferioară stânga şi în interior; -1, care plasează legenda în partea dreaptă sus şi în exterior.

De menţionat că legenda se poate muta pe grafic în poziţia dorită prin apăsare

Reprezentări grafice în doua dimensiuni 367 367

mouse stânga şi apoi mutarea în poziţia dorită.

Scanarea graficului, pentru poziţionarea legendei, se execută cu funcţia lscan, care găseşte cel mai bun plasament al legendei, care să nu se suprapună peste grafic şi să fie vizibilă.

Mutarea legendei se face automat, cu funcţia moveaxis, apelată de legend şi instalată automat în ButtonDownFcn.

Pentru precizarea titlului graficului curent se utilizeză funcţia title, care se apelează cu sintaxa: title('Titlul dorit') unde 'Titlul dorit' este un şir de caractere care reprezintă titlul graficului.

Precizarea numelui mărimilor reprezentate pe fiecare axă, precum şi a unităţilor de măsură folosite, se execută cu funcţia xlabel, pentru axa x, ylabel, pentru axa y şi zlabel, pentru axa z. Acestea se apelează cu sintaxele:

xlabel('text dorit') ylabel('text dorit') zlabel('text dorit'), unde 'text dorit' este un şir de caractere, care reprezintă, în general, numele axei, unitatea de măsură sau alte elemente utile ale axei graficului curent. Repetarea instrucţiunii, cu un alt şir de caractere, conduce la înlocuirea textului anterior, fără a fi necesară refacerea reprezentării grafice.

Plasarea unui şir de caractere, de exemplu, textul, în câmpul grafic, la coordonatele (x, y) sau (x, y, z), se realizează cu funcţia text, apelată cu sintaxa:

text(x,y,'textul') sau text(x,y,z,'textul'). Coordonatele grafice sunt date în unităţi de măsură ale ultimului grafic. Dacă coordonatele sunt vectori (X şi Y), funcţia text scrie şirul de caractere

„textul”, la toate poziţiile date de perechile (X,Y). Dacă „textul” este un şir de caractere de aceeaşi lungime cu vectorii X şi Y, funcţia marchează fiecare punct cu linia, markerul sau caracterul corespunzător din şirul „textul”.

Apelată cu sintaxa text(X,Y,'textul','sc'), funcţia interpolează puntele (X,Y) în coordonatele ecranului, respectiv între (0,0), colţul din stânga jos şi (1,1) ,colţul din dreapta sus al ecranului.

Plasarea unui şir de caractere (text sau comentariu) în cânpul grafic cu mouse-ul se realizează[ utilizând funcţia gtext, apelată cu sintaxa:

gtext('textul'). Funcţia gtext afişează şirul de caractere 'textul' în fereastra grafică şi aşteaptă

deplasarea acestuia pe grafic cu mouse-ul. Apăsând un buton al mouse-ului sau orice tastă, textul se scrie pe grafic la poziţia selectată.

Pentru a transforma un şir de caractere într-o expresie TeX, se utilizează funcţia texlabel, putând fi apelată cu sintaxa texlabel('expresie') pentru a transforma expresia 'expresie' în echivalent TeX pentru aplicaţii Matlab, sau texlabel('expresie','literal') pentru a transforma expresia 'expresie' în formă literală.

De exemplu, comanda: texlabel('sin(sqrt(x^2 + y^2))/sqrt(x^2 + y^2)')

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 368

returnează, {sin}({sqrt}({x}^{2} + {y}^{2}))/{sqrt}({x}^{2} + {y}^{2})

comanda, texlabel('lambda12^(3/2)/pi - pi*delta^(2/3)','literal')

returnează, {lambda12}^{{3}/{2}}/{pi} - {pi} {delta}^{{2}/{3}}

17.3. Funcţii utilitare pentru scriere

Pentru utilizator sunt posibile următoarele utilitare: • doclick – manipularea obiectelor de proces cu ButtonDown; • dokeypress – funcţii pentru manipularea cheilor; • domymenu – manipularea conţinutului meniului; • doresize – cheamă funcţia pentru figurile obiect; • getobj – recheamă pentru manipulare obiectul scris;

• enddrag, middrag, prepdrag, putdowntext, scribeclearmode,

scribeeventhandler, scriberestoresavefcns – funcţii help pentru editorul de plotare;

• scribeaxesdlg – funcţia de help dialog a proprietăţilor axelor; • scribelinedlg - funcţia de help dialog a proprietăţilor liniei; • scribetextdlg – editarea proprietăţilor text şi font în editorul de plotare.

17.4. Grafice 2D specializate

Reprezentarea grafică, sub formă de bare verticale, se realizează cu funcţia bar, care se poate apela cu sintaxa:

• bar(x,y,gros) – reprezintă grafic y, în funcţie de x, cu grosimea barei date de gros, care poate lipsi şi atunci, valoarea implicită este gros=0.8; dacă gros<0.8 barele au grosimea de 0.2, iar dacă gros>1 atunci barele se unesc, ca în figura 17.11 şi figura 17.12 mijloc;

• bar(x,y, 'grouped') – reprezintă barele grupate pe seturi de date şi cu aceeaşi culoare, ca în figura 17.12 superior;

• bar(x,y, 'stacked') – reprezintă barele secţionate cu culori diferite pentru seturile de date, ca în figura 17.12 inferior.

De menţionat că valorile lui x trebuie să fie egal depărtate şi crescătoare. Figura 17.12 a fost realizată cu secvenţa: subplot(3,1,1), bar(rand(10,5),'stacked'), colormap(cool); subplot(3,1,2), bar(0:.25:1,rand(5),1);

Reprezentări grafice în doua dimensiuni 369 369

subplot(3,1,3), bar(rand(2,3),.75,'grouped').

Fig.17.11. Reprezentarea bar cu grosimi diferite

Fig.17.12. Reprezentarea bar grupat şi secţionat

Apelată cu secvenţa, [xb,yb]=bar(y) sau [xb,yb]=bar(x,y)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 370

funcţia bar nu reprezintă graficele, dar calculează vectorii xb şi yb, astfel încât plot(xb,yb) să poată trasa graficul de bare. Aceasta este utilă când se doreşte un control mai mare asupra graficului.

Reprezentarea barelor orizontale se realizează cu funcţia barh, care este asemănătoare funcţiei bar. Pentru exemplificare, se consideră secvenţa anterioară în care se înlocuieşte bar cu barh, reprezentată în fiura.17.13:

subplot(3,1,1), barh(rand(10,5),'stacked'), colormap(cool); subplot(3,1,2), barh(0:.25:1,rand(5),1); subplot(3,1,3), barh(rand(2,3),.75,'grouped').

Fig.17.13. Representarea barh grupat şi secţionat

Pentru plotarea ariei de sub curbă se poate utiliza funcţia area, care se apelează cu secvenţa area(x,y) şi este asemănătoare cu plot(x,y), cu deosebirea că aria de sub curbă este colorată, între 0 şi y.

Apelată cu area(y) consideră implicit că x=1:size(y,1). Specificarea nivelului de la care se colorează aria se face prin level, care

poate fi 0 (valoare implicită) sau o valoare precizată, caz în care colorarea se face între level şi valoarea curentă a lui y, ca în figura 17.14, realizată cu secvenţa:

x=1:10;y=x.^2;area(x,y,50).

Pentru reprezentarea dinamică (în mişcare) a traiectoriei unui punct, care urmăreşte reprezentarea grafică 2D (o „cometă”), se utilizează funcţia comet, care

Reprezentări grafice în doua dimensiuni 371 371

se apelează cu una dintre sintaxele: • comet(y) – care trasează în mişcare (animat) vectorul y; • comet(x,y) – care trasează în mişcare vectorul y funcţie de x; • comet(x,y,p) – care trasează în mişcare vectorul y funcţie de x, utilizând

pentru animare (întârzierea în plotare) timpul dat de p*length(y). Pentru exemplificare se recomandă secvenţa: t = -pi:pi/200:pi; comet(t,tan(sin(t))-sin(tan(t))).

Fig.17.14. Reprezentarea funcţiei area cu level

Evidenţierea erorilor datelor reprezentate grafic se poate face cu funcţia errorbar, apelată cu sintaxa: errorbar(x,y,e).

Reprezentarea grafică a datelor cu bare de eroare ataşează fiecărei perechi (x,y) eroarea precizată într-un vector, e, cu aceleaşi dimensiuni. Vectorul e conţine lungimea barelor ce reprezintă eroarea.

Barele de erori se reprezintă simetric în raport cu ordonata y, ceea ce presupune o asociere de erori pozitive sau negative, cu aceeaşi probabilitate. Segmentele de eroare sunt de înălţime 2*e şi se trasează pe curba y=y(x). Figura obţinută reprezintă plaja de valori pe care o poate lua funcţia y cu eroarea ”e”.

Dacă x şi y sunt matrice de aceeaşi dimensiune, funcţia errorbar va reprezenta graficul cu bare de eroare, pentru fiecare coloană în parte.

Un exemplu de reprezentare grafică a funcţiei errorbar este prezentat în figura 17.15, realizată cu secvenţa:

x = 1:10; y = sin(x); e = std(y)*ones(size(x)); errorbar(x,y,e).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 372

Fig.17.15. Reprezentare grafică cu funcţia errorbar

Pentru plotarea facilă a unei expresii introduse direct ca argument (de genul funcţiei humps) se face uşor cu funcţia ezplot, care se poate apela:

• ezplot(f), ca de exemplu ezplot('cos(x)'), care consideră implicit pentru x din f=f(x), domeniul 2*pi < x < 2*pi;

• ezplot(f, [xmin,xmax,ymin,ymax]), care plotează f(x,y)=0 pe domeniul xmin < x < xmax, ymin < y < ymax;

• ezplot(f), ca de exemplu ezplot('x^2 - y^2 - 1'), care plotează f(x,y)=0 şi în care -2*pi < x < 2*pi şi -2*pi < y < 2*pi, reprezentată în figura 17.16;

• ezplot('f',[a b]), ca de exemplu ezplot('x^3 + y^3 - 5*x*y + 1/5',[-3,3]), care plotează f(x,y)=0 şi în care a=-3 < x < b=3 şi a=-3 < y < b=3;

De menţionat că, funcţia f poate fi definită şi anterior prin secvenţa: f = inline('cos(x)+2*sin(x)'),

caz în care funcţia ezplot se poate apela cu una dintre secvenţele, ezplot(f); ezplot(@humps). Plotarea facilă în coordonate polare a unei funcţii introduse ca argument,

respectiv a curbei rho = f(theta), pe domeniul implicit 0 < theta < 2*pi, se face prin apelarea funcţiei ezplot, sub forma:

ezplot(f) sau,

ezplot(f,[a,b] în care a < theta < b.

Reprezentări grafice în doua dimensiuni 373 373

Fig.17.16. Reprezentarea grafică cu ezplot

Funcţia f poate fi definită ca o expresie utilizând @ (funcţie humps) sau ca o funcţie inline, ca de exemplu:

ezpolar('1 + cos(t)') ezpolar('cos(2*t)') ezpolar('sin(tan(t))') ezpolar('sin(3*t)') ezpolar('cos(5*t)') ezpolar('sin(2*t)*cos(3*t)',[0,pi]) ezpolar('1 + 2*sin(t/2)') ezpolar('1 - 2*sin(3*t)') ezpolar('sin(t)/t', [-6*pi,6*pi]) r = '100/(100+(t-1/2*pi)^8)*(2-sin(7*t)-1/2*cos(30*t))'; ezpolar(r,[-pi/2,3*pi/2]) h = inline('log(gamma(x+1))'); ezpolar(h) ezpolar(@cot,[0,pi]) Reprezentarea grafică a funcţiei ezpolar('1 - 2*sin(3*t)'), este prezentată în

figura 17.17.

Reprezentarea grafică a unor vectori cu originea în originea sistemului de coordonate polare se face cu funcţia compass, care se apelează cu una din sintaxele:

compass(z), compass(real(z),imag(z)), sau compass(x,y),

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 374

unde z este numărul complex z=x+i*y, iar x şi y sunt numere reale care sunt proiecţia vectorului z pe abscisă şi ordonată.

Fig.17.17. Reprezentarea grafică cu ezpolar

Dacă z=[3-4*i -3+2*i 5+7*i], atunci cu compass(z) se obţine reprezentarea din figura 17.18, iar pentru x=[1 2 4]; y=[-4 5 -2], funcţia compass(x,y) este redată în figura 17.19.

Fig.17.18. Reprezentarea grafică cu compass a lui z - complex

Reprezentări grafice în doua dimensiuni 375 375

Fig.17.19. Reprezentarea grafică cu compass a vectorilor x, y

Pentru reprezentarea grafică în coordonate 2D rectangulare a vectorilor se utilizează funcţia feather, care se apelează ca şi funcţia compass, respectiv:

feather(z) sau feather(x,y). Reprezentarea aceloraşi vectori z şi x, y cu funcţia feather este redată în

figura 17.20 şi respectiv figura 17.21.

Fig.17.20. Reprezentarea grafică cu feather a lui z – complex

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 376

Fig.17.21. Reprezentarea grafică cu feather a vectorilor x, y

Fig.17.22. Reprezentarea poligoanelor cu funcţia plot

Fig.17.23. Reprezentarea poligoanelor cu funcţia fill

Reprezentări grafice în doua dimensiuni 377 377

Pentru reprezentarea grafică a poligoanelor se utilizează funcţia fill, care se apelează cu sintaxa generală fill(x,y,c), care reprezintă un poligon definit de vectorii x şi y, cu nuanţele de culoare c. Coordonatele vârfurilor poligonului sunt specificate prin perechile (x,y). Dacă se consideră necesar, poligonul se poate închide, conectând valorile finale la cele iniţiale.

Dacă argumentul c este un singur caracter dintre cele prezentate în lista de culori din tabelul 17.1 sau un vector cu trei componente [r g b], poligonul va fi colorat într-o singură culoare. În cazul în care c este un vector cu aceeaşi dimensiune ca x şi y, elementele acestuia sunt scalate cu funcţia caxis şi apoi utilizate ca indici într-o matrice care specifică culorile vârfurilor. Culorile dintre vârfuri sunt obţinute prin interpolare biliniară a culorilor vârfurilor.

Dacă x şi y sunt matrice cu aceeaşi dimensiune, fill(x,y,c) reprezintă câte un poligon pentru fiecare coloană. În acest caz, c este un vector linie pentru poligoane cu o singură culoare şi, respectiv, o matrice pentru poligoane cu culori interpolate.

Dacă numai unul dintre argumentele x sau y este matrice, celălalt fiind vector coloană cu acelaşi număr de linii, vectorul coloană se va extinde la o matrice cu aceleaşi dimensiuni, prin adăugarea unor coloane identice.

Pentru specificarea poligoanelor multiple, se poate utiliza şi forma fill(x1,y1,c1,x2,y2,c2,…), care este mult mai uşor de controlat.

Funcţia fill setează proprietăţile FaceColor a funcţiei patch (care creează module obiect) la „flat” (aceeaşi culoare), „interp” (culori interpolate) sau ColorSpec (culoarea specificată), funcţie de valorile matricei c.

Funcţia fill returnează un vector coloană al identificatorilor de control al caracteristicilor modulelor obiect, câte o linie pentru fiecare modul. Argumentele x,y,c pot fi urmate de perechi parametru-valoare, pentru a specifica proprietăţile suplimentare ale modulului obiect.

Pentru a evidenţia diferenţa dintre plot şi fill se consideră poligoanele: x1=[0 2 3 -1 0];y1=[-1 0 3 2 -1]; x2=[2 3 5 4 2]; y2=[0 3 2 0 0];

care, reprezentate cu plot, sunt prezentate în figura 17.22, iar reprezentate cu fill sunt redate în figura 17.23, din care reiese că funcţia fill umple poligoanele cu culoarea specificată.

Reprezentarea grafică cu parametrii impuşi se realizează cu funcţia fplot.

Funcţia fplot realizează o reprezentare grafică cu anumite restricţii şi se apelează cu una dintre sintaxele:

fplot('fun', limite) fplot('fun', limite, tol) fplot('fun', limite, n) fplot('fun', limite, n, unghi) fplot('fun', limite, n, unghi,subdiviz) [x,y]=fplot('fun', limite, …)

unde: fun - numele fişierului funcţie (şir de caractere), care poate fi dată sub forma

unei funcţii linie obiect, cu @ sau expresie; limite = [xmin xmax] – limitele axei x pentru care se doreşte reprezentarea

grafică; tol – eroarea tolerată la reprezentare, care, dacă lipseşte, are valoarea

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 378

implicită 2e-3, respectiv de 0.2 procente; n – numărul de eşantioane cu care este reprezentată funcţia

(implicit n=25); unghi – cea mai mare schimbare de unghi dintre două segmente

adiacente ale graficului (implicit 10°); x, y - vectori coloană în care sunt returnate valorile abscisei şi ale

ordonatei funcţiei.

Dacă funcţia fplot se apelează cu argumente de ieşire, nu se reprezintă nici un grafic, dar acesta se poate trasa ulterior apelând funcţia plot(x,y).

Un exemplu de utilizare este: subplot(2,2,1), fplot(@humps,[0 1]) f = inline('abs(exp(-j*x*(0:9))*ones(10,1))'); subplot(2,2,2), fplot(f,[0 2*pi]) subplot(2,2,3), fplot('[tan(x),sin(x),cos(x)]',2*pi*[-1 1 -1 1]) subplot(2,2,4), fplot('sin(1 ./ x)', [0.01 0.1],1e-3)

prezentat în figura 17.24.

Fig.17.24. Reprezentări cu funcţia fplot

Calculul şi reprezentarea grafică a histogramelor se face cu funcţia hist, care se apelează cu una dintre sintaxele:

• hist(y) – trasează histograma cu 10 segmente egale a datelor vectorului y; • hist(y, n) – trasează histograma cu n segmente egale a datelor vectorului y; • hist(y, x) – trasează histograma datelor vectorului y la abscisele specificate

Reprezentări grafice în doua dimensiuni 379 379

în x; • [m,z]=hist(y), [m,z]=hist(y, n), [m,z]=hist(y, x) – returnează vectorii m şi

z conţinând frecvenţa de apariţie şi de localizare a segmentelor, apoi cu funcţia bar(z,m) se poate trasa histograma, dând o mai mare flexibilitate reprezentărilor grafice şi realizând grafice mai sugestive.

Un exemplu de histogramă este cel din figura 17.25, care reprezintă un vector cu elementele distribuite normal (Gaussian), obţinut cu secvenţa:

x=-4:0.4:4; y=randn(10000,1); hist(y,x).

Fig.17.25. Reprezentarea grafică a unei histograme

Reprezentarea unei histograme în coordonate polare se face cu funcţia rose, care se apelează:

• rose(x) – unde x trebuie să fie cuprins în intervalul [0, 2π]; • rose(x,N) – în care n, este numărul de subintervale în care se împarte

intervalul [0, 2π], cu valoarea implicită N=20; • [t,r] =rose(x,N) – care returnează vectorii t şi r, ce pot fi folosiţi pentru

reprezentarea unei histograme polare, cu funcţia polar(t,r).

Pentru exemplificare, se prezintă în figura 17.26 histograma a 200 numere aleatoare, în coordonate polare, obţinută din:

x=2*pi*rand(200,1); rose(x,10).

De menţionat că în ultimele revizii ale Matlab s-a renuntat la funcţia rose ca şi la funcţia compass, acestea fiind înlocuite.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 380

Fig.17.26. Reprezentarea grafică a unei histograme polare

Reprezentarea grafică a semnalelor discrete, sub forma unor linii terminate cu cerc, se face cu funcţia stem, care se apelează cu una dintre sintaxele:

• stem(y) – trasează un grafic din linii cu cerc, cu elementele vectorului y; • stem(x,y) – trasează un grafic din linii terminate cu cerc, cu locaţiile

specificate de vectorul x, adică y=y(x), iar valorile lui x trebuie să fie egal depărtate şi crescătoare;

• stem(x,y,linie_tip) – trasează un grafic linii de tipul şi culoarea precizată în şirul de caractere linie_tip, similar cu funcţia plot (de exemplu stem(x,y,’:r’).

Un exemplu de reprezentare grafică cu funcţia stem este redat în figura 17.27, pentru funcţia discretă sinus, obţinut cu secvenţa Matlab:

n=0:30; f=sin(2*pi*n/10); stim(n,f).

Fig.17.27. Reprezentarea grafică cu funcţia stem

Reprezentări grafice în doua dimensiuni 381 381

Reprezentarea grafică în trepte se realizează cu funcţia stairs. Graficele în trepte sunt utilizate la reprezentarea diagramelor sistemelor numerice de eşantionare şi prelucrare a datelor.

Funcţia stairs se apelează cu una dintre sintaxele: • stairs(y) – trasează graficul în trepte al vectorului y; • stairs(x,y) – trasează graficul în trepte al elementelor vectorului y la

locaţiile specificate în x, iar valorile lui x trebuie să fie egal departate şi în ordine crescătoare;

• [xb,yb]=stairs(y) şi [xb,yb]=stairs(x,y) – calculează vectorii xb şi yb, astfel încât plot(xb,yb) să poată trasa graficul în trepte.

Un exemplu de grafic în trepte al funcţiei y=sin(x), obţinut cu secvenţa: x=0:0.3:6; y=sin(x); stairs(x,y)

este redat în figura 17.28.

Fig.17.28 Reprezentarea grafică cu funcţia stairs

Realizarea unei diagrame sub formă de bare, punând în ordine descrescătoare vectorii y, se poate face apelând funcţia pareto(y) sau pareto(y,x), în care y sunt valorile corespunzătoare fiecarui x.

Înălţimea barelor corespunde valorilor lui y, ordonata din stânga graficului are înălţimea cât sum(y), iar cea din dreapta dă valoarea procentuală y/sum(y), după cum se observă din figura 17.29. Curba continuă trasează diferenţa, valoarea sumei şi valoarea fiecărei valori a lui y.

Realizarea unei diagrame circulare (aşa numita diagramă „plăcintă”) cu valorile unui vector x, având specificată semnificaţia în etichetă, se face cu funcţia pie(x,eticheta), care se poate apela pie([2 4 3 5],{'North','South','East','West'}), dând diagrama din figura 17.30.

De menţionat că valorile lui x sunt normalizate, iar dacă sum(x)<1, atunci sunt trecute valorile efective şi apare un segment de cerc.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 382

Fig.17.29. Reprezentarea grafică cu funcţia pareto

Fig.17.30. Reprezentarea grafică cu funcţia pie

Plotarea unei matrice dispersate se face cu funcţia plotmatrix. Se apelează cu comanda plotmatrix(x,y) şi prezintă dispersia coloanei x funcţie de coloana y. Dacă x este o matrice p*m, iar y o matrice p*n, atunci plotmatrix produce o matrice n*m. Comanda plotmatrix(y) este asemănătoare cu comanda plotmatrix(y,y), cu excepţia faptului că diagonala este înlocuită prin hist(y(:,i)).

Un exemplu de utilizare este redat in figura 17.31, realizat cu comenzile: x = randn(50,3); y = x*[-1 2 1;2 0 1;1 -2 3;]'; plotmatrix(y). Plotarea dispersiei vectorului x, funcţie de vectorul y (x şi y având aceeaşi

dimensiune), cu markere (cerculeţe implicit) de arie determinată de valorile vectorului s (în puncte^2) şi fiecare punct colorat, conform valorilor vectorului c, se face cu scatter(x,y,s,c). Dacă s este scalar, atunci fiecare marker va avea aceeşi dimensiune.

Reprezentări grafice în doua dimensiuni 383 383

Fig.17.31. Reprezentarea grafică cu funcţia plotmatrix

Considerând valorile negative ale magnetismului z(m) la nivel planetar, funcţie de latitudinea x (grade) şi longitudinea y (grade), date de Parker, R. L., Shure, L. & Hildebrand, J., "The application of inverse theory to seamount magnetism", Reviews of Geophysics vol 25, pp 17-40, 1987, diagrama de variaţie realizată cu:

load seamount ; scatter(x,y,5,z)

este prezentată în figura 17.32.

Fig.17.32. Reprezentarea grafică cu funcţia scatter

18. REPREZENTĂRI GRAFICE ÎN TREI

DIMENSIUNI

18.1. Grafice de bază 3D

Pentru reprezentarea liniilor în spaţiu se utilizează funcţia plot3, care se poate apela prin:

• plot3(x,y,z) – care reprezintă grafic o linie în spaţiul 3D, linie care trece prin punctele ale căror coordonate sunt tripletele (x,y,z) şi în care x, y şi z sunt vectori de aceeaşi dimensiune;

• plot3(X,Y,Z), unde X, Y şi Z sunt matrice de aceeaşi dimensiune, reprezintă grafic câte o linie în spaţiul 3D, pentru fiecare triplet al coloanelor matricelor [X(:,i), Y(:,i), Z(:,i)];

• plot3(x,y,z, 'linie_tip') sau plot3(x1,y1,z1, 'linie_tip1', x2,y2,z2, 'linie_tip2',...) – realizează reprezentări 3D multiple, în care se precizează tipurile de linii şi culorile acestora, ca şi în cazul funcţiei plot.

Reprezentarea unei spirale în 3D, figura 18.1, se poate face prin comenzile: t=0:pi/50:10*pi; plot3(sin(t),cos(t),t); xlabel('sin(t)');ylabel('cos(t)'); zlabel('t').

Fig. 18.1. Reprezentarea grafică a unei spirale cu funcţia plot3

Reprezentări grafice în trei dimensiuni 385 385

Funcţia plot3 returnează un vector coloană al identificatorilor de control al caracteristicilor obiectelor linie. Obiectele linie create cu plot3 sunt copii ai axelor curente. Tripletele (x,y,z) pot fi urmate de perechile parametru-valoare, pentru a specifica proprietăţile suplimentare ale liniilor.

Pentru o citire mai precisă pe grafic, reprezentarea se poate asocia cu funcţia grid.

Reprezentarea grafică a suprafeţelor 3D sub forma unei „reţele” („mesh”)

se face utilizând funcţia mesh. Pentru reprezentările grafice 3D ale suprafeţelor şi liniilor de contur se

utilizează funcţiile meshc şi meshz. Funcţia meshc reprezintă grafic combinaţia suprafaţă 3D („mesh”) – linii de contur, reprezentate sub suprafaţă. Funcţia meshz reprezintă grafic suprafeţe 3D („mesh”), cu plan de referinţă la cota zero (piedestal).

În general, o suprafaţă este parametrizată prin două variabile independente, i şi j, care variază continuu în interiorul unui dreptunghi. Dacă, de exemplu 1≤i≤m şi 1≤j≤n, atunci fiecare punct este specificat prin trei funcţii, X(i,j), X(i,j) şi Z(i,j). Când i şi j sunt numere întregi, suprafaţa este definită în nodurile unei reţele rectangulare (grid), iar matricele X, Y, Z, au dimensiunea mxn. Dacă se doreşte şi precizarea culorii suprafeţei, este necesară încă o matrice, C(i,j), de aceeaşi dimensiune, mxn.

Fiecare punct al suprafeţei rectangulare este conectat cu alte patru puncte vecine, astfel:

ji

jijiji

,ji

,1

I

1,,1,

I

1

+

+−−−

Punctele de pe margini sunt conectate cu trei noduri, iar colţurile au numai două noduri vecine.

În cazul general, funcţia mesh, meshc sau meshz se apelează cu patru matrice, ca parametrii de intrare, respectiv:

mesh(X,Y,Z,C), meshc(X,Y,Z,C), meshz(X,Y,Z,C) Poziţia din care este observată suprafaţa reprezentată grafic poate fi

precizată cu funcţia view. Gradarea şi etichetarea axelor este dată de intervalele X,Y şi Z sau de setarea curentă a axelor, prin funcţia axis. Culorile utilizate sunt cele determinate de C sau precizate prin funcţia caxis. Valorile scalei de culori sunt utilizate ca indici ai tabelei de culoare, din colormap.

În cazul în care matricea C este omisă, se consideră C=Z, astfel încât culoarea este proporţională cu înălţimea suprafeţei.

Dacă apelarea se face, mesh(x,y,Z,C), meshc(x,y,Z,C), meshz(x,y,Z,C)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 386

sau mesh(x,y,Z), meshc(x,y,Z), meshz(x,y,Z)

în care cele două matrice sunt înlocuite de vectori, trebuie ca: length(x)=n, length(y)=m şi [m,n]=size(Z).

În acest caz, punctele reţelei sunt specificate prin tripletul (x(j),y(i),Z(i,j)), unde x corespunde coloanelor lui Z, iar y corespunde rândurilor. Pentru a rezulta o figură corectă, trebuie ca vectorii x şi y să fie ordonaţi crescător şi cu pas constant.

Dacă apelarea se execută, mesh(Z), meshc(Z), meshz(Z)

sau, mesh(Z,C), meshc(Z,C), meshz(Z,C)

atunci se consideră x=1:n şi y=1:m, iar reprezentarea se face pe baza indicilor matricei Z.

Apelate sub forma, mesh(…,'NumeProprietate','ValoareProprietate',…), meshc(…,'NumeProprietate','ValoareProprietate',…), meshz(…,'NumeProprietate','ValoareProprietate',…),

setează 'NumeProprietate' la 'ValoareProprietate' dorită, putând fi mai multe seturi de astfel de date într-un singur segment.

Dacă se apelează simplu mesh, meshc, meshz, atunci se returnează un identificator spre obiectul suprafaţă.

Funcţiile axis, caxis, colormap, hold, shading, hiden şi view setează proprietăţile obiectelor figură, axe şi suprafaţă, care afectează suprafeţele „mesh” (reţea) afişate.

O reprezentare a suprafeţelor şi a liniilor de contur, sub forma unei cascade, se poate face utilizând funcţia waterfall(X,Y,Z), care nu plotează coloanele reţelei.

Pentru exemplificare, se consideră funcţia Z=X.*exp(-X.^2-Y.^2), care se reprezintă în figura 18.2 astfel: a) cu funcţia mesh, ca o suprafaţă „mesh”; b) cu funcţia meshc, ca o suprafaţă „mesh” asociată cu linii de contur; c) cu funcţia meshz, ca o suprafaţă „mesh” cu plan de referinţă; d) cu funcţia waterfall, ca o suprafaţă „mesh” sub formă de cascadă.

Reprezentarea grafică a suprafeţelor netede 3D se face cu funcţia surf, iar a suprafeţelor 3D asociate cu linii de nivel proiectate pe planul bazei, cu funcţia surfc.

Funcţia surf(X,Y,Z,C) reprezintă a suprafaţă descrisă de matricele X,Y şi Z, şi colorată cu elementele precizate în matricea C. În unele utilizări, argumentele X şi Y pot fi vectori sau pot fi omise. De asemenea, matricea C poate fi omisă. Punctul din care este văzută o reprezentare 3D poate fi precizat prin funcţia view. Axele sunt date de matricele X,Y şi Z sau setate cu funcţia axis. Culoarea este setată de matricea C sau prin funcţia caxis. Valorile scalate ale culorilor sunt indici la matricea de culoare curentă din colormap.

Culoarea suprafeţei poate fi specificată prin două metode diferite:

Reprezentări grafice în trei dimensiuni 387 387

specificând colţurile reţelei sau centrele acesteia. Nuanţele sunt configurate cu funcţia shading. Dacă funcţia shading este iniţializată la „interp”, C trebuie să aibă aceeaşi dimensiune ca matricele X,Y,Z şi specifică culorile colţurilor, iar în interiorul zonei se realizează o interpolare lineară. Dacă shading este iniţializată „faced” (valoare implicită) sau „flat”, atunci C(i,j) specifică o culoare constantă în dreptunghiul respectiv.

Fig.18.2. Reprezentarea suprafeţelor „mesh” 3D

Apelată ca surf(X,Y,Z), se consideră C=Z, astfel încât culoarea este proporţională cu înălţimea suprafeţei.

Funcţiile surf(x,y,Z) şi surf(x,y,Z,C), având ca argumente de intrare în locul celor două matrice X şi Y, vectorul x, de dimensiune n şi vectorul y, de dimensiune m, cu condiţia length(x)=n, length(y)=m, unde [m,n]=size(Z), iar matricea C are dimensiunea mxn.. În acest caz, colţurile dreptunghiurilor care compun suprafata sunt tripletele (x(j),y(i),Z(i,j)). Prin urmare, x este asociat numărului de coloane, iar y numărului de linii.

Dacă apelarea se face surf(Z) sau surf(Z,C), atunci se consideră implicit x=1:n şi y=1:m, pentru reprezentarea grafică 3D a matricei Z, folosind eventual şi matricea de culoare C.

Specificarea unei anumite proprietăţi, Proprietate, şi a valorii acesteia,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 388

Valoare, se realizează apelând funcţia sub forma, surf(...,'Propietate',’Valoare’,...), setul de proprietăţi şi valori putând fi multiplicat de câte ori este necesar.

Funcţia surfc(...) este identică cu surf(...), exceptând liniile de nivel, care sunt reprezentate sub suprafaţă, pe acelaşi grafic.

Apelate simplu surf sau surfc se returnează un identificator al obiectului suprafaţă, care este copil al obiectului axe.

Funcţiile axis, caxis, colormap, hold, shading şi view setează proprietăţile obiectelor figură, axe şi suprafaţă, care afectează suprafeţele afişate.

Pentru exemplificare, în figura 18.3 se prezintă o suprafaţă 3D redată: a) cu surf şi b) cu surfc. Secvenţa Matlab utilizată a fost:

[X,Y]=meshgrid(-3:0.1:3); Z=peaks(X,Y); subplot(211); surf(X,Y,Z); subplot(212); surfc(X,Y,Z).

Fig.18.3. Reprezentarea 3D a suprafeţelor cu surf şi surfc

Reprezentarea grafică spaţială a poliedrelor se face cu funcţia fill3, care se apelează cu una dintre sintaxele:

• fill3(x,y,z,c) – care reprezintă un poliedru 3D, având vârfurile definite de vectorii x,y şi z, cu nuanţele de culoare precizate de c, iar coordonatele poliedrului sunt specificate prin tripletele (x,y,z);

• fill3(x,y,z, 'c') – care se deosebeşte de precedenta prin aceea că vectorul de culoare, c, are un singur caracter dintre cele prezentate în lista de

Reprezentări grafice în trei dimensiuni 389 389

culori de la funcţia plot, respectiv 'r','g','b', 'c','m','y','w','k', sau are trei componente [r g b], iar poliedrul va fi colorat cu o singură culoare;

• fill3(x1,y1,z1, c1,x2,y2,z2,c2, ...) – o formă mai uşor de controlat pentru poliedre multiple, în care c1, c2, ... pot fi din lista de culori.

Dacă c este un vector cu aceeaşi lungime ca x şi y, elementele acestuia sunt scalate cu funcţia caxis şi apoi utilizate ca indici în matricea de culoare colormap, pentru a specifica culorile vârfurilor. Culorile dintre vârfuri sunt obţinute prin interpolare biliniară a culorilor vârfurilor.

Dacă x, y şi z sunt matrice de aceeaşi dimensiune, fill3(x,y,z,c) reprezintă câte un poliedru pentru fiecare coloană. În acest caz, c este un vector linie pentru poliedre reprezentate cu o singură culoare („flat”) şi o matrice, pentru poliedre realizate cu culori interpolate, „interp” sau cu efecte speciale.

Dacă numai unul dintre argumentele x, y sau z sunt matrice, celelalte fiind vectori coloană cu acelaşi număr de linii, vectorii coloană se extind la matrice cu aceleaşi dimensiuni, prin adăugarea unor coloane identice.

Funcţia fill3 returnează un vector coloană al identificatorilor de control al modulelor obiect, câte o linie pentru fiecare modul.

Argumentele x, y, z şi c pot fi urmate de perechile parametru-valoare, pentru a specifica proprietăţile suplimentare ale modulului obiect.

Pentru exemplificare, se consideră secvenţa: x=1:100;y=x.^2.5;z=(x.*y);c=z; subplot(211); fill3(x,y,z,'k'); subplot(212); fill3(x,y,z,c)

reprezentată în figura 18.4.

Fig.18.4. Reprezentarea grafică cu fill3

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 390

18.2. Reprezentarea conturului şi grafice 2-1/2 D

Prin linii de contur se înţeleg liniile situate la acelaşi nivel pe axa Z (linii de nivel constant).

Calculul matricei C, care conţine perechile de coordonate (X,Y) ale fiecărei linii de contur, matrice utilizată de funcţia contour, contour3 sau contourf, pentru a trasa conturul actual, se face cu funcţia contourc.

Funcţia contourc se apelează cu una dintre sintaxele: • C=contourc(Z) – calculează matricea C a liniilor de contur ale

matricei Z, alegând automat numărul liniilor de nivel şi valorile acestora;

• C=contourc(X,Y,Z) – calculează matricea C a liniilor de contur ale matricei Z şi utilizează date din vectorii X şi Y, pentru a scala axele Ox şi Oy, iar elementele vectorilor X şi Y sunt cu pas constant;

• C=contourc(Z,n) sau C=contour(X,Y,Z,n)– calculează matricea C a liniilor de contur ale matricei Z, pentru n (scalar) linii de contur;

• C=contourc(Z,v) sau C=contour(X,Y,Z,v)– calculează matricea C a liniilor de contur ale matricei Z la nivelurile specificate de vectorul v;

Matricea liniilor de contur, C, este o matrice cu două linii, ca de exemplu: C = [nivel1 x1 x2 x3 ... nivel2 x2 x2 x3 ...; perechi1 y1 y2 y3 ... perechi2 y2 y2 y3 ...]

în care vectorii x şi y trebuie să fie monoton crescători şi cu pas constant. Pentru suprafeţe nerectangulare sau parametrice calculul matricei C a

liniilor de contur se face cu funcţia contours, care se apelează asemănător ca şi funcţia contourc.

Reprezentarea grafică în plan a liniilor de contur se realizează cu funcţia

contour, care se apelează cu una dintre sintaxele: • contour(Z) – reprezintă conturul liniilor de acelaşi nivel ale matricei Z,

cu precizarea: colţul din stânga sus al desenului corespunde elementului Z(1,1), iar numărul liniilor de contur şi valorile cotelor Z sunt alese automat;

• contour(X,Y,Z) – reprezintă conturul liniilor de acelaşi nivel ale matricei Z, utilizând vectorul X pentru controlul scalării pe axa Ox şi vectorul Y pentru controlul scalării pe axa Oy, iar numărul liniilor de contur şi valorile cotelor Z sunt alese automat;

• contour(Z,n) sau contour(X,Y,Z,n) – reprezintă conturul a n linii de nivel ale matricei Z, cu vectorii X şi Y pentru controlul scalării pe axa Ox şi Oy, iar dacă n lipseşte, se consideră valoarea implicită 10;

• contour(Z,V) sau contour(X,Y,Z,V) – reprezintă conturul liniilor de nivel ale matricei Z, caracterizate de valorile specificate în vectorul V,

Reprezentări grafice în trei dimensiuni 391 391

cu vectorii X şi Y pentru controlul scalării pe axa Ox şi Oy, iar dacă V=[v v], se calculează un singur nivel;

• contour(…,'tiplinie') – reprezintă liniile de contur cu liniile şi culorile specificate de tiplinie;

• C=contour(…) – returnează matricea liniilor de contur C, descrisă la funcţia contourc şi este utilizată de funcţia clabel;

• [C,H]=contour(…) – returnează matricea liniilor de contur C şi un vector coloană H, al identificatorilor obiectelor linie.

De menţionat că matricea Z trebuie să aibă cel puţin dimensiunea 3. Pentru exemplificare, în figura 18.5 se reprezintă grafic conturul liniilor de

nivel ale funcţiei z=exp(-x2-y2) în domeniul -2≤x≤2, -2≤x≤3, obţinute prin rularea secvenţei Matlab:

[x,y]=meshgrid(-2:0.2:2, -2:0.2:3); z=x.*exp(-x.^2-y.^2); contour(-2:0.2:2, -2:0.2:3,z,8);

Fig.18.5. Reprezentarea grafică a liniilor de contur cu funcţia contour

Etichetarea cotelor liniilor de contur într-o reprezentare grafică se face cu funcţia clabel, care se poate apela cu una dintre sintaxele:

• clabel(C) – etichetează liniile de nivel, iar poziţia acestora este aleasă aleator;

• clabel(C,H,V) – etichetează liniile de nivel numai pentru valorile V sau toate, dacă V lipseşte, unde C şi H sunt respectiv, matricea liniilor de contur şi identificatorul obiectelor linie, rezultate ca mărimi de ieşire

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 392

ale funcţiilor contour, contour3 sau contourf, selectând aleatoriu poziţia etichetelor;

• clabel(C,..., 'manual') – etichetează liniile de nivel selectate cu mouse-ul, apăsând tasta „ENTER”, pentru a termina acţiunea şi „Space Bar”, pentru a introduce următoarea linie de nivel;

• clabel(..., 'proprietate_text', valoare_proprietate,... ) – precizează valorile, valoare_proprietate, unei proprietăţi a textului, proprietate_text, precum dimensiune font (fontsize), culoare font (color), rotaţie text (rotation), spaţierea (labelspacing), care are valoarea implicită 144 puncte.

Pentru exemplificare, se consideră aceeaşi funcţie ca mai sus şi următoarele secvenţe Matlab: [x,y]=meshgrid(-2:0.4:2, -2:0.5:3); z=x.*exp(-x.^2-y.^2); subplot(1,3,1); [cs,h]=contour(-2:0.4:2,-2:0.5:3,z);clabel(cs,h,'labelspacing',72) subplot(1,3,2); cs=contour(-2:0.4:2,-2:0.5:3,z);clabel(cs); subplot(1,3,3); [cs,h]=contour(-2:0.4:2,-2:0.5:3,z);clabel(cs,h,'fontsize',12,'color','r','rotation',0) prezentate în figura 18.6.

Fig.18.6. Etichetarea liniilor de contur cu funcţia clabel

Reprezentarea grafică în plan a liniilor de contur pline (filled) se realizează cu funcţia contourf, care se apelează asemănător ca funcţia contour.

Reprezentări grafice în trei dimensiuni 393 393

Zonele dintre liniile de contur sunt colorate diferit, cum sunt prezentate frecvent hărţile termice. Un exemplu de utilizare este redat în figura 18.7, realizat cu secvenţa de instrucţiuni:

z=peaks; contourf(z), hold on, shading flat [c,h]=contour(z,'k-'); clabel(c,h), colorbar

Reprezentarea grafică în spaţiu a liniilor de nivel constant se realizează cu funcţia contour3, care se apelează ca şi funcţia contour. Un exemplu este prezentat în figura 18.8, realizat cu instrucţiunea contour3 (peaks).

Fig.18.7. Reprezentarea grafică a liniilor de contur cu funcţia contourf

Fig.18.8. Reprezentarea grafică în spaţiu a liniilor de nivel cu funcţia contour3

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 394

Pentru plotarea facilă a conturului unei expresii introduse direct ca argument (de genul funcţiei humps) se utilizează funcţia ezcontour, care se poate apela:

• ezcontour(f) – plotează liniile de contur ale funcţiei f(x,y), utilizând funcţia contour, unde f este un semn (de funcţie) sau o expresie simbolică, reprezentând o funcţie matematică de două variabile, x şi y, considerând domeniul implicit -2*pi < x < 2*pi, -2*pi < y < 2*pi şi acordând corespunzător gridul;

• ezcontour(f, Dom) – plotează f pe domeniu, Dom, care poate fi un vector de două dimensiuni, [a b], respectiv (a < x < b, a < y < b), de 4 dimensiuni, [xmin xmax ymin ymax] sau [xmin xmax], [ymin ymax], respectiv (xmin < x < xmax, ymin < y < ymax) sau valoarea implicită, 2*pi < x < 2*pi, -2*pi < y < 2*pi ;

• ezcontour(..., N) – plotează f pe domeniul implicit considerând un grid NxN, în care valoarea implicită a lui N=60.

Pentru rotirea unui grafic 3D se utilizează rotate3d sau se clichează semnul rotire de pe figura graficului şi se manevrează cu mouse-ul.

Reprezentarea grafică uşoară în plan, a liniilor de contur pline (filled) se realizează cu funcţia ezcontourf, care se apelează asemănător cu funcţia ezcontour. Zonele dintre liniile de contur sunt colorate diferit.

18.3. Alte grafice 3D

Reprezentarea grafică 3D sub formă de bare veticale se realizează cu funcţia bar3, care se poate apela cu sintaxa:

• bar3(Y,Z) – reprezintă coloanele matricei Z, de mxn, prin bare verticale în 3D de înălţime dată de length(Z);Y este un vector monoton crescător sau descrescător, iar culoarea este setată prin colormap;

• bar3(Z) – este asemănătoare ca bar3(X,Z), cu deosebirea că utilizează pentru y valoarea implicită Y=1:m;

• bar3(Y,Z,gros) sau bar3(Z,gros) – specifică grosimea barei date de gros, care poate lipsi şi atunci, valoarea implicită este gros=0.8, dacă gros<0.8 barele au grosimea dată de gros, iar dacă gros>1 atunci barele se unesc;

• bar3(…, 'detached') – este valoarea implicită şi reprezintă barele detaşate pe seturi de date;

• bar3(…, 'grouped') – reprezintă barele grupate pe seturi de date şi cu aceeaşi culoare;

• bar3(…, 'stacked') – reprezintă barele secţionate cu culori diferite pentru seturile de date;

• bar3(…, 'culoarelinie') – reprezintă barele cu culori specificate din tab.18.1, respectiv una dintre 'r g b y m c k w'.

Reprezentări grafice în trei dimensiuni 395 395

Apelată simplu, bar3, funcţia returnează şi date despre suprafaţă. Pentru exemplificare, se prezintă figura 18.9, realizată cu secvenţa: subplot(1,2,1), bar3(peaks(5)); subplot(1,2,2), bar3(rand(5),'stacked'). Reprezentarea barelor 3D orizontale se realizează cu funcţia bar3h, care

este asemănătoare funcţiei bar3. Pentru exemplificare, se consideră secvenţa anterioară, în care se înlocuieşte bar cu barh, reprezentată în figura 18.10.

Returnarea valorilor iniţiale utilizate se realizează cu funcţia makebars.

Fig.18.9. Reprezentarea grafică cu bar3

Fig.18.10. Reprezentarea grafică cu bar3h

Reprezentarea grafică a unui punct, care urmăreşte realizarea grafică spaţială („cometă”), se execută cu funcţia comet3, care se apelează cu una dintre sintaxele:

• comet3(z) – reprezintă vectorul z într-un grafic tridimensional, animat, prin urmărirea de un marker („cometă), la o distanţă de 0.1 din

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 396

lungimea vectorului z; • comet3(x,y,z) – reprezintă curba dată prin punctele (x(i),y(i),z(i)), în

mod animat, prin urmărirea de un marker („cometă), la o distanţă de 0.1 din lungimea vectorului z;

• comet3(x,y,z,p) – la fel ca precedenta, dar distanţa de urmărire este setată la valoarea p din lungimea totală a vectorului z.

Pentru exemplificarea modului de lucru, se recomandă exemplul: t = -pi:pi/500:pi; comet3(sin(5*t),cos(3*t),t). Pentru plotarea facilă 3D se utilizează funcţia ezplot3, care se poate apela: • ezplot3(x,y,z) – pentru plotarea în spaţiu a curbei x = x(t), y = y(t), z = z(t),

care consideră implicit, pentru t, domeniul 2*pi < t < 2*pi; • ezplot3(x,y,z,[tmin, tmax]) – pentru plotarea în spaţiu a curbei x =x (t),

y = y(t), z = z(t), care consideră pentru t domeniul tmin < t < tmax; • ezplot3(x,y,z, 'animate') sau ezplot3(x,y,z,[tmin, tmax], 'animate') – la

fel ca şi cele anterioare, dar produce o curbă spaţială animată, de genul „comet”.

De menţionat că x, y şi z pot fi funcţii definite inline @, sau expresii, ca în exemplul:

fy = inline('t .* sin(t)') ; ezplot3(@cos, fy, @sqrt) ezplot3('cos(t)', 't * sin(t)', 'sqrt(t)', [0,6*pi]) ezplot3(@cos, fy, @sqrt, 'animate')

redat în figura 18.11.

Fig.18.11. Reprezentarea grafică cu ezplot3

Reprezentări grafice în trei dimensiuni 397 397

Reprezentarea grafică a unei suprafeţe discrete Z, sub forma unor plane xy, terminate cu cerc, se execută cu funcţia stem3, care se apelează cu una dintre sintaxele:

• stem3(Z) – trasează suprafaţa discretă Z sub forma unor plane xy, terminate cu cerc;

• stem3(X,Y,Z) – trasează suprafaţa Z la valorile specificate de X şi Y; • stem3(x,y,linie_tip) sau stem3(x,y, 'filled') – trasează un grafic linii de

tipul şi culoarea precizată în şirul de caractere linie_tip, similar cu funcţia plot, ca de exemplu stem3(x,y,’:r’), sau stem3(x,y, 'filled'), când cercurile sunt umplute (colorate).

Plotarea dispersiei vectorilor în 3D, la locaţiile specificate de vectorii X, Y, Z (care trebuie să fie de aceeaşi dimensiune), cu markere (cercuri implicit) de arie determinată de valorile vectorului S ,(în puncte^2) şi fiecare punct colorat, conform valorilor vectorului C, se face cu scatter3(X,Y,Z,S,C). Dacă S este scalar, atunci fiecare marker va avea aceeaşi dimensiune. Când C este un vector de aceeaşi lungime ca şi X, Y şi Z, valorile lui C sunt interpolate linear între culorile curente din colormap. Dacă C este o matrice de 3 dimensiuni, culorile markerelor au valori RGB. De asemenea, C poate fi specificat cu culori din tabelul 17.1, respectiv una dintre 'r g b y m c k w'.

Funcţia scatter3(X,Y,Z) trasează markere de culori şi dimensiuni implicite, scatter3(X,Y,Z,S) trasează markere cu o singură culoare, iar prin scatter3(...,'filled') cercurile sunt umplute (colorate total).

Returnarea indicatorilor de control se face prin apelarea funcţiei scatter3. Un exemplu de utilizare este dat în figura 18.12, obţinut cu secvenţa: [x,y,z] = sphere(16); X = [x(:)*.5 x(:)*.75 x(:)]; Y = [y(:)*.5 y(:)*.75 y(:)]; Z = [z(:)*.5 z(:)*.75 z(:)]; S = repmat([1 .75 .5]*10,prod(size(x)),1); C = repmat([1 2 3],prod(size(x)),1); scatter3(X(:),Y(:),Z(:),S(:),C(:),'filled'), view(-60,60).

Fig.18.12. Reprezentarea grafică cu scatter3

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 398

Realizarea unei diagrame 3D circulare (aşa numita diagramă „plăcintă”) cu valorile unui vector X, având specificate semnificaţia în etichetă, se face cu funcţia pie3(X,eticheta), apelată:

pie3([2 4 3 5],[0 1 1 0],{'North','South','East','West'}) şi rezultând diagrama din figura 18.13.

De menţionat că valorile lui X sunt normalizate, iar dacă sum(X)<1, atunci sunt trecute valorile efective şi apare un segment de cerc.

Fig.18.13. Reprezentarea grafică cu pie3

Pentru plotarea facilă a reţelei (gridului) unei expresii introduse direct ca argument (de genul funcţiei humps), se utilizează funcţia ezmesh, care se poate apela:

• ezmesh(f) – plotează graficul funcţiei f(x,y) utilizând funcţia mesh, unde f este un semn sau o expresie simbolică, reprezentând o funcţie matematică de două variabile, ca x şi y, considerând domeniul implicit -2*pi < x < 2*pi, -2*pi < y < 2*pi şi acordând corespunzător gridul;

• ezmesh(f, Dom) – plotează f pe domeniu, Dom, care poate fi un vector de două dimensiuni, [a b], respectiv (a < x < b, a < y < b), de 4 dimensiuni, [xmin xmax ymin ymax] ori [xmin xmax], [ymin ymax], respectiv (xmin < x < xmax, ymin < y < ymax) sau valoarea implicită, 2*pi < x < 2*pi, -2*pi < y < 2*pi ;

• ezmesh(..., N) – plotează f pe domeniul implicit, considerând un grid NxN, în care valoarea implicită a lui N este 60;

• ezmesh(...,'circ') – plotează f pe un disc, centrat pe domeniul considerat.

Posibilităţile de apelare a funcţiei ezmesh sunt: f = ['3*(1-x)^2*exp(-(x^2) - (y+1)^2)' ... '- 10*(x/5 - x^3 - y^5)*exp(-x^2-y^2)' ... '- 1/3*exp(-(x+1)^2 - y^2)']; ezmesh(f,[-pi,pi]) ezmesh('x*exp(-x^2 - y^2)'); ezmesh('x*y','circ'); ezmesh('real(atan(x + i*y))'); ezmesh('exp(-x)*cos(t)',[-4*pi,4*pi,-2,2]);

Reprezentări grafice în trei dimensiuni 399 399

ezmesh('s*cos(t)','s*sin(t)','t'); ezmesh('exp(-s)*cos(t)','exp(-s)*sin(t)','t',[0,8,0,4*pi]); ezmesh('(s-sin(s))*cos(t)','(1-cos(s))*sin(t)','s',[-2*pi,2*pi]); h = inline('x*y - x'); ezmesh(h); ezmesh(@peaks) Pentru plotarea facilă a reţelei şi a liniilor de contur ale unei expresii

introduse direct ca argument, se utilizează funcţia ezmeshc, care se apelează asemănător cu funcţia ezmesh.

Pentru plotarea facilă a suprafeţelor colorate a unei expresii introduse direct ca argument, se utilizează funcţia ezsurf, care se apelează ca şi ezmesh. Suprafeţele sunt date parametric, x = x(s,t), y = y(s,t), z = z(s,t), ca de exemplu:

ezsurf('(1-s)*(3+cos(t))*cos(4*pi*s)', … '(1-s)*(3+cos(t))*sin(4*pi*s)', ... '3*s + (1 - s)*sin(t)', [0,2*pi/3,0,12] )

exemplificată în figura 18.14.

Pentru plotarea facilă a suprafeţelor colorate combinate, cu trasarea liniilor de contur a unei expresii introduse direct ca argument, se utilizează funcţia ezsurfc, care se apelează ca şi ezmesh sau ezsurf, ca în figura 18.15, realizată cu comanda:

ezsurfc('(s-sin(s))*cos(t)','(1-cos(s))*sin(t)','s',[-2*pi,2*pi]).

Fig.18.14. Reprezentarea grafică cu ezsurf

Pentru plotarea facilă 3D a unei expresii introduse direct ca argument (de

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 400

genul funcţiei humps) se face uşor cu funcţia ezgraph3, care se poate apela: • ezgraph3(Plotfun,f) - plotează z=f(x,y), utilizând pentru plotare funcţia

Plotfun, care poate fi o funcţie oarecare, ca de exemplu surf, având ca argumente de intrare (x,y,z);

• ezgraph3(Plotfun,f, [xmin xmax ymin ymax]) - plotează pe domeniul specificat, [xmin xmax ymin ymax];

• ezgraph3(Plotfun,x,y,z, [smin smax tmin tmax])) - plotează pe domeniul specificat, [smin smax tmin tmax];

• ezgraph3(x,y,z, [a b])) - plotează pe domeniul specificat, [a b]; • ezgraph3(Plotfun,...,Domstyle) – în care Domstyle poate fi 'rect' sau

'circ'; • ezgraph3(Plotfun,...,Npts) – utilizează un grid de NxN puncte;

ezgraph3(Plotfun,x,y,z) - plotează suprafaţa parametrică x=x(s,t), y=y(s,t) şi z=z(s,t) pe domeniul -2*pi < s < 2*pi and -2*pi < t < 2*pi.

Fig.18.15. Reprezentarea grafică cu ezsurfc

Plotarea unor suprafeţe triunghiulare colorate definită de matricea TRI, de dimensiuni Mx3, se realizează cu funcţia trisurf, care se apelează cu una dintre sintaxele:

• trisurf(TRI,X,Y,Z,C) - plotează triunghiurile definite de matricea TRI, de dimensiuni Mx3 ; rândurile lui TRI conţin indicii vectorilor X,Y şi Z

Reprezentări grafice în trei dimensiuni 401 401

care definesc o singură faţă a triunghiului, iar C este vectorul culoare; • trisurf(TRI,X,Y,Z) – utilizează C=Z, adică vectorul culoare este

proporţional cu înălţimea Z; • trisurf(…,'param','val',…) – defineşte un parametru, param, cu o

anumită valoare, val; • h=trisurf(…) – returnează vectorul h, al identificatorilor obiectelor.

Un exemplu de utilizare este redat în figura 18.16, realizat cu secvenţa Matlab:

[x,y]=meshgrid(1:15,1:15); tri = delaunay(x,y); z = peaks(15); trisurf(tri,x,y,z).

Fig.18.16. Reprezentarea grafică cu trisurf

Plotarea unor panglici 3D se realizează cu funcţia ribbon, care se apelează ca şi ribbon.

De menţionat că interiorul suprafeţelor triunghiulare nu este colorat. • ribbon(X,Y,gros) – plotează coloanele Y separat, ca panglici 3D, în

care gros este grosimea panglicii (valoarea implicită este gros=0.75), iar dacă X lipseşte, se consideră X=1:size(Y,1);

• h=ribbon(…)- returnează vectorul h, al identificatorilor obiectelor.

Un exemplu de aplicare este dat în figura 18.17, realizată cu secvenţa: X=1:10;Y=X.^2;gros=0.5;ribbon(X,Y,gros).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 402

Fig.18.17. Reprezentarea grafică cu ribbon

18.4. Reprezentarea obiectelor spaţiale solide

Reprezentarea grafică a obiectului cilindru se face cu funcţia cylinder, care generează un cilindru de rază R, cu cercul bazei aproximat din N puncte echidistante şi care se apelează cu sintaxa:

[X,Y,Z]=cylinder(R,N), în care, dacă N lipseşte, se consideră valoarea implicită N=20, iar dacă R lipseşte, se consideră valoarea implicită R=[1 1].

Funcţia returnează matricele X, Y, Z cu 2x(N+1) elemente, care specifică vârfurile fiecărei suprafeţe rezultate din aproximarea cercurilor bazelor cu poligoane cu n laturi. Reprezentarea grafică se face cu funcţia surf(X,Y,Z). Omiterea argumentelor de ieşire determină automat reprezentarea grafică a obiectului cilindru.

Vectorul R are în mod normal 2 elemente, R=[R1 R2], care precizează raza obiectului, la partea inferioară (R1) şi superioară (R2), ceea ce face posibilă construirea de conuri, trunchiuri de con, piramide, trunchiuri de piramidă.

Pentru exemplificare, în figura 18.18 se prezintă diverse posibilităţi de utilizare a funcţiei cylinder, considerând secvenţa Matlab:

Rc1=1;Rc2=0;Rc3=0.5;Hc1=10;Hc2=8;N1=40;N2=6; [xc,yc,zc]=cylinder([Rc1 Rc1],N1);zc=zc.*Hc1; subplot(221);surf(xc,yc,zc,xc) [xcon,ycon,zcon]=cylinder([Rc1 Rc2],N1);zcon=zcon.*Hc1; subplot(222);surf(xcon,ycon,zcon,xcon) [xp,yp,zp]=cylinder([Rc1 Rc2],N2);zp=zp.*Hc1; subplot(223);surf(xp,yp,zp,xp)

Reprezentări grafice în trei dimensiuni 403 403

[xtp,ytp,ztp]=cylinder([Rc1 Rc3],N2);ztp=ztp.*Hc2; subplot(224);surf(xtp,ytp,ztp,xtp).

Fig.18.18. Reprezentarea grafică cu cylinder

Reprezentarea grafică a obiectului sferă utilizează funcţia sphere, care generează coordonatele (X, Y, Z) ale sferei unitate, utilizate de funcţiile surf sau mesh pentru reprezentare grafică. Coordonatele X, Y şi Z sunt matrice de (N+1)x(N+1), unde N este numărul de puncte echidistante folosite pentru reprezentare, având valoarea implicită N=20 (dacă N lipseşte).

Apelarea se face cu sintaxa: [X,Y,Z]=sphere(N). Omiterea argumentelor de ieşire determină automat reprezentarea grafică a

obiectului sferă. Pentru exemplificare, se consideră figura 18.19, care reprezintă sfera

generată prin secvenţa: [X,Y,Z]=sphere(25); surf(X,Y,Z). Dacă s-ar fi utilizat mesh, atunci segmentele (fâşiile) nu ar fi fost colorate.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 404

Fig.18.19. Reprezentarea grafică cu sphere

Pentru generarea unui elipsoid se utilizează funcţia ellipsoid, care se apelează cu sintaxa:

• [X,Y,Z]=ellipsoid(XC,YC,ZC,XR,YR,ZR,N) prin care se generează matricele (X, Y, Z) de (N+1)x(N+1), utilizate de funcţia surf cu comanda surf(X,Y,Z), pentru a produce un elipsoid având centrul (XC, YC, ZC) şi razele XR, YR, ZR; N este numărul de puncte utilizate la reprezentare (valoarea implicită N=20);

• ellipsoid(...) sau ellipsoid(...,N), deci fără argumente de ieşire, plotează elipsoidul apelând la funcţia surface.

Ecuaţia elipsoidului este 1)()()(

2

2

2

2

2

2

=++

ZR

Z-ZC

YR

Y-YC

XR

X-XC.

18.5. Vizualizarea volumelor şi a vectorilor

Pentru vizualizarea volumelor şi a vectorilor sunt disponibile, în Matlab, o serie de facilităţi specifice, ce se pot apela prin help-ul vissuite. Astfel,

� pentru date scalare:

• isosurface - extrage o izosuprafaţă; • isonormals - normalele la izosuprafaţă; • isocaps - izosuprafeţele la capete;

Reprezentări grafice în trei dimensiuni 405 405

• contourslice - trasează conturul în planurile de separaţie; • isocolors - colorează fiecare fâşie de izosuprafaţă;

� pentru date vectoriale:

• streamline - linii de curent pentru vectori 2D sau 3D; • stream2 - linii de curent 2D; • stream3 - linii de curent 3D; • divergence - divergenţa unui câmp de vectori 2D sau 3D; • curl - viteza tangenţială şi normală; • coneplot - plotează vectorii viteză sub formă 3D; • quiver - reprezintă grafic câmpuri de vectori orientaţi în 2D; • quiver3 - reprezintă grafic câmpuri de vectori orientaţi în 3D; • streamtube - trasează tuburi de curent 3D; • streamribbon - trasează tuburi de curent 3D sub formă de panglici; • streamslice - linii de curent orientate; • streamparticles - linii de curent pe care se mişcă particule; • interpstreamspeed - interpolează liniile de curent cu viteza; • slice - plotează felii volumetrice;

� utilitare:

• subvolume - extrage un set de date din volumul de date iniţial; • reducevolume - reduce volumul de date; • volumebounds - returnează datele volumului x, y, z şi limitele culorilor; • smooth3 - nivelează datele 3D; • reducepatch - reduce numărul de volume de discretizare; • shrinkfaces - reduce numărul de suprafeţe de discretizare; • surf2patch - converteşte datele de suprafaţă în date de volume de

discretizare.

Pentru exemplificare, se prezintă funcţia quiver, care permite reprezentarea grafică a unui câmp de vectori orientaţi. Apelarea se face cu una dintre sintaxele:

• quiver(X,Y,U,V) – reprezintă mici segmente de dreaptă cu săgeţi (vectori), având originea la perechile de elemente (X, Y), iar U şi V sunt proiecţiile vectorului pe axele Ox şi Oy, cu menţiunea că matricele X, Y, U, V trebuie să aibă aceeaşi dimensiune;

• quiver(U,V) – consideră implicit X=1:n şi Y=1:m, iar U şi V sunt pe o reţea rectangulară;

• quiver(X,Y,U,V,S) sau quiver(U,V,S) – controlează lungimea săgeţilor prin factorul de scală S, care dacă lipseşte sau S=0, se face automat;

Se pot specifica tipurile de linii şi culorile la fel ca pentru funcţia plot. Pentru exemplificare, se prezintă în figura 18.20 un câmp de vectori

realizat cu secvenţa:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 406

[x,y] = meshgrid(-2:.2:2,-1:.15:1); z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.15); contour(x,y,z), hold on; quiver(x,y,px,py), hold off, axis image.

Fig.18.20. Reprezentarea unui câmp de vectori cu funcţia quiver

18.6. Poziţionarea observatorului faţă de obiect

Definirea poziţiei observatorului faţă de un obiect 3D se face cu funcţia view, care precizează unghiul pe orizontală (numit azimut) şi unghiul pe verticală (numit elevaţie).

Funcţia view este utilizată pentru vizualizarea unei reprezentări grafice spaţiale din diverse poziţii şi se apelează cu una dintre sintaxele:

• view(az,el) sau view([az,el]) – stabileşte unghiul din care se vede reprezentarea grafică 3D, unde az este azimutul (unghiul în plan orizontal), iar el este elevaţia (unghiul pe verticală); ambele unghiuri sunt date în grade;

• view([x,y,z]) – stabileşte unghiul punctului de observare în coordonate carteziene, ignorând magnitudinea vectorilor x, y, z;

• view(2) – stabileşte reprezentarea grafică la 2D, cu valorile implicite az=0 şi el=90;

• view(3) – stabileşte reprezentarea grafică 3D, cu valorile implicite az=-37.5 şi el=30;

• [az,el]=view – returnează unghiul pe orizontală, azimutul az şi unghiul pe verticală, elevaţia el, din care este observată o reprezentare grafică 3D.

De menţionat că, azimutul, az, poate lua valori pozitive sau negative, cea pozitivă fiind o rotire în jurul axei Oz ,în sens orar. Valorile pozitive ale elevaţiei, el, corespund unui punct de observare plasat deasupra planului (x,y), iar valorile negative corespund punctelor de sub plan.

Reprezentări grafice în trei dimensiuni 407 407

Valorile caracteristice ale azimutului sunt: • az=-37.5, el=30 – valori implicite, care conduc la reprezentarea 3D; • az= 0, el=90 – valori ce conduc la reprezentarea 2D; • az= 0, el=0 – conduc la vederea directă din planul zero; • az= 180, el=elevat – vedere din spate a obiectului la o elevaţie, elevat,

dorită.

În figura 18.21 sunt exemplificate aceste valori, utilizând reprezentarea trunchiului de piramidă din figura 18.18 şi secvenţa de program:

subplot(221); surf(xtp,ytp,ztp,xtp); view(-37.5,30); subplot(222); surf(xtp,ytp,ztp,xtp);view(0,90); subplot(223); surf(xtp,ytp,ztp,xtp); view(0,0); subplot(224); surf(xtp,ytp,ztp,xtp); view(180,30).

Fig.18.21. Vederea unei figuri cu view

Returnarea matricei de transformare ortogonală, cu dimensiunea 4x4, utilizată la proiecţia vectorilor spaţiali 3D pe suprafaţa 2D, se face utilizând funcţia viewmtx, care se apelează cu sintaxa:

A=viewmtx(az,el,phi), unde: A – matricea de transformare; az – azimutul; el – elevaţia; phi – unghiul de vizualizare şi control al distorsiunilor, relativ la un cub normalizat.

Rotirea unei figuri 3D pentru vizualizare cu ajutorul mouse-ului se face cu funcţia rotate3d, care se apelează cu sintaxa:

• rotate3d on – când rotirea este permisă; • rotate3d off – când nu mai este permisă rotirea.

19. CONTROLUL CULORILOR ŞI

VIZUALIZĂRII REPREZENTĂRILOR

GRAFICE

19.1. Controlul culorilor reprezentărilor grafice

Specificarea culorii cu care se realizează o reprezentare grafică în Matlab se

poate face: • cu numele prescurtat (scurt) al culorii; • cu numele întreg (lung) al culorii: • prin tripletul RGB (Red-Green-Blue, respectiv Roşu-Verde-Albastru)

Numele scurt sau lung sunt şiruri de caractere care specifică una dintre cele opt culori predefinite. Tripletul RGB este un vector linie cu trei elemente, care specifică intensitatea celor trei componente fundamentale ale oricărei culori. Elementele vectorului trebuie să fie numere în intervalul [0.0 1.0]. Cele trei forme de apelare pentru culorile predefinite în Matlab sunt prezentate în tabelul 19.1.

Tabelul 19.1.

Culoarea Numele scurt Numele lung Tripletul RGB

galben y yellow 1,1,0 mov m magenta 1,0,1

albastru-deschis c cyan 0,1,1 roşu r red 1,0,0

verde g green 0,1,0 albastru b blue 0,0,1

alb w white 1,1,1 negru k black 0,0,0

De exemplu, pentru reprezentarea graficului y(x) cu o linie de culoare roşie se poate folosi una dintre secvenţele:

plot(x,y,'r') plot(x,y,'red') h=plot(x,y); set(h,'Color',[1,0,0]). Ultima variantă este o formă mai rafinată de folosire a caracterelor de control

al caracteristicilor grafice, care se realizează prin setarea parametrului h cu care se operează ulterior.

Modificarea fondului unei reprezentări grafice din backround în roz, de exemplu, se face cu secvenţa set(gcf,'Color',[1,0.4,0.6]).

Controlul culorilor şi vizualizării reprezentarilor grafice 409

Matricea de culoare pentru o reprezentare grafică este o matrice cu dimensiunea mx3, fiind dată prin funcţia colormap, ale cărei elemente sunt numere reale în intervalul [0.0 1.0]. Linia k a unei matrice de culoare defineşte culoarea asociată indicelui k dintr-o scală a culorilor, fiind specificată prin intensitatea culorilor fundamentale din tripletul RGB: C(k,:)=[r(k) g(k) b(k)]

Funcţia colormap care prezintă matricea de culoare folosită la reprezentarea grafică se apelează cu una dintre sintaxele:

• colormap(C) – stabileşte matricea de culoare C; • C=colormap – returnează matricea de culoare curentă; • colormap('default') – setează matricea de culoare la valoarea implicită,

având dimensiunea 64x3; • colormap(hsv) – setează matricea de culoare la modelul hsv.

Stabilirea limitelor între care se scalează matricea de culoare pentru reprezentarea grafică se face cu funcţia caxis. Funcţia caxis permite modificarea proprietăţilor CLim şi CLimMode ale obiectului axe creat cu funcţia axes şi scalează axa pseudoculorii matricei de culoare. Transformările de culoare sunt controlate prin funcţia colormap şi proprietăţile CLim şi CLimMode.

Apelarea funcţiei caxis se face cu una dintre sintaxele: • caxis([cmin cmax]) – stabileşte parametrii CLim de scalare ai axei de

culoare la valorile precizate, cu menţiunea că culorile din afara intervalului cmin ≤ c ≤ cmax sunt omise şi astfel, zonele sau numai pixelii corespunzători acelor culori nu sunt reprezentate;

• caxis('manual') – fixează manual parametrii de scalare ai axei de culoare; • caxis('auto') – stabileşte implicit ClimMode, scalând automat parametrii

între valorile minimă şi maximă ale axei de culoare, fiind omise (nereprezentate) numai valorile Inf şi NaN;

• V=caxis – returnează vectorul linie V, cu două elemente, V=[cmin cmax], care conţine limita minimă, cmin şi maximă, cmax, a matricei de culoare curente;

• caxis(caxis) – „îngheaţă” scalarea axei de culoare la limitele curente, astfel încât următoarele reprezentări se pot realiza folosind aceeaşi dinamică de culoare, pentru a compara eventualele evoluţii codificate după culoare.

De exemplu, pentru reprezentarea unei sfere cu raza unitară, creată cu secvenţa,

[X,Y,Z]=sphere(32);C=Z;, a) folosind întreaga scală de culoare se utilizează, surf(X,Y,Z,C) b) vizualizând numai jumătatea inferioară (filtrând) se foloseşte, surf(X,Y,Z,C); caxis([-1 0]); c) folosind numai prima jumătate a scalei de culoare se utilizează,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 410

surf(X,Y,Z,C); caxis([-1 3]).

Stabilirea modului de colorare al suprafeţelor se face cu funcţia shading, care se apelează cu una dintre sintaxele:

• shading faceted – stabileşte modul de reprezentare a zonelor şi suprafeţelor cu aceeaşi culoare, iar liniile reţelei (mesh-ului) sunt vizibile;

• shading flat – stabileşte reprezentarea grafică a zonelor cu culoarea specificată pentru vârful din stânga-sus al reţelei, iar liniile reţelei (mesh-ului) sunt invizibile;

• shading interp – stabileşte culoarea de reprezentare a fiecărui segment sau arie elementară la o nuanţă rezultată din interpolarea liniară a culorilor capetelor liniei sau colţurile suprafeţei.

Funcţia shading stabileşte proprietăţile EdgeColor şi FaceColor pentru toate obiectele suprafaţă şi zonă din axele curente, adică pentru cele create cu funcţiile mesh, surf, pcolor, fill, fill3.

Vizualizarea şi ascunderea suprafeţelor suprapuse se face cu funcţia hidden, ce elimină liniile ascunse ale unei reţele de tip „mesh” şi care se apelează:

• hidden on – setează modul de reprezentare, astfel încât liniile acoperite ale reţelei de tip mesh să fie ascunse, acesta fiind modul implicit;

• hidden off – setează modul de reprezentare, astfel încât liniile acoperite ale reţelei de tip „mesh” să fie vizibile.

Funcţia hidden setează proprietatea FaceColor a obiectului suprafaţă. Liniile acoperite ascunse corespund la FaceColor=BackroundColor, care în mod normal este negru (black), iar liniile acoperite vizibile corespund la FaceColor=none.

Controlul contrastului unei imagini se face utilizând funcţia contrast, care se apelează cu sintaxa:

C=contrast(X,M), unde X este matricea imaginii asupra căreia se operează, iar M este numărul de nivele de gri.

Acţiunea efectivă se face cu secvenţa: image(X); colormap(C),

şi lucrează cel mai bine atunci când culorile imaginii sunt ordonate după intensitate. În mod asemănător lucrează şi funcţia imagesc doar că foloseşte toate datele din colormap.

Pentru a controla luminozitatea (strălucirea) matricei de culoare se foloseşte funcţia brighten, care se apelează cu una dintre secvenţele:

• brighten(L) – înlocuieşte matricea de culoare curentă cu una mai luminoasă, dacă 0 < L < 1, sau mai întunecată, dacă -1 < L < 0, dar care are aceleaşi culori de bază, iar brighten(L) urmat de brighten(-L) reface culoarea iniţială;

Controlul culorilor şi vizualizării reprezentarilor grafice 411

• C=brighten(L) – returnează o versiune a matricei de culoare curente, mai luminoasă sau mai întunecată, fără a opera asupra culorii reprezentării grafice;

• Cn=brighten(C,L) – returnează o versiune a matricei de culoare C, mai luminoasă sau mai întunecată, fără a opera asupra culorii reprezentării grafice.

Setarea culorilor fondului figurii se face cu funcţia colordef, care poate fi apelată cu una dintre sintaxele:

• colordef white – modifică fondul de culoare al figurii (background) în alb; • colordef black sau colordef none (pentru Matlab 4) – modifică fondul de

culoare al figurii (background) în negru; • colordef (Fig,Option) – modifică fondul de culoare al figurii, Fig, conform

opţiunii, Option, care poate fi white, black sau none, şi se aplică după ce figura a fost ştearsă cu clf;

• h=colordef('new',Option) – returnează vectorul h al identificatorilor noii figuri create având specificate opţiunile, Option, figură care poate fi vizibilă ('visible') sau nu ('off').

Setarea culorilor graficului pentru monitor alb-negru (gray-scale) se face cu funcţia graymon.

Pseudoculoarea unei matrice de culoare este dată de funcţia pcolor, care se apelează cu una dintre sintaxele:

• pcolor(C) – returnează o reprezentare grafică cu o suprafaţă de celule colorate în culorile precizate de matricea C, cu precizarea că modul implicit este 'faceted' în care culoarea unei celule este constantă, iar trecerea de la matricea C la matricea de culoare este realizată de funcţiile colormap şi caxis;

• pcolor(X,Y,C) – în care X, Y şi C sunt matrice de aceleaşi dimensiuni, sau X este un vector de n elemente, Y un vector de m elemente şi C o matrice de m

x n (X este asociat coloanelor, iar Y este asociat liniilor), returnează o reprezentare grafică cu o suprafaţă divizată în celule (ce pot avea m linii şi n coloane, nu obligatoriu echidistante), având celula (i,j), localizată de [X(i,j),

Y(i,j)], colorată de C(i,j), conform modului de setare al funcţiei shading; • h=pcolor(...) – returnerază un caracter de control al caracteristicilor

obiectului suprafaţă (creat cu funcţia surface), care este un copil al obiectului axe (creat cu funcţia axes).

Funcţia pcolor(X,Y,C) este echivalentă reprezentării unei suprafeţe surf(X,Y,0*Z,C) văzută de deasupra, adică din poziţia view([0,90]).

Prezentarea pe ecran a imaginii este redată cu funcţia image. Modul de apelare este similar cu al funcţiei pcolor, dar matricea C poate avea dimensiunea m x n sau m x n x 3 şi conţine date întregi cu 8 biţi (între 0 şi 255), cu 16 biţi (între

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 412

0 şi 65535) sau în dublă precizie. Dacă dimensiunea lui C este m x n x 3, atunci elementele C(:,:,1) sunt interpretate ca intensităţi de roşu, elementele C(:,:,2) sunt interpretate ca intensităţi de verde, iar elementele C(:,:,3) sunt interpretate ca intensităţi de albastru.

Funcţia pcolor(C) specifică culorile colţurilor, în timp ce image(C) specifică culorile celulelor, indexate direct din matricea de culoare nescalată. Prin urmare, numărul de colţuri pentru pcolor(C) este acelaşi cu numărul celulelor pentru image(C). Cu funcţia pcolor(X,Y,C) se poate obţine o reprezentare cu reţea de linii (grid), lucru care nu este posibil cu funcţia image.

Pentru exemplificarea modului de utilizare este util de observat efectul următoarelor două secvenţe:

pcolor(hadamard(20)); colormap(gray(2)); n=6;r=(0:n)'/n; t=pi*(-n:n)/n; X=r*cos(t); Y=r*sin(t); C=r*cos(2*t); pcolor(X,Y,C); axis('square') Pentru a converti o matrice de culoare codificată în culorile fundamentale

(RGB – Roşu Verde-Albastru) într-o matrice codificată nanţă-saturaţie-

luminozitate (HSV) se foloseşte funcţia rgb2hsv, care se apelează cu sintaxa: • H=rgb2hsv(M) – converteşte matricea de culoare M, de tip RGB în

matricea de culoare H, de tip HSV (hue-saturation-value).

Matricea M are un anumit număr de rânduri şi 3 coloane, iar fiecare element este în intervalul 0 şi 1. Coloanele matricei de intrare M, reprezintă intensitatea de roşu, verde şi albastru. Coloanele matricei rezultate H, reprezintă respectiv nuanţă, saturaţie, luminozitate. Elementele matricei M pot fi întregi cu 8 biţi (între 0÷ 255), cu 16 biţi (între 0 şi 65535) sau în dublă precizie, iar elementele matricei H sunt în dublă precizie.

De exemplu, pentru conversia matricei de culoare, M = [ 1.0000 1.0000 0 0 1.0000 1.0000 0.5000 0.5000 0.3000 0 0.5000 0.1000],

exprimată prin triplete RGB, într-o matrice de culoare exprimată prin triplete HSV, se foloseşte secvenţa:

M=[1 1 0; 0 1 1;0.5 0.5 0.3; 0 0.5 0.1] H=rgb2hsv(M),

obţinându-se: H = 0.1667 1.0000 1.0000 0.5000 1.0000 1.0000 0.1667 0.4000 0.5000 0.3667 1.0000 0.5000.

Controlul culorilor şi vizualizării reprezentarilor grafice 413

Pentru conversia unei matrice de culoare HSV (nuanţă-saturaţie-luminozitate) într-o matrice de culoare RGB (roşu-verde-albastru) se foloseşte funcţia hsv2rgb, care se apelează cu sintaxa:

• M=hsv2rgb (H) – converteşte matricea de intrare H, ale cărei coloane reprezintă respectiv nuanţă, saturaţie, luminozitate, în matricea de ieşire M, ale cărei coloane reprezintă respectiv intensităţi de roşu, albastru şi verde.

Dacă prima coloană a lui H (nuanţa culorii), H(:,1), variază de la 0 la 1, scala culorilor rezultate este roşu-galben-verde-bleumarin-albastru-mov-roşu.

Dacă a doua coloană a lui H (saturaţia), H(:,2), este 0, culorile sunt saturate, fiind nuanţe de gri, iar dacă este 1, culorile sunt nesaturate, adică nu conţin componenta de culoare albă.

Dacă a treia coloană a lui H (valoarea culorii), H(:,3), variază de la 0 la 1, atunci luminozitatea creşte.

De menţionat că funcţiile de conversie a matricelor de culoare rgb2hsv şi

hsv2rgb sunt reciproce. Conversia unei imagini indexate în imagine RGB se face cu funcţia

ind2rgb, care se apelează cu sintaxa: • RGB=ind2rgb(X,MAP) – converteşte matricea X şi matricea de culoare,

MAP în format RGB (truecolor). Elementele matricei X pot fi întregi cu 8 biţi (între 0 şi 255), cu 16 biţi (între

0 şi 65535) sau în dublă precizie, iar RGB este o matrice de n x m x 3 (sau m x n x 3), în dublă precizie.

Rotirea culorii reprezentării grafice se face cu funcţia spinmap, care se apelează cu una dintre sintaxele:

• spinmap – realizează rotirea ciclică a culorilor matricei de culoare a reprezentării grafice la circa 3 secunde;

• spinmap(t) – realizează rotirea ciclică a culorilor matricei de culoare timp de t secunde;

• spinmap(t,pas) – realizează rotirea ciclică a culorilor matricei de culoare timp de t secunde, cu pasul pas, care are valoarea implicită pas=2, iar dacă pas=3, viteza de rotire este mai mare şi dacă pas=-2 atunci rotirea se face în sens invers;

• spinmap(inf) – realizează rotirea ciclică a culorilor matricei de culoare un timp infinit, până la ieşirea din buclă tastând „CTRL-C”.

De menţionat că funcţia spinmap lucrează numai pentru ecran cu 256 culori.

Reprezentarea grafică a ponderii culorilor fundamentale se face cu funcţia rgbplot, ce returnează o reprezentare grafică a ponderii celor trei componente de culoare, roşu-verde-albastru, care constituie matricea de culoare C. Funcţia rgbplot se apelează cu sintaxa:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 414

• rgbplot(C) – în care C este o matrice m x 3 care este folosită de funcţia culoare colormap, iar fiecare dintre cele trei coloane ale matricei reprezintă o culoare fundamentală (roşu, verde, albastru).

Matricea C poate fi una dintre matricele care precizează culoarea.

19.2. Modele de culoare folosite în reprezentările grafice

De menţionat că există următoarele modele de matrice de culoare: • hsv – nuanţe de culoare saturate, începând cu roşu şi trecând prin galben,

verde, albastru deschis (bleumarin), albastru, mov şi revenind la roşu; • hot – reprezentare în culorile negru-roşu-galben-alb, pornind de la negru la

alb şi trecând prin roşu şi galben; • gray – scala gri liniară, adică interpolare liniară între negru şi alb; • bone – nuanţe de culoare în scala gri, pornind de la negru-albastru la alb; • copper – nuanţe de arămiu pornind de la negru la alb; • pink – culori pastelate cu nuanţe de roz, pornind de la negru la alb; • white – toată matricea este numai alb; • flag – matrice realizată prin alternarea culorilor roşu, alb, albastru şi negru,

cu perioada 4; • lines – nuanţe de culoare alb, albastru, verde închis, verde deschis, albatru,

bleomarin, mov şi roşu; • colorcube – nuanţe de gri, roşu, verde, albastru, negru şi alb; • vga – matrice cu 16 nuanţe de culoare incluzând alb, roşu, galben, verde,

albastru-deschis, albastru, mov; • jet – matrice de culoare în nuanţe saturate (variantă hsv), începând cu alb,

albastru închis, trecând prin albastru, albastru deschis, verde, galben, roşu şi terminând cu roşu închis;

• prism – matrice de culoare în nuanţele curcubeului, cu şase culori: roşu, portocaliu, galben, verde, albastru, violet;

• cool – matrice cu nuanţe de la albastru-deschis la mov şi alb; • autumn – matrice cu nuanţe de la roşu la galben şi alb; • spring – matrice cu nuanţe de la mov la galben şi alb; • winter – matrice cu nuanţe de la albastru deschis (bleu-marin) la verde şi

alb; • summer – matrice cu nuanţe de la verde la galben şi alb.

Modul de apelare este: colormap(Model(m)),

în care Model este unul dintre modelele de matrice de culoare de mai sus (hsv, ..., summer), iar m este un scalar, astfel încât matricea de culoare va avea dimensiunea m x 3 şi ale cărei coloane reprezintă ponderile culorilor fundamentale RGB.

Controlul culorilor şi vizualizării reprezentarilor grafice 415

Pentru exemplificarea modului de lucru se poate reprezenta secvenţa: n=16;N=[1:n+1;1:n+1];colormap(Model(n)); surface(N).

19.3. Controlul iluminării reprezentărilor grafice

Matlab suportă trei algoritmi pentru calculul iluminării, selectaţi prin setarea proprietăţilor FaceLighting (iluminare frontală) sau EdgeLighting (iluminarea muchiilor) ale fiecărui obiect suprafaţă analizată.

Controlul luminozităţii obiectelor surface şi patch, create cu funcţiile surf,

mesh, pcolor, fill şi fill3 se realizează cu funcţia lighting, care se poate apela: • lighting flat – setează iluminarea uniformă (plană), care produce culori

uniforme de-a lungul fiecărei feţe a obiectului şi este preferată pentru obiecte aflate în prim plan;

• lighting gouraud – iluminarea gouraud calculează culorile în punctele de vârf şi apoi interpolează culorile de-a lungul feţelor, fiind recomandată pentru a vedea suprafeţe curbe.

• lighting phong - iluminarea phong interpolează vectorii normali pe orice faţă şi apoi calculează reflexia în fiecare pixel, fiind recomandată pentru a vedea suprafeţele curbe, produce rezultate mai bune decât cea gouraud, dar necesită timpi mai mari de calcul;

• lighting none – revine la iluminarea (luminozitatea) iniţială.

Figura 19.1, prezintă cum arată o sferă de culoare roşie, utilizând fiecare din metodele de mai sus, cu o sursă de lumină albă.

Fig.19.1. Vederea unei figuri cu lighting

Controlul nuanţelor de culoare prin surse de lumină se realizează cu funcţia surfl, care reprezintă grafic suprafeţe 3D cu nuanţe de culoare bazate pe combinaţii ale modelelor de iluminare difuz (difuse), strălucitor (specular) şi normal.

Funcţia surfl(…) este asemănătoare cu surf(…) cu excepţia faptului că suprafeţele pot fi vizualizate într-o culoare unică sau în culori interpolate.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 416

Apelarea funcţiei surfl se face cu una dintre sintaxele: • surfl(X,Y,Z,S) - reprezintă a suprafaţă descrisă de matricele X,Y şi Z,

considerând culoarea proporţională cu Z, iar argumentul opţional S defineşte remanenţa, precizată printr-o matrice cu trei vectori S=[Sx, Sy, Sz], care specifică direcţia sursei de lumină;

• surfl(X,Y,Z) – este similară cu surf, fără precizarea direcţiei sursei de lumină;

• surfl(Z) sau surfl(Z,S) – se consideră implicit x=1:n şi y=1:m, pentru reprezentarea grafică 3D a matricei Z, folosind eventual şi parametrul S;

• surfl(X,Y,Z,'light') – produce o colorare a suprafeţei utilizând obiectul light; • H=surfl(…) – returnează un vector coloană H al identificatorilor obiectelor.

Remanenţa S poate fi dată şi în coordonate sferice, S=[az el], unde az este azimutul (unghiul în plan orizontal), iar el este elevaţia (unghiul pe verticală) şi ambele unghiuri sunt date în grade.

Reprezentarea grafică a normalei la suprafaţă se face cu funcţia surfnorm, care calculează şi afişează normala la suprafeţele 3D.

Se apelează cu una dintre sintaxele: • [Nx,Ny,Nz]=surfnorm(X,Y,Z) – returnează matricea componentelor normale

(Nx,Ny şi Nz) normalizate la o suprafaţă 3D descrisă de matricele X, Y şi Z; • [Nx,Ny,Nz]=surfnorm(Z) – returnează matricea componentelor normale

normalizate la o suprafaţă 3D descrisă de matricea Z; • surfnorm(X,Y,Z) şi surfnorm(Z) – reprezintă grafic suprafaţa 3D descrisă

de matricele X, Y, Z, sau numai Z, precum şi normalele la aceasta; • surfnorm(…,'NumeProprietate','ValoareProprietate',…) – la fel ca mai sus

dar şi setează 'NumeProprietate' la 'ValoareProprietate' dorită, putând fi mai multe seturi de astfel de date într-un singur segment.

Pentru inversarea direcţiilor normalelor se apelează funcţia surfnorm cu matricele X, Y şi Z transpuse, surfnorm(X',Y',Z').

Algoritmul de calcul al normalelor reprezentate în 3D se bazează pe aproximarea bicubică a datelor din matricele X, Y şi Z.

Pentru exemplificare, în figura 19.2, sunt reprezentaţi vectorii normali la suprafaţa unui trunchi de con cu razele r=4 si R=8, obţinut din secvenţa:

[X,Y,Z]=cylinder(4:8); surfnorm(X,Y,Z). În controlul iluminării o importanţă deosebită o are reflexia luminii. Prin

reflexie se înţelege partea de lumină reflectată de suprafaţă către observator. Valoarea acesteia variază de la 0 (fără reflexie) până la 1 (reflexie totală). Componentele vectorilor normali pot fi matrice pentru care normala este:

N(i,j)=[Nx(i,j), Ny(i,j), Nz(i,j)]. Aceste componente normale sunt calculate utilizând funcţia surfnorm. Pentru

calculul coeficienţilor de reflexie ai suprafeţelor trebuie precizată poziţia sursei de lumină S şi poziţia V a observatorului faţă de obiectul a cărui suprafaţă reflectă.

Cele două poziţii pot fi date în coordonate carteziene,

Controlul culorilor şi vizualizării reprezentarilor grafice 417

S=[Sx, Sy, Sz] şi V=[Vx, Vy, Vz] sau în coordonate cilindrice,

S=[azs, evs] şi V=[azv, elv] unde azs, azv este azimutul (unghiul în plan orizontal), iar els, elv este elevaţia (unghiul pe verticală) şi ambele unghiuri sunt date în grade.

Fig.19.2. Reprezentarea normalelor la suprafaţă cu funcţia surfnorm

Pentru calculul coeficientului de reflexie al suprafeţelor lucioase se utilizează funcţia specular, care foloseşte vectorii normali la suprafaţă. Se apelează cu sintaxa:

R=specular(Nx,Ny,Nz,S,V), iar pentru calculul coeficientului de reflexie al suprafeţelor difuze se utilizează funcţia diffuse, bazată pe legea lul Lambert,

R=diffuse(Nx,Ny,Nz,S). De regulă, funcţia specular se utilizează împreună cu funcţia surfl pentru a

realiza suprafeţe cu efecte speciale (umbre şi reflexii). Algoritmul implementează o aproximare care conduce la efecte de suprafeţe metalice. Cea mai mare strălucire se produce dacă vectorul normal are direcţia (s+v)/2, unde s este direcţia sursei şi v este direcţia observatorului.

Stabilirea modului de reflexie al materialului se face cu funcţia material, care se apelează cu una dintre sintaxele:

• material shiny – face obiectele strălucitoare (sclipitoare); • material dull – face obiectele întunecate; • material metal – face obiectele metalice;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 418

• material ([ka kd ks]) – setează intensitatea coeficientului de reflexie ambiental (ka), a suprafeţelor difuze (kd), suprafeţelor luciose (ks);

• material ([ka kd ks n]) – în plus, se mai dă şi coeficientul de reflexie al suprafeţelor lucioase (n);

• material ([ka kd ks n sc]) – se setează şi coeficientul de reflexie al culorii (sc) obiectelor;

• material default – setează coeficienţii pentru situaţia lipsă. De meţionat că acest control al proprietăţilor suprafeţelor reflectante se

utilizează la obiectele surface şi patch, create cu funcţiile surf, mesh, pcolor, fill şi fill3.

19.4. Mişcarea şi animaţia imaginilor

Pentru mişcarea şi animaţia figurilor se utilizează următoarele: • capture – captează imaginea curentă de pe ecran; • moviein - iniţializează memoria pentru salvarea cadrelor în mişcare; • getframe – returnează un cadru în mişcare; • movie – lansează operaţia de vizualizare a cadrelor unei imagini în mişcare; • rotate – roteşte un obiect la direcţia dorită; • frame2im – converteşte o imagime în mişcare (un frame) în indexul

imaginii; • im2frame – converteşte un index al imaginii în format animat (un frame).

Pentru a realiza mişcarea şi animaţia imaginilor (cadrelor) reprezentate într-o matrice M, pentru început se formează o nouă matrice cu coloanele deplasate, utilizând în acest scop funcţia getframe. În mod uzual funcţia getframe se apelează într-o buclă for pentru a asambla o imagine M (matrice) în mişcare care este utilizată apoi de funcţia movie.

Funcţia getframe se poate apela cu una dintre sintaxele: • M=getframe – returnează un vector coloană cu un cadru mişcat, care

reprezintă o fotografiere instantanee (pixel cu pixel); • M=getframe(h) – returnează un identificator care permite modificarea

proprietăţilor obiectului figură sau a obiectului axe; • M=getframe(h,poz) – returnează un cadru mişcat al obiectului cu

indicatorul h din zona încadrată de dreptunghiul cu dimensiunile (L,H), situat la distanţa (l,h) de colţul din stânga-jos al ferestrei grafice (în unităţile de măsură curente), iar parametrul poz trebuie să fie un vector linie cu patru elemente, poz=[l h L H].

Pentru a evita utilizarea unei memorii considerabile, înaintea realizării acestei operaţii este preferabilă prealocarea unei matrice de mişcare, capabilă să memoreze cele n cadre succesive. Pentru aceasta se generează anticipat o matrice de zerouri cu funcţia moviein, care se apelează cu sintaxa: M=moviein(n), care în realitate

Controlul culorilor şi vizualizării reprezentarilor grafice 419

este un fişier de tip „m” cu o singură linie. După aceste prelucrări asupra matricei ce reprezintă imaginea de animat, se

utilizează funcţia movie pentru a mişca cadrele într-o anumită ordine, cu o anumită frecvenţă şi un anumit interval de timp precizat.

Funcţia movie se poate apela cu una dintre sintaxele: • movie(M) – ce realizează mişcarea cadrelor matricei M, o singura dată, iar

matricea M trebuie să fie o matrice ale carei coloane sunt cadrele mişcate ale unei imagini, realizate cu funcţia getframe;

• movie(M,n) – realizează mişcarea matricei M de n ori, cu precizarea că dacă n este negativ, mişcarea se face o singură dată înainte şi o singură dată înapoi, iar dacă n este vector, primul element specifică de câte ori se face mişcarea şi elementele 2, 3, … specifică ordinea de prezentare a cadrelor în mişcare din matricea M;

• movie(M,n,f) – în care în plus parametrul f precizează frecvenţa de mişcare, în cadre(frame)/secundă, având valoarea implicită 12;

• movie(h,...) – realizează o mişcare a obiectului h, care poate fi obiect figură sau axe;

• movie(h,M,n,f,loc) – realizează mişcarea de n ori cu frecvenţa f cadre/secundă a obiectului cu identificatorul h, cu imaginea de bază în matricea M, localizat în poziţia loc=[x y neutilizat neutilizat], unde x şi y sunt coordonatele faţă de colţul stânga-jos ale ferestrei grafice, iar loc este un vector cu patru elemente.

De menţionat că animaţia se poate realiza numai dacă memoria RAM este suficientă (aceasta trebuie să fie de cel puţin 2 Mo).

Pentru exemplificare se consideră figura 19.2, care cu secvenţa, for k=1:20; r1=4./k; r2=8./k; [X,Y,Z]=cylinder(r1:r2); surfnorm(X,Y,Z); M(:,k)=getframe; end; movie(M,20,5) permite reprezentarea animat cu 5 frame/secundă de 20 de ori.

Un alt exemplu este vibraţia unei membrane în formă de L, care este realizată cu funcţia vibes, care soluţionează pentru aceasta ecuaţia undelor.

Soluţiile sunt expresii de combinaţii liniare, cu coeficienţi, depinzând de timp ai funcţiilor spaţiale bidimensionale.

Funcţiile proprii sunt calculate cu funcţia membrane. Geometria în formă de L prezintă un interes deosebit, deoarece eforturile devin infinite în apropierea colţului şi sunt utilizate funcţii Bessel de ordin fracţional pentru a rezolva aceste singularităţi.

19.5. Controlul camerei de vizualizare

Pentru controlul camerei de observare a unei figuri se utilizează funcţiile: • campos – găseşte sau poziţionează camera de vizualizare faţă de axe;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 420

• camtarget – găseşte sau poziţionează ţinta camerei de vizualizare faţă de axe;

• camva – găseşte sau poziţionează unghiul de vizualizare al camerei faţă de axe;

• camup – găseşte sau poziţionează vectorul superior al camerei de vizualizare faţă de axe;

• camproj – găseşte sau poziţionează proiecţia camerei care poate fi 'perspective' sau 'orthographic' (cazul implicit).

De menţionat că funcţiile campos, camtarget, camva, camup se apelează cu sintaxa:

• poz=cam... – pentru găsirea valorilor poziţionării; • cam... ([X Y Z]) – setează valorile X, Y, Z ale poziţionării; • mod=cam... ('mode') – pentru găsirea modului de lucru; • cam... ('mode') – setarea modului de lucru care poate fi 'auto' sau 'manual'.

Un control de nivel mai înalt al camerei de vizualizare se realizează cu funcţiile:

• camorbit – stabileşte orbita de mişcare a camerei de vizualizare, care are ca parametrii unghiul de rotaţie în plan orizontal şi unghiul de rotaţie în plan vertical (în grade) şi uneori chiar şi punctul sau axa în jurul căreia se face rotaţia;

• campan – stabileşte adâncimea de rotaţie a camerei de vizualizare, care are ca parametri unghiul de rotaţie în plan orizontal şi unghiul de rotaţie în plan vertical i uneori chiar şi punctul sau axa în jurul căreia se face rotaţia;

• camdolly – are efectul combinat al celor două funcţii anterioare; • camzoom –realizează un zoom specificat prin parametrul dorit care poate fi

subunitar, pentru micşorare, sau supraunitar, la mărire; • camroll – roteşte camera, cu un număr de grade specificat, în sens

trigonometric; • camlookat – deplasează camera şi ţinta pentru a vizualiza un anume obiect

dorit specificat ca parametru; • cameratoolbar – manipularea interactivă a camerei de la fereastra „tools” a

figurii; • camlight –poziţionează lumina faţă de axe şi în raport cu camera de

vizualizare (stânga, dreapta sau prin azimut şi elevaţie); • lightangle - poziţionează lumina în raport cu camera de vizualizare prin

poziţionarea în coordonate sferice a sursei de lumină, dându-se azimutul şi elevaţia;

• camrotate – funcţie utilitară pentru rotirea camerei, dar se poate folosi şi cea din „toolsbar”;

• objbounds – limitele obiectului 3D; • whitebg – modifică fondul de culoare al axelor.

20. CREAREA INTERFEŢELOR GRAFICE

INTERACTIVE

Crearea interfeţelor grafice interactive (Graphics User Interface) utilizează diverse funcţii Matlab specifice pentru:

• crearea elementelor de control pentru interfeţele grafice interactive; • crearea meniurilor pentru interfeţele grafice; • citirea interactivă a datelor de pe grafice; • selectarea interactivă a fişierelor citite; • stabilirea interactivă a fişierelor salvate; • selectarea interactivă a fonturilor; • selectarea interactivă a culorilor.

20.1. Crearea elementelor de control pentru interfeţele grafice interactive

Pentru controlul interactiv al reprezentărilor grafice, în Matlab se foloseşte programarea cu obiecte. În acest scop, sunt definite mai multe elemente de control interactiv:

� butoane prin apăsare (push button şi toggles button); � casete butoane radio (radio button); � casete de control (checkbox); � casete de editare (edit text şi static text); � potenţiometre liniare (sliders); � buton simplu (frame); � listă de opţiuni (listbox şi popup menu); � trasarea axelor (axes).

Butoanele prin apăsare sunt comutatoare care generează o acţiune, dacă sunt apăsate, însă nu rămân în starea apăsat. Pentru activarea unui buton prin apăsare, se apasă şi se eliberează butonul mouse-ului. Aceste butoane se utilizează dacă acţiunea pe care o realizează nu este dependentă de nici o altă acţiune executabilă prin interfaţă.

Butoanele radio sunt mutual exclusive (numai unul poate fi apăsat în acelaşi timp). Pentru activarea butonului radio, se apasă şi se eliberează butonul mouse-ului. Starea butonului este indicată prin afişare. Prin algoritm, trebuie ca implementarea acestor butoane să fie mutual exclusivă.

Potenţialele liniare acceptă valori numerice la intrare şi permit utilizatorului să deplaseze cursorul (prin apăsarea butonului mouse-ului, fără eliberarea acestuia) în interiorul unor limite. Poziţia cursorului indică valoarea numerică selectată la

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 422

eliberarea butonului mouse-ului. Se pot stabili valorile minimă, maximă şi iniţială. Lista de opţiuni a meniului este desfăşurată în momentul selectării. Dacă nu

este activată, se afişează un singur buton, cu un text care reprezintă configuraţia curentă. Această posibilitate de control grafic se foloseşte atunci când se doreşte selectarea unei opţiuni dintr-o listă mutual exclusivă, fără modificarea valorilor, ca în cazul butoanelor radio.

Casetele de editare permit introducerea unui text de la tastatură. După ce acesta a fost scris în casetă, se apasă tasta „Enter” sau se selectează butonul care lanseză execuţia. Se utilizează în cazul în care programul trebuie să preia interactiv un text.

Casetele de control sunt generate prin acţiunea de apăsare, însă rămân în această stare până la o nouă selectare. Aceste obiecte sunt utilizate pentru a permite folosirea unui număr de opţiuni independente, basculând între două stări. Pentru activarea casetei de control se apasă şi se eliberează butonul mouse-ului, iar starea sa este indicată prin afişare.

Pentru crearea elementelor de control, utilizate de interfeţele grafice interactive, se foloseşte funcţia guide, care dă posibilitatea stabilirii interactive cu mouse-ul a butoanelor sau funcţia uicontrol, care se apelează cu sintaxa:

h=uicontrol('Numeproprietate1',valoare1, 'Numeproprietate2',valoare2,...). Interfeţele grafice sunt copii ai obiectului figură şi sunt independente de

obiectul axe. Funcţia uicontrol acceptă perechile proprietate/valoare ca argumente de intrare.

Proprietăţile elementelor de control, pentru interfeţele grafice interactive, pot fi specificate la creare, prin includerea perechilor nume/valoare proprietate sau ulterior, prin identificarea obiectului şi folosirea funcţiei set.

Proprietăţile acceptate, precum şi valorile posibile ale fiecărei proprietăţi, sunt descrise mai jos şi pot fi afişate cu funcţia get.

Pentru citirea proprietăţilor se poate tasta guide, care deschide o figură implicită, unitled.fig, din care, prin apăsarea butonului „Tools” se ajunge la „Property Inspector”, care permite citirea tuturor proprietăţilor.

1. BackgroundColor - culoare Această proprietate specifică culoarea folosită pentru a colora fondul

dreptunghiului, definit prin interfaţa de control. Culoarea poate fi specificată printr-un triplet RGB sau prin numele de culori predefinite în Matlab. De la mouse se poate alege tripletul RGB dorit, în procente.

2. BusyAction -queue sau cancel Prin aceasta se specifică modul de acţiune, care poate fi pe rând (queue) sau fără (cancel).

3. ButtonDownFcn - funcţie Această proprietate permite chemarea unei funcţii Matlab, prin apăsarea butonului.

4. CData - date Permite introducerea unor date sub formă de expresie.

Crearea interfeţelor grafice interactive 423 423

5. CallBack - şir caractere Această proprietate permite evaluarea oricărei expresii Matlab, inclusiv nume de fişiere de tip „m” sau funcţii, conţinută în şirul de caractere la activarea obiectului interfaţă.

6. Children - vector Obiectul interfaţă nu are copii, astfel încât această proprietate este întotdeauna o matrice goală.

7. Clipping - on sau off Această proprietate arată dacă butonul va clipi, pentru on, sau nu, pentru off.

8. CreateFcn - nume Această proprietate permite crearea unei funcţii Matlab, care să fie apelată prin buton.

9. DeleteFcn - nume Permite ştergerea unei funcţii Matlab, apelabilă prin buton.

10. Enable - on sau off sau inactive Această proprietate stabileşte dacă butonul este utilizat, on, neutilizat, off sau inactiv, inactive.

11. FontAngle - normal sau italic sau oblique Permite stabilirea tipului de înclinare a literelor, care poate fi normală, normal, italică, italic, sau oblică, oblique.

12. FontName - nume Specifică numele, nume, fontului de scriere utilizat, care implicit este MS Sans Serif.

13. FontSize - dim Precizează dimensiunea, dim, a fontului utilizat.

14. FontUnits - inches sau centimeters sau normalized sau points sau pixeli Această proprietate specifică unităţile de măsură utilizate pentru font. Unitatea points este egală cu 1/72 inch, adică 0.0353 centimetri, iar celelalte unităţi de măsură sunt unităţi absolute.

15. FontWeight - light sau normal sau demi sau bold Specifică grosimea literei la scriere, care poate fi: subţire (light), normală (normal), semigroasă (demi) sau groasă (bold).

16. ForegroundColor - culoare Această proprietate precizează culoarea textului afişat în obiectul interfaţă. Culoarea poate fi specificată printr-un triplet RGB sau prin numele de culori predefinite în Matlab.De la mouse se poate alege tripletul RGB in procente.

17. HandleVisibility - on sau callback sau off Această proprietate precizează dacă obiectul este vizibil (on), invizibil (off) sau în spate (callback).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 424

18. HorizontalAlignment - left sau center sau right Această proprietate precizează modul de aliniere al textului definit de proprietatea String, în obiectul interfaţă definit.

19. Max - scalar Această proprietate specifică cea mai mare valoare alocată proprietăţii Value. Pentru butoane radio şi casete de control, care operează cu comutatoare „on/off”, aceasta reprezintă setarea lui Value, când interfaţa este în poziţia on. Pentru listele de opţiuni, această proprietate specifică numărul maxim de opţiuni, care pot fi definite de meniu. Pentru potenţiometre liniare, această proprietate este cea mai mare valoare care poate fi selectată. Valoarea implicită este 1.

20. Min - scalar Această proprietate specifică cea mai mică valoare alocată proprietăţii Value. Pentru butoane radio şi casete de control, care operează cu comutatoare „on/off”, aceasta reprezintă setarea lui Value, când interfaţa este în poziţia off. Pentru listele de opţiuni, această proprietate specifică numărul minim de opţiuni, care pot fi definite de meniu. Pentru potenţiometre liniare, această proprietate este cea mai mică valoare care poate fi selectată. Valoarea implicită este 0.

21. Parent - identificator Această proprietate returnează identificatorul obiectului figură (părinte), în care este afişat obiectul interfaţă. Funcţia gca returnează, de asemenea, identificatorul axelor curente ale figurii. Această proprietate se poate seta prin specificarea identificatorului obiectului părinte, ca prim argument al funcţiei uicontrol (fără a fi necesar cuvântul „Parent”, ca de exemplu: uicontrol(1,'Style','Slider',…), care determină identificatorul figurii curente.

22. Position - vector [ 4 elemente ] Prin această proprietate se specifică mărimea şi localizarea obiectului interfaţă în fereastra grafică, definită printr-un vector de 4 mărimi, poz=[orizontal vertical lungimea lăţimea], unde: orizontal şi vertical sunt distanţele, pe orizontală şi verticală, de la colţul din stânga-jos al ferestrei grafice până la colţul stânga-jos al dreptunghiului care defineşte obiectul interfaţă, iar lungimea şi lăţimea sunt dimensiunile dreptunghiului care defineşte obiectul interfaţă. Elementele vectorului poz sunt date în unităţile de măsură specificate de proprietatea Units. Matlab-ul utilizează implicit unităţile normalizate, la care (0,0) este colţul din stânga-jos, iar (1,1) este colţul din dreapta-sus al ferestrei grafice.

23. String - şir de caractere Această proprietate defineşte eticheta butoanelor prin apăsare, a butoanelor radio, a casetelor de control şi a listelor de opţiuni. Pentru introducerea mai multor opţiuni într-o listă de meniuri sau pentru a avea linii multiple într-o casetă de control, se introduc şirurile separate de caracterul „|” (bară

Crearea interfeţelor grafice interactive 425 425

verticală). Întreaga listă trebuie plasată între ghilimele . Pentru casetele de editare, această proprietate este setată la şirul introdus de utilizator.

24. Style - pushbutton sau togglebutton sau radiobutton sau checkbox sau

edit sau text sau slider sau frame sau listbox sau popupmenu Această proprietate defineşte tipul de obiect de control care se creează, respectiv buton de apăsare, buton radio, casetă de control, potenţiometru liniar, casetă de editare sau listă de opţiuni.

25. Type - şir de caractere Această proprietate identifică tipul de obiect grafic. Pentru obiectul interfaţă şirul de caractere este întotdeauna uicontrol.

26. Units - pixeli sau normalized sau inches sau centimeters sau points Această proprietate specifică unităţile de măsură utilizate pentru interpretarea proprietăţii Position. În toate cazurile, măsurarea se face din colţul stânga jos al ferestrei grafice. Unităţile normalizate transformă colţul stânga jos al ferestrei grafice în coordonatele (0, 0), iar colţul din dreapta sus în (1.0, 1.0). Unitatea points este egală cu 1/72 inch, adică 0.0353 centimetri, iar celelalte unităţi de măsură sunt unităţi absolute.

27. UserData - matrice Proprietatea este orice matrice asociată obiectului, care poate să nu fie folosită, dar poate fi vizualizată folosind funcţia get.

28. Value - scalar Valorile posibile ale acestei proprietăţi depind de metoda de control, ele putând fi stabilite interactiv cu mouse-ul sau prin intermediul funcţiei set. Afişarea pe ecran reflectă schimbările făcute prin stabilirea directă a proprietăţii Value.

29. Visible - on sau off Proprietatea determină dacă obiectul de control al interfeţei este vizibil pe ecran, cazul on sau nu este vizibil, cazul off. Valoarea implicită este on.

Pentru exemplificarea modului de creare a interfeţelor grafice interactive se consideră următoarele exemple:

• crearea unui buton prin apăsare, care crează axe normalizate curente, se realizează prin secvenţa,

h = uicontrol('Style','Pushbutton','Units','normalized','Position', ...

[0.2 0.8 0.3 0.1],'Callback','cla','string','Creează Axe'); • crearea unei interfeţe interactive, care schimbă culoarea unei reprezentări

grafice, prin selectarea unei matrice de culoare dintr-o listă de meniuri (popup menu); se realizează cu secvenţa:

hp=uicontrol('Style','Popup','String','hsv|hot|cool|gray|','Units', ... 'normalized','Position',[0.2 0.8 0.3 0.2],'Callback','setmap');

care necesită existenţa unui fişier setmap.m, conţinând următoarele instrucţiuni:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 426

val=get(hp,'Value');if val==1; colormap(hsv); elseif val==2; colormap(hot);

elseif val==3; colormap(cool); elseif val==4; colormap(gray); end, şi pentru a evidenţia efectul se poate apela secvenţa,

[X,Y,Z]=sphere(20); surf(X,Y,Z);grid care trasează o sferă;

• crearea a şase tipuri de obiecte de control al interfeţelor grafice, prezentate în figura 20.1,

Fig.20.1. Obiecte de control ale interfeţei grafice

se realizează cu secvenţa, hpb=uicontrol('Style','Pushbutton','Units','normalized','Position', ...

[0.2 0.8 0.2 0.1],'Callback','cla','String','Buton prin apasare'); hrs=uicontrol('Style','Radiobutton','Units','normalized','Position', ...

[0.6 0.8 0.15 0.1],'Callback','cla','String','Buton radio'); hsl=uicontrol('Style','Slider','String','Potenţiometru liniar', ...

'Units','normalized','Position',[0.2 0.5 0.3 0.1],'Min',0,'Max',1); hpm=uicontrol('Style','Popup','String','hsv|hot|cool|gray', ...

'Units','normalized','Position',[0.2 0.2 0.25 0.1])

hcb=uicontrol('Style','Checkbox','String','Caseta de control', ... 'Units','normalized','Position',[0.6 0.5 0.2 0.1],'Callback','figure');

hed=uicontrol('Style','Edit','String','Caseta de editare', ... 'Units','normalized','Position',[0.6 0.15 0.2 0.05])

Crearea interfeţelor grafice interactive 427 427

20.2. Crearea meniurilor pentru interfeţele grafice

Pentru crearea unor meniuri cu acţiuni predefinite, care se afişează în bara superioară de meniuri, se utilizează funcţia uimenu, care se apelează cu una dintre sintaxele:

� h= uimenu('Nume proprietate','Valoare proprietate', ...); � hsub= uimenu(h,'Nume proprietate','Valoare proprietate', ...).

Funcţia uimenu, după cum se observă, acceptă perechile proprietate / valoare ca argumente de intrare. Fiecare opţiune a meniului poate fi la rândul ei un meniu, care afişează un submeniu, atunci când este selectată.

Submeniurile sunt create prin apelarea funcţiei uimenu, având ca prim argument identificatorul meniului principal. Dacă nu se specifică nici un identificator al unui meniu existent, este creat un meniu principal, care se plasează în bara superioară de meniuri (la nivelul cel mai înalt).

Proprietăţile obiectului meniu, descrise în continuare, pot fi stabilite cu funcţia set şi afişate cu funcţia get.

Aceste proprietăţi pot fi specificate la creare, prin includerea perechilor nume/valoare proprietate sau ulterior, prin identificarea obiectului şi folosirea funcţiei set.

Lista proprietăţilor acceptate, precum şi valorile posibile ale fiecărei proprietăţi sunt prezentate mai jos.

1. Accelerator - Caracter Această proprietate specifică combinaţia de caractere echivalentă acţiunii de apelare a unei opţiuni din meniu. Acceleratorul permite utilizatorului să selecteze o opţiune din meniu, prin tastarea combinaţiei de taste „Ctrl”+”Caracter”.

2. CallBack - şir de caractere Această proprietate permite evaluarea oricărei expresii Matlab, inclusiv nume de fişiere, de tip „m” sau funcţii, conţinută în şirul de caractere, la activarea opţiunii din obiectul meniu.

3. Children - vector Copiii obiectului meniu sunt alte meniuri (numite submeniuri), iar identificatorul conţine câte un vector pentru fiecare submeniu.

4. Enable - on sau off sau inactive Această proprietate controlează o opţiune care se poate sau nu selecta. Dacă o opţiune nu se poate selecta, atunci eticheta acesteia este scrisă cu litere de culoare deschisă (estompat).

5. Label - etichetă Această proprietate specifică textul etichetelor, etichetă, opţiunilor meniului.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 428

6. Parent - identificator Această proprietate returnează identificatorul obiectului părinte, care poate fi un obiect figură sau obiect meniu, iar pentru crearea submeniurilor este absolut necesară setarea acestei proprietăţi.

7. Position - scalar Prin această proprietate se specifică localizarea obiectului meniu pe bara superioară, de la stânga la dreapta, funcţie de valoarea scalarului.

8. Separator - on sau off Această proprietate permite separarea cu lini a fiecărei opţiuni a unui meniu, dacă este on sau fără separare, pentru off.

9. Type - şir de caractere Această proprietate identifică tipul de obiect grafic. Pentru obiectul interfaţă, şirul de caractere este întotdeauna uicontrol.

10. UserData matrice Proprietatea este orice matrice asociată obiectului, care poate să nu fie folosită, dar poate fi vizualizată folosind funcţia get.

11. Visible - on sau off Proprietatea determină dacă obiectul de control al interfeţei este vizibil pe ecran, cazul on, sau nu este vizibil, cazul off. Valoarea implicită este on.

Pentru exemplificare, pornind de la meniul existent al unei figuri, se adaugă un meniu principal cu eticheta Aplicaţii, care conţine trei opţiuni: Nou, Salvare şi Închidere figură. Opţiunea Nou are două subdomenii: Figură nouă şi Fişier M nou. Secvenţa Matlab pentru aceasta este:

f=uimenu('Label','Aplicaţii'); n=uimenu(f,'Label','Nou'); uimenu(f,'Label','Salvare','CallBack','save'); uimenu(f,'Label','Închide figură','CallBack','close'); uimenu(n,'Label','Figura nouă','CallBack','figure'); uimenu(n,'Label','Fişier M nou','CallBack','edit').

20.3. Citirea interactivă a datelor de pe grafice

Pentru citirea interactivă (cu mouse-ul) a datelor de pe graficele reprezentate pe ecran, se foloseşte funcţia ginput, care se apelează cu una dintre sintaxele:

• [x,y]=ginput(N) – returnează N puncte de pe figura curentă, ale căror coordonate sunt vectorii x şi y, poziţionând de fiecare dată, pentru un punct N, cursorul mouse-ului în punctul dorit şi apasând butonul acestuia pentru confirmare, iar la terminarea introducerii celor N puncte, sunt returnaţi vectorii x şi y corespunzători acestor puncte;

• [x,y]=ginput – permite introducerea unui număr neprecizat de puncte, operaţia încheindu-se prin apăsarea tastei „Enter”;

Crearea interfeţelor grafice interactive 429 429

• [x,y,B]=ginput(N) sau [x,y,B]=ginput – returnează coordonatele datelor selectate (care pot fi N puncte), în vectorii x şi y, precum şi variabila B, care reprezintă butonul cu care a fost selectată data (1 pentru butonul din stânga, 3 pentru butonul din dreapta mouse-ului şi altceva pentru tastatură).

Variabilele x şi y, în care au fost returnate aceste valori, se salvează cu funcţia save, ca orice variabilă a mediului de lucru Matlab.

20.4. Selectarea interactivă a fişierelor citite

Pentru selectarea interactivă a numelui şi locului de unde se citesc date sau programe Matlab, se utilizează funcţia uigetfile, care afişează o „casetă de dialog”.

Funcţia uigetfile se apelează cu sintaxa, [nume, cale] = uigetfile('filtrul','titlul casetei',X,Y)

în care: • filtrul – parametrul ce determină care fişiere sunt iniţial afişate în fereastra

de dialog; spre exemplu, dacă acesta este '*.m', sunt listate toate fişierele Matlab având extensia „m”;

• titlul casetei – şir de caractere, care se afişează ca titlu al casetei de dialog; • X, Y – parametrii ce definesc poziţia iniţială a casetei de dialog, în pixeli

(nu toate sistemele acceptă această opţiune); • nume – şir de caractere în care este returnat numele fişierului selectat din

caseta de dialog, iar dacă este întâlnită o eroare sau este selectat butonul Cancel, atunci nu mai există nici un nume;

• cale – şir de caractere în care este returnată calea fişierului selectat din caseta de dialog, iar dacă este întâlnită o eroare sau este selectat butonul Cancel, atunci calea este stearsă din memorie.

Dacă fişierul menţionat nu există, se afişează un mesaj de eroare şi controlul este returnat casetei de dialog. Utilizatorul poate introduce alt nume de fişier sau poate selecta butonul Cancel. Toţi parametrii funcţiei sunt opţionali, însă dacă unul este utilizat, atunci trebuie utilizaţi toţi ceilalţi.

De exemplu, [num,cale]=uigetfile('*.m','SELECTEAZA'),

produce o casetă de dialog asemanătoare cu „Open” din Word, având numele SELECTEAZĂ, ce permite modificarea directorului de căutare prin intermediul lui „Look in”.

Dacă se selectează fişierul matlab.mat, atunci se obţine: nume = matlab.mat cale = C:\matlabR12\work\.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 430

20.5. Stabilirea interactivă a fişierelor salvate

Pentru stabilirea interactivă a numelui şi locului unde se vor salva date sau programe Matlab, se utilizează funcţia uiputfile, care afişează ,de asemenea, o casetă de dialog şi se poate apela cu sintaxa,

[nume, cale] = uiputfile('fişier iniţial','titlul casetei',X,Y) în care:

• fişier iniţial – parametru ce precizează numele fişierului implicit, în care se salvează datele, iar dacă acesta este ,de exemplu, test.m, sunt listate toate fişierele Matlab, având extensia „m”;

• titlul casetei – şir de caractere care se afişează ca titlu al casetei de dialog; • X, Y – parametrii ce definesc poziţia iniţială a casetei de dialog, în pixeli

(nu toate sistemele acceptă această opţiune); • nume – şir de caractere în care este returnat numele fişierului selectat din

caseta de dialog, iar dacă este întâlnită o eroare sau este selectat butonul Cancel, nu se returnează nimic;

• cale – şir de caractere în care este returnată calea fişierului selectat din caseta de dialog, iar dacă este întâlnită o eroare sau este selectat butonul Cancel, nu se întoarce nimic.

Dacă fişierul există, suprascrierea acestuia cu date noi se face numai dacă utilizatorul acceptă, prin selectarea butonului „YES”, concatenată cu o comandă de salvare. Toţi parametrii funcţiei sunt opţionali, însă dacă unul este utilizat, atunci trebuie utilizaţi toţi ceilalţi.

De exemplu, [num,cale]=uiputfile('*.m','Save'),

produce o casetă de dialog asemănătoare cu „Open” din Word, având numele „Save”, ce permite modificarea directorului de căutare prin intermediul lui „Save in”. Dacă se selectează fişierul matlab.mat, atunci se obţine:

nume = matlab.mat cale = C:\matlabR12\work\.

20.6. Selectarea interactivă a fonturilor şi a culorilor

Pentru selectarea interactivă a fonturilor utilizate de o aplicaţie Matlab, se utilizează funcţia uisetfont, care afişează o casetă de dialog cu nume specificat şi numele tuturor fonturilor utilizate de Windows şi se apelează cu sintaxa:

H=uisetfont(HIN, 'titlul casetei'). Această funcţie se utilizează la selectarea fonturilor, ca intrări pentru

obiectele grafice. Parametrii sunt opţionali şi pot fi specificaţi în orice ordine. Dacă este utilizat

HIN, atunci trebuie să se specifice identificatorul obiectului grafic text sau axe.

Crearea interfeţelor grafice interactive 431 431

Proprietăţile curente ale fonturilor, atribuite acestui obiect, sunt utilizate pentru a iniţializa caseta de dialog a fonturilor.

Dacă parametrul titlul casetei este utilizat, acesta este afişat ca nume al casetei de dialog, iar argumentul de ieşire ,H, este identificatorul obiectului grafic. Dacă HIN este specificat, H este identic cu HIN, iar dacă nu este specificat, se creează un nou text, prin selectarea proprietăţilor fonturilor şi se returnează identificatorul acestuia.

Dacă este întâlnită o eroare sau este selectat butonul Cancel, identificatorul H este setat la 0.

De exemplu, h =uisetfont(gca,'Fonturi') deschide o casetă de dialog, într-o figură, denumită Fonturi, în care sunt

casete pentru selectarea numelui fontului (Font), a stilului (Font Style), dimensiunii acestuia (Size), precum şi casetă de selectare (OK) sau anulare (Cancel). De exemplu, în fişierul de lucru poate să apară:

h = FontName: 'Times New Roman' FontUnits: 'points' FontSize: 12 FontWeight: 'normal' FontAngle: 'italic'. Pentru selectarea interactivă a culorilor utilizate de o aplicaţie Matlab, se

utilizează funcţia uisetcolor, care afişează o casetă de dialog cu numele specificat şi cu toate culorile gestionate de Windows şi se apelează cu sintaxa:

C=uisetcolor(ARG, 'titlul casetei'). Această funcţie se utilizează la selectarea culorilor, ca intrări pentru obiectele

grafice. Parametrii sunt opţionali şi pot fi specificaţi în orice ordine. Parametrul ARG este fie un identificator al unui obiect grafic, fie un triplet

RGB (de exemplu [1 0 0] pentru roşu). În ambele cazuri, culoarea specificată este utilizată la iniţializarea casetei de dialog. Dacă nu este utilizată iniţializarea, atunci culoarea folosită este negru.

Dacă parametrul titlul casetei este utilizat, acesta este afişat ca nume al casetei de dialog, iar argumentul de ieşire ,C, este tripletul RGB selectat. Dacă parametrul de intrare ARG este identificator, culoarea obiectului grafic este stabilită la culoarea RGB selectată.

Dacă este întâlnită o eroare sau este selectat butonul Cancel, identificatorul H este setat la 0.

Pentru comanda, Ca=uisetcolor(gca,'Fondul figurii'),

pe ecran apare caseta de dialog cu titlul Fondul figurii, care permite utilizatorului alegerea interactivă a culorii, pentru fondul figurii.

De menţionat că alegerea culorilor se face deschizând fereastra unei noi figuri şi că se poate selecta şi fondul axelor.

21. ELEMENTE DE BAZĂ ÎN UTILIZAREA SIMULINK

PENTRU SIMULARE

În ultimii ani, Simulink a devenit softul cel mai larg utilizat în mediile academice şi în industrie, pentru modelarea şi simularea sistemelor dinamice. Larga utilizare este dată de uşurinţa programării prin intermediul GUI (graphical user interface) şi de diversitatea modelelor ce pot fi analizate, începând cu cele ideale, linearizate, până la cele mai realiste modele nelineare, continue sau discrete în timp, sau cele care îşi modifică în timp configuraţia.

În plus, are posibilitatea utilizării foarte facile a funcţiilor Matlab elaborate, pentru descrierea unor fenomene foarte complicate.

De obicei, Matlab-ul se utilizează pentru analiza modelelor staţionare, iar Simulink pentru modele dinamice. Cum orice model realizat este testat prima dată în regim staţionar şi abia apoi în regim dinamic, o serie de funcţii pentru calculul unor proprietăţi sunt elaborate încă din faza analizei staţionare şi este util de a putea fi integrate în modelele dinamice.

Baza modelării matematice a Simulink o constituie calculul operaţional şi, în principal, transformata Laplace.

21.1. Calculul operaţional. Transformarea Laplace

Calculul operaţional se bazează pe realizarea unei corespondenţe între două mulţimi de funcţii: mulţimea funcţiilor numite original şi imaginile lor, obţinute printr-o anume transformare. Interesul pentru această corespondenţă se datorează faptului că operatorilor de derivare şi integrare, aplicaţi funcţiilor original, le corespund anumite operaţii algebrice, care se aplică imaginilor lor.

Se numeşte original, o funcţie )(tf , reală sau complexă, definită pe mulţimea numerelor reale şi care satisface următoarele condiţii :

1) 0)( =tf pentru 0<t ;

2) )(tf este derivabilă pe porţiuni;

3) există două numere, 0 ,0 00 ≥σ>M astfel încât teMtf

⋅σ

⋅≤0)( .

Prima condiţie apare firesc, deoarece metodele operaţionale sunt folosite la rezolvarea unor probleme inginereşti concrete, în care mărimea fizică reprezentată prin )(tf , are proprietatea că, sau este nulă, înainte de momentul iniţial 0=t , sau

valorile sale pentru 0<t nu prezintă interes. A doua condiţie, de derivabilitate pe porţiuni, este impusă de necesitatea ca,

pe un interval oarecare, ( )ii xx ,1−, din domeniul de definiţie, să existe limitele

laterale, ( ) ( ) ( ) ( ) nixfxfxfxf iiii ,,2,1 ,0 ,0 ,0 ,0 11 L=−′+′−+

−−.

Elemente de bază în utilizarea Simulink pentru simulare 433

A treia condiţie arată că valorile modulului funcţiei pot fi majorate prin valorile unei exponenţiale. Numărul 0σ , se numeşte indice de creştere al funcţiei )(tf .

Cea mai simplă funcţie original este funcţia unitate, cu indicele de creştere 00 =σ ,

>

=

<

0pentru 1

0pentru 2

10pentru 0

)(

t

t

t

t .

Funcţia unitate este importantă datorită faptului că, dată fiind o funcţie )(tϕ , definită pe toată axa reală şi îndeplinind ultimele două condiţii, funcţia

<

=ϕ⋅η=

0pentru )(

0pentru (0)2

10pentru 0

)()()(

tt

t

t

tttf

este o funcţie original. De menţionat că suma şi produsul a două funcţii original sunt funcţii original.

Se numeşte transformată Laplace a funcţiei )(tf sau imaginea după Laplace

a funcţiei )(tf integrala notată

( )∫∞

⋅−

⋅==

0

d)()( tetfsFtftsL

în care, τ⋅+σ= js este un număr complex, în care σ este partea reală, iar τ este partea imaginară. Integrarea se face în funcţie de variabila t şi, ca urmare, transformata Laplace a funcţiei )(tf este funcţia )(tf , de variabilă complexă, s.

Inversa transformatei Laplace este dată de formula lui Mellin-Fourier,

( ) 0 ,d2

1)( σ>⋅

⋅π⋅

= ∫∞+

∞−

asesFj

tfja

ja

ts .

Această integrală poate fi calculată de multe ori, dar nu întotdeauna, cu ajutorul teoremei reziduurilor. Se admite că F(s) are numai poli simpli.

21.1.1. Câteva proprietăţi ale transformării Laplace

Pentru a putea aplica metoda transformării Laplace, numită şi metoda operaţională, la cele mai simple problemele şi pentru a pune în evidenţă necesitatea inversării acestei transformări, se vor prezenta câteva proprietăţi elementare ale acestei transformări.

Dacă funcţia )(tf este identic nulă, transformata ei Laplace este, de

asemenea, nulă, adică 0)( =sF .

O funcţie )(tf , constantă şi egală cu unitatea, începând de la momentul zero,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 434

adică 1)( =tf , are transformata Laplace 0Re ,1

d1)(0

>=⋅= ∫∞

ss

tesFst .

Transformata Laplace a funcţiei tetf

α

=)( este α>

α−

== ReRe ,1

)( ss

sF .

Admiţând că se cunoaşte transformata Laplace a funcţiei )(tf , )()( sFtf =L

şi se caută transformata Laplace a derivatei lui )(tf în raport cu timpul,

)0()(dd

d

d

d

0

fsFstet

f

t

f st−⋅== ∫

−L .

Ca urmare, transformata Laplace a derivatei unei funcţii se obţine înmulţind cu s transformata funcţiei şi scăzând din acest produs valoarea funcţiei, la momentul zero. Dacă valoarea funcţiei este nulă la momentul iniţial, rezultatul devine deosebit de simplu : transformata Laplace a derivatei se obţine înmulţind transformata Laplace a funcţiei, cu s. Prin aplicarea repetată a acestei reguli, se obţine transformata Laplace a unei derivate de ordin oarecare

)0()0()0()(d

d )1(11n

−−−

−−′−−⋅=nnnn

nffsfstfs

t

fLLL ,

în care )0(,),0(),0( )1( −′

nfff L sunt valorile funcţiei şi ale primelor 1−n derivate

ale ei, la 0=t . Transformata Laplace a integralei unei funcţii oarecare se obţine împărţind

trasformata Laplace a acestei funcţii cu s

)(1

d)(0

sFs

ttf =∫∞

L .

Prin aplicarea repetată a acestei reguli, se obţine că integrarea de n ori în

domeniul variabilei t corespunde cu împărţirea prin ns în domeniul s.

Transformarea Laplace este o transformare lineară, adică [ ] LLL ++=++=++ )()()()()()( 221111112211 sFcsFctfctfctfctfc LLL .

Funcţia deplasare, ( ) ( )τ−τ− tft1 , în care τ este o constantă, are o variaţie

(grafic) identică cu funcţia )(tf , cu excepţia faptului că este deplasată cu τ şi dă

valori nule pentru τ<t ; are transformata Laplace ( ) ( )[ ] )(1 sFetftst−

=τ−τ−L .

Pe baza celor anterioare, se arată uşor că transformata Laplace a funcţiei )(tfetλ−

este )( λ+sF .

Conform teoremei asemănării, )( sFt

f ⋅ττ=

τ

L , unde τ este un număr

constant pozitiv. Produsul de convoluţie sau produsul de compoziţie a două funcţii )(tf şi

)(tg , pentru care se cunosc transformatele Laplace :

Elemente de bază în utilizarea Simulink pentru simulare 435

∫∞

⋅=

0

d)()( tetfsFst , ∫

⋅=

0

d)()( tetgsGst

este : [ ] [ ] )()()()(d)()(0

sGsFtgtftgf ⋅=⋅=

ττ−⋅τ∫

LLL .

Deoarece derivatei îi corespunde înmulţirea cu s, rezultă şi

[ ] [ ] )()()()(d)()(d

d

0

sGsFstgtfstgft

⋅⋅=⋅⋅=

ττ−⋅τ∫

LLL ,

care mai este cunoscută şi sub denumirea de formula lui Duhamel.

21.2. Elemente de bază pentru simularea cu Simulink

21.2.1. Blocuri de bază

Blocul Bus Creator combină un set de semnale pe o magistrală, grupul de semnale fiind reprezentat de o singură linie în diagramă. Când este folosit împreună cu blocul Bus Selector, permite reducerea liniilor

pentru descrierea diagramei de la un capăt la altul. Aceasta face ca diagrama să fie mai uşor înţeleasă.

Pentru a reuni grupul de semnale cu blocul Bus Creator, se setează parametrii blocului egalând „numărul porţilor de intrare” cu „numărul semnalelor din grup”. Blocul va afişa numărul de intrări specificat. Se poate conecta orice tip de semnal la intrare, inclusiv semnalele altor magistrale. Pentru a separa semnalele, se conectează la ieşirea blocului o intrare a Bus Selector.

Blocul atribuie un nume fiecărui semnal pe care-l creează. Aceasta permite referirea la anumite semnale, când se caută sursa acestora sau selectarea semnalelor pentru conexiunea cu alte blocuri. Blocul oferă două opţiuni de denumire a semnalelor magistralei.

Pentru a specifica faptul că semnalele preiau numele lor de la porţile de intrare, se selectează „Signal in bus”din lista cu opţiuni.

Blocul Bus Creator generează nume pentru semnalele care corespund

intrărilor care nu au nume. Numele sunt din „signaln”, unde n este numărul de porţi

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 436

la care este conectat semnalul. Se poate schimba numele oricărui semnal prin scrierea numelui direct în

diagramă sau în fereastra proprietăţilor semnalului „Signal Properties”. Dacă se schimbă un nume atâta timp cât fereastra blocului Bus Creator este deschisă, trebuie închisă şi redeschisă această fereastră sau apăsat butonul refresh, aflat lângă lista semnalelor, pentru a actualiza numele în fereastră.

Pentru a specifica faptul că intrările magistralei trebuie să aibă nume proprii, se selectează cererea de potrivire a numelui intrărilor semnalelor cu cele ale semnalelor aparţinând listei din fereastra parametrilor blocului. Fereastra parametrilor blocului afişează numele semnalelor care sunt în acel moment conectate la intrări sau un nume generat (de exemplu, semnalul 2), pentru o intrare necunoscută (fără nume). Din acest moment, se poate folosi fereastra parametrilor, pentru a se schimba numele intrărilor semnalelor. Pentru a schimba numele unui semnal anume, se selectează semnalul din listă. Numele semnalului selectat apare în câmpul „rename selected signal”. Se scrie noul nume în acest câmp şi se selectează butonul „Apply” sau „OK”, pentru a înregistra modificările făcute.

Lista semnalelor magistralei din fereastra de dialog a blocului Bus Creator este o listă a semnalelor de intrare în bloc. Semnul plus „+”, aflat în faţa unui semnal, indică faptul că acest semnal este el însuşi o magistrală, căruia i se pot afişa componentele, prin selectarea semnului plus. Pentru a afla sursa oricărei intrări a semnalului, se selectează semnalul din lista semnalelor în magistrală şi butonul „Find”. Simulink deschide subsistemul conţinând sursa semnalului, dacă este necesar şi iluminează pictograma sursei. Blocul Bus Creator acceptă şi redă valori reale şi complexe ale oricărui tip de dată suportat de Simulink, inclusiv tipului cu virgulă fixă. Parametrii sunt daţi în fereastra de dialog.

Elemente de bază în utilizarea Simulink pentru simulare 437

Opţiunea nume semnal (Signal naming option) selectează numele semnalelor de la porţile de intrare, pentru a atribui numele semnalelor de intrare care le corespund. Se selectează cererea de introducere a noului nume, care trebuie să se găsească în lista semnalelor magistralei. Se activează opţiunea de redenumire a semnalului selectat, prin selectarea câmpului „Rename selected signal”.

Numărul de intrări (Number of inputs) specifică numărul de intrări în acest bloc. Blocul DSP Constant generează un semnal, a cărui valoare rămâne constantă pe timpul simulării. Semnalul constant este cu timp-discret sau timp-continuu.

Când modul este setat continuu, ieşirea este un semnal în timp-continuu. Când modul este setat discret, parametrul timpului este vizibil şi semnalul a avut perioada de ieşire discretă, specificată de parametrii timpului.

Fereastra de dialog este cea din figura alăturată. „Sample mode” specifică

modul la ieşire, DISCRET, pentru un semnal cu timp discret şi CONTINUU, pentru un semnal cu timp continuu. Output, specifică fie că ieşirea este bazată pe „Sample”, fie bazată pe adaptare (frame). Când „Sample-

based” este selectat şi ieşirea este un vector, dimensiunea acestuia este forţată să se încadreze în dimensiunea valorii constante (rând sau coloană). Sample time, specifică perioada pentru ieşirile

„sample-based’. Când este selectată opţiunea „frame-based” pentru parametrii ieşirilor, acest parametru este numit „perioada adaptată” şi este discretă, pentru o ieşire de bază adaptată.

Valoarea constantă (Constant value) specifică valoarea dorită. Acest parametru este adaptat, valoarea introdusă aici poate fi adaptată la o nouă rulare, dar rămâne constantă până la următoarea modificare. Dacă

se specifică orice tip de dată în acest câmp, se scrie valoarea cea nouă, valoarea cea veche pierzându-se dintre parametrii datelor de ieşire.

Blocul Gain multiplică intrarea cu o valoare constantă. Intrarea şi gain-ul pot fi fiecare scalar, vector sau matrice. Se poate specifica valoarea gain-ului în fereastra parametrilor. Precizarea tipului de elemente sau a matricei poate fi specificat la parametrii multiplicării.

De asemenea, este precizată ordinea de multiplicare a termenilor în cazul unei matrice. Blocul Gain acceptă valori reale sau complexe, vectoriale sau matriceale, cu elemente de orice tip ale Simulik-ului, exceptând cel Boolean. Blocul Gain suportă tipuri de dată cu virgulă fixă. Dacă valoarea de intrare a blocului Gain este

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 438

de tip real, iar valoarea Gain-ului este complexă, ieşirea este complexă. Parametrii şi fereastra de dialog sunt redate în figura de mai jos.

„Gain” specifică valoarea cu care va fi multiplicată intrarea. Gain-ul poate fi scalar, vector sau matrice. Gain-ul nu poate fi de tip boolean. Multiplicarea - specifică modul de multiplicare, care poate fi: Element (K*u) – fiecare element al intrării este multiplicat cu fiecare element al gain-ului; Matrice (K*u) – intrare şi gain sunt de tip matrice; Matrice (K) (u-vector) – intrarea şi ieşirea sunt obligatoriu vectori, iar lungimea lor este determinată de lungimea Gain-ului.

“Samle time” - specifică intervalul de timp între încercări; pentru a seta timpul unei încercări se stabilesc parametrii la -1.

Blocul Scop - vizualizează semnalele generate în timpul unei simulări, redând datele introduse în timpul simulării. Poate avea axe multiple (una pe port); toate axele au un orizont de timp comun. Blocul

permite adaptarea timpului şi a valorilor de intrare indicate. Fereastra Scop se poate muta sau dimensiona şi se pot modifica valorile parametrilor în timpul simulării. Dacă semnalul este constinuu, Scop produce un grafic punct cu punct. Dacă semnalul este discret, Scop produce un grafic de tip treaptă. Scop oferă un rând de butoane utile, care să permită mărirea (zoom-ul) datelor obţinute, afişarea tuturor datelor introduse, păstrarea setărilor axelor de la o simulare la alta, limitarea datelor afişate şi salvarea datelor în spatiul de lucru. Butoanele de lucru sunt prezentate în figura următoare, ce reprezintă fereastra Scop, care apare atunci când se deschide grupul Scop.

Elemente de bază în utilizarea Simulink pentru simulare 439

Când se afişează un vector sau o matrice de semnale, Scop alocă fiecarui semnal câte o culoare în ordinea: galben, purpuriu, cian, roşu, verde şi albastru închis. Dacă se afişează mai mult de şase semnale, Scop reia ciclic culorile în ordinea de mai sus. Se stabilesc limitele axei y, prin click dreapta pe axă şi alegând proprietăţile axei, din căsuţele de dialog ce apar: Y min - valoarea minimă pentru axa y; Y max - valoarea maximă pentru axa y; Titlu - numele graficului. În partea de jos apare timpul cât a durat simularea. Cu Zoom se pot mări atât datele de pe axele x şi y în acelaşi timp sau pe fiecare direcţie separat. Funcţia zoom-ului nu este activă în timpul simulării. Pentru a mări datele pe ambele direcţii în acelaşi timp, se selectează butonul cel mai din stânga al barei de zoom, după care se defineşte zona de mărit, folosind căsuţa de selectare. Când se plimbă mouse-ul, Scop vizualizează datele din acea zonă. De asemenea, se poate da click într-un punct din zona care trebuie mărită.

Pentru a mări doar datele de pe axa x , se click-ează pe butonul din mijloc din bara de Zoom. Butonul de setare a salvării axelor face posibil ca, setările pe axa x si axa y să poată fi salvate pentru simularea viitoare.

Fereastra de dialog a parametrilor Scopului ne lasă să schimbăm limitele

axelor, să setăm numărul lor, timpul de simulare, etichetele şi opţiunile de salvare. Pentru a afişa fereastra, se selectează butonul Parameters din fereastra de dialog sau dublu-click pe pictograma Scop-ului. Fereastra de dialog este următoarea

Limita de timp sau schimbarea x- axei, se face prin introducerea unui număr

sau prin selectarea butonului Auto din câmpul Time range. Introducerea unui număr de secunde va produce afişarea după fiecare introducere a ecranului modificat.

Este permisă etichetarea sau specificarea numelui fiecarei axe, având la dispoziţie următoarele opţiuni:

all – eticheta este poziţionată în afara tuturor axelor; inside – eticheta este poziţionată în interior; bottom-axix only – eticheta este poziţionată în partea de jos a axelor; none – nu este etichetat.

Când este selectată opţiunea Scroll, blocul Scop afişează în continuare spre stânga, pentru a putea fi observată bine forma graficului pentru fiecare segment.

Când această opţiune nu este selectată, Scopul afişează rezultatul pe tot ecranul de la stânga la dreapta, ştergând partea de început, înlocuind cu următorul segment, până când se finalizează

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 440

simularea, în final, având afişată pe ecran doar partea finală a diagramei. Se poate afişa notaţia datelor pentru fiecare punct din ecranul Scopului.

Scop afişează legenda cu toate stilurile de linii folosite, pentru toate semnalele folosite.

Tipuri de date folosite

Blocul Scopului acceptă semnale reale ale oricărui tip de date folosite de Simulink, inclusiv cele cu virgulă fixă.

Printarea ferestrei Scopului Pentru a printa conţinutul

fereastrei blocului Scop, se deschide fereastra proprietaţilor scopului şi se dă click pe pictograma cu simbolul print,

cum se arată în figura următoare.

Blocul Sum execută adunări sau scăderi pe intrările sale. Acest

bloc poate aduna sau scădea intrări de tip scalar, vector sau matrice. De asemenea, poate utiliza şi elementele unui vector cu o singură intrare. Fereastra de dialog este redată mai jos.

Se specifică operaţiile în lista parametrilor “list of signs”: Plus (+), minus (-)şi spaţiu (|) sunt caracterele care indică operaţiile ce se execută asupra intrărilor. • Dacă sunt două sau mai multe intrări,

atunci numărul caracterelor trebuie să fie egal cu numărul intrărilor. De exemplu, “+-+”, necesită trei intrări şi cere blocului să scadă a doua (cea din mijloc) intrare, din prima (vârful) intrare şi apoi să adune a treia valoare .

• Toate valorile care nu sunt scalari trebuie să aibă aceleaşi dimensiuni.

Scalarul va fi mărit, ca să aibă aceeaşi dimensiune ca celelalte intrări. • Un caracter “spaţiu” creează un spaţiu mai mare între pictogramele blocului. • Dacă se cere doar adunarea intrărilor, atunci valoarea parametrului numeric

este egală cu numărul intrărilor. • Dacă un singur vector este intrare, atunci semnele “+” sau “-“ vor fi înlocuite

cu un operator specific.

Elemente de bază în utilizarea Simulink pentru simulare 441

Tipul datelor folosite: blocul Sum acceptă semnale reale sau complexe, ale oricărui tip de dată utilizată de Simulink, inclusiv a celor cu virgulă fixă.

Se poate alege forma pictogramei, de cerc sau dreptunghi. Lista semnelor se dă prin introducerea unui număr de caractere plus (+) şi

minus (-), egal cu numărul de intrări. Adunarea este operaţia lipsă, deci dacă se doreşte adunarea intrărilor, se introduce numărul porţilor de intrare. Se poate influenţa poziţia intrărilor, prin introducerea caracterelor “space”.

Prin “Sample time” se specifică intervalul de timp. Este necesar ca toate intrările să aibă acelaşi tip de dată. Se selectează acest parametru pentru că toate intrările trebuie să aibă acelaşi tip de dată.

Modul tipului de dată al ieşirilor se specifică şi se urmăreşte să fie la fel ca la prima intrare. De asemenea, se poate alege să se construiască tipul datei din listă. Dacă se alege „Specify via dialog”, atunci parametrii “Output data type”, “Output scaling value” şi “Lock output scaling against changes by the

autoscaling tool” devin vizibili. Valoarea ieşirilor se setează utilizând doar puncte binare, iar vizualizarea se

realizează dacă se selectează “Specify via dialog for” din parametrii “Output data

type mode”. Blocul Saturation (Saturare) limitează distanţa dintre

semnale. Blocul Saturation acceptă şi tipuri de date cu virgulă fixă şi impune limitele superioare şi inferioare ale semnalului. Când semnalul de intrare este între limite, atunci el rămâne neschimbat.

Când semnalul de intrare nu se încadrează între limite, atunci semnalul este modificat până când se încadrează între limite. Blocul Saturation acceptă semnale reale şi complexe de orice tip suportate de Simulink.

Parametrii şi fereastra de dialog sunt prezentate în figura alaturată. Când semnalul de intrare al blocului Saturation este deasupra limitei superioare introduse pentru

aceste valori, Simulink adaptează, micşorând spre această valoare. Când semnalul de intrare al blocului Saturation este sub această valoare; iesirea acestui bloc este marită pâna la această valoare.

Blocul Transfer FCT (Funcţia de Transfer) ajută la implementarea unei funcţii de transfer. Blocul Transfer Fct implementează o funcţie de transfer, unde intrarea (u) şi ieşirea (v) pot

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 442

fi exprimate prin funcţii de transfer de forma următoare:

)()2()1(

)()2()1(

))

)(

)(

)()( 21

21

nddensdensden

nnnumsnumsnum

sden

snum

su

sysH

ndnd

nnnn

++⋅+⋅

++⋅+⋅===

−−

−−

L

L

unde nn şi nd sunt numărul de coeficienţi ai numărătorului şi ai numitorului; num şi den conţin coeficienţii numărătorului şi ai numitorului, în ordine descrescătoare a puterii lui s.

De menţionat că num poate fi un vector sau o matrice; den poate fi un vector şi ambii au parametrii specificaţi în fereastra de dialog a blocului. Ordinul numitorului trebuie să fie mai mare sau egal cu ordinul numărătorului.

Parametrii şi fereastra de dialog sunt redaţi mai jos. Blocul Transfer Fct are ca intrare un scalar. Dacă numărătorul blocului este un vector, ieşirea blocului este un scalar. Dacă numărătorul este matrice, funcţia de transfer extinde intrarea într-un vector de ieşire, a cărui lungime să fie egală cu numărul de rânduri ale numărătorului. Funcţia de transfer

permite vizualizarea atât a numărătorului cât şi a numitorului. Dacă fiecare este specificat ca un vector sau ca o variabilă inclusă între paranteze, pictograma arată funcţia de transfer cu coeficienţii specificaţi. Dacă se specifică variabila între paranteze, variabila este evaluată. De exemplu, dacă număratorul este [3, 2, 1] şi numitorul este [7, 5, 3, 1], atunci blocul va fi:

Funcţia de transfer acceptă ca intrare şi ieşire semnale de tip double. O matrice cu mai multe rânduri poate să genereze mai multe ieşiri.

Blocul Math Function (Functie MATLAB) permite aplicarea unei funcţii sau expresii Matlab unei intrări. Blocul Math Function aplică funcţii Matlab sau expresii specificate la intrare. Ieşirile funcţiei trebuie să aibă aceeaşi lungime ca iesirile blocului. Expresii pentru acest bloc sunt funcţiile de forma: sin; atan2(u(1), u(2)) ;u(1)^u(2)

Tipuri de date folosite de blocul Math Function sunt intrare reală sau

Elemente de bază în utilizarea Simulink pentru simulare 443

complexă, de tip double şi generează ieşire reală sau complexă de tip double; depinde de setările făcute la parametrul Output signal type.

Funcţia Matlab este o funcţie internă sau expresie de operaţii şi funcţii acceptate.

Dacă se specifică doar funcţia, nu este necesar să se includă şi argumentul intrării între paranteze.

Fereastra de dialog permite selectarea tipului de semnal al funcţiei Matlab ca fiind real, complex sau auto. Valoarea auto, setează tipul ieşirii astfel încât să fie la fel ca tipul semnalului de intrare.

Blocul Fcn este o funcţie definită de utilizator, în care se pot

utiliza apoape toate operaţiile din Matlab, cu observaţia că variabila o reprezintă semnalul de intrare, predefinit ca variabila u. Blocul nu

lucrează cu matrice şi nu admite operaţia de împărţire („:”)

Blocul Derivative calculează derivata impulsului intrat funcţie de timpul de calcul al modelului luat pentru simulare. La început valoarea de intrare este zero şi prin urmare, ieşirea din bloc va fi tot zero. Acurateţea

calculului depinde de pasul de timp luat pentru simulare. Blocul are o singură intrare şi o singură ieşire.

Blocul Step este funcţia treaptă care modifică valoarea iniţială (Initial value) la valoarea finală (Final value) la timpul (Step time), care, dacă nu este precizat, se consideră valoarea implicită de 1 secundă.

Valorile iniţiale şi finale sunt de tipul 1-D. Blocul To Workspace transmite spre spaţiul de lucru datele cu

numele Variable name, având fixată limita inferioară, variaţia de timp şi timpul. Datele sunt salvate fie sub formă de matrice (Array),

fie de structură (Structure).

21.3. Modelul pentru rezolvarea ecuaţiei Van der Pol

Modelul pentru rezolvarea ecuaţiei Van der Pol,

( ) 0122

2

=+⋅+⋅ε+ ydt

dyy

dt

yd,

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 444

în mediul de programare Simulink este redat în figura de mai jos.

van der Pol Equation

To start and stop the simulation, use the "Start/Stop"

selection in the "Simulation" pull-down menu

The van der Pol Equation

(Double-click on the "?" for more info)

2

Out2

1

Out1

1/s 1/s

Scope

Mux

1

Mu

Double-click

here for

Simulink Help

?

1 - u*u

Fcn

x2

x2

x1

x1

Variaţia marimilor y’ şi y’’ în timp este redată în figura de mai jos.

0 10 20 30 40 50 60 70-3

-2

-1

0

1

2

3

t

d2y/d

t2

dy/d

t

21.4. Modelarea şi simularea instalaţiei de alimentare

cu combustibil

Pentru modelare, în vederea regimurilor tranzitorii, este importantă instalaţia din limita cazanului, care permite modificarea debitului de combustibil cu sarcina.

Modelul fizic al instalaţiei de alimentare cu cărbune praf aferentă unei mori este redat în figura 21.1.

Alimentarea cu cărbune a fiecărei mori se face cu alimentatoare cu bandă, aşezate sub buncărele de cărbune, care fac posibilă o modificare a debitului de cărbune prin viteza alimentatorului, printr-un variator de turaţie cu lanţ.

Variatorul de turaţie este comandat de impulsul de ieşire din regulatorul de debit, format pe baza impulsurilor de intrare primite de la reglarea puterii, traductorul de viteză al benzii şi participarea morii (limitată la minim 20 % din capacitate).

Elemente de bază în utilizarea Simulink pentru simulare 445

Fig.21.1. Instalaţia de alimentare cu combustibil solid

Procesele fizice ce descriu funcţionarea instalaţiei de alimentare cu combustibil sunt de transport, la combustibilul solid şi respectiv de laminare, la combustibil lichid sau gazos. Apar, în toate cazurile, întârzieri şi o reacţie inversă.

Ipoteze simplificatoare adoptate: • densitatea şi înălţimea stratului de cărbune pe bandă sunt constante; • păcura se consideră incompresibilă, iar ventilul de reglare este

echiprocentual; • modificarea debitului se face numai prin modificarea vitezei benzii sau

deschiderii ventilului. Modelul matematic ce descrie funcţionarea benzii de transport, fără a

considera mecanismele de acţionare, reglare şi limitare este:

DmeDmiDmctd

d−=

unde Dmc, Dmi, Dme [kg/s] - sunt respectiv, variaţia debitului de combustibil, intrat şi ieşit dintr-un contur de bilanţ. Debitul masic intrat, Dmi, depinde de mărimea principală controlată, care poate fi viteza benzii sau lungimea tijei ventilului, printr-o constantă. Totodată, debitul masic ieşit, Dme, în primul moment, se poate considera constant.

Considerând mărimea de comandă tradiţională, anume presiunea aburului viu p0 , şi luând în consideraţie întârzierea sistemului de acţionare şi reacţia, forma

operaţională a modelului ce permite calculul debitului de combustibil în u.r. este:

0

s

ps

Dmc +1

c

T

T

e D−

=

unde: Tc - constanta de timp a sistemului de reglare a debitului de combustibil, cu valori de 44 [s], pentru cărbune praf, 12-17 [s], pentru păcură, şi 5-8 [s] pentru gaze; TD - timp de întârziere, având valori: 8-10 [s] la cărbune, 4-5 [s] la păcură şi 2-3 [s] la gaze.

Diagrama bloc a instalaţiei de alimentare cu combustibil şi regulatorul aferent, este prezentată în figura 21.2. De obicei, regulatorul debitului de combustibil este de tip PID, valorile constantelor depinzând atât de tipul de

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 446

combustibil, cât şi de modul de participare al centralei la acoperirea curbei de sarcină.

Fig.21.2. Sistemul de alimentare cu combustibil

Variaţia debitului relativ de combustibil este redată în figura 21.3, care evidenţiază întârzierile diferite de la un tip de combustibil la altul.

Pentru constante, s-au considerat valorile: la cărbune TD = 10 [s], iar TC= 44 [s]; la păcură TD = 5 [s], iar TC = 15 [s]; pentru gaze TD = 2 [s], iar TC = 5 [s].

Fig.21.3. Variaţia debitului de combustibil

21.5. Modelarea şi simularea focarului

Se consideră un focarul ca o zonă de ardere reală sau fictivă, la sfârşitul căreia rezultă temperatura adiabatică de ardere.

Modelul fizic al focarului este prezentat în figura 21.4. Se consideră cazul cel mai cuprinzător, întâlnit practic numai la generatoarele de abur cu ardere suplimentară, în sensul că poate intra o cantitate de aer necesar arderii, o cantitate de combustibil şi gaze de la turbina cu gaze, ieşind zgură şi gaze de ardere impure.

Procesele fizice ce descriu funcţionarea focarului adiabatic de omogenizare sunt cele de ardere a combustibilului (solid, lichid sau gazos) şi omogenizare (prin amestec turbulent şi transport), în volumul fizic real.

Elemente de bază în utilizarea Simulink pentru simulare 447

Ipoteze simplificatoare adoptate: • compoziţia şi temperatura de preîncălzire a combustibilului rămân constante; • concentraţia masică de vapori de apă din aer, xaer , nu se modifică în timp; • masa totală nu variază în timp; • aerul şi gazele de ardere se consideră gaze perfecte, ceea ce permite calculul

densităţii din ecuaţia de stare a gazului perfect.

Fig.21.4. Modelul fizic al focarului

Modelul matematic ce descrie funcţionarea focarului rezultă din ecuaţia de conservare a energiei.

Variaţia densităţii rezultă din ecuaţia de stare a gazului perfect. Forma

operaţională care dă variaţia densităţii gazelor cu variaţia temperaturii, în u.r., este:

rogF = - tgF unde: rogF - variaţia densităţii gazelor de ardere din focar; tgF - variaţia temperaturii gazelor de ardere din focar.

Se consideră focarul de omogenizare de la un generator de abur energetic care arde cărbune pulverizat sau păcură.

În acest caz ecuaţia de conservare a energiei este,

( ) ( )d

d tV h Dmc h hi Dmaer h

Dmgaze h Dmzg h Q

F gF gF comb aer

gF zg pierderi

⋅ ⋅ = ⋅ + + ⋅ −

⋅ − ⋅ −

ρ

unde: VF [m3] - volumul focarului; ρgF [kg/m3

] - densitatea gazelor din focar; hi [kJ/kg] - puterea calorifică inferioară a combustibilului; Dmc, Dmaer, Dmgaze,

Dmzg [kg/s] - debit masic de combustibil, aer, gaze de ardere şi respectiv de zgură; Qpierderi [kW] - suma pierderilor focarului; hgF , hcomb , haer , hzg [kJ/(kg °C] - entalpia gazelor din focar, a combustibilului, aerului şi respectiv a zgurii.

Pe de altă parte:

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 448

( )d

d tV Dmc Dmaer Dmgaze DmzgF gF

⋅ = + − − =ρ 0

iar, MzgfocarDmcDmzgMtaerumAlfaDmcDmaer ⋅=⋅⋅= ;

unde, în plus: Alfa - coeficientul de exces de aer; Mtaerum [kg/kg] - masa teoretică de aer umed necesar arderii, funcţie de compoziţia combustibilului; Mzgfocar [kg/kg] - masa zgură reţinută în focar, funcţie de tipul focarului şi conţinutul iniţial de anorganic.

După prelucrare, forma operaţională, care permite calculul variaţiei temperaturii gazelor din focar, în u.r., este:

s tgF = - a1F tgF + a2F Dmc + a3F taer unde:

{ }

00

000

1FagFgFF

cenusagF

hV

hMzgfocarhMgazeDmc

⋅⋅

⋅−⋅⋅

=

ρ

;

{ }

.)1(

a

;a

00

000

3F

00

00000

2F

gFgFF

aer

gFgFF

cenusagFaercomb

hV

hMtaerumAlfaDmc

hV

hMzgfocarhMgazehMtaerumAlfahihDmc

⋅⋅

⋅⋅−⋅=

⋅⋅

⋅−⋅−⋅⋅++

=

ρ

ρ

În relaţiile de calcul a coeficienţilor, indicele superior "0", semnifică faptul că mărimile sunt calculate din regimul de referinţă, la momentul 0, neperturbat.

Diagrama bloc ce permite calculul temperaturii focarului adiabatic, este redată în figura 21.5.

Fig.21.5. Focar adiabatic GA

Figura 21. 6 prezintă variaţia în timp a temperaturii adiabatice a gazelor din focarul adiabatic al generatorului de abur de 1035 t/h, funcţionând pe cărbune pulverizat, în u.r., la aplicarea unui semnal treaptă, pentru Dmc şi taer.

Elemente de bază în utilizarea Simulink pentru simulare 449

Fig.21.6. Variaţia temperaturii adiabatice a gazelor

21.6. Modelarea şi simularea generatorului electric

Modelul matematic este nelinear, toate mărimile sunt în u.r., şi cuprinde: • ecuaţiile Park pe axele d şi q:

;; ''''dqqd IxEU IxEU

dqqd⋅−=⋅+=

;)(;)(' '''ddqqqd IxxEE IxxEE

dqqd⋅−−=⋅−+=

( ) ;'

1;

'

1

00

''d

d

qfd

d

ET

Et d

d EE

TE

t d

ddq

⋅−=−⋅=

• puterile sincrone la ieşire (activă şi reactivă):

qddqqqd IUIUQIUIdUP ⋅−⋅=⋅+⋅= ;

• tensiunile finale:

;' ;' ''''dqqq IxjIxEUEjEE

dd⋅⋅−⋅+=⋅+=

• curentul pe fază şi impedanţa la intrare:

( ) ( )

( ) ( )

⋅−−⋅−

⋅−⋅−

=

⋅+=−⋅+=

b

a

UEUE

UEUE

I

I

sau

bjaZ ZUE= IjII

bb

bqb

q

d

bqd

dq

d

δδ

δδ

sincos

cossin

;;)'(

''

''

• ecuaţiile electromecanice:

( )[ ] ;; 000

ωωδωωπ

ω −=−⋅−−⋅⋅

=

t d

d DPW

H

n

t d

di

unde: U, Ud, Uq - tensiunea finală pe o fază a statorului, respectiv componentele d şi q ale acesteea; Ed, Eq, E - tensiunile fictive corespunzătoare reactanţelor sincrone

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 450

şi finală; E', E'd, E'q - tensiunea tranzitorie internă şi componentele pe axa d,

respectiv q; xd, xq - reactanţa sincronă longitudinală şi respectiv transversală; x'd, x'q - reactanţele tranzitorii corespunzătoare axei d şi q; T'd0 ,T'q0 - constantele de timp tranzitorii: a înfăşurării de excitaţie (din axa d) şi a circuitului rotoric din axa q, când celelalte circuite sunt deschise; I, Id, Iq - curentul pe fază şi respectiv componenta transversală şi longitudinală; P - puterea activă; Q - puterea reactivă; Z - impedanţa complexă totală; a - suma rezistenţei generatorului, transformatorului şi liniei, până la bare; b -suma reactanţei liniei, reactanţei transformatorului şi tranzitorie directă a generatorului; ω

0 [rad/s] - viteza unghiulară staţionară; n0 [1/s]

- frecvenţa sincronă staţionară; H [s] - constanta de inerţie a ansamblului turbogenerator; Wi - puterea mecanică transmisă de turbină la cupla generatorului; D [s/rad] - constanta de amortizare; δ0 [rad] - unghiul electric; indicele 0 semnifică starea staţionară de referinţă; toate mărimile ce nu au precizate unităţi de măsură, sunt în u.r.

Pentru modelul generatorului electric, prezentat în figura 21.7:

Fig. 21.7. Modelul generatorului electric

• mărimile de intrare sunt: Efd - tensiunea de excitaţie, de la regulator; Ub - tensiunea pe bare, de la sistem; Wi - puterea internă la cuplă, de la turbină;

• mărimile de ieşire sunt: P - puterea electrică activă livrată; Q - puterea electrică reactivă livrată; ωωωω - viteza unghiulară, pentru regulatorul de turaţie.

Detalierea modelului Simulink al generatorului electric se prezintă în figura

21.8.

Elemente de bază în utilizarea Simulink pentru simulare 451

Fig. 21.8. Modelul Simulink al generatorului electric

Sistemul de ecuaţii care stă la baza modelului Simulink este:

δP bq ⋅+⋅+⋅+⋅= 43'

2'd1 UEE gggg ;

δUs bqq ⋅+⋅+⋅+⋅+⋅=⋅ 98'

7'd6fd5

' EEEE ggggg ;

δs bq ⋅+⋅+⋅+⋅=⋅ 1312'

11'd10

'd UEEE gggg ;

δQ bq ⋅+⋅+⋅+⋅= 1716'

15'd14 UEE gggg ;

( ) ( ) ( ) PWωωs i ⋅⋅−⋅⋅+⋅⋅−=⋅ HHHD 21212 ; ω=δ⋅s unde:

( ) ;10000

''1 qdqdqd IxaxbIUbUag ⋅⋅−⋅−⋅+⋅−⋅=

;''10000

2 dI

qxa

dxb

qI

qUa

dUbg ⋅⋅+

⋅−⋅+⋅+⋅=

( ) ( ) ;0

'00cos0sin

0'

00cos0sin3

+⋅⋅δ⋅−δ⋅+

−⋅⋅δ⋅+δ⋅=

qUqx

dIab

dUdx

qIbag

( )

( )

;

'000cos0sin

'000cos0sin

04

⋅+δ⋅+δ⋅

+

⋅−δ⋅−δ⋅

=

qx

dI

qUba

dx

qI

dUab

bUg

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 452

;'

1)'( ;

'

' ;

'

1

000

765d

dd

d

dd

d T

xxbg

T

xxag

Tg

+−⋅−=

−⋅−==

( ) ;cossin'

'008

0

δδ ⋅+⋅⋅

= baT

xxg

d

dd( );sincos

'

' 009

0

0δδ ⋅−⋅⋅

⋅= baT

xxUg

d

dd

b

;'

)'( ;

'

1)'(

00

1110q

qq

q

qq

T

xxag

T

xxbg

−⋅

=

+−⋅

−=

( );cossin'

'0012

0

δ⋅−δ⋅⋅

= abT

xxg

q

qq( );cossin

'

'0013

0

0δ⋅+δ⋅⋅

⋅= baT

xxUg

q

qq

b

( ) ( );''0000014 qqdddqq xIUbxIUaIg ⋅+⋅+⋅−⋅+=

( ) ( );''0000015 qqdddqd xIUaxIUbIg ⋅+⋅−⋅−⋅+=

( ) ( )

( ) ( );

cossin'

sincos'

00

00

16

00

00

δ⋅−δ⋅⋅+⋅+

+δ⋅+δ⋅⋅⋅−

−=

abUxI

abxIUg

dqq

ddq

( )( )

( )( );

sincos'

cossin'

00

00

17

00

00

0

δ⋅+δ⋅+⋅−

−δ⋅−δ⋅⋅−

⋅=

abUxI

abxIUUg

dqq

ddq

b

Mărimile de referinţă considerate sunt: Z=0.1+j.0.3; xd=xq= 1.2; x'd=x'q= 0.2; Ub0 = 0.8; Ud0 =0.578; Uq0 = 0.816; Id0 =0.876; Iq0 =0.482 toate în u.r.; T'd0 =T'q0 =2.5 s; H=4 s; D = 0.2 s/rad; δ0 = 58.5°.

În figura 21.9 se prezintă variaţia puterii active P, la o variaţie treaptă cu 10 % a mărimilor de intrare, respectiv a tensiunii de excitaţie Efd, a tensiunii pe bare Ub, şi puterii interne la cuplă Wi.

Fig. 21.9. Variaţia puterii active P cu Efd, Ub, şi Wi

22. ELEMENTE DE BAZĂ MICROSOFT EXCEL

PENTRU MODELARE ŞI SIMULARE

În ciuda opiniei generale, Microsoft Excel este destinat calculului cu scop general, realizării de grafice şi operaţii statistice, neavând o aplicabilitate limitată doar la domeniul financiar-contabil.

Datorită includerii în pachetul Microsoft Office, această aplicaţie soft este instalată pe majoritatea calculatoarelor care rulează una dintre variantele Windows. Efectuarea unor calcule şi grafice în cadrul Microsoft Excel este recomandabilă, deoarece beneficiază de toate avantajele folosirii conjugate a aplicaţiilor componente Microsoft Office: eficacitate, transfer facil al informaţiilor între documente prin copiere, stabilirea unor legături între copiere şi original, încorporarea de noi date, prin copierea de informaţii existente sau inserare prin intermediul unor obiecte.

În paginile ce urmează, se va încerca o prezentare succintă a acestei aplicaţii software, prin descrierea principalelor funcţii şi modul în care acestea pot fi utilizate, pentru realizarea unor calcule matematice complexe.

22.1. Lucrul cu foile de calcul

22.1.1. Descrierea unui fişier-dosar de lucru

Un fişier Excel (prezintă extensia: .xls) conţine mai multe foi de calcul (worksheet sau mai scurt sheet), reunite într-un dosar de lucru workbook (book). Numele dosarului este, de fapt, numele fişierului, care apare pe bara de titlu a ferestrei, iar numele foilor de calcul apare pe etichetele din partea de jos a paginii. În mod automat, la crearea unui fişier, i se atribuie numele Book1, iar foilor de calcul Sheet1, Sheet2, Sheet3.

Dacă numele fişierului se stabileşte la salvarea acestuia, numele foilor de calcul se schimbă, prin alegerea opţiunii Sheet – Rename, din meniul Format sau făcând dublu click pe butonul stâng (sau click pe butonul drept) pe eticheta foii de calcul şi scriind noul nume. Dosarul se poate răsfoi cu uşurinţă, printr-un click pe eticheta foii de calcul dorite. Foile de calcul se pot adăuga (meniul Insert - Sheet) sau şterge (meniul Edit - Delete Sheet).

O foaie de calcul este organizată în rânduri sau linii (rows), marcate prin numere şi coloane (columns), marcate prin litere. Intersecţia dintre o linie şi o coloană este celula (cell), a cărei adresă sau referinţă este dată de litera asociată coloanei, urmată de numărul asociat rândului (A1 este prima celulă a unei foi de calcul). Celula activă este celula în care se introduc date în momentul tastării, această acţiune având loc pe bara de valori şi formule a celulei active (formula

bar). Se poate lucra, atât cu o singură celulă odată, cât şi cu mai multe, formându-

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 454

se astfel un domeniu. Adresa domeniului este dată de adresa primei celule din domeniu, urmată de „:” şi de adresa ultimei celule din domeniul ales. (A1:B2 este domeniul format din primele patru celule din foaia de calcul).

O celulă poate conţine valori (values), numere şi texte sau formule (formulas). O valoare este o informaţie introdusă direct într-o celulă; poate fi o valoare numerică, inclusiv dată, oră, monedă, procent, fracţie, notă ştiinţifică sau text. O formulă este o secvenţă de valori, referinţe de celule, nume, funcţii sau operatori, care produc noi valori din valori existente. Formulele încep întodeauna cu semnul „=”. O valoare, care este rezultatul unei formule, poate schimba şi alte valori din dosarul de lucru.

În figura următoare sunt prezentate principalele componente, amintite mai sus, ale ferestrei Microsoft Excel.

22.1.2. Selectarea uneia sau a mai multor celule

Pentru a lucra cu un domeniu de celule, acesta trebuie mai întâi selectat, prin poziţionarea mouse-ului pe prima celulă a domeniului şi ţinându-se apăsat butonul stâng al acestuia, până la inserarea ultimei celule din domeniul dorit. Pentru selectare se mai pot folosi şi combinaţiile de taste „Shift + săgeţi” sau „Shift + PageUp” sau „Shift + PageDown”.

Există situaţii când este necesară selectarea unor domenii neadiacente (grupuri de celule care nu sunt alăturate). Pentru selectarea acestora, se apasă după selectarea primului domeniu tasta „Ctrl” şi se ţine apăsată, până la selectarea

Elemente de bază Microsoft Excel pentru modelare şi simulare 455

ultimului domeniu, care se face tot prin poziţionarea cursorului în prima celulă a acestuia, cu click pe butonul stâng al mouse-ului şi tragere în direcţia dorită, ţinându-se apăsat butonul.

22.1.3. Derularea foii de calcul

Parcurgerea foii de calcul se face cu ajutorul barelor de deplasare, orizontală şi verticală. Dacă se doreşte menţinerea pe ecran a primelor rânduri sau coloane din tabel, se poate proceda la îngheţarea zonei respective, prin utilizarea opţiunii Window-Freeze Panes. O altă opţiune este Window-Split, împărţirea ferestrei foii de calcul în patru ferestre, cu derulare independentă, fiecare având bare de deplasare proprii.

22.1.4. Dimensionarea rândurilor şi a coloanelor

Pentru ca datele introduse în tabel să poată fi urmărite uşor, este utilă dimensionarea înălţimii unui rând sau a lăţimii unei coloane.

Pentru ajustarea lărgimii unei coloane se poziţionează cursorul pe linia de demarcaţie dintre coloane, forma cursorului devine o linie cu săgeţi la ambele capete, ţinând apăsat butonul stâng, se trage în direcţia dorită (la dreapta pentru a lărgi coloana, la stânga pentru a o îngusta). Executarea unui dublu click pe marginea din dreapta a capului unei coloane determină lărgimea automată a acesteia, astfel încât să încapă în celule toate datele introduse în coloana respectivă. Similar, se procedează şi în cazul înălţimii rândurilor.

Pentru a ajusta în acelaşi timp înălţimea şi lăţimea mai multor rânduri şi coloane, se selectează un rând şi apoi, din meniul Format-Row-AutoFit, la fel se selectează o coloană, apoi meniul Format-Column-AutoFit.

22.1.5. Forma de prezentare a datelor

În momentul în care s-au introdus datele necesare, s-au aplicat formule de calcul şi s-au obţinut rezultatele dorite, trebuie aleasă o formă plăcută şi eficientă de prezentare a materialului realizat. În acest scop, se utilizează opţiunile prezente în meniul Format.

Opţiunea Format-AutoFormat oferă o listă de forme predefinite de tabele. Format-Style este utilă dacă se doreşte un anumit stil al datelor care apar în foaia de calcul cum ar fi: formatul numerelor, al textului, tipul, mărimea şi culoarea fontului utilizat, alinierea datelor în celule, marginea celulelor şi altele.

Excel recunoaşte cuvintele ca text şi le aliniază la stânga, în interiorul celulei. Numerele sunt aliniate la dreapta. La selectarea unor comenzi care se aplică logic numerelor, Excel ignoră orice text întâlnit. În cazul în care se doreşte interpretarea unui număr ca text, se pune apostrof înaintea primei cifre a numărului (astfel ‘123 este tratat ca text şi nu va intra în calcule ulterioare).

Pentru scrierea automată a unui titlu de rând sau coloană, pe mai multe linii, în interiorul aceleiaşi celule, se selectează meniul Format-Cells-Alignement-

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 456

Wrap Text. Trecerea la o linie nouă, în interiorul unei celule, se face cu combinaţia de taste „Alt + Enter”. Pentru un spaţiu de lungime definită se foloseşte „Ctrl + Alt + Tab”.

22.1.6. Protejarea celulelor, a foilor de calcul şi a dosarelor de

lucru

Prin protejarea foii de calcul, în toate celulele componente ale acesteia, se blochează orice modificare, până la o eventuală deprotejare.

Protejarea foile de calcul şi dosarelor de lucru se realizează din meniul Tools-Protection-Protect Sheet (protejarea foilor) sau Protect Workbook (protejarea dosarelor). La protejarea foilor există câteva opţiuni:

Password – permite alegerea unei parole; Contents – blochează conţinutul (celulele) foii de calcul, nemaipermiţând

modificări sau ştergeri; Objects – nu permite modificarea diagramelor sau a obiectelor grafice. Dacă, ulterior protejării, se doreşte modificarea valorilor din anumite celule,

se procedează astfel: se selectează celulele dorite apoi, din meniul Format-Cells-

Protection, se invalidează opţiunea Locked.

Deplasarea, copierea, mutarea şi inserarea celulelor

Mutarea unei celule sau a unui grup de celule se face astfel: se selectează celula sau domeniul care urmează a fi mutat, prin plasarea cursorului pe chenarul negru al celulei sau a domeniului activat. Forma acestuia devine o săgeată albă, click stânga şi tragerea zonei selectate în noua locaţie, urmată de eliberarea butonului mouse-ului.

Copierea se face similar, cu menţiunea că se va ţine apăsată tasta Ctrl din momentul în care se poziţionează cursorul pe chenarul zonei selectate.

Copierea şi mutarea se pot face şi folosind comenzile din meniul Edit: Copy, Cut, Paste.

În interiorul unui tabel pot fi inserate celule, coloane sau linii libere, utilizând comenzile corespunzătoare din meniul Insert. De asemenea, celule, linii sau coloane pot fi înlăturate după selectare şi utilizând comanda Edit-Delete.

22.2. Operaţii şi funcţii matematice

22.2.1. Funcţii de calcul

Pentru a efectua operaţii aritmetice sau folosi funcţiile matematice din meniuri, este necesar ca descrierea formulei de calcul să înceapă cu semnul „=”.

De exemplu, pentru a calcula în celula D1 rezultatul înmulţirii valorilor din celulele A1 şi B3, la care se adună valoarea din celula C1, se activează celula D1, în care se scrie următoarea formulă: =A1*B1+C1 (echivalentul D1=A1*B1+C1).

Elemente de bază Microsoft Excel pentru modelare şi simulare 457

Funcţia AutoSum este utilizată la însumarea valorilor unui domeniu selectat, rezultatul fiind afişat în celula imediat următoare.

Pentru activare se selectează domeniul de aplicare dorit şi se apasă din bara

de butoane .

Alături de butonul funcţiei AutoSum, există butonul Paste Function, care permite utilizarea uneia dintre funcţiile de calcul disponibile. Aceste funcţii sunt predefinite, fiind mai uşor de utilizat şi mai rapide decât formulele.

După apăsarea butonului, fx , apare o listă a funcţiilor definite, grupate pe domenii de aplicare; se alege funcţia dorită, se apasă OK, după care se completează argumentul funcţiei.

Funcţiile pot fi introduse şi cu ajutorul Insert-Function, iar dacă se cunoaşte sintaxa funcţiilor, acestea pot fi introduse şi direct, pe bara de formule şi valori a celulei active.

Microsoft Excel încorporează mai multe funcţii de calcul, grupate în următoarele categorii:

Funcţii financiare (Financial), aplicate cu deosebire în domeniul economico-financiar;

Funcţii cronologice (Date & Time), cu ajutorul cărora se poate lucra în formule cu valori de tip dată şi de tip oră;

Funcţii matematice şi trigonometrice (Math & Trig), utilizate în calcule matematice;

Funcţii statistice (Statistical), cu care se realizează analize statistice a datelor introduse;

Funcţii de căutare şi referinţă (Lookup and Reference), utile în căutarea unor date, liste de date sau tabele, sau a referinţei unei celule;

Funcţii pentru baze de date (Database), folosite în cazul în care se doreşte să se afle dacă valorile dintr-o listă îndeplinesc anumite condiţii sau criterii;

Funcţii text (Text), cu ajutorul cărora se poate opera în formule cu string-uri de caractere;

Funcţii logice (Logical), utilizate la efectuarea operaţiilor logice; Funcţii de informare (Information), cu ajutorul cărora se poate determina

tipul datelor conţinute de o celulă.

22.2.2. Funcţii matematice şi trigonometrice

Dintre cele mai importante funcţii matematice şi trigonometrice se menţioneză:

- ABS(number) întoarce valoarea absolută a unui număr (number). Exemplificare: ABS(2) = 2; ABS(-2) = 2. - ACOS(number) întoarce valoarea, exprimată în radiani, a arccosinusului unui număr.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 458

Exemplificare: ACOS(-0.5) = 2,094395 (2 π /3) sau, ACOS(-0.5)*180/PI() = 120 (°). - ACOSH(number) întoarce valoarea, exprimată în radiani, a arccosinusului

hiberbolica unui număr, cuprins între 0 şi 1. Exemplificare: ACOSH(1) equals 0;

ACOSH(10) equals 2,993223. - ASIN(number) întoarce valoarea, exprimată în radiani, a arcsinusului unui

număr. Exemplificare: ASIN(-0.5) = -0.5236 (-π/6) sau,

ASIN(-0.5)*180/PI() = -30 (°). - ASINH(number) întoarce valoarea, exprimată în radiani, a arcsinusului

hiperbolic a unui număr. Exemplificare: ASINH(-2.5) = -1,64723; ASINH(10) = 2,998223.

- ATAN(number) întoarce valoarea, exprimată în radiani, a arctangentei unui număr. Exemplificare: ATAN(1) = 0,785398 (π/4) sau,

ATAN(1)*180/PI() =45 (°). - ATAN2(x_num,y_num) întoarce valoarea, exprimată în radiani, a

arctangentei unor coordonate x şi y (x_num şi y_num), specificate (adică unghiul format între axa OX şi linia trasă prin punctul de origine şi cel ale cărui coordonate sunt specificate). Exemplificare: ATAN2(-1, -1= -2,35619 (-3π/4) sau,

ATAN2(-1, -1)*180/PI() = -135 (°). - ATANH(number) întoarce valoarea, exprimată în radiani, a arctangentei

hiperbolice a unui număr (cuprins între –1 şi 1 exclusiv). Exemplificare: ATANH(-0.1) = -0,10034

- CEILING(number,significance) rotunjeşte un număr (number) în sus, până la următorul multiplu semnificativ specificat(significance).

Exemplificare: CEILING(2.5, 1) = 3; CEILING(-2.5, -2) = –4; CEILING(1.5, 0.1) = 1,5.

- COMBIN(number,number_chosen) întoarce numărul de combinări, pentru un număr dat (number); number_chosen este numărul luat în fiecare combinaţie.

Exemplificare: Dacă se doreşte formarea unei echipe de 2 oameni din 8 candidaţi, numărul de combinări C28 este: COMBIN(8, 2) = 28.

- COS(number) întoarce valoarea cosinusului unui unghi, dat în radiani, (number). Exemplificare: COS(1.047) =0,500171;

COS(60*PI()/180) = 0,5, (valoarea cosinusului de 60°). - COSH(number) întoarce valoarea cosinusului hiperbolic a unui unghi, dat

în radiani.

Elemente de bază Microsoft Excel pentru modelare şi simulare 459

Exemplificare: COSH(4) = 27,30823. - DEGREES(angle) converteşte radiani (angle) în grade. Exemplificare: DEGREES(PI()) = 180 (corespondenţa în ° a lui π ). - EVEN(number) întoarce valoarea rotunjită, la următorul întreg, par, al

unui număr (number). Exemplificare: EVEN(0.5) = 2; EVEN(2) = 2; EVEN(-1) =-2.

- EXP(number) întoarce valoarea ridicării constantei e (2,718282), la o putere dată (number). Exemplificare: EXP(1) = 2,718282 (valoarea aproximativă a lui e);

EXP(2) = 7.389056 (e2). - FACT(number) întoarce valoarea factorială (1*2*3…) a unui număr nenegativ (number).

Exemplificare: FACT(5) = 120; FACT(1.9) = FACT(1) = 1; FACT(0) = 1.

- FLOOR(number,significance) rotunjeşte un număr (number), în jos, până la următorul multiplu semnificativ specificat (significance). Exemplificare: FLOOR(2.5, 1) = 2;

FLOOR(-2.5, -2) = –2; FLOOR(1.5, 0.1) =1,5. - INT(number) rotunjeşte, în jos, un număr (number), până la cel mai

apropiat întreg. Exemplificare: INT(8.9) = 8; INT(-8.9) = -9.

- LN(number) întoarce valoarea logaritmului natural al unui număr (number). Exemplificare: LN(2.7182818) =1; LN(86) = 4,4543047.

- LOG(number,base) întoarce valoarea logaritmului unui număr (number), în baza specificată (base). Dacă nu se specifică baza, se ia valoarea 10, calculându-se astfel, logaritmul în baza 10 al numărului specificat. Exemplificare: LOG(10) = 1; LOG(8, 2) =3.

- LOG10(number) întoarce valoarea logaritmului unui număr (number) în baza 10. Exemplificare: LOG10(86) = 1,934498451; LOG10(10) = 1.

- MDETERM(array) întoarce determinantul a unei matrice date cu un număr egal de linii şi coloane (array).

Exemplificare: MDETERM({1,3,8,5;1,3,6,1;1,1,1,0;7,3,10,2}) =88; MDETERM({3,6,1;1,1,0;3,10,2}) =1;

MDETERM({3,6;1,1}) =-3. - MINVERSE(array) întoarce matricea inversă a unei matrice date cu un

număr egal de linii şi coloane (array). Exemplificare: MINVERSE({4,-1;2,0}) = {0,0.5;-1,2); MINVERSE({1,2,1;3,4,-1;0,2,0})={0.25,0.25,-0.75; 0,0,0.5; 0.75,-0.25,-0.25}.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 460

- MMULT(array1,array2) întoarce la două matrice, produsul este o matrice cu acelaşi număr de linii ca prima matrice a produsului (array1) şi acelaşi număr de coloane cu cea de-a doua matrice (array2). Exemplificare: MMULT({1,3;7,2}, {2,0;0,2}) = {2,6;14,4;

MMULT({3,0;2,0}, {2,0;0,2}) = {6,0;4,0. - MOD(number,divisor) întoarce restul, după împărţirea unui număr

(number) cu un divizor (divisor). Exemplificare: MOD(3, 2) = 1; MOD(-3, 2) = 1;

MOD(3, -2) = -1; MOD(-3, -2) = -1. - ODD(number) întoarce, valoarea rotunjită la următorul întreg impar, a unui

număr (number). Exemplificare: ODD(1.5) = 3; ODD(3) = 3; ODD(-1) = –1.

- PI( ) întoarce valoarea 3,14159265358979, a constantei matematice . Exemplificare: PI()/2 = 1,57079... - POWER(number,power) întoarce valoarea unui număr (number) ridicat

la o putere (power). Exemplificare: POWER(5,2) = 25;

POWER(98.6,3.2) = 2401077; POWER(4,5/4) = 5.656854. - PRODUCT(number1,number2, ...) întoarce produsul tuturor numerelor

date ca argumente (number1,number2, ...). Exemplificare: Dacă celulele A2:C2 conţin numerele: 5, 15, şi 30:

PRODUCT(A2:C2) = 2250; PRODUCT(A2:C2, 2) = 4500. - RADIANS(angle) converteşte ,în radiani, valoarea unui unghi, specificată

în grade (angle). Exemplificare: RADIANS(270) = 4,712389 (3/2). - RAND( ) întoarce un număr, randomic, distribuit între 0 şi 1. Exemplificare: Pentru a genera randomic un număr mai mare sau egal cu 0

şi mai mic decât 100: RAND()*100. - ROMAN(number,form) converteşte un scris în formă arabă (number), în

formă romană, (form) precizează tipul de numeral roman dorit: 0 sau nespecificat – clasică; 1 – concisă; 2 – concisă; 3 – concisă; 4 – simplificată, TRUE – clasică, FALSE – simplificată. Exemplificare: ROMAN(499,0) = CDXCIX;

ROMAN(499,1) = LDVLIV; ROMAN(499,2) = XDIX; ROMAN(499,3) = VDIV;

ROMAN(499,4) = ID; ROMAN(1993,0) = MCMXCIII. - ROUND(number,num_digits) rotunjeşte un număr (number) la numărul

de zecimale precizat (num_digits). Exemplificare: ROUND(2.15, 1) = 2,2;

Elemente de bază Microsoft Excel pentru modelare şi simulare 461

ROUND(-1.475, 2) = -1,48; ROUND(21.5, -1) = 20. - ROUNDDOWN(number,num_digits) rotunjeşte, în jos, un număr

(number) la numărul de zecimale precizat (num_digits). Exemplificare: ROUNDDOWN(76.9,0) = 76

ROUNDDOWN(-3.14159, 1) = –3,1 ROUNDDOWN(31415.92654, -2) = 31,400 - ROUNDUP(number,num_digits) rotunjeşte, în sus, un număr (number)

la numărul de zecimale precizat (num_digits). Exemplificare: ROUNDUP(76.9,0) = 77;

ROUNDUP(-3.14159, 1) = –3,2; ROUNDUP(31415.92654, -2) = 31,500. - SIGN(number) determină semnul unui număr dat (number). Dacă

numărul este 0, atunci valoarea întoarsă este 0. Exemplificare: SIGN(10) =1; SIGN(4-4) = 0; SIGN(-0.00001) = -1.

- SIN(number) întoarce valoarea sinusului unui unghi dat (number). Exemplificare: SIN(PI()) = 1,22E-16 ( sinusul lui π este zero);

SIN(PI()/2) = 1; SIN(30*PI()/180) = 0,5, (sin30°). - SINH(number) întoarce valoarea sinusului hiperbolic al unui număr

(number). Exemplificare: SINH(1) =1,175201194; SINH(-1) = -1,175201194.

- SQRT(number) întoarce valoarea rădăcinii pătrate a unui număr dat (number).

Exemplificare: SQRT(16) = 4; SQRT(ABS(-16)) = 4. - SUBTOTAL(function_num,ref1,ref2,…) întoarce subtotalul unei liste sau

baze de date, ce poate fi definită de maximum 29 de referinţe (ref1, ref2,…), tipul funcţiei (function_num) poate avea 11 valori: 1 - AVERAGE; 2 – COUNT; 3 – COUNTA; 4 – MAX; 5 – MIN; 6 – PRODUCT; 7 – STDEV; 8 – STDEVP; 9 – SUM; 10 – VAR; 11 – VARP.

Exemplificare: SUBTOTAL(9,C3:C5) va genera un subtotal al celulelor C3:C5, utilizând funcţia SUM.

- SUM(number1,number2, ...) însumează numerele din celulele precizate (number1,number2, ...). Exemplificare: Dacă A2:E2 conţin: 5, 15, 30, 40 şi 50:

SUM(A2:C2) = 50; SUM(3, 2) = 5; - SUMIF(range,criteria,sum_range) însumează celulele care întrunesc un

anumit criteriu. Exemplificare: Dacă celulele A1:A4 conţin valorile corespunzătoare unor

vânzări: 100000, 200000, 300000, 400000, iar B1:B4 valorile comisioanelor corespunzătoare: 7,000, 14000, 21000, 28000,

SUMIF(A1:A4,">160000",B1:B4) = 63000.

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 462

- SUMPRODUCT(array1,array2,array3, ...) multiplică componentele corespunzătoare din două până la 30 matrice date (array1,array2,array3, ...). şi întoarce suma acestor produse. Exemplificare: SUMPRODUCT({3,4;8,6;1,9}, {2,7;6,7;5,3}) =156.

- SUMSQ(number1,number2, ...) întoarce suma pătratelor argumentelor date (number1,number2, ...). Exemplificare: SUMSQ(3, 4) = 25.

- SUMX2MY2(array_x,array_y) întoarce suma diferenţei dintre pătratele valorilor care compun două matrice date (array_x,array_y).

Exemplificare: SUMX2MY2({2, 3, 9, 1, 8, 7, 5}, {6, 5, 11, 7, 5, 4, 4}) =-55. - SUMX2PY2(array_x,array_y) întoarce suma însumării pătratelor

valorilor care compun două matrice date (array_x,array_y). Exemplificare: SUMX2PY2({2, 3, 9, 1, 8, 7, 5}, {6, 5, 11, 7, 5, 4, 4}) = 521.

- SUMXMY2(array_x,array_y) întoarce suma pătratelor diferenţelor dintre valorile care compun două matrice date (array_x,array_y).

Exemplificare: SUMXMY2({2, 3, 9, 1, 8, 7, 5}, {6, 5, 11, 7, 5, 4, 4}) = 79. - TAN(number) întoarce valoarea tangentei unghiului dat în radiani

(number). Exemplificare: TAN(0.785) = 0,99920; TAN(45*PI()/180) = 1.

- TANH(number) întoarce valoarea tangentei hiperbolice a unui unghi dat, în radiani (number). Exemplificare: TANH(-2) = -0,96403; TANH(0) = 0.

- TRUNC(number,num_digits) tunchiază un număr (number), cu o precizie specificată (num_digits); dacă aceasta nu se specifică, valoarea luată de precizie este 0. Exemplificare: TRUNC(8.9) = 8; TRUNC(-8.9) = –8.

22.3. Lucrul cu diagrame

22.3.1. Crearea diagramelor

Realizarea unor grafice sau diagrame este deosebit de utilă, atât din punctul de vedere al celui care o realizează (care poate descoperi mai uşor din noianul de date pe cele semnificative), cât şi din cel al unui observator neavizat, care poate înţelege astfel mai uşor semnificaţia sau utilitatea unor şiruri de date sau tabele de cifre, consistente.

În general, în cadrul graficelor (diagramelor), datele sunt reprezentate într-un sistem de coordonate XOY, formând puncte sau serii de date. Axa OY este axa valorilor dependente de categoriile de date incluse pe axa OX, axa categoriilor. Se mai poate spune că axa OY constituie variabila dependentă, iar axa OX variabila independentă.

Crearea graficelor în cadrul Microsoft Excel este simplă: astfel, mai întâi se

Elemente de bază Microsoft Excel pentru modelare şi simulare 463

selectează domeniul de date pentru care se doreşte realizarea graficului, se alege

din meniu opţiunea Insert-Chart sau se apasă din bară butonul ChartWizard şi apoi se alege tipul de grafic (diagramă) adecvat.

22.3.2. Tipuri de diagrame

O diagramă trebuie să ilustreze corect datele selectate. Programul Microsoft Excel prezintă mai multe tipuri şi subtipuri de grafice (diagrame):

-diagrame cu coloane (Column) - sunt folosite pentru ilustrarea comparaţiilor dintre diferite categorii de date prezente în selecţie (există tipuri similare de diagrame, în care coloanele sunt înlocuite de figuri geometrice în spaţiu: Cylinder, Cone, Pyramid);

-diagrame cu bare (Bar) - sunt similare cu cele anterioare, cu deosebirea că, coloanele verticale sunt înlocuite de bare orizontale (există tipuri similare de diagrame, în care barele sunt înlocuite de figuri geometrice în spaţiu: Cylinder, Cone, Pyramid);

-diagrame cu linii (Line) - ilustrează evoluţia în timp a unor categorii de date; -diagrame circulare (Pie sau Doughnut) - sunt utilizate pentru evidenţierea

unor relaţii dintre părţi şi întreg; -diagrame cu suprafeţe (Area) - sunt asemănătoare celor cu linii, permiţând

evidenţierea evoluţiei, dar şi cu cele circulare, deoarece permit compararea proporţiilor;

-diagrame prin puncte (Scatter) - sunt marcate punctele în coordonate XOY şi eventual liniile care le unesc; pot fi considerate ca fiind neutre din punct de vedere al evidenţierii unor caracteristici a datelor selectate;

-diagrame radar (Radar) - prezintă simultan relaţiile dintre diferitele serii de date şi dintre fiecare serie de date şi ansamblul lor;

-diagrame cu suprafeţe (Surface)- sunt utilizate pentru reprezentarea relaţiilor dintre două sau mai multe variabile, evidenţiind zonele înalte şi joase dintr-un set mare de date;

-diagrame cu buline (Bubbles) - marchează punctele în coordonate XOY, bulinele reflectând şi dimensiunea valorii y.

Diagrame cu coloane

Se compară rezultatele obţinute de mai mulţi candidaţi, în al doilea tur al alegerilor locale, dintr-un oraş oarecare: A – 40%, B – 60%. Există mai multe moduri (subtipuri) de reprezentare, prin diagrame cu coloane, a acestei situaţii:

Clustered column (2-D)– compară valorile corespunzătoare fiecărei categorii;

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 464

Rezultatele alegerilor (Tur 2)

0%

10%

20%

30%

40%

50%

60%

A B

- Clustered column (3-D) - variantă în trei dimensiuni a subtipului anterior.

0%

10%

20%

30%

40%

50%

60%

A B

Rezultatele alegerilor (Tur 2)

- 3-D column- variantă în trei dimensiuni a subtipului anterior, care prezintă

aşezarea coloanelor corespunzătoare fiecărei categorii, în linie sau rând.

AB

Rezultatele

alegerilor (Tur 2)

0%

10%

20%

30%

40%

50%

60%

Elemente de bază Microsoft Excel pentru modelare şi simulare 465

Rezultatele

alegerilor (Tur 2)

A

B

0%

10%

20%

30%

40%

50%

60%

- 3-D column with cylindrical shape- variantă în trei dimensiuni a

subtipului anterior, în care coloanele sunt înlocuite de cilindrii.

AB

Rezultatele

alegerilor (Tur 2)

0%

10%

20%

30%

40%

50%

60%

Rezultatele

alegerilor (Tur 2)

A

B

0%

10%

20%

30%

40%

50%

60%

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 466

- 3-D column with conical shape- variantă în trei dimensiuni a subtipului anterior, în care coloanele sunt înlocuite de conuri.

AB

Rezultatele

alegerilor (Tur 2)

0%

10%

20%

30%

40%

50%

60%

Rezultatele

alegerilor (Tur 2)

A

B

0%

10%

20%

30%

40%

50%

60%

- 3-D column with pyramid shape- variantă în trei dimensiuni a subtipului

anterior, în care coloanele sunt înlocuite de piramide.

AB

Rezultatele

alegerilor (Tur 2)

0%

10%

20%

30%

40%

50%

60%

Elemente de bază Microsoft Excel pentru modelare şi simulare 467

Rezultatele

alegerilor (Tur 2)

A

B

0%

10%

20%

30%

40%

50%

60%

- Column with cylindrical shape- variantă în trei dimensiuni a subtipului

Clustered Columnn, în care coloanele sunt înlocuite de cilindrii:

A

B

0%

10%

20%

30%

40%

50%

60%

Rezultatele alegerilor (Tur 2)

- Column with a conical shape- variantă în trei dimensiuni a subtipului anterior, în care coloanele sunt înlocuite de conuri:

A

B

0%

10%

20%

30%

40%

50%

60%

Rezultatele alegerilor (Tur 2)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 468

- Column with a pyramid shape- variantă în trei dimensiuni a subtipului anterior, în care coloanele sunt înlocuite de piramide:

A

B

0%

10%

20%

30%

40%

50%

60%

Rezultatele alegerilor (Tur 2)

- Stacked column (2-D) – compară contribuţia fiecărei categorii la total.

0%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

Rezultatele alegerilor (Tur 2)

- Stacked column (3-D) – variantă în trei dimensiuni a subtipului anterior.

Rezultatele

alegerilor (Tur 2)

0%

20%

40%

60%

80%

100%

Elemente de bază Microsoft Excel pentru modelare şi simulare 469

- Stacked column with cylindrical shape- variantă în trei dimensiuni a subtipului anterior, în care coloana este înlocuită de cilindru:

Rezultatele

alegerilor (Tur 2)

0%

20%

40%

60%

80%

100%

- Stacked column with conical shape- variantă în trei dimensiuni a

subtipului anterior, în care coloana este înlocuită de con:

Rezultatele

alegerilor (Tur 2)

0%

20%

40%

60%

80%

100%

- Stacked column with pyramid shape- variantă în trei dimensiuni a

subtipului anterior, în care coloana este înlocuită de piramidă:

Rezultatele

alegerilor (Tur 2)

0%

20%

40%

60%

80%

100%

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 470

Diagrame cu bare

Se compară rezultatele obţinute de mai mulţi candidaţi, în al doilea tur al alegerilor locale dintr-un oraş oarecare: A – 40%, B – 60%. Există mai multe moduri (subtipuri) de reprezentare, prin diagrame cu bare, a acestei situaţii:

- Clustered bar (2-D)–compară valorile corespunzătoare fiecărei categorii.

Rezultatele alegerilor (Tur 2)

0% 10% 20% 30% 40% 50% 60%

A

B

- Clustered bar (3-D) - variantă în trei dimensiuni a subtipului anterior.

0% 20% 40% 60%

A

B

Rezultatele alegerilor (Tur 2)

- Bar with a cylindrical shape- variantă în trei dimensiuni a subtipului

anterior, în care bara este înlocuită de cilindru.

0% 20% 40% 60%

A

B

Rezultatele alegerilor (Tur 2)

Elemente de bază Microsoft Excel pentru modelare şi simulare 471

- Bar with a conical shape- variantă în trei dimensiuni a subtipului anterior, în care bara este înlocuită de con.

0% 20% 40% 60%

A

B

Rezultatele alegerilor (Tur 2)

- Bar with a pyramid shape- variantă în trei dimensiuni a subtipului

anterior, în care bara este înlocuită de piramidă.

0% 20% 40% 60%

A

B

Rezultatele alegerilor (Tur 2)

- Stacked bar (2-D) – compară contribuţia fiecărei categorii la total.

0% 20% 40% 60% 80% 100%

Rezultatele

alegerilor (Tur 2)

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 472

- Stacked bar (3-D) – variantă în trei dimensiuni a subtipului anterior.

0% 20% 40% 60% 80% 100%

Rezultatele

alegerilor (Tur 2)

- Stacked bar with a cylindrical shape – variantă în trei dimensiuni a subtipului anterior, în care bara este înlocuită de cilindru..

0% 20% 40% 60% 80% 100%

Rezultatele

alegerilor (Tur 2)

- Stacked bar with a conical shape – variantă în trei dimensiuni a subtipului

anterior, în care bara este înlocuită de con.

0% 20% 40% 60% 80% 100%

Rezultatele

alegerilor (Tur 2)

Elemente de bază Microsoft Excel pentru modelare şi simulare 473

- Stacked bar with a pyramid shape – variantă în trei dimensiuni a subtipului anterior, în care bara este înlocuită de piramidă.

0% 20% 40% 60% 80% 100%

Rezultatele

alegerilor (Tur 2)

Diagrame cu linii

În scopul realizării unor evaluări ale tendinţelor cererii de detergent de pe piaţă, se compară vânzările (în kilograme) de detergent lichid şi detergent praf, înregistrate de un magazin într-o săptămână.

Ziua Detergent lichid [kg] Detergent praf [kg]

1 33 30 2 30 33 3 35 31 4 34 37 5 33 36 6 36 38 7 32 35

Există mai multe moduri (subtipuri) de reprezentare prin diagrame cu linii: - Line – prezintă prin linii, tendinţele fiecărei categorii, pe o perioadă de

timp:

Comparatii ale vanzarilor

0

5

10

15

20

25

30

35

40

1 2 3 4 5 6 7Zile

Kilo

gra

me

Detergent lichid

Detergent praf

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 474

- 3-D Line – variantă în trei dimensiuni a subtipului anterior.

1 2 3 4 5 6 7

0

10

20

30

40

Kilogra

me

Zile

Comparatii ale vanzarilor

Detegent lichid

Detergent praf

- Line with markers– prezintă prin linii, pe care sunt marcate punctele cunoscute, tendinţele caracteristice ale fiecărei categorii, pe o perioadă de timp:

Comparatii ale vazarilor

0

5

10

15

20

25

30

35

40

1 2 3 4 5 6 7Zile

Kilo

gra

me

Detergent lichid

Detergent praf

Diagrame circulare

Se compară rezultatele obţinute de mai mulţi candidaţi, în al doilea tur al alegerilor locale, dintr-un oraş oarecare: A – 40%, B – 60%. Există mai multe moduri (subtipuri) de reprezentare, prin diagrame circulare, a acestei situaţii:

- Pie - prezintă sub forma feliilor dintr-o plăcintă contribuţia fiecărei valori la total.

Rezultatele alegerilor

(Tur 2)

A B

Elemente de bază Microsoft Excel pentru modelare şi simulare 475

- Pie 3-D- variantă în trei dimensiuni a subtipului anterior:

Rezultatele alegerilor (Tur 2) A B

- Exploded Pie – prezintă, sub forma feliilor tăiate dintr-o plăcintă, contribuţia fiecărei valori la total.

Rezultatele alegerilor

(Tur 2)

A B

- Exploded Pie 3-D- variantă în trei dimensiuni a subtipului anterior.

Rezultatele alegerilor

(Tur 2)A B

- Doughnut – prezintă, sub forma feliilor dintr-o gogoaşă, contribuţia fiecărei valori la total, (sunt asemănătoare cu cele circulare, cu deosebirea că, permit reprezentarea mai multor serii, cu ajutorul a două sau mai multor cercuri concentrice). Astfel, pe lângă prezentarea rezultatelor de la al doilea tur de scrutin: A-40% şi B-60% (cerc exterior), se pot prezenta şi rezultatele obţinute de cei patru candidaţi iniţiali, la primul tur: A-35%, B-30%, C-20%, C-15% (cerc interior).

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 476

Rezultatele alegerilor

(Ambele tururi )

A B

C D

- Exploded Doughnut 3-D- prezintă, sub forma feliilor tăiate dintr-o gogoaşă, contribuţia fiecărei valori la total.

Se pot astfel evidenţia, scorurile obţinute de fiecare candidat, la fiecare tur.

Rezultatele alegerilor

(Ambele tururi)

A B

C D

Diagrame cu suprafeţe

Se compară vânzările (în kilograme) de detergent lichid şi detergent praf, înregistrate de un magazin într-o săptămână.

Ziua Detergent lichid [kg] Detergent praf [kg]

1 25 27 2 30 33 3 35 31 4 34 37 5 33 36 6 36 38 7 32 35

Există subtipuri de diagrame cu suprafeţe pentru prezentarea comparaţiei:

Elemente de bază Microsoft Excel pentru modelare şi simulare 477

- Area – prezintă, prin suprafeţe, asemeni colinelor, tendinţele cronologice ale fiecărei categorii (nu se pot observa simultan, ca la Line, ambele tendinţe):

Comparatii vanzari

0

5

10

15

20

25

30

35

40

1 2 3 4 5 6 7

Detergent lichid [kg]

Detergent praf [kg]

- Area 3-D- variantă în trei dimensiuni a subtipului anterior.

12

34

56

7

0

5

10

15

20

25

30

35

40

Comparatii vanzari Detergent lichid [kg]

Detergent praf [kg]

- Stacked Area – prezintă prin suprafeţe, tendinţele fiecărei categorii,

permiţând şi compararea proporţiilor din total (vânzări detergent) ale fiecăreia.

Comparatii vanzari

0

10

20

30

40

50

60

70

80

1 2 3 4 5 6 7

Detergent praf [kg]

Detergent lichid [kg]

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 478

- Stacked Area 3-D- variantă în trei dimensiuni a subtipului anterior.

12

34

56

7

0

10

20

30

40

50

60

70

80

Comparatii vanzari Detergent praf [kg]

Detergent lichid [kg]

- 100% Stacked Area – prezintă, prin suprafeţe, procentele din total (vânzări

detergent), corespunzătoare tendinţelor cronologice ale fiecărei categorii.

Comparatii vanzari

0%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

1 2 3 4 5 6 7

Detergent praf [kg]

Detergent lichid [kg]

- 100% Stacked Area 3-D– variantă în trei dimensiuni a subtipului anterior.

1 23 4

56

7

0%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

Comparatii vanzari Detergent praf [kg]

Detergent lichid [kg]

Elemente de bază Microsoft Excel pentru modelare şi simulare 479

Diagrame prin puncte

Un aparat de aer condiţionat, care asigură o temperatură interioară constantă, are un consum de energie diferit, în funcţiede temperatura exterioară text ,căreia trebuie să îi facă faţă, astfel:

text

[°C]

16,7 19,2 22,1 25 27,8 31,5 33,3 36,1 38,9 42,4 44,3

Pcons

[W]

901 910 919 927 936 944 952 975 1018 1051 1071

Ilustrarea dependenţei, dintre temperatura exterioară şi consumul de energie necesar menţinerii la interior a unei temperaturi constante de 20°C, se poate face în mai multe moduri:

- Scatter – este evidenţiată prin puncte dependenţa Pcons(text):

850

900

950

1000

1050

1100

15 20 25 30 35 40 45

text [o]

Pc

on

s

- Scatter with lines–este evidenţiată prin puncte şi linii dependenţa Pcons(text):

850

900

950

1000

1050

1100

15 20 25 30 35 40 45

text [o]

Pc

on

s

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 480

- Scatter with lines without markers– este evidenţiată doar prin linii (fără puncte) dependenţa Pcons(text):

850

900

950

1000

1050

1100

15 20 25 30 35 40 45

text [o]

Pco

ns

Diagrame radar

Se doreşte ilustrarea rezultatelor obţinute de cei patru candidaţii participanţi la primul tur al alegerilor: A-35%, B-30%, C-20%, C-15%.

Există mai multe subtipuri de diagrame radar, cu ajutorul cărora pot fi reprezentate scorurile electorale obţinute de candidaţii A, B, C, D. Acest tip de diagrame este mai puţin utilizat în aplicaţiile obişnuite, fiind mai ales folosit în cadrul aplicaţiilor complexe, care implică studii statistice sau management de proiecte:

- Radar - ilustrează dimensiunea valorilor, prin distanţa faţă de un punct fix, central:

Rezultatele alegerilor

(Tur 1)

0%

5%

10%

15%

20%

25%

30%

35%

A

B

C

D

Elemente de bază Microsoft Excel pentru modelare şi simulare 481

- Radar with markers - ilustrează dimensiunea valorilor, prin distanţa faţă de un punct fix, central, a punctelor corespunzătoare acestora:

Rezultatele alegerilor

(Tur 1)

0%

5%

10%

15%

20%

25%

30%

35%

A

B

C

D

- Radar - ilustrează dimensiunea valorilor, prin distanţa faţă de un punct fix,

central, a punctelor corespunzătoare acestora şi suprafaţa dintre acestea:

Rezultatele alegerilor

(Tur 1)

0%

5%

10%

15%

20%

25%

30%

35%

A

B

C

D

Diagrame cu suprafeţe

În scopul realizării unor evaluări a vânzărilor zilnice, se compară, pentru fiecare zi a săptămânii, vânzările (în kilograme) de detergent lichid şi detergent praf, înregistrate de un magazin într-o săptămână.

Ziua Detergent lichid [kg] Detergent praf [kg]

1 25 27 2 30 33 3 35 31 4 34 37 5 33 36 6 36 38 7 32 35

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 482

Există mai multe moduri de reprezentare prin diagrame cu suprafeţe, a fiecărei categorii de cantitate vândută; indiferent de tipul mărfii (0-10 kg, 10-20 kg, 20-30 kg, 30-40 kg), i se atribuie o culoare:

- 3-D Surface - ilustrează în trei dimensiuni cu ajutorul unei suprafeţe pline:

1 2 3 4 5 6 7

0

10

20

30

40

30-40

20-30

10-20

0-10

- Wireframe Surface - ilustrează în trei dimensiuni, cu ajutorul unei

suprafeţe conturate, neumplute:

1 2 3 4 5 6 7

0

10

20

30

40

30-40

20-30

10-20

0-10

- Contour- diagramă cu suprafeţe, prezentată sub forma vederii de sus a

suprafeţelor pline, corespunzătoare fiecărei categorii:

1 2 3 4 5 6 7

0-10 10-20 20-30 30-40

Elemente de bază Microsoft Excel pentru modelare şi simulare 483

- Wireframe Contour- diagramă cu suprafeţe, prezentată sub forma vederii de sus a suprafeţelor conturate, neumplute, corespunzătoare fiecărei categorii:

1 2 3 4 5 6 7

0-10 10-20 20-30 30-40

Diagrame cu buline

În scopul realizării unor evaluări a vânzărilor zilnice, se compară, pentru fiecare zi a săptămânii, vânzările (în kilograme) de detergent lichid, înregistrate de un magazin într-o săptămână.

Ziua Detergent lichid [kg]

1 25 2 30 3 35 4 34 5 33 6 36 7 32

- Bubbles – se compară datele atât pe baza poziţiei în coordonate XOY, cât şi a dimensiunii bulinelor:

Detergent lichid [kg]

0

5

10

15

20

25

30

35

40

45

0 2 4 6 8

- Bubbles (3-D) – variantă în trei dimensiuni a subtipului anterior

Detergent lichid [kg]

0

5

10

15

20

25

30

35

40

45

0 2 4 6 8


Recommended