P. 1
Sisteme de Programare Pentru Modelare Si Simulare - Curs

Sisteme de Programare Pentru Modelare Si Simulare - Curs

|Views: 259|Likes:
Autor: Gh. Lazaroiu
Autor: Gh. Lazaroiu

More info:

Published by: Portal studentesc - Energetica on Jun 14, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/11/2015

pdf

text

original

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 10
308
.
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 < 10
308
.

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 a
b
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 10
308
). 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 10
308
,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 a
ij

elementul generic al matricei [a], cu b
ij
elementul generic al matricei [b] şi c
ij

elementul generic al matricei sume [c], atunci avem:
[c] = [a]+[b],
ceea ce se reduce la,
c
ij
= a
ij
+ b
ij
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,



=

=
j i
j i
i
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
j i
b a ,
,
se pot forma produsele,
l
m
k
j i
kl
m j i
b a c
, , ,
⋅ = , sau
, , ,
k
j i
l
m
lk
j i m
a b d ⋅ = , 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ă
j i
a a
,
= , transpusa acesteea, a
t,
se obţine prin înlocuirea liniilor cu coloanele de
acelaşi rang, astfel că
i j t
a a
,
= .
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 2
53
-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ã , y y 2
2 y dacã , 2 y y 3
g(y)
2
3 2
¦
¹
¦
´
¦
< + ⋅
> − ⋅ ⋅
=
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:

j i dacã , 1
j i dacã 0,
j i 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 1
pas
k_init k_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 9 1 8 1
11
3 95
= + = +
(
¸
(

¸

= 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 expresia
1 j i
1
j) 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:
1
pas
vmax vmin
N +
(
¸
(

¸

= , 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:
1 N
vmax vmin
pas


= . 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 [10
lmin
10
lmax
]. 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 [10
lmin
10
lmax
]. Dacă lmax=pi
(adică π), atunci elementele vectorului sunt distribuite între 10
lmin
ş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 10
2
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 = x
min
: ∆x : x
max
, y = y
min
: ∆y : y
max

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 x
2
+y
2
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 .... 0 0
.... .... .... ....
0 .... 0 0
0 .... 0 0
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 .... 1 1
.... .... .... ....
1 .... 1 1
1 .... 1 1
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 .... 0 0
.... .... .... ....
0 .... 1 0
0 .... 0 1
I .
Elementele sale sunt:
¹
´
¦
=

=
j i
j i
I
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 ( ) (
2 2 1
+ + ⋅ + ⋅ − + + ⋅ + ⋅ + ⋅ =
− −
n p x n p x n p x p x p x p x P
n n n

prima linie a companionulul este:
) 1 (
) 1 (
,
) 1 (
) (
,
) 1 (
) 1 (
, ... ,
) 1 (
) 3 (
,
) 1 (
) 2 (
p
n p
p
n p
p
n p
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 ) (
2 3
+ + + = x x x x p ,
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
1
N k
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
j i
a A
,
= cu m i ,..., 2 , 1 = şi n j ,..., 2 , 1 = ,este
simetrică dacă
i j j i
a a
, ,
= şi antisimetrică, dacă
i j j i
a a
, ,
− = .
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
) ( m j n i
j i
n Hi = =
− +
= ,
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
b a + , respectiv:
( ) , ...
1 1 2 1 2 1 n n n
n
n
n
n
n
n n
b ab C b a C b a C a b a + + + + + = +
− − −

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
b a + . De exemplu, linia 3 conţine coeficienţii
descompunerii binomului ( )
3
b a + , 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
b a + , 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 ( ) ( )
j n
i c j i V

= , , 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:
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
5 5 5 5 5
4 4 4 4 4
3 3 3 3 3
2 2 2 2 2
1 1 1 1 1

1 5 25 125 625
1 4 16 64 256
1 3 9 27 81
1 2 4 8 16
1 1 1 1 1
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 , i
i n-
i,j W
0
1 1
2
1 2
.
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,
i z 2 1 1 2 1 + = − + = , se utilizează pentru partea imaginară, ca variabile
predefinite i sau j, . 1 − = = j i Este posibil ca variabilei imaginare să îi fie
ataşată o variabilă predefinită utilizării sale, de exemplu , s z 2 1+ = .

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
1000
e , 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, A Ur , este, prin definiţie, suma elementelor de pe
diagonala principală,


=
=
n
i
i i
a
1
,
Ur A .
Urma produsului a două matrice este independentă de ordinea factorilor,
) ( Ur ) ( Ur
,
1
,
1
,
1
,
1
A B B A ⋅ = ⋅ = ⋅ = ⋅
∑ ∑ ∑ ∑
= = = =
j i
n
i
i j
n
j
i j
n
j
j i
n
i
b b b a .
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/2
n
1 i
2
i
1/2
x
|
|
¹
|

\
|
= ⋅ =

=
x x x
T

unde x şi x
T
sunt, prin definiţie:
[ ]
n
T
n
x x x
x
x
x
... ,
...
2 1
2
1
=
(
(
(
(
¸
(

¸

= x x .
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ă, N j 1 cu , x max X
N
1 k
jk
≤ ≤ |
¹
|

\
|
=

=
, 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 ( ) N i 1 cu , λ max X ρ X
i
2
≤ ≤ = = , 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 N k 1 cu , x max X
N
1 j
jk
≤ ≤
|
|
¹
|

\
|
=

=

, 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
1 k j,
jk
F
... x X x x x + + + =
|
|
¹
|

\
|
=

=
ş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
2
N
1 k
k
2
V ... V V V V + + + = |
¹
|

\
|
=

=
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
1
p
p
N
1 k
k
p
V ... V V V V + + + = |
¹
|

\
|
=

=
, se calculează cu
norm(V,p), egală cu sum(abs(V).^P)^(1/P);
valoarea maximă în modul, respectiv ( ) N k 1 , V max V
k
≤ ≤ =

,
este calculată cu funcţia norm(V,inf) ;
valoarea minimă în modul, respective ( ) N k 1 , V min V
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, [ ]
ij
a A = , cu elementele în R (sau C).

Determinantul format cu elementele maticei [ ]
ij
a A = , păstrându-le
poziţia, se numeşte determinantul matricei A şi se notează cu
[ ]
ij ij
a A a A 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,
n m p , ≤
. Dacă alegem din A, p linii
p
i i i ,..., ,
2 1
şi p coloane
p
j j j ,..., ,
2 1
, 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 n m q q p = =
,
Algebră numerică liniară 141
(
(
(
(
(
¸
(

¸

=
p p p p
p
p
j i j i j i
j i j i j i
j i j i j i
a a a
a a a
a a a
M
...
... ... ... ...
...
...
2 1
2 2 2 1 2
1 2 1 1 1
.
În modul acesta, cu liniile şi coloanele matricei A se poate forma un număr
de
( ) ( )! ! ! !
! !
p n p p m p
n m
C C
p
n
n
m
− −
= matrice de ordinul p. Determinanţii acestor
matrice se numesc determinanţii de ordinul p ai matricei A. Dacă 0 A ≠ , 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ă 0 A ≠ , există un
număr ) , min( n m q r = ≤ , 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 [ ]
ij
a A = , o matrice n m× , deci n j m i ,... 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 A
t
sau A
T
,
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ă [ ]
ji t
a A = , m i n j ,..., 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,
ji ij
a a = şi că este antisimetrică dacă
ji ij
a a − = . Prin urmare:
o matrice simetrică este egală cu transpusa sa, deoarece
ji ij
a a = ;
într-o matrice antisimetrică, elementele de pe diagonala principală sunt
nule, 0 =
ii
a (pentru a putea satisface definiţia
ji ij
a a − = ) ;
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ă a
ij
= a
ji
;
• 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ă [ ]
ij
a A = , 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
A
A
A
A
A
A
A
A
ji
nn n n
n
n
det
det
...
det det
... ... ... ...
det
...
det det
det
...
det det
2 1
2 22 12
1 21 11
1
,
unde
ji
A este complementul algebric al lui
ij
a , din determinantul [ ]
ij
a ş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 A
0
,
A
-1
*A = A*A
-1
= A
0
= 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
= A
0
= 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,
n
e e e ,..., ,
2 1
, ortogonali doi câte doi , având fiecare norma egală
cu 1,
( )
¹
´
¦
=

=
j i
j i
e e
j i
daca , 1
daca , 0
, .
Dacă numai prima condiţie este îndeplinită, se spune că
n
e e e ,..., ,
2 1

formează o bază ortogonală. Dacă sunt îndeplinite amândouă condiţiile, baza este
ortonormală.
Cu vectorii unei baze oarecare,
n
u u u ,..., ,
2 1
, se poate construi întotdeauna o
bază ortonormală,
( )
¹
´
¦
=

=
j i
j i
u u
j i
daca , 1
daca , 0
,
iar vectorii bazei sunt ortogonali doi câte doi şi au norma ( ) 1 , = =
i i i
u u u .
Î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 x
1,
apropiat de x,
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 148
funcţia f(x
1
) diferă mult de f(x). Invers, o funcţie se spune că este bine condiţionată,
dacă pentru un x
1
apropiat de x, funcţia f(x
1
) 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 . 1 152 . 1
543 . 6 917 . 6 6
2 1
2 1
x x
x x

şi un sistem “perturbat”,
¹
´
¦
= ⋅ +
= ⋅ + ⋅
095 . 1 152 . 1
543 . 6 912 . 6 6
2 1
2 1
x x
x x

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:
1 1 1 1 11
... ... b x a x a x a
n n j j
= ⋅ + + ⋅ + + ⋅
...........................................................
i n in j ij i
b x a x a x a = ⋅ + + ⋅ + + ⋅ ... ...
1 1

...........................................................
m n mn j mj m
b x a x a x a = ⋅ + + ⋅ + + ⋅ ... ...
1 1

de m ecuaţii liniare cu n necunoscute, m şi n fiind două numere naturale oarecare.
Dacă notăm,
;
....
....
B ;
....
....
X ;
... ...
.. .......... ..........
... ...
.. .......... ..........
... ...
A
1 1
1
1
1 1 11
|
|
|
|
|
|
¹
|

\
|
=
|
|
|
|
|
|
|
¹
|

\
|
=
|
|
|
|
|
|
|
¹
|

\
|
=
m
i
n
j
mn mj m
in ij i
n j
b
b
b
x
x
x
a a a
a a a
a a a

atunci sistemul de ecuaţii liniare se poate scrie, matriceal, sub forma: A*X = B.
Un şir ordonat de numere,
0 0
2
0
1
,..., ,
n
x x x , care satisfac relaţiile:
; ,..., 2 , 1 ; ... ...
0 0 0
1 1
m i b x a x a x a
i n in j ij i
= = ⋅ + + ⋅ + + ⋅
se numeşte soluţie a sistemului. Numerele
0 0
2
0
1
,..., ,
n
x x x , 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
ij
a 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
pp p p
p
p
p
... a a a
... a a a
... a a a
2 1
2 22 21
1 12 11

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


= ∆
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
p
n
x x x ,..., ,
2 1
, 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,

( )
1 1 , 1 1 , 1
2
1
1
1
....
...


+ + +
+

=
p p p
p
p
p
b a a
b
b
b
D , … ,
( )
m m m
p
p
p m
p
b a a
b
b
b
D
1 1
2
1
1
....
...



=

+
.

Dacă n m p ≤ < (sau m n p ≤ < ) vom putea forma p m− 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 ,
0 0
2
0
1
,..., ,
p
x x x , şi avem
p n−
∞ 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
1 1 1 11
1
1
1 1 11
|
|
|
|
|
|
|
|
¹
|

\
|
=
|
|
|
|
|
|
|
¹
|

\
|
=
m mn mj m
i in ij i
n j
mn mj m
in ij i
n j
b a a a
b a a a
b a a a
a a a
a a a
a a a

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
p n−
∞ 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
,

A det
A
1 ji
A
=


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
2 1
2 22 21
1 12 11
|
|
|
|
|
¹
|

\
|
=
nn n n
n
n
... a a a
... a a a
... a a a

poate fi descompusă sub forma,
A = Ls + D +Us,
cu:

0 ...
... ... ... ... ...
0 0 ... 0
0 0 ... 0 0
Ls
1 2 1
21
|
|
|
|
|
¹
|

\
|
=
− nn n n
a a a
a
;
0 ... 0 0
... ... ... ... ...
0 0 ... 0
0 0 ... 0
D
12
11
|
|
|
|
|
¹
|

\
|
=
nn
a
a
a
;

0 ... 0 0 0
... ... ... ... ...
... 0 0
... 0
Us
2 23
1 13 12
|
|
|
|
|
¹
|

\
|
=
n
n
a a
a a a

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 ... 0 0
L
3 2 1
22 21
11
|
|
|
|
|
¹
|

\
|
=
nn n n n
l l l l
l l
l
,
...
x
2
1
|
|
|
|
|
¹
|

\
|
=
n
x
x
x
,
...
b
2
1
|
|
|
|
|
¹
|

\
|
=
n
b
b
b
,
componentele vectorului x, soluţiile sistemului, pot fi găsite prin substituţie înainte,
respectiv:
( ) . 1,2,..., ;
1
x ;
1
x ; x
1
1
1 21 2
22
2
11
1
1
n m x l b
l
x l b
l l
b
m
j
j mj m
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 ; z
1
1
1 21 2
22
2
11
1
1
n m z l b
l
z l b
l l
b
m
j
j mj m
mm
m
=
|
|
¹
|

\
|
⋅ − ⋅ = ⋅ − ⋅ = =


=

Odată vectorul z cunoscut, ecuaţia z=U*x (care este identică cu U*x=z)
având,

... 0 0 0
... ... ... ... ...
... 0
...
U
2 23 22
1 13 12 11
|
|
|
|
|
¹
|

\
|
=
nn
n
n
u
u u u
u u u u
,
...
x
2
1
|
|
|
|
|
¹
|

\
|
=
n
x
x
x
,
...
z
2
1
|
|
|
|
|
¹
|

\
|
=
n
z
z
z
,
Algebră numerică liniară 155
din care, din ultima linie, rezultă,

11
n
x
u
z
n
= ,
şi în general,
1. ,..., 1 , ;
1
1
− =
|
|
¹
|

\
|
⋅ − ⋅ =

+ =
n n m x u z
u
x
n
m j
j mj m
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:
1 1 1 1 11
... ... x x a x a x a
n n j j
⋅ = ⋅ + + ⋅ + + ⋅ λ
...........................................................
i n in j ij i
x x a x a x a ⋅ = ⋅ + + ⋅ + + ⋅ λ ... ...
1 1

...........................................................
n n nn j nj n
x x a x a x a ⋅ = ⋅ + + ⋅ + + ⋅ λ ... ...
1 1

de n ecuaţii liniare cu n necunoscute, având matricea A simetrică.

Dacă un vector 0 ≠ x are proprietatea că x x ⋅ = ⋅ λ 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 x x ⋅ = ⋅ λ A , aceeaşi proprietate o va avea orice vector x k ⋅ ,
unde k este un număr oarecare, real sau complex. Acest fapt este o consecinţă a
proprietăţilor transformării liniare, ( ) ( ) x k x k x A k x k ⋅ ⋅ = ⋅ ⋅ = ⋅ ⋅ = ⋅ ⋅ λ λ 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 x x ⋅ = ⋅ λ A este echivalentă cu,
( ) 0 I - 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

¹
´
¦
=

=
j i
j i
e
ij
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
2 1
2 22 21
1 12 11
=



= = ⋅
λ
λ
λ
λ λ
nn n n
n
n
a a a
a a a
a a a
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
λ λ λ ,..., ,
2 1
, 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
k
x , a sistemului x x ⋅ = ⋅ λ 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
n
u u u ,..., ,
2 1
, 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
n
u u u ,..., ,
2 1
, are formă
diagonală, atunci
n
λ λ λ ,..., ,
2 1
sunt valorile proprii, iar
n
u u u ,..., ,
2 1
reprezintă
direcţiile proprii corespunzătoare.
Dacă valorile proprii
n
λ λ λ ,..., ,
2 1
sunt distincte, direcţiile proprii
corespunzătoare sunt reprezentate prin vectorii
n
u u u ,..., ,
2 1
, 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
n
e e e ,..., ,
2 1
, 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
( )
¹
´
¦
=

=
j i
j i
e e
j i
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 A
T
≠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:
x B x ⋅ ⋅ = ⋅ λ 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:
x x ⋅ = ⋅ λ .A B
-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 (2
x
), 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*2
n
, 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 e
x
(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: ( ) ( ) ( ) y sin i y cos e e
x z
⋅ + = . 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
N
2 P ≤ 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 2
N
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 i y x z ⋅ + = , real
sau imaginar se face prin funcţia abs(z). După cum se ştie, modulul r al unui
număr complex este
2 2
y x r + = . 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
i y x z ⋅ + = , 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
y
sin ,
r
x
cos = = ϕ ϕ . Cu cele de mai sus, forma trigonometrică a numărului
complex este: ( ) ( ) ( ) ϕ ϕ sin cos r z 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 i y x z ⋅ + = , 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 i y x z ⋅ + = , conjugatul său este i y x z ⋅ − = ş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
tol x y ≤ − , 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:
k
2
1
0
d
1
... d
1
d
1
d y
+ +
+
+ = . 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
1
0 0.25 + = ,
7 -
1
3
1
1 1.35
+
+ = ,
18
1
5 -
1
2 -
1
3 3.455 -

+
+
+ − = ,
4
1
2
1
3
1
9 -
1
3
1
1 1.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ă: ( )
¦
¹
¦
´
¦
<
=
>
=
0 x 1 -
0 x 0
0 x 1,
x sign , . 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
1
dt e t x
t x
, unde ℜ ∈ x ,
sau
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 178
• prin limita şirului
( )
( ) ( ) ( )
x
n
n n
n x x x x
x ⋅
+ + ⋅ + ⋅
=
Γ
∞ →
!
2 1
lim
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 ! + Γ = n n ;
• pentru orice z finit, este satisfăcută relaţia de recurenţă ( ) ( ) x x x Γ = + Γ 1 ;
• cunoscând valoarea pentru x > 1, valorile pentru x < 1 se determină din
ecuaţia complementelor ( )
( ) ( ) ( ) ( ) x x
x
x x
x
⋅ + Γ

=
⋅ Γ
= − Γ
π
π
π
π
sin 1 sin
1 ;
• 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
a t
x a a dt t e
a
a x P
0
1
, 0 ,
) (
1
) , ( ,
şi are limitele: ( ) 1 ) , ( , 0 , 0 = ∞ = a P a P .
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
a t
x a a dt t e
a a
a x
a x P a x Q , 0 ,
) (
1
) (
) , (
) , ( 1 ) , (
1

şi are limitele,
( ) 0 ) , ( , 1 , 0 = ∞ = a P a Q .
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, ( ) q p B , , sau funcţia lui Euler de prima speţă, de variabile
complexe p şi q, poate fi definită prin integrala,
( ) ( )

− −
− =
1
0
1 1
1 , dt t t q p B
q p
,
convergentă pentru ( ) 0 > ℜ p , ( ) 0 > ℜ q .

Principalele proprietăţi ale funcţiei Beta sunt:
• funcţia Beta, ( ) q p B , , este simetrică în raport cu p şi q, ( ) ( ) p q B q p B , , = ,
obţinută prin schimbarea de variabilă τ = − t 1 , astfel că
( ) ( ) ( )
∫ ∫
= − = − − =
0
1
1
0
) , ( 1 1 , p q B d d q p B
p q p p
τ τ τ τ τ τ ;
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 180
• între funcţiile lui Euler ( ) q p B , şi ( ) z Γ există relaţia
( )
( ) ( )
( ) q p
q p
q p B
+ Γ
Γ Γ
= , ;
• pentru funcţia lui Euler de prima speţă avem egalitatea,
( )
( ) ( )
( )
( ) ( )
( )
( ) q p qB
q p
q p
q
q p
q p
p q p pB , 1
1
1
1
1
1 , + =
+ + Γ
Γ + Γ
=
+ + Γ
+ Γ Γ
= + .

Î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
q p
q p inc
x
n q p B
n p B
q p pB
x x
dt t t
q p B
q p x B
0
0
1 1 1

1 ,
1 , 1
1
,
1
1
) , (
1
) , , (
cu,
] 1 , 0 [ , 0 , ∈ ℜ ∈ >
+
x p,q q p
şi limitele:
( ) 0 , , 0 = q p B
inc
, 1 ) , , ( = ∞ q p B
inc
.

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 ) ( ) ( ) (
2 2
2
2
2
2 2 2
= − + +
⇔ = − + ′ + ′ ′
x y x
dx
x dy
x
dx
x y d
x
x y x x y x x y x
ν
ν

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
) ( ) (
2 1
x J C x J C y
ν ν −
+ =
unde C
1
şi C
2
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
p p
x
x J
ν
ν
ν
.
Între funcţiile Bessel cu indici de semne contrare, J
ν
şi J

, există relaţia
( ) ) ( 1 ) ( x J x J
n
ν ν
− =

.
Î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
x
n, î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
) ( ) (
2 1
x Y C x J C y
n n
+ =

unde C
1
şi C
2
sunt constante arbitrare, J
n
este funcţia Bessel de speţa întâi şi ordin n
iar Y
n
este funcţia Bessel de speţa a doua şi ordinul n, numite şi funcţiile lui
Neumann, astfel că uneori sunt notate cu N
n
.
Pentru n întreg şi pozitiv ( )
( )


=


− −
− =
1
0
2
2
! 2
! 1 1
2
ln
3
2
) (
n
k
n k
n k n n
x
k
k n x
x J x Y
π
, iar
pentru n neîntreg este o combinaţie liniară,
( ) ( )
nx
x J nx x J
x Y
n n
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 ) ( x Y x Y
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ă
( )
( )
( )
( ), ) ( ) ( , ) ( ) (
2 1
x iY x J x H x iY x J x H
ν ν ν ν ν ν
− = + =
unde i este unitatea imaginară.
Funcţiile
( ) ( )
) ( ), (
2 1
x H x H
ν ν
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 ,
( )
) (
1
x H
ν
, respectiv de speţa a doua,
( )
) (
2
x H
ν
.
Dacă n ≠ ν întreg, atunci
( )
( ) ( )
νπ
ν
νπ
ν
ν
sin
) (
1
x J e x J
i x H
i



= ,
( )
( ) ( )
νπ
ν
νπ
ν
ν
sin
) (
2
x J e x J
i x H
i


− = .
Schimbând pe ν în ν − , rezultă evident,
( ) ( )
) ( ) (
1 1
x H e x H
i
ν
νπ
ν
=

,
( ) ( )
) ( ) (
2 2
x H e x H
i
ν
νπ
ν


= .
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:
( ) 1
2 4
1
2
1
4 2
0

|
¹
|

\
|
+
|
¹
|

\
|
− ≈
x x
x J ; ( )
( ) n
x
x J
n
n
n
Π

2
;
( ) ; 57722 . 0 ln
1
...
3
1
2
1
1 lim ln ; ln
2
ln
2
0
= |
¹
|

\
|
− + + + + = |
¹
|

\
|
+ ≈
∞ →
n
n
x
x Y
n
γ γ
π

( )
( )
0 , ,
! 1 2
> ∈

− ≈ n N n
x
n
x Y
n
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:
( ) ,
2 4
cos
2
|
¹
|

\
|
− − ≈
π π
π
n x
x
x J
n
|x|≅1;
( ) ,
2 4
sin
2
|
¹
|

\
|
− − ≈
π π
π
n x
x
x Y
n
|x|≅1;
( ) ( ) ,
2
,
2
2 4 2 2 4 1
|
¹
|

\
|
− − − |
¹
|

\
|
− −
≈ ≈
π π π π
π π
n x j
n
n x j
n
e
x
x H e
x
x H |x|≅1.

Pentru funcţiile lui Bessel sunt valabile următoarele formule de recurenţă:
( ) ( ) ( ) ( ) ( ) ( ) x Y x Y
x
n
x Y x J x J
x
n
x J
n n n n n n 1 1 1 1
2
,
2
− + − +
− = − = ,
( ) ( ) ( ) ( ) ( ) ( ) x J
x
n
x J x J x J
x
n
x J x J
dx
d
n n n n n n
− = − = ′ =
− + 1 1
, ( ) ( ) x J x J
1 0
− = ′ ,
( ) ( ) ( ) ( ) ( ) ( ) x Y
x
n
x Y x Y x Y
x
n
x Y x Y
dx
d
n n n n n n
− = − = ′ =
− + 1 1
, ( ) ( ) x Y x Y
1 0
− = ′ ,
( ) ( )dx x xJ
x
x J

=
0 1
1
, ( ) ( )dx x xY
x
x Y

=
0 1
1
, ( ) ( ) ( )dx x xJ
x
x J x J

= +
2
0 2
2
1
2
0
2
,
( ) ( )
( )
( ) ( ) x J
x
x J
x
n n
x J x J
dx
d
n n n n 1
2 2
2
1
1
1
+
+
(
¸
(

¸



= ′ ′ = ,
Funcţii matematice în Matlab 185
( ) ( )
( )
( ) ( ) x Y
x
x Y
x
n n
x Y x Y
dx
d
n n n n 1 2 2
2
1
1
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,

( ) ( ) , cos
2
, sin
2
2
1
2
1
x
x
x J x
x
x J
π π
= =


( ) ( ) , cos
2
1
sin
2
, cos sin
1 2
2
3
2
3
|
¹
|

\
|
+ − = |
¹
|

\
|
− =

x x
x
x J x x
x x
x J
π π

( ) întreg, , cos
1
sin
1 2
2
1
n x
x
B x
x
A
x
x J
n n
n
(
¸
(

¸

|
¹
|

\
|
+ |
¹
|

\
|
=
+
π
iar
|
¹
|

\
|
|
¹
|

\
|
x
B
x
A
n n
1
,
1
sunt
polinoame în
x
1
de 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
sin
2
0
cos
sin cos
1
2
1
2
1
d n x d e e d e e
i
x J
in ix in ix
n n
,
( ) ( ) ( )
∫ ∫ ∫

= = =
1
0
2
2
0 0
0
1
cos 2
sin cos
2
sin cos
1
du
u
ux
d x d x x J
π
θ θ
π
θ θ
π
π
π
.

De asemenea, funcţiile Bessel de prima speţă şi de ordin întreg, ( ) x J
n
,
admit reprezentarea ( )
∫ +
|
|
¹
|

\
|

=
C
n
x
n
d
e
i
x J ζ
ζ π
ζ
ζ
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
( ) ( )


=
=
1 ν
ν ν
ξ x J a x f
n
, cu 1 0 ≤ ≤ x , adică poate fi exprimată cu ajutorul unui
număr mare de funcţii Bessel de ordinul n. În această expresie ,... ... , ,
2 1 ν
ξ ξ ξ sunt
rădăcinile funcţiei ( ) ξ
n
J ordonate după mărime (n>-1), n fiind număr real.
Dacă n este real n>-1, toate zerourile funcţiei ( ) x J
n
sunt reale, întrucât seria
corespunzătoare are toţi coeficienţii reali. Funcţia ( ) 0 = x J
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 1 0 ≤ ≤ 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 ( ) ( ) ( ) 1 0 , ... , ... , ,
2 1
≤ ≤ x x J x x J x x J x
n n n ν
ξ ξ ξ , formează
o mulţime de funcţii ortogonale în domeniul 1 0 ≤ ≤ x , adică,
( ) ( ) ( ) ( ) k i dx x J x J x dx x J x J x
k n i n k n i n
≠ = =
∫ ∫
, 0 x
1
0
1
0
ξ ξ ξ ξ .
Coeficienţii dezvoltării în serie
( ) ( ) ( ) ( ) ... ...
2 2 1 1
+ + + + = x J a x J a x J a x f
n n n n n
ξ ξ ξ
îi putem obţine prin înmulţirea ambilor membrii cu funcţia ( ) x xJ
n ν
ξ , integrând de
la 0 la 1 şi ţinând seama de relaţia de ortogonalitate,
( ) ( ) k i dx x J x J x
k n i n
≠ =

, 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:
( )
( )dx x J x x f
J
a
n
n
ν
ν
ν
ξ
ξ


=
1
0
2
) (
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 ) (
2 2 2 2
2
2
2
2
2
2
2
= − +
|
¹
|

\
|
⇔ = − + +
⇔ =
|
|
¹
|

\
|
− + +
x y n x
dx
d
x
dx
d
x x y n x
dx
x dy
x
dx
x y d
x
x y
x
n
dx
x dy
x dx
x y d

ci, în general, trebuie să rezolvăm ecuaţii diferenţiale de forma:
0 ) (
) ( 1 ) (
2
2
2
2
=
|
|
¹
|

\
|
− + + x y
x
n
k
dx
x dy
x dx
x y d
,
care, cu schimbarea de variabilă kx z = ,se reduce la forma canonică.
Soluţia generală a ecuaţiei anterioare se poate scrie sub forma
) ( ) (
2 1
kx J C kx J C y
n n −
+ = sau ) ( ) (
2 1
kx Y C kx J C y
n n
+ = , care, pentru n şi x ,iau
valori complexe.
Pentru cazul paricular 1
2
− = k , ecuaţia anterioară devine
0 ) ( 1
) ( 1 ) (
2
2
2
2
=
|
|
¹
|

\
|
− − + + x y
x
n
dx
x dy
x dx
x y d
,
având soluţia generală de forma,
) ( ) (
2 1
x K C x I C y
n n
+ = ,
unde ) (x I
n
este funcţia Bessel modificată de speţa întâi, iar ) (x K
n
este funcţia
Bessel modificată de speţa a doua.
Aceste funcţii modificate sunt echivalentele funcţiilor Bessel ) (x J
n
şi
) (x Y
n
, care diferă printr-un factor constant şi sunt date de expresiile,
( ) ( ) ( ), ) ( ix J i ix J i x I
n
n
n
n
n
− ≡ =


( ) ( ) [ ] ( ) ( ) [ ] x I x I
n
ix iY ix J i x K
n n n n
n
n
− = + =

+
π
π π
sin 2 2
) (
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:
( ) 1
2 4
1
2
1
4 2
0

|
¹
|

\
|
+
|
¹
|

\
|
− ≈
x x
x I ; ( ) 0 ,
2 !
1
>
|
¹
|

\
|
≈ n
x
n
x I
n
n
;
( ) ; 57722 . 0 ln ,
2
ln
0
= − ≈ γ
γ x
x K ( )
( )
0 , ,
! 1 2
1
≠ ∈

− ≈

n N n
x
n
x K
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
e
x I
x
2
0
≈ , ( )
x
e
x
x K


2
0
π
, |x|≅1;
Funcţii matematice în Matlab 189

( ) x x I
x I
2
1
1
) (
0
1
− ≈ ,
( ) x x K
x K
2
1
1
) (
0
1
+ ≈ , |x|≅1.

Pentru funcţiile Bessel modificate, sunt valabile următoarele formule de
recurenţă:
( ) ( ) ( ) ( ) ( ) ( ) x K x K
x
n
x K x J x I
x
n
x I
n n n n n n 1 1 1 1
2
,
2
− + − +
+ = + − = , ( ) ( ) x K x K
1 0
− = ′ ,
( ) ( ) ( ) x I x I x I
dx
d
1 0 0
= ′ = , ( ) ( )dx x xI
x
x I

=
0 1
1
, ( ) ( )dx x xK
x
x K

=
0 1
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 x i
2
1
(respectiv
4
π
i
xe ) sau x i
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):
|
|
¹
|

\
|
=
|
|
¹
|

\
|
= +
4
0
4
0
) ( bei ) ( ber
π π
i i
xe I ixe J x i x ,
|
|
¹
|

\
|
=
|
|
¹
|

\
|
− = +
4
0
4
3
0
) ( ei ) ( ker
π π
i i
xe K ixe K x ik x .
Ţinând seama de ( ), ) ( ix J i x I
n
n
n

= avem
( )


=
|
¹
|

\
|
=
|
|
¹
|

\
|
0
2
2
4
0
2 !
1
p
p
p
i
x
p
i xe I
π
,
astfel că:

( ) ( )
...
2 ! 4
1
2 ! 2
1
1 Re Re ) ( ber
8
2
4
2
2
1
0
2
3
0
− |
¹
|

\
|
+ |
¹
|

\
|
− ≈
|
|
¹
|

\
|
=
|
|
¹
|

\
|
=
x x
x i J x i J x ,
( ) ( ) ( )
...
2 ! 5
1
2 ! 3
1
2 ! 1
1
Im Im ) ( bei
10
2
6
2
2
2
2
1
0
2
3
0
− |
¹
|

\
|
+ |
¹
|

\
|
− |
¹
|

\
|

|
|
¹
|

\
|
− =
|
|
¹
|

\
|
=
x x x
x i J x i J x

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
xe J x i x ,
|
|
¹
|

\
|
− = ±
±
4
3
) ( kei ) ( ker
π
ν ν ν
i
ixe K x i x ,
|
|
¹
|

\
|
= +
±
4
3
) 1 (
) ( hei ) ( her
π
ν
i
xe H x i x .

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 / 1
3
1
Ai(z)

⋅ ⋅ = K
z

( ) ( ) ( ) ζ ζ
3 / 1 3 / 1
3
Bi(z) I I
z
+ ⋅ =


unde:
2
3
3
2
z ⋅ = ζ .
Î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
x P dt e
x
t
= ⋅ =


π
,
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 192
) erf(x 1
2
erfc(x)
0
2
− = ⋅ =


x
t
dt e
π

în care ) 5 . 0 , (
2
x P este funcţia Gamma incompletă, iar argumentul x trebuie să fie
real şi 0 ≥ x .
Funcţia eroare şi complementara acesteia au limitele,
0 erf(0) = , 1 ) erf( = ∞ , 1 erfc(0) = , 0 ) erfc( = ∞ ,
şi respectă relaţiile de simetrie :
erf(-x) erf(-x) − = , erfc(x) 2 erfc(-x) − = .

Calculul valorii funcţiei eroare genaralizate, pentru x şi y scalar, vector sau
matrice se face cu relaţia:
) erf(x erf(y)
2
erf(x)
2
− = ⋅ =


y
x
t
dt e
π
.

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

π
.
8.7.9. Funcţia integrală exponenţială
Funcţia integrală exponenţială, expint, pentru fiecare element x>0, este
definită prin:

∞ −
=
x
t
dt
t
e
expint(x) .
O altă definiţie a funcţiei integraleexponenţială este valoarea principală a
integralei Chauchy, notată Ei şi definită prin:

∞ −

=
x t
dt
t
e
Ei(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 = = ∆ u u ,
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
2
2
2
2
=
|
¹
|

\
|


⋅ ⋅


+


⋅ +
|
¹
|

\
|


⋅ ⋅



r
U
r
r
U U
ϕ θ θ
θ
θ θ
,
unde:
( ) ( ) θ ϕ θ ϕ θ ϕ θ cos , sin sin , cos sin , , ⋅ ⋅ ⋅ ⋅ ⋅ = r r r u r U
este funcţia obţinută din ( ) z y x u , , prin schimbarea coordonatelor carteziene în
sferice,
θ ϕ θ ϕ θ cos z , sin sin y , cos sin ⋅ = ⋅ ⋅ = ⋅ ⋅ = r r r x .

Funcţiile ( ) z y x u , , , omogene în x, y, z, care satisfac ecuaţia lui Laplace se
numesc funcţii sferice. Gradul de omogenitate al funcţiei ( ) z y x u , , se numeşte şi
ordinul funcţiei sferice.
Dacă ( ) z y x u , , este o funcţie sferică de ordinul n, datorită omogenităţii,
avem
( ) ( ) ( ) ϕ θ θ ϕ θ ϕ θ ϕ θ , cos , sin sin , cos sin , ,
n
n n
F r r r r u r r U ⋅ = ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ = ,
care, introdusă în ecuaţia lui Laplace, scrisă în coordonate sferice şi simplificând cu
n
r , conduce la:
( ) 0 1


sin
1


sin
sin
1
2
2
2
= ⋅ + ⋅ +


⋅ + |
¹
|

\
|


⋅ ⋅



n
n n
F n n
F F
ϕ θ θ
θ
θ θ
.

Funcţiile ( ) ϕ θ,
n
F , 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
n
F U = .
Fiecărei funcţii sferice ( ) ( ) ϕ θ, , , , r U z y x u = de ordinul n îi corespunde o
funcţie sferică superficială ( ) ϕ θ,
n
F şi, reciproc, fiecărei funcţii sferice
superficiale ( ) ϕ θ,
n
F îi corespunde o funcţie sferică
( ) ( ) ( ) ϕ θ ϕ θ , , , , ,
n
n
F r r U z y x u ⋅ = =
de acelaşi ordin n.
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 194
De menţionat că schimbarea lui n în 1 − − = n p , lasă ecuaţia anterioară
neschimbată şi prin urmare, dacă ( ) ( ) ϕ θ ϕ θ , , ,
n
n
F r r U ⋅ = este o funcţie sferică,
atunci şi funcţia ( ) ( ) ϕ θ ϕ θ , , ,
1
1
1 − −
− −
⋅ =
n
n
F r r U 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ă:
( ) ( ) ( )
( )
( )
k n
k
n
E
k
k
k n
k
n n
x
k n
k n
C x P P
2
2
0
! 2
1 2 2 5 3 1
1 cos

|
¹
|

\
|
=



− − ⋅ ⋅
⋅ ⋅ − = =

L
α ,
în care
|
|
|
¹
|

\
|
2
n
E 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
n n
x
x n
x P 1
d
d
! 2
1
2
n
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
n n
x i
x P ζ
ζ
ζ
π
d
1
2
1
2
1
1
2
,
• satisfac relaţia de recurenţă, care permite determinarea tuturor
polinoamelor, când se cunosc două dintre ele, cu indici diferind printr-o
unitate,
( ) ( ) L 3 , 2 , 1 , 0 1 2 1
1 1
= = + + − +
− +
n nP xP n P n
n n n
,
• 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 ( ) x P
n
este o soluţie a ecuaţiei diferenţiale a lui
Legendre,
( ) [ ] ( ) ( ) ( ) 0 1 ' 2 " 1 0 1 ' 1
d
d
2 2
= − − + − ⇔ = − − − y n n xy y x y n n y x
x
,
• polinoamele lui Legendre formează un sistem de funcţii ortogonale pe
intervalul [ ] 1 , 1 − ,
Funcţii matematice în Matlab 195
( ) ( )
¦
¹
¦
´
¦
=
+

= ⋅ ⋅


n k
n
n k
x x P x P
n k
pentru
1 2
2
pentru 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,
( )


=

0 n
n n
x P a
cu coeficienţii Fourier generalizaţi
( ) ( ) x x P x f
n
a
n n
d
2
1 2
1
1
⋅ ⋅
+
=




De menţionat că, polinomul lui Legendre ( ) x P
n
, este o soluţie particulară a
ecuaţiei lui Legendre, ( ) ( ) 0 1 ' 2 " 1
2
= − − + − y n n xy y x .

Soluţia generală a ecuaţiei lui Legendre este
( ) ( ) ( ) ( ) x P C x K
x
x
x P C z x P y
n n n n
⋅ +
(
¸
(

¸

+

+
⋅ ⋅ = ⋅ =
− 1 1
1
1
ln ,
în care polinoamele ( ) x K
n 1 −
se determină dezvoltând funcţia
1
1
ln

+
x
x
în serie
de puteri.

Funcţiile ( ) ( ) ( ) x K
x
x
x P x Q
n n n 1
1
1
ln

+

+
⋅ = 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
m m
m n
x
x P
x x P
d
d
1
2
2
,
− =
,
( ) ( )
( )
m
n
m m
m n
x
x Q
x x Q
d
d
1
2
2
,
− =
,
unde m şi n iau valorile 0, 1, 2, 3, …, iar n m ≤ .
Funcţiile lui Legendre asociate sunt soluţii ale ecuaţiei diferenţiale:
( ) ( ) 0
1
1 ' 2 " 1
2
2
2
= ⋅
(
¸
(

¸


− + + ⋅ − − y
x
m
n n y x y x
şi pot fi exprimate sintetic sub forma:
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 196
( ) ( )
( )
m
n
m m
m
m n
x
x P
x x P
d
d
1 1 ) (
2
2
,
− ⋅ − =
,
î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:
( )
( )
( )
( )
¦
¹
¦
´
¦
> ⋅
+

⋅ ⋅ −
=
=
0 pentru
!
!
2 1
0 pentru ) (
) (
,
,
m x P
m n
m n
m x P
x SP
m n
m
n
m n

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:
( ) 0
1
1
2 ' 2 " 1
2
2
= ⋅
(
¸
(

¸


− + ⋅ − − y
x
y x y x ,
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:

( )
( ) ( )
( )( ) ( )
( ) ( ) [ ]
n n
n
n
n n
x b a x
x n
x b a x
b a
x J
+ +

− −
+ + +
− −


=
β α
β α
α α α d
d
2 1
1
) (
L
,
unde β α , sunt două numere reale mai mari decât –1.
Polinomul lui Jacobi ) (x J
n
este o soluţie a ecuaţiei diferenţiale:
( )( ) ( )( ) ( )( ) [ ] ( ) 0 1 ' 1 1 " = ⋅ + + + − ⋅ − + + − + + ⋅ − − y n n y a x b x y b x a x β α β α
Totodată, polinoamele lui Jacobi, cuprind drept cazuri particulare, alte
polinoame speciale, astfel:
• pentru 1 , 1 , 0 , 0 = − = = = b a β α 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
b
b a = = − = β α , se obţin polinoamele lui Hermite ;
• pentru
2
1
, 1 , 1 − = = = − = β α b a , 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
1
z
e z f



=
π

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 , ( ) z f 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,
( ) ( )
∫ ∫

∞ −

∞ −



= = dt
t
e dz z f z f
2
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 ( )
0 0 0 0
, , z y x P poate fi obţinută ca intersecţia planelor
0
x x = ,
0
y y = ,
0
z z = . Aceste plane se intersectează, două câte două, după
dreptele
0 0
, z z y y = = ;
0 0
, x x z z = = ;
0 0
, y y x x = = ,
paralele cu axele de coordonate. Fiecărui punct
0
P din spaţiu, îi este ataşat un
triedru k j i
r r r
, , , 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 ( )
0 0 0 0
, , z P ϕ ρ este intersecţia următoarelor suprafeţe: cilindru
0
ρ ρ = , semiplanul
0
ϕ ϕ = şi planul
0
z z = (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
z
C , pe care
variază numai z.
Notăm cu
z
u u u
r r r
, ,
ϕ ρ
vectorii unitari tangenţi la aceste curbe, în
0
P ş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
ϕ ρ
u u
r r
, au direcţii
Funcţii matematice în Matlab 201
nedeterminate.
Fiind ortogonali, doi câte doi,
z
u u u
r r r
, ,
ϕ ρ
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:
¦
¹
¦
´
¦
=
⋅ =
⋅ =
z z
y
x
ϕ ρ
ϕ ρ
sin
cos

cu π ϕ ρ 2 0 , 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
¦
¦
¹
¦
¦
´
¦
=
|
¹
|

\
|
=
+ =
z z
x
y
y x
arctan
2 2
ϕ
ρ

cu π π ρ < |
¹
|

\
|
≤ ≥
x
y
arctan - , 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: OP r = , 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
r
C 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
ϕ θ
u u u
r
r r r
, , 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
ϕ θ
u u u
r
r r r
, , poate fi considerat triedru de referinţă şi depinde de
punct.
Între coordonatele sferice şi coordonatele carteziene avem relaţiile:
¦
¹
¦
´
¦
⋅ =
⋅ ⋅ =
⋅ ⋅ =
θ
ϕ θ
ϕ θ
cos
sin sin
cos sin
r z
r y
r x

cu π ϕ π θ 2 0 , 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:
¦
¦
¦
¦
¹
¦
¦
¦
¦
´
¦
|
|
¹
|

\
|
+
=
|
¹
|

\
|
=
+ + =
2 2
2 2 2
arctan
arctan
y x
z
x
y
z y x r
θ
ϕ
cu π ϕ π θ 2 0 , 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θ ⋅ ⋅ = ⋅ b a b a .
Cel mai tipic exemplu de produs scalar a doi vectori este lucrul mecanic
produs de o forţă constantă b F = , 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,
θ θ cos cos ⋅ = ⋅ b F . 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:
• a b b a ⋅ = ⋅ - este comutativ;
• ( ) ( ) b a b a ⋅ ⋅ = ⋅ ⋅ λ λ , în care λ este un scalar oarecare;
• ( ) c b c a c b a ⋅ + ⋅ = ⋅ + - este distributivă faţă de adunare;
• 0
2
≥ = ⋅ a a a , egalitatea având loc numai dacă a=0;
• b a b a ⋅ ≤ ⋅ - 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 = ⋅ = ⋅ = ⋅ = ⋅ = ⋅ = ⋅ i k k j j i k k j j i i .

Fig. 8.11.
Ţinând seama de cele de mai sus, vectorii a şi b vor avea expresiile:
,
3 2 1 3 2 1
k b j b i b b k a j a i a a ⋅ + ⋅ + ⋅ = ⋅ + ⋅ + ⋅ = .
Înmulţind scalar aceste sume şi ţinând seama de cele anterioare, se obţine:

3 3 2 2 1 1
b a b a b a b a ⋅ + ⋅ + ⋅ = ⋅ .
Pentru a b = , avem :

2
3
2
2
2
1
2
3
2
2
2
1
2
a a a a a a a a a a + + = ⇒ + + = = ⋅ .
Expresia care dă unghiul a doi vectori este:
2
3
2
2
2
1
2
3
2
2
2
1
3 3 2 2 1 1
cos
b b b a a a
b a b a b a
+ + ⋅ + +
⋅ + ⋅ + ⋅
= θ

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 * 6 11 * 5 10 * 4
9 * 3 8 * 2 7 * 1
C
72 55 40
27 16 7
C
C=dot(A,B,1) este,
[ ] [ ] 72 27 55 16 40 7 C 99 71 47 C + + + = ⇔ = ,
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 206
iar C=dot(A,B,2) este:
(
¸
(

¸

+ +
+ +
= ⇔
(
¸
(

¸

=
72 55 40
27 16 7
C
167
50
C .
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,
2 2 1 , 0 4 3 k j i b k j i a ⋅ − ⋅ + ⋅ = ⋅ + ⋅ − ⋅ = ,
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:
( ) ( ) ( ) k b a b a j b a b a i b a b a
b b b
a a a
k j i
b a c ⋅ − + ⋅ − + ⋅ − = = × =
1 2 3 1 3 1 1 3 2 3 3 2
3 2 1
3 2 1
.
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 ⋅ ⋅ = × = b a b a c
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:
• a b b a × − = × - este anticomutativ;
• ( ) ( ) b a b a × ⋅ = × ⋅ λ λ , în care λ este un scalar oarecare;
• ( ) c b c a c b a × + × = × + - este distributiv faţă de adunare;
• produsul vectorial a doi vectori colineari este nul, deoarece 0 sin = θ ;
Funcţii matematice în Matlab 207
• b a b a ⋅ ≤ × - 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,
2 1 1 , 1 3 5 k j i b k j i a ⋅ − ⋅ − ⋅ − = ⋅ − ⋅ − ⋅ = ,
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
N
x x x ,..., ,
2 1
este dată de relaţia:
N
x x x
N
x
m
N
N
k
k
+ + +
= =

=
...
2 1 1
,
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
natural numar 1, 2 impar, dacã ,
2
1
k k N N
N
x
N
x
k k N N
N
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
i
X S
1
ş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ă, S
j
, a unui vector X este dată de relaţia matematică
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 212
N j X S
j
k
k j
,..., 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
i
X P
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, P
j
, a unui vector X este dat de relaţia matematică
N j X P
j
k
k j
,..., 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
6 5 4 3 2 1
, , , , , x x x x x x . Probabilitatea cu care variabila x
k
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
p p p
x x x
X
,..., ,
,..., ,
2 1
2 1
, care în exemplu anterior devine:
|
|
¹
|

\
|
6
1
6
1
6
1
6
1
6
1
6
1
6 5 4 3 2 1
X .
Analiza datelor şi transformata Fourier 215
Se numeşte valoare medie (sau speranţă matematică) a unei variabile aleatoare X
numărul:



=
=
=
⋅ =

=
+ + +
⋅ + + ⋅ + ⋅
= =
n
k
k k
n
k
k
n
k
k k
n
n n
x p
p
x p
p p p
x p x p x p
x X M
1
1
1
2 1
2 2 1 1
...
...
) (
deoarece

=
=
n
k
k
p
1
1. Se observă că valoarea medie a variabilei X este media
ponderată a valorilor sale, cu ponderile
n
p p p + + + ...
2 1
. Contribuţia unei valori x
k

în determinarea valorii medii x este cu atât mai mare, cu cât probabilitatea p
k
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
k
M şi este:
( ) [ ] ( )
k
k
n n
k k
k
k
k
x p x p x p X M M
1
2 2 1 1
1
... ⋅ + + ⋅ + ⋅ = = .
Valoarea medie de ordinul al doilea, pentru k=2,
2 2
2 2
2
1 1 2
...
n n
x p x p x p M ⋅ + + ⋅ + ⋅ = se numeşte şi valoarea medie pătratică a
variabilei X.
Valoarea medie de ordinul 1 (k=1) este chiar valoarea medie ) (
1
X M M = .
Valoarea medie de ordinul k = -1 este media armonică,
1
2
2
1
1
1
...


|
|
¹
|

\
|
+ + + =
n
n
x
p
x
p
x
p
M , care pentru
n
p p p
n
1
...
2 1
= = = = , devine:
n
x x x M
N 1
...
1 1
2 1 1
+ + + =

.
Pentru k = 0 se obţine media geometrică,
n
p
n
p p
x x x M ⋅ ⋅ ⋅ = ...
2 1
2 1 0
, care pentru
n
p p p
n
1
...
2 1
= = = = , se reduce la:
n
n
x x x M ⋅ ⋅ ⋅ = ...
2 1 0
.

Se numeşte abatere a variabilei X, variabila aleatoare x X U − = , care ia valorile
x x u
k K
− = , adică:
x x u
p p p
u u u
U
k k
n
n
− =
|
|
¹
|

\
|
,
,..., ,
,..., ,
2 1
2 1
. Valoarea medie a abaterii, M(U), este nulă.
Prin urmare, M(U) nu ne poate da nici o indicaţie asupra împrăştierii valorilor x
k

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
p p p
u u u
U
,..., ,
,..., ,
2 1
2 1
.

Momentul de ordinul k al variabilei X se notează cu ( )
k
X M şi este:
( ) întreg. , ...
2 2 1 1
k x p x p x p X M
k
n n
k k k
⋅ + + ⋅ + ⋅ =
Se numeşte moment centrat de ordinul k al variabilei aleatoare U momentul de
ordinul k al abaterii sale x X U − = , adică ( )

=
⋅ =
n
i
k
i i
k
x p U M
1
. Î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),
2 2
sau ), ( σ µ X D şi se numeşte dispersia sau varianţa variabilei aleatoare X,

=
⋅ = = =
n
i
i i
u p X D
1
2 2 2
) ( σ µ .
Rădăcina pătrată a dispersiei,
2 2
2 2
2
1 1
...
n n
u p u p u p ⋅ + + ⋅ + ⋅ = = σ µ ,
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
( ) ) ( ) ( Y D X D Y X D + = + ;
• pentru orice variabilă aleatoare X şi orice constantă k, ( ) ) (
2
X D k X k D ⋅ = ⋅ ;
• dacă variabilele aleatoare
n
X X X ,..., ,
2 1
sunt independente şi
n
λ λ λ ,..., ,
2 1

sunt constante, atunci
( ) ) ( ... ) ( ) ( ...
2
2
2
2 1
2
1 2 2 1 1 n n n n
X D X D X D X X X D ⋅ + + ⋅ + ⋅ = ⋅ + + ⋅ + ⋅ λ λ λ λ λ λ ;
• valoarea medie pătratică a unei variabile aleatoare X este mai mare decât
modulul valorii sale medii, deoarece ( ) 0 ≥ X D , rezultă
( ) ( ) x X M x X M ≥ ⇒ ≥
2
2
2
, care se mai poate scrie şi

n n n n
x p x p x p x p x p x p ⋅ + + ⋅ + ⋅ ≥ ⋅ + + ⋅ + ⋅ ... ...
21 2 1 1
2 2
2 2
2
1 1
;
• 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
L
L x X P
σ
≤ ≥ − (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
1
2
1
_
1
1
|
|
¹
|

\
|
|
¹
|

\
|


=

=
n
i
i
x x
n
s ; dacă X este un model oarecare dintr-o distribuţie
normală, s
2
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
1
2
1
_
1
|
|
¹
|

\
|
|
¹
|

\
|
− =

=
n
i
i
x x
n
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
i
x
n
x
1
_
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 V U ⋅ se
numeşte corelaţia variabilelor X şi Y şi se notează, de regulă, cu
XY
C ,
) ( V U M C
XY
⋅ = .
Între corelaţia
XY
C , valoarea medie a produsului Y X ⋅ şi valorile medii ale celor
două variabile există relaţia,
y x Y X M Y M X M Y X M C
XY
⋅ − ⋅ = ⋅ − ⋅ = ) ( ) ( ) ( ) ( .
Principalele consecinţe ale corelaţiei sunt:
• dacă două variabile aleatoare X, Y au corelaţia nulă, atunci valoarea medie a
produsului Y X ⋅ este egală cu produsul y x ⋅ al valorilor lor medii şi
reciproc dacă y x Y X M ⋅ = ⋅ ) ( , 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
XY
C 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,
) ( ) (
) (
2 2
V M U M
V U M C
Y X
XY


=

=
µ µ
ρ ,
unde
X
µ şi
Y
µ sunt abaterile medii pătratice ale celor două variabile X, Y.
Coeficientul de corelaţie satisface inegalităţile 1 1 ≤ ≤ − ρ .
Funcţia Matlab cov, calculează covarianţa definită ca,
( ) ( ) [ ]
2 2 1 1 2 1
) , cov( µ µ − ⋅ − = x x E x x ,
unde E este probabilitatea matematică şi
i i
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 ( )
( )
) , ( ) , (
,
,
j j C i i C
j i C
j i R

= , 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(n 1) ( ) 1 ( 2 -
) ( ) 1 ( ) 1 ( ) 2 ( ) ( ) 1 ( ) (
a
⋅ + − − − ⋅
− − ⋅ + + + − ⋅ + ⋅ =
a
b b
n a n y ) a(
n n x n b n x b n x b n y
L
L

sau, în transformată Z
( )
( )
( )
( ) z X
z n a z a
z n b z b b
z Y
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 ( ) ( ) ( j k v j u k w
j
− + =


Suma este pentru toate valorile lui j, ceea ce conduce la indici permişi pentru
) ( j u ş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, n
1
şi n
2
, atunci
formula pentru convoluţia bi-dimensională a lui a şi b este:


−∞ =


−∞ =
− − ⋅ =
1 2
)
2 2
,
1 1
( )
2
,
1
( )
2
,
1
(
k k
k n k n b k k a n n c .
Î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:
( )


=
⋅ + ⋅ +
1
0
sin cos
k
k k
t k b t k a a ω ω
unde
k k
b a a , , ,
0
ω sunt constante reale, iar t o variabilă reală. Deoarece funcţiile
x cos , x sin sunt periodice de perioadă π ⋅ 2 , funcţiile t kω cos , t kω sin , cu k
număr natural, au perioada
ω
π 2 1
⋅ = =
k k
T
T
k
.
Prin urmare, dacă seria trigonometrică este convergentă într-un punct t
0
, iar suma
seriei este S(t
0
), seria va fi convergentă şi în punctele t
0
+ nT, cu n întreg şi S(t
0
+
nT)=S(t
0
). 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ă a
1
şi b
1
nu sunt amândoi nuli, suma seriei,
( )


=
⋅ + ⋅ + =
1
0
sin cos ) (
k
k k
t k b t k a a t S ω ω
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,
( )


=
⋅ + ⋅ + =
1
0
sin cos ) (
k
k k
t k b t k a a t f ω ω ,
care, dacă coeficienţii sunt,

L , 3 , 2 , 1 , d sin ) (
2
, d cos ) (
2
, d ) (
1
0
= = = =
∫ ∫ ∫
+ + +
k t t k t f
T
b t t k t f
T
a t t f
T
a
T
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,
( )


=
⋅ + ⋅ =
0
1 1
sin cos ) (
k
k k
t k B t k A t f ω ω ,
unde
T
π
ω
2
1
= este pulsaţia armonicei fundamentale, iar coeficienţii sunt,
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 226
L , 3 , 2 , 1 , d sin ) (
2
, 0
, d cos ) (
2
, d ) (
1
2
2
1 0
2
2
1
2
2
0
= = =
= =

∫ ∫

− −
k t t k t f
T
B B
t t k t f
T
A t t f
T
A
T
T
k
T
T
k
T
T
ω
ω

Pentru funcţia neperiodică se deduce dezvoltarea analoagă,
( ) ( ) ω ω ω ω ω ω d sin d cos ) (
0 0
t b t a t f
∫ ∫
∞ ∞
+ =
în care coeficienţii, denumiţi şi densităţi spectrale ale amplitudinii, sunt:
( ) u u u f b u u u f a d sin
1
) ( , d cos ) (
1
) ( ⋅ = ⋅ =
∫ ∫

∞ −

∞ −
ω
π
ω ω
π
ω
Coeficienţii A
k
şi B
k
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 ( ) ω ω d a respectiv ( ) ω ω d b .
Mărimile ( ) ω a şi ( ) ω b sunt densităţile amplitudinilor, adică amplitudinile ( ) ω ω d a ,
respectiv ( ) ω ω d b , 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, ( ) t a ω ω ω cos d , respectiv cosinus
( ) t b ω ω ω cos d , 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
u t jn
u e u f t f
2
2
-
1
d
2
1
1
ω
ω
π
.
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
u t jn
u e u f t f
2
2
-
d
2
1
ω
ω
π
.
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
u t j
u e u f u
ω
ϕ ,
în care t are rolul de parametru.
Suma, ( )

+∞
−∞ =
∆ ∆
n
t n , ω ωϕ 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,

( ) ( ) ( ) ω ω
π
ω
π
ω ω ω
d
2
1
d d
2
1
-
t j t j u j
e j F e u e u f t f ⋅ = ⋅
(
¸
(

¸

=
∫ ∫ ∫
+∞
∞ −
+∞
∞ −
+∞



cu ( ) ( )

+∞


=
-
dt e t f j F
u jω
ω
Funcţia ( ) ω j F 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,
( ) ( ) ω ω
π
ω
d
2
1
t j
e j F t f ⋅ =

+∞
∞ −

Sunt uzuale notaţiile:
( ) ( ) t f j F F = ω şi ( ) ( ) ( ) ω ω j F j F t f
1 −
= F ,
cu F transformata Fourier şi F
-1
inversa transfomatei Fourier sau transformata
Fourier inversă.
Cu aceste notaţii sunt valabile relaţiile:
( ) ( )
0
0
t j
e j F t t f
ω
ω

⋅ = − F , ( ) ( )
0
(
0
ω ω
ω
− = ⋅ j F e t f
t j
F , ( ) ( ) ω ω j F j
t
f
n
n
n
=
d
d
F .
Comportarea unui sistem liniar se descrie prin funcţia de sistem, numită şi
funcţie de transfer,
( ) ( )
( ) ω θ
ω ω
j
e A j H

⋅ =
Prin definiţie, această funcţie de transfer înmultită cu complexul conjugat
0
0
t j
e K
ω
⋅ al unei excitaţii armonice pur cosinusoidale, dă complexul răspunsului
armonic de regim permanent, ( )
0
0
t j
e j H K
ω
ω ⋅ .
Funcţia de transfer, ( ) ω j H , înmulţită cu transformata Fourier, ( ) ω j F , a
funcţiei de excitaţie dă transformata Fourier a răspunsului, ( ) ω j G , î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,
( ) ( ) ( ) ω ω ω j H j F j G ⋅ = ,
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) :
( ) ( )
( )( ) 1 1
1
− −
=

=
k n
N
n
n x k X ω , ( ) ( )
( )( ) 1 1
1
1
− − −
=

=
k n
N
N
n
k X
N
n x ω , unde
N
j
N
e


=
π
ω
2
.
Relaţia dintre DFT şi coeficienţii Fourier în:
( ) ( )
( )
( )
( )
|
¹
|

\
|

⋅ ⋅
⋅ + |
¹
|

\
|

⋅ ⋅
⋅ + =

= t N
n t k
k b
t N
n t k
k a a n x
N
k d
2
sin
d
2
cos
2
1
0
π π
,
este,
N
X
a
) 1 (
0
= , ( )
( )
N
k X real
k a
) 1 (
2
+
⋅ = , ( )
( )
N
k X imag
k b
) 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 R I f → : , cu R I ⊂ interval, spunem că :
• punctul I x ∈
0
este un punct de maxim (local) pentru f, dacă există o
vecinătate V a lui
0
x , astfel încât ( ) ( )
0
x f x f ≤ , pentru orice
I V x I ∈ ;
• punctul I x ∈
0
este un punct de minim (local) pentru f, dacă există o
vecinătate V a lui
0
x , astfel încât, ( ) ( )
0
x f x f ≥ , pentru orice
I V x 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 R I f → : are derivată într-un
punct,
0
x , din interiorul intervalului I şi dacă
0
x este punct de maxim sau minim
local pentru funcţia f, atunci derivata sa este nulă în punctul
0
x , 0 ) (
0
'
= x f . Dacă
punctul
0
x este unul dintre capetele intervalului I, punctul
0
x poate fi punct de
extremum, fără ca derivata să se anuleze în punctul
0
x . De menţionat că reciproca
teoremei lui Fermat nu este în general adevărată, adică o funcţie derivabilă într-un
punct
0
x , care are derivata nulă în punctul
0
x , nu are în punctul
0
x în mod necesar
un extremum.
Pentru o funcţie R I f → : , 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 ( ) b a c , ∈ , astfel încât 0 ) ( = ′ c f , 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
0
x , în
care funcţia este continuă, avem :
• un punct de minim, dacă derivata la stânga punctului
0
x este negativă,
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 234
iar la dreapta lui
0
x este pozitivă;
• un punct de maxim, dacă derivata la stânga punctului
0
x este pozitivă,
iar la dreapta lui
0
x este negativă;
• nu este punct de extremum dacă derivata are acelaşi semn la stânga şi la
dreapta punctului
0
x .

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 I x ∈
0
, astfel încât,
( ) ( ) ( ) ( ) 0 , 0 , , 0 , 0
0
) (
0
) 1 (
0 0
≠ = = ′ ′ = ′

x f x f x f x f
n n
L ,
atunci
0
x este :
• punct de maxim dacă n=2m şi ( ) 0
0
) (
< x f
n
;
• punct de minim dacă n=2m şi ( ) 0
0
) (
> x f
n
;
• punct de inflexiune doar dacă n=2m+1 şi ( ) 0
0
) (
< x f
n
.

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,
( ) 5 2
2 3
− ⋅ − + = x x x x f
î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
R I x x x f → : , , ,
2 1
L , cu
p
R I ⊂ interval,
spunem că :
• punctul ( ) I a a a
p
∈ , , ,
2 1
L este un punct de minim local al funcţiei,
( )
p
x x x f , , ,
2 1
L , dacă există o vecinătate V a lui ( )
p
a a a , , ,
2 1
L , astfel
încât, pentru orice ( ) I V x x x
p
I L ∈ , , ,
2 1
, să fie adevărată relaţia
( ) ( )
p p
a a a f x x x f , , , , , ,
2 1 2 1
L L ≥ ;
• punctul ( ) I a a a
p
∈ , , ,
2 1
L este un punct de maxim local al funcţiei,
( )
p
x x x f , , ,
2 1
L , dacă există o vecinătate V a lui ( )
p
a a a , , ,
2 1
L , astfel
încât, pentru orice ( ) I V x x x
p
I L ∈ , , ,
2 1
, să fie adevărată relaţia
( ) ( )
p p
a a a f x x x f , , , , , ,
2 1 2 1
L L ≤ .

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 ( )
p
x x x f , , ,
2 1
L , definită pe
p
R I ⊂ , care are în punctul
( )
p
a a a , , ,
2 1
L un extremum şi derivate parţiale, atunci în acest punct derivatele
parţiale se anulează,
( ) ( ) ( ) 0 , , , , , 0 , , , , 0 , , ,
2 1 2 1 2 1
2 1
= ′ = ′ = ′
p x p x p x
a a a f a a a f a a a f
p
L L L L .
Soluţiile sistemului,
0 , , 0 , 0
2 1
=


=


=


p
x
f
x
f
x
f
L ,
formează mulţimea punctelor staţionare ale funcţiei ( )
p
x x x f , , ,
2 1
L .
Se observă că, pe mulţimea punctelor staţionare diferenţiala de ordinul întâi
se anulează, ( ) 0 , , , d
2 1
=
p
x x x f 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
( )
p
x x x f , , ,
2 1
L se găsesc printre punctele staţionare ale ei.
Pentru o funcţie ( )
p
x x x f , , ,
2 1
L , definită pe
p
R I ⊂ , derivabilă parţial de
trei ori pe I şi punctul ( )
p
a a a , , ,
2 1
L o soluţie a sistemului
0 , , 0 , 0
2 1
=


=


=


p
x
f
x
f
x
f
L ,
dacă pentru orice
( )
j i
p
ij
x x
a a a f
A
∂ ∂

=
, , ,
2 1
2
L
numerele:

11 1
A = ∆ ,
22 21
12 11
2
A A
A A
= ∆ , ... ,
pp p p
p
p
p
A A A
A A A
A A A
2 1
2 22 21
1 12 11
L L L L
L
L
= ∆ , sunt pozitive
atunci funcţia ( )
p
x x x f , , ,
2 1
L are în punctul ( )
p
a a a , , ,
2 1
L un minim;

11
1
*
A − = ∆ ,
22 21
12 11
2
*
A A
A A
= ∆ , ... , ( )
pp p p
p
p
p
A A A
A A A
A A A
2 1
2 22 21
1 12 11
*
1
L L L L
L
L
− = ∆ , sunt
pozitive, atunci funcţia ( )
p
x x x f , , ,
2 1
L are în punctul ( )
p
a a a , , ,
2 1
L un
maxim.

Pentru determinarea minimului unei funcţii de mai multe variabile în
vecinătatea unui vector de start,
0
x , î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
2
2
1 2 2 1
1 100 , x x x x x f − + − ⋅ =
care are minimul 0, în punctul (1,1). Punctul tradiţional de plecare pentru căutarea
soluţiei, x
0
, 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, a
2
], 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 x
0,
funcţia este f(x
0
)=0, atunci
semnul funcţiei pentru un x<x
0
diferă de semnul funcţiei pentru x<x
0
, funcţia
schimbând semnul.
Ca o regulă generală, se consideră o valoare oarecare x
0
şi se caută zeroul cel
mai apropiat de această valoare, considerând un interval ce include punctul x
0
ş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ă, x
0

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 x
0
=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 ) ( = X F , 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
T
F.

Pentru exemplificare, se consideră sistemul de ecuaţii:
2
1
2 1
2 1
2
2
x
x
e x x
e x x


= + −
= −

care, pentru rezolvare în Matlab ,la o soluţie iniţială x0=[-5 -5], se scrie
0 2
0 2
2
1
2 1
2 1
= − + −
= − −


x
x
e x x
e x x

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

1
2
1
1
2 1
1
1
1
) (
+ −

+
=
− +
+ ⋅ + ⋅ + + ⋅ + + ⋅ + ⋅ = ⋅ =

n n n
k
k
n n
n
i
i n
i
A x A x A x A x A x A x A x P L L
unde x este variabila, reală sau complexă, iar A
i,
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,
i x x x x p ⋅ + + ⋅ + ⋅ + ⋅ + ⋅ = 2 6 5 4 3 2
2 3 4
1

este dată de vectorul,
p1=[2 3 4 5 6+2i ].

Se numeşte funcţie raţională un cât de două polinoame,
( )
1
2
1
1
2 1
1
2
1
1
2 1
) (
) (
+ −

+ −

+ ⋅ + ⋅ + + ⋅ + + ⋅ + ⋅
+ ⋅ + ⋅ + + ⋅ + + ⋅ + ⋅
= =
p p p
k
k
p p
n n n
k
k
n n
B x B x B x B x B x B
A x A x A x A x A x A
x Q
x P
x R
L L
L L

Î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,
( ) ( ) ( ) ( ) p l x b x a x B x Q = + + + − ⋅ ⋅ − ⋅ − ⋅ = λ β α
λ β α
L L ;
1

şi atunci funcţia R(x),
( )
( ) ( ) ( )
λ β α
l x b x a x B
A x A x A
x Q
x P
x R
n
n n
− ⋅ ⋅ − ⋅ − ⋅
+ + ⋅ + ⋅
= =
+

L
L
1
1
1
2 1
) (
) (
,
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,
( ) 1 4 3 2
2 3 4
1
+ ⋅ + ⋅ + ⋅ = x x x x p , ( ) x x x x p ⋅ + ⋅ + ⋅ = 2 3 2
2 3
2
,
polinomul sumă este,
( ) ( ) ( ) 1 2 7 5 2
2 3 4
2 1
+ ⋅ + ⋅ + ⋅ + ⋅ = + = x x x x x p x p x p
s
,
iar polinomul diferenţă este,
( ) ( ) ( ) 1 2 2
2 3 4
2 1
+ ⋅ − + + ⋅ = − = x x x x x p x p x p
d
.
Î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 P
k
, adică:
( )
∑ ∑
+
=
− +
+
=
− +
⋅ ⋅ = ⋅ ⋅ =
1
1
1
1
1
1
) (
n
i
i n
i
n
i
i n
i k
x A k x A k x P
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
k
1
= ş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
1 1
= =
r
k , 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, ( ) x u , ( ) x v 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 ( ) ( ) ( j k v j u k w
j
− + =


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 ( ) x p
m
,
( ) ( ) ( ) x x x x x x x x p x p x p
m
⋅ + ⋅ + ⋅ + ⋅ + ⋅ + ⋅ + ⋅ = ⋅ = 2 3 10 18 21 12 4
2 3 4 5 6 7
2 1


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,
v r r q v u 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 1 3 2 ) (
2 3
+ ⋅ + + ⋅ = x x x x f , 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 ( )
2 1
/ ˆ µ µ − = x x î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 ( ) 1 2 3
2
+ + = x x x p , î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 1 29 72 29
2 3 4
+ − + − x x x x
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 ) ( ≠ x P , 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:
1 1
...
+
+ + +
n n
n
c s c s c .
De exemplu, polinomul:
27 72 6
2 3
− ⋅ − ⋅ − s s s
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, ( ) A I s − ⋅ 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
1 1
...
+
+ + +
n n
n
c s c s c .
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,
5 3 4 2 ) (
2 3 4
+ ⋅ + ⋅ − ⋅ + = x x x x x P .
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ă R a z < − < ε , 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 ( )

Γ
z z f 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 a f , adică ( )

Γ

= z z f
i
a f 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
1
cu , ) (
1
k
a
f
i
c a z c z f
k
k
k
k
k
ζ
ζ
ς
π
.
Dacă k=-1, rezultă
1
) ( rez

= c a f , unde c
-1
este coeficientul lui
a z −
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 ( ) ( ) ( ) z f a z z
p
⋅ − = ϕ 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
1
d
2
1
) ( rez
a z
1 - p
a z
1
p z f a z
a z
z
i
p z f
p
a
p
z
a z
z
i
a f
p
p p
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
) (
) (
) (
z h
z g
z f = .
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
( )
( )
1
2
3
1
2 1
1
2
3
1
2 1
+
− −
+
− −
+ + + +
+ + + +
=
n
n n n
m
m m m
a z a z a z a
b z b z b z b
z a
z b
L
L
, unde b
j


şi a
j

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

( )
( )
( ) z k
p z
r
p z
r
p z
r
z a
z b
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
m j
j
j
j
j
p z
r
p z
r
p z
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:

( )
( ) 3 8 4
7 2 3 5
3
2 3
+ + −
+ − +
=
z z
z z z
z a
z b
.
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 . 0 00 . 2
75 . 1 50 . 0 75 . 0 25 . 1
) (
) (
3
2 3
− ⋅ −
− ⋅ + ⋅ − ⋅ −
=
z z
z z z
z a
z b
.
11.5.1. Utilitare pentru funcţii de transfer
Modelul de stare liniar, sub formă vectorială, a unui sistem dinamic este:

¹
´
¦
⋅ + ⋅ =
⋅ + ⋅ =
) ( ) (
) ( ) (
t u D x C t y
t u B x A t x&

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,

¹
´
¦
⋅ + ⋅ =
⋅ + ⋅ =
u D x C y
u B x A x&

în funcţia de transfer H,
( ) ( )
( ) A I s
A I s C B A I s
D B A I s C
s D
s N
s H
− ⋅
− ⋅ − ⋅ + − ⋅
= + ⋅ − ⋅ = =

det
det det
) (
) (
) (
) (
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
p s p s p s
z s z s z s
k
s p
s z
s H
− − −
− − −
= =
L
L
2 1
2 1
) (
) (
) (
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,
m m
m
n n
n
a s a s a
b s b s b
s a
s b
s H
+ ⋅ + + ⋅
+ ⋅ + + ⋅
= =
− −

− −

1
1
1
1
1
1
) (
) (
) (
L
L

în forma,
( )( ) ( )
( )( ) ( )
n
n
p s p s p s
z s z s z s
k
s p
s z
s H
− − −
− − −
= =
L
L
2 1
2 1
) (
) (
) (
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 x
0
, dacă
limita,
( )
( ) x f
x x
x f x f
x x
'
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
) ( ) ( x B x A ⋅ , astfel ca ( ) ) ( ) ( ) ( ) ( ) ( ) ( ) (
'
x B x A x B x A x B x A x D ′ ⋅ + ⋅ ′ = ⋅ = ;
• [M, N] = polyder (A, B), returnează în vectorii M şi N, coeficienţii
numărătorului şi numitorului derivatei raportului polinoamelor
) (
) (
x B
x A
,
respectiv,
2
' '
)) ( (
) ( ) ( ) ( ) (
) (
) (
) (
) (
x B
x B x A x B x A
x B
x A
x N
x M ⋅ − ⋅
=
|
|
¹
|

\
|
= .

Pentru calculul derivatei polinomului P(x)=x
3
+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 ( ) ( ) x x x x ⋅ + ⋅ + ⋅ + ⋅ 2 9 6 3
2 2
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 18 42 36 12
2 3
+ + + x x x .

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 x
min
şi x
max
.
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 x
min
şi x
max
), iar cele pentru y trebuie să se afle între prima şi ultima valoare
din prima linie (între y
min
şi y
max
).
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, R I ∈ şi
p
x x x x < < < < L
2 1 0
puncte aparţinând lui
I, se poate defini o funcţie teoretică R I f → : , ale cărei valori
i
y , sunt cunoscute
numai în nodurile
i
x , p i x f y
i i
≤ ≤ = 0 ), ( .
Orice funcţie R I F → : astfel încât, ( ) p i y x F
i i
≤ ≤ = 0 , , se numeşte
funcţie de interpolare a lui f, sau echivalent, funcţie de interpolare asociată tabelei
de p+1 valori,

0
x
1
x
2
x ...
p
x
0
y
1
y
2
y ...
p
y

Evident că o astfel de funcţie nu este unică, iar graficul ei trece prin punctele
( ) p i y x
i i
≤ ≤ 0 , , . De exemplu, în cazul interpolării liniare, graficul lui F este linia
poligonală cu vârfurile ( ) p i y x
i i
≤ ≤ 0 , , .
O altă funcţie de interpolare asociată tabelei anterioare este polinomul lui
Lagrange de interpolare, care este un polinom P, de p P ≤ grad , cu coeficienţi
reali, astfel încât ( ) p i y x P
i i
≤ ≤ = 0 , şi ( ) ) (x P x f ≅ pentru orice I x ∈ .
Se demonstrează uşor că polinomul Lagrange de interpolare, asociat unei
tabele de valori, există şi este unic. Pentru orice j, p j ≤ ≤ 0 , notând
cu
j
L polinomul
( )
( ) ( )( ) ( )
( ) ( )( ) ( )
n j j j j j j
n j j
j
x x x x x x x x
x x x x x x x x
x L
− − − −
− − − −
=
+ −
+ −
L L
L L
1 1 0
1 1 0
,
atunci polinomul Lagrange ( ) x P , asociat tabelei de interpolare este
( ) ( )

=
⋅ =
p
j
j j
x L y x P
0
.
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 256
Un avantaj al reprezentării prin polinoamele Lagrange o constituie faptul că
polinoamele
j
L depind numai de alegerea nodurilor de interpolare, dar la adăugarea
unor noi noduri, calculul lui
j
L trebuie refăcut, ceea ce este un defect.
Polinomul
j
L depinde de x, ca şi polinomul ( ) x P , ş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
3 2 1 0
− = = = = = y y y y p şi
( )
( )( )( )
( )( )( )
( )( )( )
( )( )( ) 8
8 14 7
4 2 1
4 2 1
2 3
3 0 2 0 1 0
3 2 1
0
− ⋅ + ⋅ −
− =
− − −
− − −
=
− − −
− − −
=
x x x x x x
x x x x x x
x x x x x x
x L ,
( )
( )( )( )
( )( )( )
( )( )
3
4 2
3 1 2 1 0 1
3 2 0
1
− −
=
− − −
− − −
=
x x x
x x x x x x
x x x x x x
x L ,
( )
( )( )
4
4 1
2
− −
− =
x x x
x L , ( )
( )( )
24
2 1
3
− −
=
x x x
x L .
Cu acestea, polinomul de interpolare este
( ) ( ) ( ) 4 8 5
4
1
) ( 3 ) (
2 3
3 0
0
− + − = − = ⋅ =

=
x x X x L x L x L y x P
p
j
j j
.
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ă [ ] b a I , = este un interval şi b x x x a
n
= < < < = ∆
+1 1 0
: L
este o diviziune cu n noduri interioare, o funcţie R I s → : se numeşte „spline” de
ordinul k ( 1 ≥ k ), relativ la ∆ , dacă funcţia s este de clasă ) (
1
I C
k −
şi în orice
interval [ ]
1
,
+ i i
x x , cu n i ≤ ≤ 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
x x
f
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
b x x x a
n
= < < < =
+1 1 0
L , este un spaţiu vectorial real de dimensiune 1 + + k n ,
pentru determinarea unei funcţii spline se impun 1 + + k n condiţii.
Aplicând acest fapt, rezultă că, dacă R I f → : este o funcţie de clasă
) (
1
I C
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:
( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( ) ( )
¦
¹
¦
´
¦
= ′ = ′ =
= ′ = ′ =
= =
− −
− −
b f b s b f b s b f b s
a f a s a f a s a f a s
x f x s x f x s
k k
k k
n n
) 1 ( ) 1 (
) 1 ( ) 1 (
1 1
, , ,
, , ,
, ,
L
L
L
.
Aproximarea ( ) ( ) x s x f ≅ pentru orice I x ∈ 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ă b x x x a
n
= < < < = ∆
+1 1 0
: 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 x
k
≤ x ≤ x
k+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(x
j
)=y
j
, şi prima derivată P’(x) este
continuă, derivata a doua P”(x) este probabil necontinuă, putând sări la
x
j
;
• pantele pentru x
j
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 x
j
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
2
cos
k
y
π
ş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
2 2
y x
e x z
− −
⋅ = , 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
i
c i d i
x x x
1
2
, ,
min ϕ
unde
d i
x
,
, sunt valorile date (cunoscute), iar
c i
x
,
sunt valorile calculate.
Regresia polinomială este o aproximare a unui set de date printr-un polinom
de forma:


=

− −
+ + + + = =
n
i
n n
n n i n
a x a x a x a x a x p
0
1
1
1 0
... , ) (
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,
( )
1
1
2 1
...
+

+ + + + =
n n
n n
p x p x p x p x p
• [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
ˆ
µ
µ −
=
x
x ,
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 . 0 1064 . 1 1471 . 0 7435 . 0 4217 . 0 0983 . 0 0084 . 0 ) (
2 3 4 5 6
+ + + − + − = x x x x x x x f
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,

j n
i j i
x v

=
,

apoi foloseşte operatorul ‘ \ ‘ pentru a rezolva ecuaţia V
p
≅ 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 P
x,
din setul
P, se poate trasa o frontieră, care să cuprindă toate punctele intermediare care se
gasesc mai aproape de P
x
,

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 ) (x y 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,
( ) 0 h ; ,..., 2 , , > ⋅ + ⋅ + + = h m x h x h x x ρ
pe care o vom numi reţea unidimensională. Punctele h m x h x h x x ⋅ + ⋅ + + ,..., 2 , ,
se numesc noduri, iar h pasul reţelei.
Vom presupune că mulţimea ρ este inclusă în mulţimea pe care ) (x y este
definită şi notăm cu

h m x h x h x x
y y y y
⋅ + ⋅ + +
,..., , ,
2

valorile funcţiei în nodurile h m x h x h x x ⋅ + ⋅ + + ,..., 2 , ,

Prin definiţie,
x h x
y y −
+
se notează
x h x x
y y y x y − = ∆ = ∆
+
) (
şi se numeşte diferenţa finită de ordinul întâi a funcţiei ) (x y în punctul x sau,
pe scurt, diferenţa funcţiei ) (x y .
Diferenţa diferenţelor de ordinul întâi,
x h x x
y y y x y ∆ − ∆ = ∆ = ∆
+
2 2
) ( ,
se numeşte diferenţa de ordinul al doilea şi, în general, diferenţa deferenţelor de
ordinul n-1,
x
n
h x
n
x
n n
y y y x y
1 1
) (

+

∆ − ∆ = ∆ = ∆ ; m n ≤ ,
se numeşte diferenţa de ordinul n a funcţiei ) (x y , î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 h x + , iar pentru calculul diferenţei de ordinul al doilea este
necesar să cunoaştem valorile funcţiei în punctele x, h x + , h x ⋅ + 2 , etc.
Dacă funcţia ) (x y este definită în toate punctele h n x ⋅ + , unde n=0, 1, 2, …,
atunci ) (x y admite diferenţe de orice ordin.
Diferenţa de ordinul n a funcţiei ) (x y , în punctul x, este dată de egalitatea,
( )
( )
( )
( )
x
n
h p n x
p
n
p
h n x n h n x
n
y y C y C y x y 1 ... 1 ... ) (
1
1
− + + − + + − = ∆
− + − + ⋅ +

unde
( )! !
!
p n p
n
C
p
n

= sunt coeficienţii binomiali.
Pe baza relaţiei de mai sus se poate calcula diferenţa de ordinul n a funcţiei
) (x y
,
în punctul x, dacă se cunosc valorile funcţiei în punctele x, h x + , h x ⋅ + 2 ,
..., h n x ⋅ + şi reciproc, dacă se cunoaşte valoarea funcţiei ) (x y , în punctul x şi
diferenţele sale, până la ordinul n, în acest punct, se poate calcula valoarea funcţiei
în punctul h n x ⋅ + .
Între valorile funcţiei ) (x y , în punctele x şi h n x ⋅ + , există relaţia,
x
n
x
p p
n x n x h n x
y y C y C y y ∆ + + ∆ + + ∆ + =
⋅ +
... ...
1
.
Dată fiind, pentru funcţia ) (x y , o reţea
( ) 0 h ; ,..., 2 , , > ⋅ + ⋅ + + = h m a h a h a a r
cu schimbarea de variabilă X h x ⋅ = , se obţine o nouă funcţie, ( ) X h y X Y ⋅ = ) ( , cu
proprietatea că în nodurile reţelei, ( )
h
a
b m b b b b rr = + + + = ; ,..., 2 , 1 , ia aceleaşi
valori ca ) (x y , în nodurile reţelei r,
h n a n b
y Y
⋅ + +
= , şi din acest motiv se preferă
reţele cu pasul 1 = h . În acest caz,
( )
( )
( )
( )
x
n
p n x
p
n
p
n x n n x
n
y y C y C y x y 1 ... 1 ... ) (
1
1
− + + − + + − = ∆
− + − + +
,
( )
x
n
n x x
n
x
p p
n x n x n x
y y y y C y C y y ∆ + = ⇔ ∆ + + ∆ + + ∆ + =
+ +
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 = − = ∆
+ x h x x
ω ω ω ,
• pentru două funcţii, ) (x y şi ) (x z , 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:

x x x x
z y z y ∆ + ∆ = + ∆ ) ( ,

x x x x
y y ∆ ⋅ = ⋅ ∆ ω ω ) ( ,

x x x x x x x x
z y y z z y z y ∆ ⋅ ∆ + ∆ ⋅ + ∆ ⋅ = ⋅ ∆ ) ( ,
Derivarea şi diferenţierea numerică a funcţiilor 281

( )
1 +

∆ ⋅ − ∆ ⋅
=
∆ + ⋅
∆ ⋅ − ∆ ⋅
=
|
|
¹
|

\
|

x x
x x x x
x x x
x x x x
x
x
z z
z y y z
z z z
z y y z
z
y
.

Diferenţele pentru câteva funcţii uzuale sunt:
• diferenţa de ordinul întâi a funcţiei
n
x x y = ) ( , respectiv puterile
naturale ale variabilei x, este

=

⋅ = − + = ∆
n
k
k n k
n
n n n
x C x x x
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, n k ≤ , 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 (
+ − − ⋅ + ⋅
= + − − ⋅ + ⋅ = ∆

n x x x x
F n x x x n x F
n n
sunt:
( ) ( ) ); ( ); (
1 1
x F n x F x F n x F
n n n n − − −
⋅ − = ∆ ⋅ = ∆
• diferenţele de diverse ordine ale funcţiei 1 a , ≠
x
a se obţin imediat,
( ) ( ) ( ) 1 , ... , 1 , 1
2 2 1 x n x n x x x x x x
a a a a a a a a a a a ⋅ − = ∆ ⋅ − = ∆ ⋅ − = − = ∆
+
şi pentru o funcţie ( ) x ϕ avem,
( ) ( ) ( ) ( ) ( ) ( )

1 x x x x x x
a a a a a
ϕ ϕ ϕ ϕ ϕ ϕ
− = − = ∆
∆ + +

• 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
( )
( )
( )
( )
(
¸
(

¸

+ ⋅

= ∆
2
cos
2
sin 2 sin
x
x
x
x
ϕ
ϕ
ϕ
ϕ ,
( )
( )
( )
( )
(
¸
(

¸

+ ⋅

− = ∆
2
sin
2
sin 2 cos
x
x
x
x
ϕ
ϕ
ϕ
ϕ ,
( )
( )
( )
( )
(
¸
(

¸

+ ⋅

= ∆
2
ch
2
sh 2 sh
x
x
x
x
ϕ
ϕ
ϕ
ϕ ,
( )
( )
( )
( )
(
¸
(

¸

+ ⋅

= ∆
2
sh
2
sh 2 ch
x
x
x
x
ϕ
ϕ
ϕ
ϕ ,
care, pentru ( ) β α ϕ + ⋅ = x x , devin
( )
(
¸
(

¸

+ |
¹
|

\
|
+ ⋅ = + ⋅ ∆ β α
α
β α
2
1
cos
2
sin 2 sin x x ,
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 282
( )
(
¸
(

¸

+ |
¹
|

\
|
+ ⋅ − = + ⋅ ∆ β α
α
β α
2
1
cos
2
sin 2 cos x x ,
( )
(
¸
(

¸

+ |
¹
|

\
|
+ ⋅ = + ⋅ ∆ β α
α
β α
2
1
ch
2
sh 2 sh x x ,
( )
(
¸
(

¸

+ |
¹
|

\
|
+ ⋅ = + ⋅ ∆ β α
α
β α
2
1
sh
2
sh 2 ch x x .

Considerăm o funcţie reală de două variabile, ( ) y x z , , 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
ℜ ∈
ij
M ,
denumite nodurile reţelei, având coordonatele de forma,
( ) n j m i k j y h i x M
ij
, ... , 2 , 1 , 0 ; , ... , 2 , 1 , 0 ; , = = ⋅ + ⋅ + .
Dacă k h ≠ , reţeaua se numeşte dreptunghiulară. Printr-o transformare
analogă celei din cazul reţelei unidimensionale, Y k y X h x ⋅ = ⋅ = , , se obţine o
reţea pătratică având pasul h.
Dacă k h = 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 ( ) y x z , .
Notăm
1 , + + y i x
z , valoarea funcţiei ( ) y x z , , în nodul
ij
M .
Diferenţele finite parţiale de ordinul întâi (pe scurt, diferenţe finite) ale
funcţiei ( ) y x z , , în punctul ( ) y x, sunt:
• în raport cu x:
y x x y x x
z z z
, 1 , − +
= ∆ ,
• în raport cu y: z z z
y x y x y
− = ∆
+1 , ,
.

Diferenţele parţiale de ordinul al doilea ale funcţiei ( ) y x z , , în punctul ( ) y x, ,
se definesc prin egalitaţile :
( )
y x y x y x y x x x y x
x
z z z z z
, , 1 , 2 , ,
2
2
2
+ ⋅ − = ∆ ∆ = ∆
+ +
,
( )
y x y x y x y x x x y x
y
z x z z z
, 1 , 2 , , ,
2
2
2
+ ⋅ − = ∆ ∆ = ∆
+ +

( )
y x y x y x y x x x y x xy
z x z z z z
, , 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
( ) x f , este raportul dintre variaţia funcţiei şi variaţia lui x,
( ) ( ) ( )
0 0
'
0
) 0
0
'
) (
( ) (
lim
0
x Df x f
dx
x df
x x
x f x f
x f
x
x x
= = =


=

,
cu menţiunea că derivata într-un punct este un număr.
Totodată, derivata funcţiei ( ) x f , I x ∈ , într-un punct I x ∈
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 ( ) ) ( ,
0 0
x f x , 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 ( ) x f şi ( ) x g sunt derivabile, atunci funcţia ( ) ) (x g x f ⋅ este
derivabilă şi ( ) ) ( ' ) ( ) ( ) ( ' )] ( [
0 0 0 0
'
0
x g x f x g x f x g x f x x ⋅ + ⋅ = ⋅ = , iar
( )
) (
) ( ) ( ' ) ( ) ( '
) (
0
2
0 0 0 0
'
0
x g
x f x g x g x f
x g
x f
x x
⋅ − ⋅
=
(
¸
(

¸

= ;
• derivata funcţiei compuse ( ) ( ) ( ) x u f x F = este ( ) ( ) ( ) ) (
0
'
0
'
0
'
x u x u f x F ⋅ = ;
• derivata funcţiei inverse este
) (
1
) (
0
'
0
1
'
x f
y f =

şi 1 ) ( ) (
0
'
0
1
'
= ⋅

x f y f ;
• derivatele funcţiilor trigonometrice sunt: ( ) x x sin cos
'
− = , ( ) x x cos sin
'
= ,
( )
x
x
2
'
cos
1
tg = , ( )
x
x
2
'
sin
1
ctg

= ;
• derivata funcţiei logaritmice este ( )
a x
x x x
a
ln
1 1
log
0
'
0
⋅ = = ;
• derivata funcţiei exponenţiale este ( ) a a a
x x
ln
'
⋅ = ;
• derivatele funcţiilor hiperbolice sunt ( ) x
e e
x
x x
ch
2
sh
'
=

=

,
( ) x
e e
x
x x
sh
2
ch
'
=
+
=

, ( )
x e
e
x
x
x
2 2
2
'
ch
1
1
1
th =
+

= , ( )
x e
e
x
x
x
2 2
2
'
sh
1
1
1
cth − =

+
= ;
• derivatele funcţiilor circulare inverse sunt ( )
2
'
1
1
arcsin
x
x

= ,
( )
2
'
1
1
arccos
x
x


= , ( )
2
'
1
1
arctg
x
x
+
= , ( )
2
'
1
1
arcctg
x
x
+

= ;
• derivatele funcţiilor hiperbolice inverse sunt ( )
2
'
1
1
argsh
x
x
+
= ,
( )
2
'
1
1
argth
x
x

= , 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
x dA ) (
,
iar
( )
dx
x dB
dx
x dA
dx
x B x A d ) ( ) ( ) ( ) (
+ =
+
,
Derivarea şi diferenţierea numerică a funcţiilor 285
( )
) (
) (
) (
) ( ) ( ) (
x A
dx
x dB
x B
dx
x dA
dx
x B x A d
× + × =
×
, ) (
) (
) (
) (
1
1
x A
dx
x dA
x A
dx
x dA
× × − =


.

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 ( ) x f
'
într-un punct,
k
x
,
se poate face:
• cu diferenţe regresive sau diferenţă înapoi, ( )
1
) 1 '
( ) (




=
k k
k k
x x
x f x f
x f ;
• cu diferenţe progresive sau diferenţă înainte, ( )
k k
k k
x x
x f x f
x f


=
+
+
1
) 1 '
( ) (
;
• cu diferenţe centrale sau diferenţă centrală, ( )
1 1
) 1 1 '
( ) (
− +
− +


=
k k
k k
x x
x f x f
x f .

Pentru exemplificare, se calculează derivata funcţiei:
400 5 25 12 3
2 3 4 5
+ ⋅ + ⋅ + ⋅ − ⋅ − = x x x x x y
pe intervalul [-4, 4], utilizând aproximarea cu diferenţe finite şi calculul matematic.
Funcţia derivată matematic este
5 50 36 12 5
2 3 4 '
+ ⋅ + ⋅ − ⋅ − ⋅ = x x x x y .
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
5 3
2
1
2 1 n n n
n
i
n
n n n
h
x f
care calculează derivata printr-o formulă în patru puncte, şi în care:
i i
x x h − =
+1
- pasul de divizare,
) ( ) (
1 i i i
x f x f y − = ∆
+
- deferenţele de ordinul 1,
i i i
y y y ∆ − ∆ = ∆
+1
2
- diferenţele de ordinul 2,
i i i
y y y
2
1
2 3
∆ − ∆ = ∆
+
- diferenţele de ordinul 3 ;
i i i
y y y
3
1
3 4
∆ − ∆ = ∆
+
- 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 :
( )
(
¸
(

¸

∆ ⋅ − ∆ ⋅ + ∆ ⋅ − ∆ ⋅ =
i i i i i
y y y y
h
x f
4 3 2 '
4
1
3
1
2
1 1

( )
(
¸
(

¸

∆ ⋅ + ∆ − ∆ ⋅ =
i i i i
y y y
h
x f
4 3 2
2
' '
24
11 1
.
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
U
k
y
U
j
x
U
i U


⋅ +


⋅ +


⋅ =
r r r
grad ,
în care U(x,y,z) este o funcţie reală, definită pe
3
R X ∈ şi derivabilă pe X. Vectorul
( )
0 0 0
, , grad z y x U , este normal la suprafaţa de nivel, în punctul ( )
0 0 0
, , z y x U .
Dacă se introduce operatorul
z
k
y
j
x
i


⋅ +


⋅ +


⋅ = ∇
r r r
, numit operatorul
nabla sau operatorul Hamilton, atunci se poate scrie : U U ∇ = 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
r n r
n
n

− ∆ +
=
→ ∆
r r r
ϕ ϕ
ϕ
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,
x F ∂ ∂ / , 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 x F ∂ ∂ / , derivata parţială pe direcţia lui x (pe coloană), FY corespunde lui
y F ∂ ∂ / , 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:
2 2
) , (
y x
xe y x z
− −
= , î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ă
) , , ( ) , , ( ) , , ( ) , , ( z y x R k z y x Q j z y x P i z y x V ⋅ + ⋅ + ⋅ =
r r r r
,
definită pe
3
R X ∈ , cu valori scalare în
3
R , derivabilă parţial pe X, se poate defini
divergenţa funcţiei ) , , ( z y x V
r
sau divergenţa câmpului vectorial V
r
şi se notează
V
r
div ,funcţia scalară,
V
z
R
y
Q
x
P
V
r r
⋅ ∇ =


+


+


= div .
Se numeşte rotorul funcţiei vectoriale V
r
sau rotorul câmpului vectorial V
r
şi
se notează V
r
rot funcţia vectorială
Derivarea şi diferenţierea numerică a funcţiilor 289

|
|
¹
|

\
|





⋅ + |
¹
|

\
|





⋅ +
|
|
¹
|

\
|





⋅ =
y
P
x
Q
k
x
R
z
P
j
z
Q
y
R
i V
r r r r
rot .

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
A V
V
V
A
V
d
1
lim div
0


=
∫ → ∆
r r
,
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
( ) l V
A
V
L
A
d
1
lim rot
0
n


=
∫ → ∆
r r
,
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 V
r
rot , este o funcţie identic nulă pe domeniul de
definiţie, dacă P, Q, R au derivate de ordinul doi continue, 0 rot div = V
r
.
Divergenţa câmpului , U grad nu mai este nulă,
U U
z
U
y
U
x
U
z
U
k
y
U
j
x
U
i ∆ = ∇ ⋅ ∇ =


+


+


=
|
|
¹
|

\
|


⋅ +


⋅ +



2
2
2
2
2
2
div
r r r
,
unde operatorul ∆ , definit ca:

2
2
2
2
2
2
z y x ∂

+


+


= ∇ ⋅ ∇ = ∆
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 ) , ( y x u , 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
2 2
4
1
4 dy
u d
dx
u d u
l
unde:
( )
i j i j i j i j i ij
u u u u u l − + + + =
− + − + 1 , 1 , , 1 , 1
4
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 ,...) , , ( z y x u , del2(U) este:
|
|
¹
|

\
|
+ + + =

= ...
2
1
2
2
2
2
2
2
2 2
dz
u d
dy
u d
dx
u d
N N
u
l
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
lui
N
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 ) , ( y x u , 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
= ∂
2
u/∂x
2
+ ∂
2
u/∂y
2
.
Pentru exemplificare, se consideră funcţia
2 2
) , ( y x y x u + = , 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 ) (x f y = , în intervalul de integrare [a, b], cu o curbă mai simplă
) (x g y = , deci :

) d ) ( d ) (
b
a
b
a
∫ ∫
≅ x x g x x f

unde curba ) (x g y = , 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
j j
h w x f x x f ) ( d ) (
b
a

unde
j
w , 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, ) (x f y = , pe intervalul de integrat [a, b], se pot lua
subintervale egale,
n
a b
x x
k k

= −
+1
, astfel încât
b x x x x x x x a
n n k k
< < < < < < < < < <
− + 1 1 2 1 0
... ...

iar metoda dreptunghiurilor constă în a aproxima integrala definită

=
b
a
d ) ( x x f I ,
cu o sumă Riemann.
Aproximarea se poate face prin două formule :
Integrarea numerică a funcţiilor 293
[ ] ) ( ... ) ( ) ( ) (
1 2 1 1 −
+ + + + ⋅


n
x f x f x f a f
n
a b
I ,
[ ] ) ( ) ( ... ) ( (
1 2 1 2
b f x f x f x f
n
a b
I
n
+ + + + ⋅



,
astfel că, dacă funcţia este crescătoare pe interval, atunci I
1
aproximează prin lipsă,
iar I
2
prin exces.
În metoda dreptunghiurilor, se înlocuieşte arcul ) (x f y = , cu o funcţie în
trepte, iar eroarea de calcul
( )
n
a b
A
2

≤ , cu ) ( ' sup x f A
b x a ≤ ≤
= .
14.1.2. Metoda trapezelor
Metoda trapezelor constă în a aproxima integrala definită

=
b
a
d ) ( x x f I , prin
semisuma valorilor I
1
şi I
2,
calculate anterior,
[ ] ) ( ) ( 2 ... ) ( 2 ) ( 2 ) (
2 2
1 2 1
2 1
b f x f x f x f a f
n
a b I I
I
n tr
+ ⋅ + + ⋅ + ⋅ + ⋅


=
+



care, după prelucrări, se poate scrie :






⋅ + + ⋅





=
1
1
) ( 2 ) ( ) (
2
n
i
i tr
x f b f a f
n
a b
I
În metoda trapezelor, se înlocuieşte arcul de curbă ) (x f y = , cu o coardă, iar
eroarea de calcul
( )
2
3
12 n
a b
B


≤ , cu ) ( sup
' '
x f B
b x a ≤ ≤
= .
14.1.3. Metoda tangentelor
În această metodă, se aproximează pe fiecare subinterval [ ]
1
,
+ k k
x x , arcul de
curbă ) (x f y = , cu tangenta la curbă, luându-se numărul diviziunilor pare (n=2m)
şi se duce tangenta la curbă în punctele de abscisă x
2k+1
, tangentă pe care o
mărginim la dreptele paralele cu axa Oy, duse prin punctele (x
2k
, 0) şi (x
2k+1
, 0),
astfel încât, aria trapezului este dată de ( ) ) ( ) ( ) (
2
1 2 2 2 2 + +


= + ⋅


k k k
x f
m
a b
x f x f
m
a b
.
Însumând pentru toate ariile elementare, obţinem,
( ) ( ) ( ) [ ]
1 2 3 1
b
a
tan
... d ) (

+ + + ⋅

≅ =
∫ m
x f x f x f
m
a b
x x f I
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
tan
I I
I
tr
Sims
+ ⋅
= .
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 294
Formula lui Simpson, luând numărul de diviziuni par, n=2m, este :
( ) ( ) ( ) ( ) ( ) ( ) ( ) [ ] b f x f x f x f x f x f a f
m
a b
I
m m Sims
+ + + + + + + ⋅



− − 1 2 2 2 3 2 1
4 2 ... 4 2 4
6

În metoda lui Simpson se aproximează curba în intervalul [ ]
2 2 2
,
+ k k
x x , printr-
un arc de parabolă C x B x A y + ⋅ + ⋅ =
2
, care trece prin punctele curbei de abscise
x
2k
, x
2k+1
, x
2k+2
, iar eroarea de calcul
( )
4
5
2880 m
a b
C


≤ , cu ) ( sup x f C
IV
b x a ≤ ≤
= .
14.1.5. Aproximarea prin interpolare
Considerăm că intervalul de interpolare [a, b], se poate împărţi în n
subintervale oarecare,
b x x x x x a
n n
= < < < < < =
−1 2 1 0
... ,
în care, funcţia f(x) ia valorile,
) ( ), ( ),... ( ), (
1 1
b f x f x f a f
n−
.
În această metodă, funcţia de integrat f(x), se aproximează cu polinomul L
n
,
de interpolare, al lui Lagrange, care trece prin cele n+1 puncte,
( ) ( ) ( ) ( ) ( ) ( )
n n
x f x x f x x f x , ,..., , , ,
1 1 0 0

a cărui expresie este,
( ) ( ) ( )
n n n
x f X x f X x f X L ⋅ + + ⋅ + ⋅ = ...
1 1 0 0
,
cu
( ) ( ) ( )
( ) ( ) ( )
n k k k
n
k
k
x x x x x x
x x x x x x
x x
X
− ⋅ ⋅ − ⋅ −
− ⋅ ⋅ − ⋅ −


=
K
K
1 0
1 0
1
.
Dacă înlocuim pe f(x) în ,

b
a
d ) ( x x f cu ) (x L
n
, obţinem,
( )
( ) ( ) ( )
( ) ( ) ( )
∫ ∑

− ⋅ ⋅ − ⋅ −

− ⋅ ⋅ − ⋅ −
=
=
b
a
1 0
0
1 0
dx
x x
x x x x x x
x x x x x x
x f
I
k
n
n
k
n k k k
k
K
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:
( ) ( ) t a b x a b t a x d d ⋅ − = ⇒ − ⋅ + = ,
( ) ( ) ( ) a b t a x a b t a x a b t a x
n n
− ⋅ + = − ⋅ + = − ⋅ + = , , ,
1 1 0 0
L .
Prin urmare,
1 0
1 1 0
= < < < < <
− n n
t t t t L ,
şi
( ) ( ) ( ) ( )
k i k i k k
t t a b x x t t a b x x − ⋅ − = − − ⋅ − = − , ,L
astfel încât, integrala I devine ( )
∫ ∑
=
⋅ =
1
0 0
dt t T Y I
k
n
k
k
, unde,
Integrarea numerică a funcţiilor 295
( ) ( )
( ) ( ) ( ) ( ) ( )
n k k k k k k k
k
k
t t t t t t t t t t
x f a b
Y
− ⋅ ⋅ − ⋅ − ⋅ ⋅ − ⋅ −
⋅ −
=
+ −
K K
1 1 1 0
,
( ) ( ) ( ) ( ) ( ) ( )
n k k k
t t t t t t t t t t t T − ⋅ ⋅ − ⋅ − ⋅ ⋅ − ⋅ − =
+ −
K K
1 1 1 0
,
în care ( ) t T
k
, sunt polinoame de gradul n , în t.
Pentru diverse valori ale lui n, s-au calculat integralele ( )

=
1
0
'
dt t T T
k k
şi
coeficienţii
( ) ( ) ( ) ( ) ( )
n k k k k k k k
k
k
t t t t t t t t t t
T
A
− ⋅ ⋅ − ⋅ − ⋅ ⋅ − ⋅ −
=
+ −
K K
1 1 1 0
'
, astfel încât, prin
intermediul acestora, ce se găsesc calculaţi, aproximarea integralei se reduce la
calculul sumei ( ) ( )

=
⋅ ⋅ −
n
k
k k
x f A a b
0
.
14.1.6. Calculul numeric al integralelor pe intervale infinite
În definiţia anterioară a integralei definite

b
a
d ) ( x x f , 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 ) ( x x f ,


b
-
d ) ( x x f ,

+∞
∞ -
d ) ( x x f ,
care se pot reduce cu uşurinţă la cazul


=
a
d ) ( x x f I .
Pentru calculul integralelor de acest tip, presupunem că integrala are sens sau
că este convergentă, dacă

∞ →
A
a
d ) ( lim x x f
A
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 ) ( x x f I , se poate face :
• prin schimbarea variabilei, astfel încât intervalul infinit [ ] +∞ , a , să se
transforme într-un interval finit, de exemplu, [ ] b a, , şi apoi, se evaluează prin
una dintre metodele expuse anterior;
• prin separarea integralei în două integrale,
∫ ∫ ∫
∞ ∞
+ =
b a a
d ) ( d ) ( d ) ( x x f x x f x x f
b
, iar
apoi calculul se poate face:
• neglijând termenul integrală infinită, dacă b este suficient de mare,
astfel încât
∫ ∫
>>
b b
x x f x x f
2
b a
d ) ( d ) ( ;
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 296
• aproximând forma asimptotică a lui f(x) , printr-o funcţie ) ( ) ( x f x g ≅ ,
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
D D
x y x f y S y x f y x y x f II
a 0
d ) , ( d d ) , ( d d ) , (
unde f, este funcţia de integrat, x şi y sunt variabilele de integrare, D este domeniul
de integrare, considerat dreptunghiular, [ ] [ ] b a x 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, h
J
b
I
a
h h
y x
= = = = .
Dacă integrala dublă se calculează prin metoda trapezului, atunci :
( )
∑∑ ∑∑
= =

=

=
+ + + +
⋅ ⋅ = + + + ⋅ ≅
I
i
J
j
j i j i
J
j
I
i
j i j i j i j i
h w f f f f f
h
II
0 0
2
, ,
1
0
1
0
, 1 1 , 1 1 , ,
2
1
4

în care ponderile
j i
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
j
j i j i
J
j
I
i
j i j i j i j i j i j i j i j i j i
h w f
f f f f f f f f f
h
II
0 0
2
, ,
1
1
1
1
, 1 1 , 1 , 1 1 , , 11 1 , 1 1 , 1 1 , 1 1 , 1
2
2
16 4
9

unde ponderile
j i
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ă ) (x f y = , î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
dx x
0
) 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
1
dx
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 , , cos sin ∈ ∈ ⋅ + ⋅ y x y x x y 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: ) ( ) ( t G t F
dt
du
⋅ = ;
• ecuaţia pendulului: ) ( ) sin(
2
2
t F
l
g
dt
d
= θ ⋅ +
θ
;
• ecuaţia van der Pol: ( ) 0 1
2
2
2
= + ⋅ + ⋅ ε + y
dt
dy
y
dt
y d
;
• ecuaţia oscilatorului LRC: ) (
2
2
t E
C
E
dt
dQ
R
dt
Q d
L = + ⋅ + ⋅ ;
• ecuaţia Riccati: 0 ) ( ) ( ) (
2
= + ⋅ + ⋅ + t R y t Q y x P
dt
dy
sau
0 ) ( ) ( ) (
2
= + ⋅ + ⋅ + t R y t Q y x P
dt
dy

în care: t este variabila independentă, iar p Q y u , , , , θ , sunt variabilele dependente.

O ecuaţie diferenţială de ordinul n, este o relaţie de forma,

( )
( ) 0 , , , , = ′
n
y y y x F L ,
în care n se numeşte ordinul ecuaţiei diferenţiale,
( )
( )
n
y y y x F , , , , L ′ este o funcţie
reală definită pe [ ]
1
, ,
+
⊂ ×
n
R Y Y b a , având argumente variabila reală [ ] b a x , ∈ , iar
y este o funcţie reală, având derivate până la gradul n,
( ) n
y y y , , , 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 ( ) x y ϕ = , derivabilă de n ori pe [ ] b a , , se numeşte soluţie pe [ ] b a , ,
dacă verifică ecuaţia,
( ) ( )
( )
( ) ( ) 0 , , , , = ϕ ϕ′ ϕ x x x x F
n
L
Rezolvarea numerică a ecuaţiilor diferenţiale 301
pentru orice [ ] b a x , ∈ .
Funcţia ( )
n
C C C x , , , ,
2 1
L ϕ este soluţia generală a ecuaţiei diferenţiale de ordinul
n,
( )
( ) 0 , , , , = ′
n
y y y x F L , studiată într-un domeniu [ ] y x D , ⊃ , dacă ϕ este o soluţie a
ecuaţiei şi dacă, prin alegerea convenabilă a constantelor
n
C C C , , ,
2 1
L , funcţia
( )
n
C C C x , , , ,
2 1
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 , , , , ,
2 1
=
n
C C C y x R L , care
este denumită, de obicei, integrală generală;
• parametric, printr-un sistem
( )
( )
¹
´
¦
ψ =
ϕ =
n
n
C C C t y
C C C t x
, , , ,
, , , ,
2 1
2 1
L
L
.

Se numeşte soluţie particulară a ecuaţiei diferenţiale
( )
( ) 0 , , , , = ′
n
y y y x F L , o
funcţie ( ) x y
*
ϕ = , [ ] b a x , ∈ şi ( ) D y x ∈ , , care se obţine din soluţia generală, dând
valori particulare constantelor
n
C C C , , ,
2 1
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
y y y x F L , o ecuaţie diferenţială de ordin k n − , care conţine 1 ≥ k
constante arbitrare,
( )
( ) 0 , , , , , , , ,
2 1
= ′ Ψ

k
k n
C C C y y y x L L şi care este verificată de
integrala generală. În particular, dacă 1 = k , obţinem integrala primă, având forma
( )
( ) 0 , , , , ,
1
= ′ Φ

C y y y x
n
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 k n − .
Î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
( ) ( ) ( ) ( ) x a
x
x a
x
x a
x
x a L
n n
n n
n
+ ⋅ + + ⋅ + ⋅ =


d
d
d
d
d
d
1
1
1 - n
1
n
0
L
şi are următoarele proprietăţi :
[ ] [ ] [ ]
2 1 2 1
y L y L y y L
n n n
+ = + ;
[ ] [ ] . , const C y L C y C L
n n
= ⋅ = ⋅
O ecuaţie de forma
( )
( )
( )
( )
( ) ( ) ( ) ) ( ) (
1
1
1 0
x f y L x f y x a y x a y x a y x a
n n n
n n
= ⇔ = ⋅ + ′ ⋅ + + ⋅ + ⋅


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 ) ( 0
1
1
1 0
= ⇔ = ⋅ + ′ ⋅ + + ⋅ + ⋅


y L y x a y x a y x a y x a
n n n
n n
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
y y y x F 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
0
x x = , funcţia y şi
derivatele ei
( ) 1
, , ,


n
y y y L , să ia valori date dinainte
1 1 0
, , ,
− n
a a a L ,
1 0
) 1 (
1 0 0 0
) ( , , ) ( , ) (


= = ′ =
n
n
a x y a x y a x y 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 [ ] b a x ,
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 y
i
, în zona de
început a domeniului de definiţie, rezolvarea acestora furnizând informaţii
despre comportamentul funcţiilor y
i
, î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
y
i
, î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, ) (x p y = ′ , unde p(x) este funcţia necunoscută, iar y este variabila independentă
) ( p y y = .
Pentru cazul ecuaţiei diferenţiale de ordinul doi care are forma generală
( ) ) (x n y x m y = ′ + ′ ′ ,
efectuarea schimbării de variabile duce la stabilirea relaţiilor :
Rezolvarea numerică a ecuaţiilor diferenţiale 303
) (x p y = ′ , p x m x n p p x m x n
p
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ă,
( ) n i y y y x q y
n i
, , 1 , , , , ,
2 1
L L = = ′ ,
unde, funcţiile
i
q , 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ă,
F a M = ⋅
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
x
x X
t
x
M ,
d
d
,
d
d
2
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
x
X
t
x
M ,
d
d
d
d
2
2
şi cu substituţia
t
x
v
d
d
= , ecuaţia se transformă în,
( ) ) , ( ,
d
d
notatii alte cu
t y F y M t v X
t
v
M = ′ ⋅     → ← = ⋅ , 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
) ( d
t y F y M y t F
t
t y
M = ′ ⋅ ⇔ = ⋅ ,
şi de cele mai multe ori, matricea M este normalizată, M=1, astfel că, forma cea
mai frecventă este:
) , ( ) , (
d
) ( d
t y F y y t F
t
t y
= ′ ⇔ = .
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 ) , ( t y F y M = ′ ⋅ , 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ă
0 0
) ( y t y = ;
• 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:
) , ( t y F y = ′ ,
cu condiţia iniţială
0 0
) ( y t y = , dezvoltarea în serie Taylor a funcţiei ) (t y , în
0
t t =
este
( ) ( ) ( ) L + − ⋅
′ ′ ′
+ − ⋅
′ ′
+ − ⋅ ′ + =
3
0
0
2
0
0
0 0 0
! 3
) (
! 2
) (
) ( ) ( ) ( t t
t y
t t
t y
t t t y t y t y .
Valoarea funcţiei,
1 + n
y , la momentul
1 + n
t , în funcţie de valoarea funcţiei,
n
y , la
momentul
n
t este
L + ⋅
′ ′ ′
+ ⋅
′ ′
+ ⋅ ′ + =
+
3 2
1
! 3 ! 2
h
y
h
y
h y y y
n n
n n n
,
Rezolvarea numerică a ecuaţiilor diferenţiale 305
unde
n n
t t h − =
+1
.
Exemple tipice de metode monopas sunt metodele Euler şi Runge Kutta. În metoda
Runge-Kutta, soluţia la pasul
1 + n
t este obţinută funcţie de
n
y , ) , (
n n
y t F , iar F(t,y) este
evaluată la paşi intermediari între
n
t şi
1 + n
t , 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
n
t . Toate metodele monopas sunt explicite.

Metodele multipas, care au o precizie mai mare, necesită cunoaşterea valorilor
L , ,
2 1 − − n n
y y şi L , ,
2 1 − − n n
F F . 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 ( ) (
, , , ,

′ =
n n
y y y t f y L
şi notăm
n i y y
i
i
, , 2 , 1 ,
) 1 (
L = =

,
putem scrie:
1 , , 2 , 1 ) , , , ( ,
1 1
− = =

=

+
n i y y t f y y y
n n i i
L L .
Pentru sisteme neautonome, t y =
0
şi atunci 1
0
=

y . Pentru sistemele autonome,
n i n i y g y
i i i
, , 2 , 1 , , 2 , 1 ), ( L L = = =


unde 1 ) (
0
=
i
y g .
Î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ă,
j ij i i
y A B y ⋅ + = ′
unde
ij
A este o matrice costantă de (n+1) x (n+1), iar
i
B este un vector constant de
lungime n+1. Sistemul linearizat se revolvă şi apoi, cu noile valori ale lui
ij
A şi
i
B ,
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
k jk j i
B A y x ⋅ + =
−1
, ecuaţia
diferenţială se transformă în ecuaţia omogenă
j ij i
x A x ⋅ = ′ , care, pentru generalizarea
analizei, este un sistem linear, omogen
j ij i
y A y ⋅ = .
Considerând că
ij
A are n+1 valori proprii, n i
i
, , 2 , 1 , 0 ,
) (
L = λ că
ij
A este matricea
diagonală a valorilor proprii şi matricea
ij
S , a vectorilor proprii, atunci
k ik i
y S z
1 −
= şi
n i z z
i i i
, , 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
n i c e z
i
t
i
i
L , 2 , 1 , 0 ,
) (
= =
λ

sau, funcţie de dependenţa originală a variabilelor,
i
t
ik k ik i
c e S z S z
i ) (
λ
= = sau
n
t
in
t
i
t
i i
c e S c e S c e S z
n ) ( ) 1 ( ) 0 (
1 1 0 0
λ λ λ
+ + + = 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< t
i

nu afectează direct valorile lui y(t), la t<t
i
. 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 n i h i a t n a b h
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,
( ) ), ( , , (
0 0 1
t y y y t h y y
n n n n
= ∆ ⋅ + =
+

unde ∆ este funcţia care caracterizează metoda. Erorile locale de trunchiere,
( )
1 + p
h O , 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
0
t t h − = ,
) , (
0 0 0
t y F F = , pentru lungimea subintervalului se obţine,
) , ( ) ( ) ( ) (
0 0 0 0 0 0 0
h F y y h t y F y y h t y t y t y ⋅ + = ⇒ ⋅ + = ⇒ ⋅ ′ + = ,
de unde se deduce relaţia de recurenţă:
1 - 0 ,
1
N n h F y y
n n n
≤ ≤ ⋅ + =
+
.
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
h
2
, 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
N n h F y y
n n n
≤ ≤ ⋅ + =
+
, a fost
utilizat pentru primul subinterval, cu ajutorul lui t
1
şi y
1
corespunzător, pe care-l notăm
) 1 (
1
y , se determină F
1
, la capătul din dreapta şi se face media ( ) 2 /
1 0
F F + . Aceasta se
consideră a fi
0
F , în ecuaţia iniţială şi se reia calculul, obţinând o valoare îmbunătaţită a
lui y
1
, 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 ,
1 2 1
2 1
K y h t F h K y t F h K
N n K y y
n n n n
j n
+ + ⋅ = ⋅ =
≤ ≤ + =
+

Eroarea dată de toţi termenii care se omit este proporţională cu h
3
, respectiv O(h
3
).
Pentru rezolvarea problemelor rigide (stiff) se aplică metoda lui Euler implicită,
care are la bază relaţia,
) , (
1 1 1 + + +
⋅ + =
n n n n
y t F h y y .
Î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
n
t şi
1 + n
t , 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
1 2 1
2 1 1
K y h t F h K y t F h K
N n K K y y
n n n n
n n
+ + ⋅ = ⋅ =
≤ ≤ + ⋅ + =
+

Eroarea este proporţională cu h
3
, respectiv O(h
3
);
• 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 , 2 2 6 1
3 4 2 3
1 2 1
4 3 2 1 1
K y h t F h K K y h t F h K
K y h t F h K y t F h K
NJ n K K K K y y
n n n n
n n n n
n n
+ + ⋅ = + + ⋅ =
+ + ⋅ = ⋅ =
≤ ≤ + + + ⋅ + =
+

Eroarea este proporţională cu h
5
, respectiv O(h
5
).

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 , ,
2 1 − − n n
y y şi L , ,
2 1 − − n n
F F .
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
1 1
0
1
= ⋅ ⋅ − ⋅
∑ ∑
=
− + − +
=
− +
m
i
i n i n i
m
i
i n i
y t F b h y a ,
fiind definită pentru un număr de m paşi şi de parametrii a
i
şi b
i
. O reducere a
generalizării este atunci când . 1
0
= a Dacă 0
0
= 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ă 1
1
− = a , 0
0
= b - adică algoritmul este
explicit şi K i a
i
L , 3 , 2 , 0 = = , unde K este ordinul, respectiv m=K. Relaţiile, în funcţie
de ordin, sunt:
• Ordinul întâi: ) , (
1 n n n n
y t F h y y ⋅ + =
+
;
• Ordinul secund: ( )
1 1 1
, ( ) , ( 3
2
1
− − +
− ⋅ + =
n n n n n n
y t F y t F h y y ;
• Ordinul trei: ( ) ) , ( 5 , ( 16 ) , ( 23
12
1
2 2 1 1 1 − − − − +
+ − ⋅ + =
n n n n n n n n
y t F y t F y t F h y y ;
• Ordinul patru:
|
|
¹
|

\
|
− +
+ −
⋅ + =
− − − −
− −
+
) , ( 9 ) , ( 37
, ( 59 ) , ( 55
24
1
3 3 2 2
1 1
1
n n n n
n n n n
n n
y t F y t F
y t F y t F
h y y ;
• Ordinul cinci:
|
|
|
|
¹
|

\
|
+
− +
+ −
⋅ + =
− −
− − − −
− −
+
) , ( 251
) , ( 1274 ) , ( 2616
, ( 2774 ) , ( 1901
720
1
4 4
3 3 2 2
1 1
1
n n
n n n n
n n n n
n n
y t F
y t F y t F
y t F y t F
h y y ;
SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE 310
• Ordinul şase:
|
|
|
|
¹
|

\
|
− +
− +
+ −
⋅ + =
− − − −
− − − −
− −
+
) , ( 475 ) , ( 2877
) , ( 7298 ) , ( 9982
) , ( 7923 ) , ( 4277
1440
1
5 5 4 4
3 3 2 2
1 1
1
n n n n
n n n n
n n n n
n n
y t F y t F
y t F y t F
y t F y t F
h y y .
Metodele Adams-Moulton consideră 1
1
− = a , 0
0
≠ b - adică algoritmul este
implicit şi 1 , 3 , 2 , 0 − = = K i a
i
L , unde K este ordinul, respectiv m=K. Relaţiile, în
funcţie de ordin, sunt:
• Ordinul întâi: ) , (
1 1 1 + + +
⋅ + =
n n n n
y t F h y y ;
• Ordinul secund: ( )
n n n n n n
y t F y t F h y y , ( ) , (
2
1
1 1 1
− ⋅ + =
+ + +
;
• Ordinul trei: ( ) ) , ( , ( 8 ) , ( 5
12
1
1 1 1 1 1 − − + + +
− + ⋅ + =
n n n n n n n n
y t F y t F y t F h y y ;
• Ordinul patru:
|
|
¹
|

\
|
+ −
− +
⋅ + =
− − − −
+ +
+
2 2 1 1
1 1
1
, ( ) , ( 5
) , ( 19 ) , ( 9
24
1
n n n n
n n n n
n n
y t F y t F
y t F y t F
h y y ;
• Ordinul cinci:
|
|
|
|
¹
|

\
|

− + −
− +
⋅ + =
− −
− − − −
+ +
+
) , ( 19
) , ( 106 ) , ( 2646
) , ( 646 ) , ( 251
720
1
3 3
2 2 1 1
1 1
1
n n
n n n n
n n n n
n n
y t F
y t F y t F
y t F y t F
h y y ;
• Ordinul şase:
|
|
|
|
¹
|

\
|
+ −
− + −
− +
⋅ + =
− − − −
− − − −
+ +
+
) , ( 27 ) , ( 173
) , ( 482 ) , ( 798
) , ( 1427 ) , ( 475
1440
1
4 4 3 3
2 2 1 1
1 1
1
n n n n
n n n n
n n n n
n n
y t F y t F
y t F y t F
y t F y t F
h y y ;
Metodele Gear consideră 0
0
≠ b - adică algoritmul este implicit şi 0 =
i
b ,
K i L , 3 , 2 , 1 = , unde K este ordinul, respectiv m=K.
Relaţiile, în funcţie de ordin, sunt:
• Ordinul întâi: ) , (
1 1 1 + + +
⋅ + =
n n n n
y t F h y y ;
• Ordinul secund: ( ) ) , ( 2 4
3
1
1 1 1 1 + + − +
⋅ + − + =
n n n n n n
y t F h y y y y ;
• Ordinul trei: ( ) ) , ( 6 2 9 18
11
1
1 1 2 1 1 + + − − +
⋅ + + − + =
n n n n n n n
y t F h y y y y y ;
• Ordinul patru:
|
|
¹
|

\
|
⋅ + −
− + −
+ =
+ + −
− −
+
) , ( 12 3
16 36 48
25
1
1 1 3
2 1
1
n n n
n n n
n n
y t F h y
y y y
y y ;
• Ordinul cinci:
|
|
¹
|

\
|
⋅ + +
+ − + −
+ =
+ + −
− − −
+
) , ( 60 12
75 200 300 360
137
1
1 1 4
3 2 1
1
n n n
n n n n
n n
y t F h y
y y y y
y y ;
Rezolvarea numerică a ecuaţiilor diferenţiale 311
• Ordinul şase:
|
|
¹
|

\
|
⋅ + − +
+ − + −
+ =
+ + − −
− − −
+
) , ( 60 10 72
225 400 450 360
147
1
1 1 5 4
3 2 1
1
n n n n
n n n n
n n
y t F h y y
y y y y
y y ;
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 y y y t f = = ′ ,
unde y, este un vector de elemente
i
y şi ) , , , , , (
3 2 1 m
y y y y t f L , este vector funcţie,
cu elementele f
i
.
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:
( ) m i y y y y t f h y y
n
m
n n n n n
i
n
i
, , 3 , 2 , 1 , , , , ,
) ( ) (
3
) (
2
) (
1
) ( ) ( ) 1 (
L L = ⋅ + =
+
.
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 ( , y y y A
dt
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
( )
n n n n
y A h I y A h y y ⋅ ⋅ + = ⋅ ⋅ + =
+1
sau ( )
0 0
y B y A h I y
n n
n
⋅ = ⋅ ⋅ + = ,
unde I, este matricea identitate. Pentru a avea soluţii numerice stabile, pentru cazul
lui n mare, trebuie ca matricea
n
B 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
i i
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
2
1 1
i
i
h h
λ
≤ ⇒ ≤ λ ⋅ + .
Dacă rangul magnitudinii valorilor proprii este mare, de exemplu
1 min max >> λ λ ≡
i i i i
S , 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 (
, ,
2 2
n n n n n n n
y t f y t f A
h
I
h
y y + |
¹
|

\
|
− + =
+ +
, m n L , 3 , 2 , 1 =
în care I, este matricea identitate, iar A este matricea Jacobian, recalculată la fiecare
pas,
(
(
(
(
(
(
(
(
¸
(

¸

=
m
m m m
m
m
n
dy
df
dy
df
dy
df
dy
df
dy
df
dy
df
dy
df
dy
df
dy
df
A
L
M L M M
L
L
2 1
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,
( ) y y x f y ′ = ′ ′ , , ,
0
) 0 ( y y = ,
L
y L y = ) ( ,
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
= ⋅ + ′ ′ y k y , , 0 ) 1 ( ) 0 ( = = y y
apare o problemă cu valori proprii,
N n n k
n
, , 2 , 1 , L = π ⋅ =
şi vectori proprii,
) sin( ) ( x n x y
n
⋅ π ⋅ = .
Punând
2 2
- x k ∆ ⋅ = λ , sistemul se poate scrie sub forma 0 ) - (A = ⋅ ⋅ λ y I , în
care I este maticea identitate, A este aşa numita matrice Stieltjes,
(
(
(
(
¸
(

¸




=
2 0 0
0 2 1
0 1 2
L
M L M M
L
L
A , iar
(
(
(
(
¸
(

¸

=
−1
2
1
N
y
y
y
y
M
.
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
) ( d
t y F y M y t F
t
t y
M = ′ ⋅ ⇔ = ⋅ ,
iar funcţiile ode15s, ode23s, ode23t şi ode23tb pot rezolva şi ecuaţii de forma
) , ( ) ( ) , (
d
) ( d
) ( t y F y t M y t F
t
t y
t M = ′ ⋅ ⇔ = ⋅ .
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'',..., y
n-1
),
se definesc,
y
1
= y ; y
2
= y' ; y
3
= y''; ... , y
n
= y
n-1
; Y=[ y
1
, y
2
, y
3
, y
n
]
astfel că,
f(t, y, y', y'',..., y
n-1
) = f(t, y
1
, y
2
, y
3
, y
n
) ; Y'=f(t,Y)
se scriu expresiile,
y
1
'

= y
2
; y
2
'

= y
3
; y
3
'= y
4
; ... ; y
n
' = y
n
;
şi în final, funcţia F:
function ydot=F(t,y)
expresie 1: y
1
'

= y
2
;
expresie 2: y
2
'

= y
3
;
expresie 3: y
3
'= y
4
;
….. ... ;
expresie n-1: y
n
' = y
n
;
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,
3 2 1
y y y ⋅ = ′ ;
3 1 2
y y y ⋅ − = ′ ;
2 1 3
51 . 0 y y y ⋅ ⋅ − = ′ ;
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
2 1
y y = ′ ; ( )
1 2
2
1 2
1 1000 y y y y − ⋅ − ⋅ = ′ ; 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
y
j
=y
j
(i), unde i=1, 2, …, n este numărul de ordine al
elementului y
j
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=10
x
, 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=10
x
î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:

j i
j i j i j i
,j i
, 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(-x
2
-y
2
) î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 ) (t f , reală sau complexă, definită pe
mulţimea numerelor reale şi care satisface următoarele condiţii :
1) 0 ) ( = t f pentru 0 < t ;
2) ) (t f este derivabilă pe porţiuni;
3) există două numere, 0 , 0
0 0
≥ σ > M astfel încât
t
e M t f
⋅ σ
⋅ ≤
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 ) (t f , 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, ( )
i i
x x ,
1 −
, din domeniul de definiţie, să existe limitele
laterale,
( ) ( ) ( ) ( ) n i x f x f x f x f
i i i i
, , 2 , 1 , 0 , 0 , 0 , 0
1 1
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 ) (t f .
Cea mai simplă funcţie original este funcţia unitate, cu indicele de creştere 0
0
= σ ,

¦
¹
¦
´
¦
>
=
<
= η
0 pentru 1
0 pentru
2
1
0 pentru 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
¦
¹
¦
´
¦
> ϕ
= ϕ
<
= ϕ ⋅ η =
0 pentru ) (
0 pentru (0)
2
1
0 pentru 0
) ( ) ( ) (
t t
t
t
t t t f
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 ) (t f sau imaginea după Laplace
a funcţiei ) (t f integrala notată
( )


⋅ −
⋅ = =
0
d ) ( ) ( t e t f s F t f
t s
L
în care, τ ⋅ + σ = j s este un număr complex, în care σ este partea reală, iar τ este
par