Sunteți pe pagina 1din 153

Mircea Mihãlcicã

METODE NUMERICE
ÎN MATLAB
G H ID P R A C T IC D E L A B O R A T O R

BRA{O V
Recenzenţi ştiinţifici: prof.dr.ing.mat. Sorin Vlase
Universitatea Transilvania Braşov
prof.dr.ing. Florin Comstantin
Universitatea Transilvania Braşov
Consilier editorial: prof.dr.ing. Florin Andreescu
Tehnoredactare: autorul
Coperta şi grafica: dr.ing. Bogdan Andreescu
Corectura: autorul

© 2011

ISBN 978-973-131-130-2
Mircea Mihãlcicã

METODE NUMERICE
ÎN MATLAB
G H ID P R A C T IC D E L A B O R A T O R

BRA{O V
CUPRINS

1 Introducere 5
2 Mediul de lucru 10
2.1 Introducere 10
2.2 Operații matematice simple 10
2.3 Variabile 12
2.4 Funcții matematice simple 15
2.5 Exerciții 18
3 Operații cu șiruri și matrici 20
3.1 Introducere 20
3.2 Definirea șirurilor 20
3.3 Operații matematice simple cu șiruri 23
3.4 Manipularea șirurilor 25
3.5 Definirea matricelor 26
3.6 Matrici speciale 28
3.7 Operații matematice simple cu matrici 29
3.8 Operații element cu element 32
3.9 Formatul de afișare 34
3.10 Exerciții 36
4 Funcții și polinoame. Ecuații 42
4.1 Introducere 42
4.2 Calculul valorilor funcțiilor 42
4.3 Exerciții 43
4.4 Șirul coeficienților unei funcții 45
4.5 Grafice de funcții 48
4.6 Grafice multiple 51
4.7 Lucrul direct pe grafic 53
4.8 Grafice în trei dimensiuni 54
4.9 Exerciții 55
4.10 Sisteme de ecuații liniare compat. determinate 57
4.11 Interpolare polinomială 59
3
4.12 Ecuații diferențiale în Matlab 64
4.13 Suprafețe în trei dimensiuni 69
5 Operatori statistici 71
5.1 Introducere 71
5.2 Media aritmetică 71
5.3 Mediana 72
5.4 Abaterea medie pătratică și dispersia 75
5.5 Exerciții 79
6 Analiză modală 81
6.1 Introducere 81
6.2 Exemplu - arbore cotit 81
Modul program. Introducerea și afișarea datelor.
7 87
Structuri repetitive și structuri condiționale
7.1 Introducere 87
7.2 Introducerea datelor de la tastatură 88
7.3 Instrucțiuni de afișare 91
7.4 Exerciții 93
7.5 Structuri repetitive 95
7.6 Structuri condiționale 97
7.7 Exerciții 105
7.8 Obiecte (structuri de date) în Matlab 113
8 Exerciții recapitulative 119
9 Calculatorul de funcții 135
9.1 Introducere 135
9.2 Zone și comenzi funtool 136
Anexă - Lista funcțiilor și constantelor descrise în volum 141

Bibliografie 145

4
1. INTRODUCERE

Pentru sistematizarea prezentării informaţiilor cât şi a


justificării utilităţii prezentei lucrări privind utilizarea
bibliotecilor cu rutine ştiinţifice de către studenţii cu profil
inginerie mecanică, vom admite existenţa a patru etape de viaţă
a unui produs sau componentă mecanică:
- etapa de proiectare
- etapa de cercetare
- etapa de producţie
- etapa de exploatare.
Apreciem încă de la început ca necesare şi oportune
precizarea tipurilor de probleme la care trebuie să răspundă un
inginer în activitatea practică:
- să se dimensioneze astfel o componentă, încât în
condiţii de exploatare date, rezistenţa în exploatare să fie de n
ore cu o probabilitate p.
- care este probabilitatea ca rezistenţa în exploatare a
unei componente să fie de n ore, în condiţii de exploatare date?
- care este probabilitatea ca rezistenţa în exploatare a
unei variante constructive să fie superioară altei variante
constructive, în condiţii de exploatare date?
- cu ce probabilitate rezistenţa în exploatare a unei
variante constructive diferă în condiţii de exploatare diferite?
În figură se prezintă un algoritm general de rezolvare a
problemelor de mai sus.

5
6
Plecând de la algoritmul prezentat în figură, în cadrul
tabelului am sistematizat o parte din metodele numerice utile în
ingineria mecanică legate de problemele practice care le
generează şi le-am încadrat în module mari specifice
bibliotecilor de rutine existente pe piaţă (biblioteca ştiinţifică
IBM, MATLAB, MATCAD etc.)

Componenta Problema practică pe


Tip de operaţie
bibliotecii care o generează
-selecţia datelor -analiza datelor
-medie experimentale
-medie pătratică -calculul duratei de
-dispersie viaţă
-corelaţii şi regresii
-prezicerea duratei de
-funcţii de repartiţie
viaţă
-teste de concor- -stabilire regimuri de
Statistică
danţă încercări
matematică
etc. pe standuri
-stabilire regimuri de
încercări
în exploatare
-control calitate
producţie
etc.
-memorare -calcule statice de
Calcul matriceal -operaţii rezistenţă
-sisteme de ecuaţii -vibraţii componente

7
liniare mecanice
-vectori şi valori -dinamică
proprii -stabilitate
etc. etc.
-rădăcini -calcule statice de
-polinoame speciale rezistenţă
-rădăcini ecuaţii -stabilire regimuri de
neliniare încercări
-extremele funcţiilor pe standuri
-aproximare -stabilire regimuri de
Polinoame
-interpolare încercări
-analiză Fourier în exploatare
etc. -fiabilitatea
produselor
etc.

-diferenţiere -dinamica
numerică autovehiculelor
-ecuaţii diferenţiale -stabilitatea
Calcul
ordinare autovehiculelor
diferenţial şi
-funcţii speciale -vibraţii
integral
-cuadraturi numerice -controlul sistemelor
etc. mecanice
etc.
-linii -analiza datelor
-curbe experimentale
Grafică
-histograme -buletine de încercări
etc. etc.

8
Volumul de față se adresează inginerilor sau viitorilor
ingineri. Scopul materialelor prezentate nu este acela de a-l
transforma pe cititor într-un programator de elită, însă pentru a
fi capabili de a utiliza Matlab cu o anumită eficiență sunt
necesare o serie de cunoștințe de programare. În mod intenționat
codul scris pentru unele exemple nu este cel mai eficient (uneori
problema s-ar putea rezolva mai simplu) dar sunt alese
variantele prezente în această lucrare pentru a pune în evidență
anumite instrucțiuni, funcții și structuri de programare cu care
cititorul ar trebui să se familiarizeze.

9
2 MEDIUL DE LUCRU. SCALARI ȘI OPERAȚII
MATEMATICE SIMPLE. VARIABILE

2.1 Introducere
Se poate afirma cu tărie că nu este necesar să fim
programatori pentru a putea lucra în Matlab. De fapt am încercat
să dezvoltăm acest volum în ideea în care inginerii cu cunoștințe
doar tangențiale de programarea calculatoarelor să poată
beneficia de posibilitățile care le sunt oferite de către aplicație.
Totuși, trebuie să amintim că o persoană care posedă cunoștințe
de programare se va descurca mult mai ușor și eficient în
Matlab, iar a folosi aplicația fără a cunoaște măcar aspecte de
bază din programarea calculatoarelor este un lucru aproape
imposibil.
Mediul de lucru Matlab oferă două posibilități: lucrul în
mod „linie de comandă”, în care operatorul introduce comanda,
apasă tasta <Enter> și respectiva comandă (dacă nu face parte
dintr-o structură specială, la care ne vom referi mai târziu în
cadrul acestui material) este executată imediat, și lucrul în
modul „program”, în care toate instrucțiunile sunt scrise linie cu
linie într-un editor de text inclus în interiorul aplicației iar apoi
întregul cod este compilat și rulat. Pentru început vom prezenta
exemple în linie de comandă, fiind modul considerat „mai la
îndemână” de cei ce-și încep drumul în Matlab.

2.2 Operații matematice simple


Matlab este capabil de a efectua operațiile matematice
simple care ne sunt foarte comune, de genul adunării, înmulțirii,

10
împărțirii, ridicării la putere (extragerea radicalului poate fi
considerată tot o ridicare la putere). Iată modul de lucru pentru
operațiile matematice simple (urmăriți imaginile de sus în jos și
de la stânga spre dreapta):

Se observă în ultimul exemplu că rezultatul expresiei


16^1/2 este 8. Dacă intenția noastră a fost să ridicăm numărul 16
la puterea 1/2 (să extragem rădăcina pătrată din 16), nu am
reușit acest lucru. Atingem aici un alt subiect, ordinea
operațiilor. Matlab urmărește ordinea operațiilor din
matematică, deci expresia noastră va fi efectuată în ordinea
următoare: numărul 16 va fi ridicat la puterea 1, apoi rezultatul
acestei prime operații va fi împărțit la 2 (rezultatul final obținut
fiind evident 8). Dacă dorim să extragem rădăcina pătrată,

11
trebuie să folosim expresia 16^(1/2). Matlab va efectua prima
dată operația dintre paranteze, cu rezultat 0.5, iar apoi va ridica
numărul 16 la 0.5, cu rezultat final 4. Iată codul:

2.3 Variabile
În programare, o variabilă este un nume simbolic ales
pentru a fi folosit ca o reprezentare a unei cantități de
informație, cunoscută sau necunoscută. O variabilă este asociată
unei locații unde este stocată respectiva cantitate de informație.
De cele mai multe ori, valorile variabilelor se schimbă pe
parcursul unui program informatic (variabila este utilizată cu o
valoare într-un anumit loc în program, apoi valoarea ei se
schimbă și e folosită cu valoarea nouă într-un alt loc etc.)
Atunci când variabila „ia o valoare”, operațiunea
poartă numele de atribuire. Secvența din imagine
poate fi citită sub forma „variabilei a îi este
atribuită valoarea 7”.

Se poate observa în exemplele de mai sus că, după ce


apăsăm tasta <Enter>, Matlab „răspunde” cu o confirmare a
operațiunii sau calculului matematic solicitat de operator (echo).
Am cerut aplicației să îi atribuie variabilei a valoarea 7, am
primit confirmarea că a=7 pe următoarele două rânduri. Există

12
un dezavantaj pentru acest răspuns: ecranul se umple mai
repede, făcând necesară derularea pentru a putea urmări codul.
Pentru a scăpa de acest răspuns, după linia de comandă, înainte
de a apăsa <Enter>, se poate adăuga simbolul ; (punct și
virgulă):
Se poate observa că, în cazul
folosirii simbolului ; la sfârșit,
Matlab sare direct la
următoarea linie de comandă
Pentru a „curăța” (șterge) ecranul, comanda folosită este clc .

!Atenție!
- Matlab este „case sensitive”, adică ține cont de literă mare -
literă mică atunci când lucrează cu variabile. Cu alte cuvinte,
dacă definim a=10 și A=20, aplicația le va trata ca variabile
diferite.
În exemplul de față observăm diferențele
dintre a și A ca variabile. De asemenea,
observăm că simbolul ; așezat după o
instrucțiune poate fi folosit ca separator
(am putut scrie pe același rând a=10 și
A=20 deoarece am folosit ; iar dacă veți
încerca să scrieți respectivele comenzi fără
; după, veți primi o eroare). De asemenea,
pentru a vedea valorile variabilelor, le-am
„apelat” pur și simplu în linia de comandă
(am tastat a <Enter> și A <Enter>)

13
Există o fereastră în Matlab unde puteți consulta valorile
actuale ale tuturor variabilelor pe care Matlab le are în memorie.

Fereastra Workspace, conținând


valorile actuale ale variabilelor
active (în cazul nostru a și A).
Fereastra se află în mod implicit
în dreapta spațiului de lucru în
linie de comandă
Pentru a reseta (șterge) toate valorile variabilelor aflate
în memorie, se folosește comanda clear .

!Atenție!
Atunci când începeți un program nou, este recomandat să
ștergeți valorile variabilelor aflate în memorie, mai ales atunci
când ați mai lucrat în respectiva sesiune de lucru.

Variabilele în
Matlab respectă regulile
matematice ale
structurilor matematice pe
care le reprezintă. Acest
lucru este cel mai vizibil
în cazul scalarilor și
operațiilor matematice
simple.

14
!Atenție!
În limbajul pe care îl folosim atunci când descriem relațiile
matematice există tendința de a ignora operatorul „înmulțit”. De
exemplu, când ne referim la nu spunem „trei deînmulțit cu
x pătrat” ci „trei x pătrat”. Matlab însă nu face supoziții, are
nevoie de operator:

De asemenea, se recomandă mare atenție la ordinea operațiilor.

2.4 Funcții matematice simple


Matlab oferă utilizatorilor un set uriaș de funcții
matematice, multe dintre ele fiind tratate pe parcursul acestui
îndrumar. În capitolul de față vom aborda o serie de funcții
matematice simple care vă vor ajuta în lucrul cu date
experimentale.

Funcția Efect
round(x) Rotunjește o valoare către cel mai apropiat întreg
Rotunjește o valoare către cel mai apropiat întreg
ceil(x)
superior
Rotunjește o valoare către cel mai apropiat întreg
floor(x)
inferior
Rotunjește o valoare către cel mai apropiat întreg
fix(x)
spre zero

15
!Atenție!
În reprezentarea
numerelor zecimale,
Matlab folosește
punctul și nu virgula.
Pentru a nu exista
confuzii, în cadrul
acestui volum vom
alege același tip de
reprezentare pentru
numerele care nu sunt
întregi.
Pentru a înțelege
comportamentul
funcțiilor ceil, floor și
fix urmăriți cu atenție
exemplele atât pentru
valoarea pozitivă
rotunjită cât și pentru
cea negativă.

Funcția Efect
rem(x,y) Restul împărțirii lui x la y
sqrt(x) Rădăcina pătrată a lui x
factor(x) Împarte valoarea x în factori primi
factorial(x) Calculează x factorial
lcm(x,y) Calculează cel mai mic multiplu comun pt. x și y
gcd(x,y) Calculează cel mai mare divizor comun pt. x și y

16
Matlab pune la dispoziție o serie de
constante ce pot fi folosite în
operațiile matematice comune.
Deocamdată amintim trei dintre ele:
Epsilon (simplificat, cea mai
eps
mică valoare posibilă)

Partea imaginară a unui număr


i,j
complex

pi Numărul

17
2.5 Exerciții:
1. Introduceți următoarele comenzi în Matlab:
>> 2*3*4*5
>> x1=17
>> x2=12
>> x3=9
>> x1/x2-x3
>> (x3-x2)^(1/2)

2. Definiți în Matlab variabilele a=1, b=2, c=3, d=4. Calculați


apoi expresiile:
a)
b)
c)

Răspunsuri:
a) 21
b) 47
c) 0.0714

3. Definiți în Matlab variabilele a=3, b=4, c=5. Calculați apoi


expresiile:

a)

b)
c)
Răspunsuri:

18
a) 6.2727
b) 5184
c) 504

4. Calculați aria unui cerc cu raza de 59 metri. Rotunjiți inferior


rezultatul și aflați radicalul. Noul rezultat rotunjiți-l superior și
împărțiți-l în factori primi. Calculați și afișați aria triunghiului
având drept lungimi ale laturilor valorile obținute la punctul
anterior (respectivii factori primi).
Răspuns:
6.4952

19
3 OPERAȚII CU ȘIRURI ȘI MATRICI

3.1 Introducere
Nu este cunoscut tuturor faptul că numele aplicației
Matlab nu este derivat din cuvântul matematică („Math”) -
Matlab vine de la MATrix LABoratory. Devine evident acum
faptul că matricile ocupă un rol important în Matlab și sunt un
subiect demn de a le fi dedicat propriul capitol în conținutul
acestui volum. De altfel, matricile sunt elemente de bază în
inginerie și mai ales în cea a autovehiculului.
Deși am intitulat capitolul „operații cu șiruri și matrici”,
trebuie spus că Matlab nu lucrează cu noțiunea de „șir”. Pentru
aplicație, un șir este de fapt o matrice de un rând și n coloane,
care suportă toate operațiile matematice specifice matricilor.
Vom prefera pe alocuri să numim acest tip special de matrice
„șir” deoarece considerăm că poate fi vizualizată mai ușor și, în
concluzie, lucrurile sunt mai lesne de înțeles.

3.2 Definirea șirurilor


Un șir ale cărui elemente sunt cunoscute poate fi
introdus de la tastatură sub forma:

Există o categorie de șiruri cu proprietăți speciale pe care


Matlab ne oferă posibilitatea de a le defini cu ajutorul unor

20
comenzi simple de la tastatură. Acestea sunt șirurile în care
elementele se incrementează (pornind de la primul spre ultimul)
cu un anumit pas fix. De exemplu, comanda:

va defini un șir de la 1 la 7, în care elementele se incrementează


cu pasul 1. Dacă se dorește schimbarea pasului, acest lucru
trebuie specificat, ca și parametru, între cele două capete ale
șirului, sub forma:

Comanda de mai sus va defini un șir începând de la 0,


până la 4.5 și cu pas de 0.5.
Dacă analizăm cele două exemple anterioare, observăm
că pentru definirea șirurilor noastre cunoșteam capătul din
stânga al intervalului, capătul din dreapta al intervalului și pasul
cu care elementele se incrementează. În practică se întâlnește

21
adeseori și situația în care sunt cunoscute capetele intervalului
(stâng și drept) dar nu se cunoaște pasul, ci numărul de puncte în
care se dorește împărțirea respectivului interval. De exemplu,
apare o problemă de genul „Realizați o scală de la 0 la 12, în 17
puncte”. Aceasta se rezolvă cu comanda linspace:

!Atenție!
În structura comenzii linspace ordinea este r=linspace(capătul
din stânga, capătul din dreapta, numărul de puncte), pe când
în cazul în care se cunoaște pasul, r=capătul din stânga:pas:
capătul din dreapta. Confuziile între aceste două sintaxe sunt
foarte întâlnite
În structura comenzii linspace, ultimul argument face referire la
numărul de puncte și nu la numărul de intervale. Dacă se
cunoaște numărul de intervale în care este necesar a se împărți
spațiul, trebuie ținut cont că numărul de intervale este numărul
de puncte -1.

22
3.3 Operații matematice simple cu șiruri
În Matlab, șirurile suportă operațiile algebrice clasice ale
matricilor. Să presupunem că avem șirul:

Adunarea cu un scalar:

Înmulțirea cu un scalar:

Scăderea unui scalar:

Împărțirea la un scalar:

23
Adunarea a două șiruri:

De notat că, pentru a fi posibilă adunarea a două șiruri în sensul


clasic, dimensiunile celor două șiruri trebuie să fie identice.
Pentru înmulțirea sau împărțirea a două șiruri aspectele
se complică, în sensul în care, după cum am spus, șirurile sunt
de fapt matrici iar operația de înmulțire este considerată de
Matlab înmulțire matriceală.

După cum știm, condiția pentru a înmulți două matrici este ca


numărul de linii din prima matrice să fie egal cu numărul de
coloane din cea de-a doua matrice.

24
Dacă în exemplul de mai sus se dorește înmulțirea
matriceală dintre cele două șiruri a și b, este necesară
transpunerea șirului b.

Șirul b
Șirul b transpus

După cum se poate


observa, operația de
înmulțire matriceală
este acum posibilă

De notat că Matlab oferă posibilitatea înmulțirii element


cu element a celor două șiruri. Acest aspect este tratat în
capitolul 3.8, Operații element cu element.

3.4 Manipularea șirurilor


Considerăm șirul cu elemente introduse manual de la
tastatură:

25
Comanda r(i) va returna valoarea elementului i din șirul r.
Numărul i este un indice, valoarea acestui indice nu are nici o
legătură cu valoarea elementului din șir pe care îl reprezintă:

Comanda returnează valoarea celui de-


al patrulea element din șirul r . Această
valoare este 3

Sortare crescătoare - comanda sort:

Suma și produsul elementelor șirului - comenzile sum și prod:

Lungimea șirului - comanda length:

3.5 Definirea matricilor


După cum am menționat, șirurile sunt de fapt matrici de
un rând și n coloane. Teoria prezentată în capitolele dedicate

26
șirurilor se aplică așadar și în cazul matricilor, diferența făcând-
o practic apariția celei de-a doua dimensiuni în cadrul matricilor
și posibilitatea pe care ne-o oferă aplicația de a folosi un set de
matrici speciale.
O matrice în Matlab poate fi definită prin două metode:

Prima metodă de a defini o


matrice în Matlab: se
deschide paranteză pătrată,
se apasă <Enter> după
fiecare rând, la sfârșit se
închide paranteza pătrată

A doua metodă de a defini


o matrice în Matlab: se
deschide paranteză pătrată,
se tastează ; după fiecare
rând, la sfârșit se închide
paranteza pătrată
!Recomandări!
În capitolul 2 aminteam că Matlab este Case Sensitive (ține cont
de literă mare - literă mică atunci când lucrează cu variabile.
Preferința noastră personală este de a nota matricile cu literă
mare și variabilele simple sau șiruri cu literă mică, pentru a fi
mai ușor de identificat în codul programului.
În cazul în care lucrăm cu matrici de dimensiuni mici, preferința
noastră personală este de a le defini cu ajutorul primei metode,
vizibilitatea fiind mai bună. În cazul în care lucrăm cu matrici de

27
dimensiuni semnificative, considerăm a doua metodă de definire
(cu ; între rânduri) ca fiind mai eficientă.

3.6 Matrici speciale


În matematică există o serie de matrici cu o structură
specială, multe dintre acestea fiind întâlnite foarte des în
calculele inginerești. Matlab ne pune la dispoziție posibilitatea
de a defini cu comenzi foarte simple unele dintre aceste matrici:

Matricea nulă:

Comanda definește o
matrice de 4 rânduri și 3
coloane (argumentele
4,3 din paranteză) cu
elemente nule

Matricea unitate:
Dacă în paranteză
se specifică un
singur argument,
matricea generată
va fi pătratică
(numărul de linii al
matricei va fi egal
cu numărul de
coloane

28
Matricea 1:

Matricea cu numere aleatoare:

Matricea cu numere aleatoare este o matrice specială care


conține valori între 0 și 1, generate aleator (la fiecare apelare a
comenzii, valorile din interiorul matricei diferă).

3.7 Operații matematice simple cu matrici


În Matlab, matricile suportă operațiile algebrice simple
specifice lor: adunarea și scăderea unui scalar, înmulțirea și
împărțirea cu un scalar și adunarea a două matrici de aceleași
dimensiuni.

29
Adunarea și scăderea unui scalar:

Înmulțirea și împărțirea cu un scalar:

Adunarea matricilor de aceleași dimensiuni:

Înmulțirea clasică a două matrici se face după regulile


înmulțirii matriceale (linii pe coloane), cu condiția ca numărul
de linii din prima matrice să fie egal cu numărul de coloane din
cea de-a doua:

30
Pe lângă aceste operații, vom aminti și calculul
transpusei și inversei unei matrice, care în Matlab are sintaxa
următoare:

Transpusa
matricei A

Pentru calculul inversei matricei A, trebuie satisfăcută


condiția matematică necesară pentru ca matricea A să fie
inversabilă (determinantul matricei să fie diferit de 0). Calculul
determinantului unei matrice se face cu comanda det:
Determinantul
Matricea A este 0,
matricea A nu
suportă
inversă

31
Calculul inversei unei matrice (în cazul în care condiția
este îndeplinită) se face cu comanda inv:

Determinantul este diferit de 0,


matricea A suportă inversă

3.8 Operații element cu element


Am amintit că înmulțirea între două matrici în Matlab se
face matricial, linii pe coloane. De foarte multe ori însă, în
practică, avem nevoie de posibilitatea de a înmulți aceste
formațiuni matematice (șiruri, matrici) element cu element. De
exemplu, să presupunem că avem un șir în care am stocat o serie
de date experimentale:

În prelucrările la care trebuie să supunem aceste date


experimentale este necesar să calculăm și pătratele acestora,
practic să obținem un nou șir cu elementele din șirul x, însă

32
fiecare la pătrat. Dar x^2=x*x în Matlab, iar x*x= înmulțire
matriceală, așadar eroare. O soluție ar fi să calculăm șirul:

sau să creăm un program informatic cu structuri repetitive


(aspect pe care îl vom trata în capitolele viitoare) pentru a
rezolva problema. Ambele soluții sunt incomode.
Matlab ne pune la dispoziție posibilitatea înmulțirii a
două șiruri sau matrici de dimensiuni egale prin metoda element
cu element, prin folosirea aritmeticii sau sintaxei cu punct:

Pentru a folosi sintaxa cu punct (și a realiza operația element cu


element), se va utiliza simbolul punct " . " înaintea operatorului
(în cazul nostru ridicarea la putere - ^ ).
!Atenție!
O problemă specială o prezintă matricile pătratice
ridicate la putere. Utilizatorii aflați la începutul drumului în
Matlab au tendința de a „uita” de sintaxa cu punct, de exemplu
ei își doresc să ridice matricea A la putere, element cu element,
dar folosesc comanda A^2 (fără punct), care are ca rezultat
înmulțirea matriceală A*A. Problema apare datorită faptului că

33
înmulțirea matriceală este posibilă iar Matlab nu va returna
eroare, ci un rezultat complet greșit - atunci când rezultatul e
eroare este evident că am greșit ceva, dacă în schimb este
returnat un rezultat valid, avem tendința de a-l considera corect:

Se observă diferențele majore dintre


rezultatele returnate de cele două
sintaxe, în primul caz înmulțirea
element cu element, în cel de-al
doilea înmulțirea matriceală

3.9 Formatul de afișare


Probabil ați observat că, atunci când rezultatele sunt
valori zecimale, Matlab va afișa primele patru cifre de după
virgulă. Acesta este modul standard de afișare a valorilor de
genul celor amintite. Pe lângă respectivul mod mai există încă
două, afișarea cu 15 zecimale și afișarea sub formă de fracție,
ambele putând fi utile, în funcție de situație (de exemplu puteți
alege formatul cu 15 zecimale dacă aveți de realizat un calcul
foarte exact, iar formatul sub formă de fracție arată de obicei

34
mai bine din punct de vedere al prezentării atunci când redactați
o lucrare). Stabilirea formatului de afișare se face cu comanda
format:

Comanda format este ceea ce


vom numi în continuare o
„setare de stare” a aplicației,
adică o setare care, odată
stabilită, rămâne neschimbată
până la o eventuală modificare
viitoare.
Cu alte cuvinte, din momentul
în care am stabilit să zicem
format long, toate valorile care
nu sunt întregi vor fi afișate cu
15 zecimale.
Există mai multe astfel de
setări de stare în Matlab iar cu
unele dintre ele ne vom întâlni
și pe parcursul acestui volum,
la capitolul dedicat graficelor
de funcții.

Exemplul nostru este unul puțin forțat - evident că pi nu este


egal cu 355/113 dar, pentru a putea avea o reprezentare sub
formă de fracție, aceasta este expresia cea mai apropiată pe care
a găsit-o Matlab (valorile fracției și ale lui pi sunt identice
pentru primele 6 zecimale)

35
3.10 Exerciții:
1. Generați o matrice de 5x5 conținând numere întregi pătrate
perfecte între 1 și 100.
Rezolvare:
Pas1: Generăm o matrice de 5x5 conținând numere aleatoare
între 0 și 1:

Pas2: Înmulțim matricea cu 10, pentru a aduce valorile din


intervalul [0,1] în intervalul [1,10]:

Pas3: Eliminăm partea zecimală a valorilor folosind


operațiunile de rotunjire prezentate în 2.4.

36
Mare atenție însă, enunțul cere pătrate perfecte între 1 și
100, dacă am rotunji cu round și am ridica la pătrat, valorile mai
mici de 0.5 (în cazul matricei de mai sus, B(2,5) este 0.3571) s-
ar rotunji în 0, iar pătratele lor ar fi 0. Comanda floor rotunjește
absolut toate valorile spre inferior, deci aici lucrurile stau și mai
rău - pentru a avea siguranța valorii minime 1, este necesară
rotunjirea superioară, cu comanda ceil:

Pas4: Ridicăm elementele matricei la pătrat:

Observăm folosirea sintaxei cu punct, pentru că avem nevoie de


înmulțire element cu element.
Vă recomandăm să încercați să scrieți toate aceste
operațiuni într-o singură linie de comandă. Vă veți testa
37
cunoștințele în ceea ce privește ordinea operațiilor, sintaxa cu
punct și vă îmbunătăți experiența de lucru în Matlab:

Evident, valorile obținute în matricea D nu sunt egale cu cele


obținute în matricea E, deoarece am plecat în fiecare caz de la o
matrice cu numere aleatoare între 0 și 1, respectiva matrice va
returna alte valori la fiecare generare.

2. Generați un șir de 6 numere întregi aleatoare impare


Rezolvare:
Pas1: Generăm un șir de 6 numere (o matrice de 1 rând și 6
coloane) aleatoare între 0 și 1:

Pas2: Înmulțim șirul cu 10, pentru a aduce valorile din


intervalul [0,1] în intervalul [1,10]:

38
Pas3: Eliminăm partea zecimală a valorilor:

Nu avem acces la nici o operație matematică simplă care să


poată transforma șirul într-unul de numere impare în mod direct.
Dacă însă vom înmulți șirul cu un întreg par, rezultatul va fi par.
Pas4:Transformăm șirul într-un șir de numere pare:

Acum este suficient de a aduna (scădea) șirului un întreg impar.


Pas5:Transformăm șirul într-un șir de numere impare:

Sau într-o singură linie de comandă:

39
3. Realizați sortarea descrescătoare a șirului x=[1 7 4 9 2]
Rezolvare:
Matlab ne pune la
dispoziție sortarea
crescătoare.
Cu ajutorul acesteia
și prin operații
matematice simple,
vom rearanja șirul x
într-o formă des-
crescătoare. Planul
este de a înmulți
șirul cu -1, a-l sorta
apoi crescător iar în
final a-l înmulți din
nou cu -1.
Se observă că
rezultatul îl stocăm
tot în variabila x -
enunțul ne cere să
sortăm descrescător
șirul, așadar valorile

40
rezultate vor trebui să fie conținute în aceeași variabilă. Acest
lucru poate crea o oarecare confuzie în rândul celor neinițiați în
programare. Aspectul este și mai evident atunci când folosim o
singură linie de comandă:

Acest tip de operație cu variabila conținută atât în membrul din


stânga cât și în membrul din dreapta este foarte întâlnit în
programare și nu trebuie să creeze confuzii. Practic, rândul se
poate citi: „Noii variabile x îi este atribuită valoarea rezultată în
urma operației din membrul drept, unde este folosită valoarea
vechii variabile x”
!Observație!
În exercițiile de mai sus se poate remarca faptul că eventualele
dificultăți nu apar din utilizarea Matlab-ului (am folosit
operațiuni matematice din școala primară), ci din planul
matematic - ingineresc care trebuie realizat pentru a rezolva
problema. Atunci când planul este solid și complet, Matlab
devine ceea ce trebuie să fie, adică doar un instrument pentru a
rezolva problema în mod rapid.

41
4. FUNCȚII ȘI POLINOAME. ECUAȚII

4.1 Introducere
Pe parcursul acestui capitol vom considera expresiile
ca fiind funcții de
variabila x și vom folosi pentru apelarea lor în Matlab notația y,
. Operațiile care implică funcții și de care ne vom
ocupa în cadrul acestui capitol sunt: calculul valorilor funcțiilor,
aflarea rădăcinilor funcțiilor și grafice de funcții.

4.2 Calculul valorilor funcțiilor


Calculul funcției
pentru un șir x de forma
înseamnă calculul valorilor expresiei
pentru fiecare valoare x(i)
din șirul x, . Exemplu:
Să se calculeze valorile funcției pentru
x luând valori în intervalul [-2,2] în 10 puncte.
Pas1: Definim șirul valorilor x pentru care calculăm funcția y:

42
Pas2: Calculăm valorile funcției:

În comanda de mai sus observăm folosirea sintaxei cu


punct. Echivalentul comenzii de mai sus, desfășurat, dacă nu am
avea acces la sintaxa cu punct, ar fi:

.
.
.

4.3 Exerciții:
1. Să se calculeze valorile funcțiilor sinus și cosinus între 0 și 2π
cu un pas de 0.1.
Rezolvare:

Nu afișăm rezultatele în exemplu, deoarece ar ocupa spațiu


inutil, așadar am folosit ; după expresii. Atenție, atunci când
vine vorba de unghiuri, Matlab lucrează în radiani.

43
2. Să se calculeze valorile funcției
pentru x luând valori din 1 în 1.
Rezolvare:
Situația aici este mai complicată, își schimbă forma în
funcție de interval. Rezolvarea, cu elementele pe care le
cunoaștem până acum, arată de felul următor:
Se definește variabila
x, separat, pe cele două
intervale

Se calculează cele
două forme ale
funcției, pe fiecare
interval, și rezultatele
se stochează în
variabile diferite

În final, funcției y i se
vor atribui valorile
obținute la pasul
anterior (în ultima
expresie cele două
șiruri se concatenează -
al doilea șir este
adăugat în continuarea
primului.

44
Pentru rezolvarea acestui tip de probleme în care își
schimbă forma în funcție de interval vom prezenta o metodă mai
elegantă după ce vom introduce elemente privind structurile
repetitive și structurile condiționale.

4.4 Șirul coeficienților unei funcții


Dacă avem funcția
, definim ca șir al coeficienților funcției șirul

Matlab ne oferă posibilitatea de a beneficia de operații


direct cu șirul coeficienților unei funcții (atunci când acesta este
cunoscut), avantajele majore ale acestui șir apărând la calculul
valorilor funcțiilor și la extragerea rădăcinilor acestora.
Calculul valorilor funcțiilor cu ajutorul șirului
coeficienților se realizează folosind comanda polyval. Exemplu:
Să se calculeze valorile funcției pentru
x luând valori între [-2,2] cu pas de 1.
Varianta clasică:

45
Varianta cu polyval:
Pas1: Definim același șir al valorilor x:

Pas2: Definim șirul coeficienților funcției:

Pas3: Calculăm funcția:

Evident, valorile funcției y sunt aceleași în ambele tipuri de


calcul.

!Atenție!
Există tendința ca, atunci când unul dintre coeficienți „lipsește”,
să-l „sărim”, să nu-l mai trecem în șirul coeficienților. Este o
greșeală foarte gravă, respectivul coeficient nu lipsește, ci este 0.
În exemplul anterior „nu apare” , dar în șirul coeficienților
este obligatoriu să trecem 0 în poziția lui. Dacă am fi scris

46
respectivul șir c=[3 -2 -1 -7], atunci funcția cu care lucra Matlab
era , nicidecum cea din enunț.
Calculul rădăcinilor funcțiilor cu ajutorul șirului
coeficienților se realizează folosind comanda roots. Exemplu:
Să se calculeze valorile funcției .
Matematic putem scrie:

Așadar rădăcinile funcției sunt


În Matlab se scrie:
Definirea șirului
coeficienților, din nou
atenție la 0 - ul final

Rezultatul este afișat


sub forma unei
matrici coloană,
conținând în ordine
rădăcinile , și

Dacă nu suntem mulțumiți de modul de afișare, nu ne oprește


nimic să-l schimbăm, folosind ceea ce știm deja:

Sortare (sort) și afișare


pe linie ( ' - rezultat
transpus)

47
4.5 Grafice de funcții
Pentru a realiza graficul în două dimensiuni al unei
funcții (de fapt, al unui set de valori y față de un set de valori x)
se folosește comanda plot(x,y). Exemplu:
Să se realizeze graficul funcției pentru
x luând valori între [-2,2] cu pas de 0.1.
Pas1: Calculul valorilor funcției:

S-a utilizat metoda care folosește șirul coeficienților


Pas2: Trasarea graficului:

48
În această formă, graficul nu este în nici un fel
spectaculos, nici din punct de vedere al informațiilor oferite, nici
din punct de vedere al prezentării. Matlab ne oferă însă
posibilitatea de a manipula acest grafic pentru a-l aduce în forma
dorită.
Stabilirea titlului și etichetelor axelor:

De asemenea, tot de la tastatură se poate alege tipul de


linie și culoarea cu care să fie trasat graficul:

49
După cum se poate observa, în comanda cu care se
trasează efectiv graficul s-a adăugat în paranteză '--g'. Aceștia
sunt doi parametri cu ajutorul cărora se poate schimba tipul și
culoarea liniei cu care e trasat graficul. În cazul nostru, exemplul
se traduce prin „realizează graficul cu linie întreruptă și verde”.
Din punct de vedere al culorilor, variantele posibile sunt Red
Green Blue Cyan Magenta Yellow blacK (r,g,b,c,m,y,k) iar din
punct de vedere al tipului de linie se poate alege dintre - -. -- : . o
x * + s(quare) d(iamond) p(entagram) < > ^ (ultimele trei
simboluri stabilesc tipul liniei sub formă de triunghiuri cu vârful
orientat precum cel descris de fiecare simbol).
Parametrii se definesc în interiorul funcției plot, între
apostrofuri, și nu contează ordinea în care sunt definiți. De
exemplu, dacă în cazul nostru scriam plot(x,y,'g--') rezultatul
era identic.

50
4.6 Grafice multiple
Există două situații comune de care ne lovim atunci când
lucrăm cu grafice: fie dorim să afișăm simultan mai multe
grafice pe același spațiu de lucru, fie dorim ca, peste un grafic
deja existent în spațiul de lucru, să suprapunem un nou grafic,
proaspăt realizat. În Matlab trebuie acordată atenție deosebită
acestui aspect deoarece, în mod implicit, un nou grafic afișat
înlocuiește figura deja existentă pe ecran. De exemplu, avem
șirul de valori x și două funcții y(x) și z(x) pentru care dorim să
realizăm graficele. Dacă scriem plot(x,y) se va realiza primul
grafic, dar apoi dacă scriem plot(x,z) se va realiza cel de-al
doilea, dar primul va dispărea. Comanda pentru a le afișa
simultan ar fi plot(x,y,x,z). Exemplu:
Să se realizeze (simultan) graficul funcțiilor sinus și cosinus,
între 0 și 2π, în 50 de puncte.

Se poate observa că, în cazul graficelor afișate simultan, dacă nu


este specificată culoarea liniei, Matlab va trasa graficele cu
culori diferite. Evident, și în cazul graficelor multiple, culoarea
51
și tipul de linie pot fi definite individual. De asemenea, am
adăugat un caroiaj graficului. Acest lucru se realizează cu
comanda grid:

Grid este una dintre acele „setări de stare” ale Matlab-


ului, cu opțiunile on și off.
În al doilea caz, în care se dorește trasarea unui nou
grafic peste unul deja existent, se folosește setarea de stare hold,
cu aceleași argumente, on și off. Exemplu:
Să se realizeze graficul funcției sinus, între 0 și 2π, în 50 de
puncte, iar apoi, pe același suport, să se afișeze și graficul
funcției cosinus.

O primă diferență se observă direct: cele două grafice


sunt realizate cu aceeași culoare a liniei. În cazul afișării mai
multor grafice pe același suport, setarea culorilor sau / și
tipurilor de linie diferite între graficele afișate este insistent
recomandată. De asemenea, atenție la variabilele de stare, în

52
special la hold, nu uitați să dezactivați această opțiune când nu
mai este necesară (hold off).

4.7 Lucrul direct pe grafic


Una dintre cele mai puternice facilități pe care le oferă
Matlab în ceea ce privește graficele sunt instrumentele de lucru
direct pe grafic. Din fereastra în care se afișează graficul se pot
stabili atât elementele pe care le-am prezentat mai sus (etichete
pentru axe, titlu, tip și culoare linie, caroiaj) cât și multe altele.
În momentul în care veți stăpâni graficele în Matlab, veți
renunța la alte aplicații ce le foloseați în acest scop (Excel etc.)

53
4.8 Grafice în trei dimensiuni
Dacă îi oferim cele trei seturi de coordonate, Matlab
poate afișa și grafice în trei dimensiuni. Exemplu:
Fie x între 0 și 2π, în 50 de puncte. Să se realizeze graficul în
trei dimensiuni cu axele {x, sin(x), cos(x)}.
Pas1: Se definesc cele trei axe:

Pas2: Se realizează graficul în 3 dimensiuni, cu comanda plot3:

Graficele în trei
dimensiuni se pot
roti astfel încât să
fie afișate din
perspectiva dorită.

54
4.9 Exerciții
1. Realizați graficul funcției pentru x între -3
și 3, cu caroiaj, folosind 50 de puncte, culoarea roșie și linie
întreruptă.
Pas1: Definim valorile pentru care vom calcula funcția:

Pas2: Calculăm valorile funcției:

sau

Pas3: Trasăm graficul funcției:

55
2. Realizați cu caroiaj graficul funcției pentru x
luând valori între 0 și 1, cu interval de 0.01.

3. Realizați pe fond bleu, cu linie roșie întreruptă și groasă de 4


pixeli, cu etichete, graficul pentru funcția ,
pentru x luând valori pe intervalul -1,1 în 100 de puncte.

56
4.10 Sisteme de ecuații liniare compatibil determinate
Sistemele de ecuații liniare compatibil determinate se
rezolvă foarte simplu cu ajutorul Matlab-ului.
Avem sistemul:

Scriem matricea coeficienților sistemului:

Scriem matricea termenilor liberi:

Urmărim să aflăm matricea necunoscutelor:

În Matlab, soluțiile sistemului se obțin cu comanda


linsolve(A,B). Exemplu:

57
Fie sistemul . Să se verifice dacă este

compatibil determinat și, în cazul în care este, să se afle


soluțiile.
Rezolvare:
Pas1: Verificare dacă sistemul e compatibil determinat:
Pentru ca sistemul să fie compatibil determinat trebuie ca
matricea sistemului să fie nesingulară - determinantul matricei
să fie diferit de 0.

Pas2: Calculul soluțiilor sistemului:

Același efect se obține și cu comanda A\B (backslash).

58
4.11 Interpolare polinomială
În practică, în urma înregistrărilor făcute pentru
măsurarea unui fenomen sau proces în timp se obțin o serie de
tabele cu date experimentale. Dacă se pun într-un grafic și se
unesc punctele respective, se obțin grafice ale funcțiilor care
reprezintă respectivul fenomen sau proces. Funcțiile propriu-zise
nu sunt cunoscute, dar se cunosc valorile acestora în momentele
în care au fost măsurate. Funcțiile nu pot fi determinate exact,
dar este necesar să operăm cu aceste funcții și, uneori, sunt
necesare și valori care nu se regăsesc în tabelele cu înregistrări.
Din acest motiv este util să se găsească aproximări ale acestor
funcții, valabile pe întreg intervalul studiat.
Cele mai simple funcții care pot aproxima funcțiile
exacte sunt polinomialele, care vor fi utilizate în cele ce
urmează.
Ideea din spatele aproximării polinomiale este de a găsi
un polinom de un anumit grad a cărui evoluţie grafică să „se
suprapună” cât mai bine peste punctele graficelor noastre.
Trebuie să definim, de asemenea, într-o formă precisă, noțiunea
de „a se suprapune” cât mai bine. Ar exista mai multe
posibilități de abordare a aproximării polinomiale.

Interpolarea cu un polinom de gradul n:


Dacă avem un număr de n+1 înregistrări, se poate găsi
un polinom de grad n de forma
cu care să treacă prin toate punctele date
. Coeficienții polinomiali pot fi determinați prin
condiția anterioară. Rămâne de rezolvat sistemul linear:

59
Problema care apare în acest caz este că, pentru n mare,
sistemul linear devine instabil, determinantul sistemului având
valori foarte mari. Dificultatea poate fi ocolită dacă se iau un
număr mai mic de înregistrări și se consideră separat polinoame
de grad mai mic pentru un număr de înregistrări consecutive. De
exemplu, se pot lua primele 5 înregistrări și se construiește un
polinom de grad 4. Apoi se iau înregistrările începând de la a 2
la 6 și se construiește un alt polinom de grad 4 și așa mai
departe. Principalul avantaj al acestei metode este că starea
fenomenului studiat poate fi aproximată printr-o funcţie cu
coeficienţi ficşi, care poate fi la rândul ei procesată mai departe
pentru alte scopuri, cum ar putea fi determinarea unor parametri.
Matlab ne pune la dispoziție posibilitatea de a folosi polinoame
de aproximare direct pe grafic. Exemplu:
Luăm un șir de 10 măsurători experimentale ale
comportamentului unui sistem în timp. Cum nu avem în acest
volum posibilitatea practică de a obține aceste date, generăm un
șir de 10 numere aleatoare între 1 și 10, care presupunem că ar
reprezenta șirul nostru de măsurători experimentale.

60
y - valorile noastre experimentale
x - momentele în timp pentru aceste valori
Interpolarea polinomială se poate alege din meniul Tools / Basic
Fitting:

În cazul de mai sus, s-a ales pentru datele noastre


interpolarea cu un polinom de ordinul 7. După cum se poate
observa, aproximarea este departe de a fi perfectă dar totuși
polinomul redă destul de bine distribuția datelor noastre
experimentale. Pentru a vedea forma matematică a polinomului
de interpolare, asigurați-vă că ați bifat „Show equations”.

Interpolarea cu funcții Spline


O metodă superioară, în cazul în care există interesul în a
obţine o formă cât mai exactă a funcţiei de interpolare, este
folosirea funcţiilor Spline. Pentru experimentul de față a fost

61
utilizată interpolarea cu funcţii cubice Spline, care este pusă la
dispoziţie de aplicaţia Matlab. În interpolarea cu funcţii Spline,
funcţia cu ajutorul căreia se realizează interpolarea este un tip
special de polinom care efectuează interpolarea interval cu
interval. Practic, funcţia va trece prin toate punctele dar
coeficienţii ei se vor modifica pe fiecare interval al graficului
pentru care se realizează interpolarea.
Pentru a putea analiza matematic seturile de date
experimentale este nevoie de o serie de funcţii care ideal ar fi să
treacă prin toate punctele şi cu ajutorul cărora să poată fi
determinată matematic poziţia sistemului oriunde pe durata
evoluției acestuia în timp. După cum am spus, o funcţie care să
fie unică şi care să treacă prin toate punctele dorite este de
obicei foarte greu dacă nu imposibil de găsit, de aceea se preferă
o aproximare pe segmente. Fiecărui segment i se ataşează un
polinom de gradul al treilea (o expresie cubică), acesta trecând
prin cele două puncte (cele două capete ale segmentului). În
final, se obţine o funcţie pe segmente, continuă, de forma:

unde este un polinom de gradul trei definit de expresia:

pentru .
Principalul dezavantaj al metodei de aproximare cu
funcţii Spline vine tocmai din natura multi-polinomială a acestor
62
funcții de interpolare. Faptul că funcţia îşi schimbă forma de la
segment la segment face post-procesarea datelor destul de
complicată, chiar dacă putem obţine destul de uşor în Matlab
coeficienţii de la .
Codul pentru generarea funcției spline cubice de aproximare și
afișarea peste graficul punctelor:

Graficul:

După cum se poate observa, interpolantul spline cubic


are o comportare mult mai exactă decât polinomul de ordinul 7,
în sensul în care trece prin toate punctele. Pentru fiecare curbă
care unește două puncte consecutive, interpolantul este de forma
unei cubice cu coeficienți diferiți. Lista coeficienților se poate
obține cu comanda cs.coefs:

63
Coeficienţii de pe primul rând din tabelul de mai sus
reprezintă coeficienţii corespunzători polinomului de interpolare
al primului segment. De exemplu, pentru primul segment,
cubica de interpolare este
.

4.12 Ecuații diferențiale în Matlab


Rezolvarea ecuațiilor diferențiale în Matlab nu este un
lucru ușor, s-ar putea realiza un volum dedicat doar acestui
subiect. În lucrarea de față vom prezenta un exemplu de ecuație
diferențială liniară de ordinul întâi, folosind cel mai popular
solver oferit de Matlab, și anume ode45, un solver de ordinul 4,
bazat pe metoda Runge-Kutta.
Exemplu:
În urma unui dezastru, un grup de persoane au rămas izolate pe
coasta unui munte. Ei trebuie recuperați de o expediție a
alpiniștilor, dar până atunci au nevoie de provizii. Avioanele nu
64
pot ateriza dar pot arunca provizii. Pachetele au 40kg fiecare și
le sunt instalate parașute (considerăm rezistența adusă
de parașută). Viteza inițială este zero, căutăm viteza maximă
care se va atinge. Ecuația care guvernează mișcarea este:

Rezolvare:
Primul lucru care se urmărește este să obținem o ecuație de
forma:

Așadar, ecuația noastră devine:

sau:

Pentru pasul următor, va trebui să pregătim funcționarea solver-


ului ode45. Acestuia trebuie să-i punem la dispoziție o funcție în
format Matlab care definește funcția din problemă, condițiile
inițiale (viteza inițială zero) și perioada de timp în care să fie
căutată soluția.
Pentru primul pas, va trebui să scriem și să salvăm un fișier în
Matlab de felul următor:

Salvăm fișierul ca f.m în directorul activ al Matlab.


Acum scriem într-un alt fișier .m codul care ne va oferi soluția:

65
Iar rezultatul grafic va fi:

Așadar viteza maximă care se va atinge va fi în jur de 35m/s.

Solverul Matlab nu știe să rezolve decât ecuații


diferențiale de ordinul întâi. Pentru rezolvarea ecuațiilor de
ordinul al doilea, trebuie să introducem o variabilă suplimentară
cu care să „transformăm” ecuația într-una de ordinul întâi, apoi
după ce determinăm acea variabilă (care va fi un vector) să o
înlocuim în ecuație, care devine apoi una de ordinul întâi,
rezolvabilă după cum am prezentat mai sus.

66
Pentru a face munca mai ușoară celor interesați de
ecuații diferențiale, ne-am gândit să adăugăm două tabele de
derivare și integrare pentru funcții simple:

TABEL DERIVATE SIMPLE


Funcția Derivata
1

67
TABEL PRIMITIVE SIMPLE
Funcția Derivata

68
4.13 Suprafețe în trei dimensiuni
În geometria în trei dimensiuni, o funcție de două
variabile de genul reprezintă o suprafață. Pentru a
putea reprezenta respectiva suprafață în Matlab, vom folosi
comanda mesh. Este necesară în prealabil o anumită „pregătire a
terenului” - folosind valorile x și y va trebui să creăm o structură
matriceală în două dimensiuni, iar pentru aceasta vom folosi
funcția meshgrid. Să luăm un exemplu:
Reprezentați grafic funcția a cărei ecuație este dată de:

pe domeniul , , cu pas de 0.1

69
Exemplu:
Reprezentați suprafețele plane:

pe domeniul , , cu pas de 0.1


Partea de calcul:

Partea de afișare:

Rezultatul:

70
5. OPERATORI STATISTICI

5.1 Introducere
În lucrul cu date experimentale, de cele mai multe ori
volumul acestora este atât de mare încât datele, în forma în care
sunt ele, nu pot fi folosite sau prezentate într-un mod eficient.
De exemplu, dacă prelevăm date experimentale de la o
componentă a unui autovehicul (cum ar fi o punte) pe traseu, de-
a lungul câtorva săptămâni de zile, atunci când vrem să evaluăm
respectivele date experimentale este imposibil să ne putem face
o idee urmărind valorile una câte una. În realitate, toate aceste
valori se strâng într-o bază de date, urmează apoi anumite
prelucrări ale acestora, pentru ca în final să reprezentăm acele
valori printr-un anumit parametru, pe care l-am denumit aici
operator statistic. Ne vom ocupa pe parcursul acestui capitol de
media aritmetică, mediana, abaterea medie pătratică (sau
abaterea standard) și dispersia.

5.2 Media aritmetică


Media aritmetică a unui șir de valori se calculează
însumând elementele șirului și împărțind respectiva sumă la
numărul de elemente din șir. Exemplu: să se calculeze media
aritmetică a valorilor unui șir de la 1 la 6, cu pas de 1.
Pas1: Definim șirul de valori:

71
Pas2: Calculăm media aritmetică - determinăm suma
elementelor, pe care o împărțim la lungimea șirului

Sau, scris într-o singură


linie de comandă

Matlab ne pune la dispoziție o comandă prin care putem


calcula direct media aritmetică. Aceasta este mean:

5.3 Mediana
De multe ori, media aritmetică nu este o mărime care să
reflecte eficient repartiția (natura, tendința) datelor noastre

72
experimentale. Pentru consumul de combustibil, media
aritmetică este metoda după care se calculează „consumul
mediu”, o mărime statistică eficientă în acest caz. Sunt unele
cazuri în care media aritmetică nu este însă relevantă.
Într-un șir ordonat de lungime impară, mediana
reprezintă valoarea de la mijlocul șirului. Într-un șir ordonat de
lungime pară, mediana reprezintă media aritmetică a celor două
valori de la mijlocul șirului. Exemplu:
Să se calculeze mediana pentru șirul de măsurători x=[-1 1 2 -2
3 1 0 14].
Pas1: Definim șirul de valori:

Pas2: Sortăm șirul și-i calculăm lungimea (presupunem că nu o


cunoaștem):

73
Pas3: Scriem rutina de calcul a medianei:

Rutina de mai sus se poate citi în felul „Dacă restul


împărțirii lungimii șirului la 2 este zero - cu alte cuvinte, dacă
șirul este par - atunci mediana este media aritmetică a valorilor
de la mijlocul șirului ordonat, altfel - dacă șirul este impar -
mediana este valoarea de la mijlocul șirului ordonat”. În
respectiva rutină am folosit o structură condițională (if) -
structurile condiționale și repetitive vor fi prezentate în capitolul
7, secțiunea dedicată structurilor repetitive și condiționale.
Matlab ne pune la dispoziție o comandă prin care putem calcula
direct mediana. Aceasta este median (nu este necesară
ordonarea șirului în prealabil):

Pentru a înțelege mai bine acest operator statistic, să


analizăm diferența dintre mediană și media aritmetică, a cărei
valoare pentru șirul nostru este 2.25. Se observă destul de ușor

74
că majoritatea valorilor noastre sunt mai apropiate de 1 decât de
2.25. De fapt, ceea ce se întâmplă este că valoarea 14, fiind mult
prea mare (probabil, o eroare de măsurare) practic „strică”
media aritmetică a șirului nostru de măsurători. Media
aritmetică fără valoarea 14 ar fi fost 0.57, o valoare mult mai
aproape de repartiția (tendința) datelor noastre experimentale.

5.4 Abaterea medie pătratică (abaterea standard) și


dispersia
În cazul unui șir de valori, abaterea medie pătratică sau
abaterea standard se calculează ca o medie pătratică simplă sau
ponderată a abaterilor valorilor șirului față de media lor
aritmetică. Pătratul abaterii standard poartă numele de dispersie.
De multe ori, nici media aritmetică și nici mediana nu ne
oferă informații corecte privind repartiția datelor noastre
experimentale. De exemplu, să presupunem că proiectăm un
automat de cafea: introducem cafea într-un compartiment și apă
în rezervor, iar la fiecare apăsare a butonului automatul ar trebui
să livreze 200ml de cafea. Observăm însă că în testarea
prototipului, aparatul umple primul pahar cu 150ml, al doilea cu
200ml și al treilea cu 250ml de cafea.
Dacă ne-am raporta la media aritmetică, lucrurile ar
părea în regulă, aceasta având, pentru șirul nostru de măsurători,
valoarea 200. Dacă am calcula mediana, am ajunge tot la
valoarea 200, cea pentru care automatul a fost proiectat. Dacă
am considera doar acești doi operatori statistici, am putea ajunge
la concluzia că aparatul nostru funcționează perfect, pe când
lucrurile nu stau deloc așa, vedem cu ochiul liber diferențele

75
foarte mari de lichid dintre pahare. Din cauza acestor situații a
fost introdus operatorul statistic numit dispersie, având formula:

unde elementul curent (elementul de indice i)


media aritmetică a șirului x
probabilitatea de apariție a evenimentului
lungimea șirului

În cazul cel mai comun în care avem aceeași


probabilitate de apariție a evenimentului (sau aceasta nu se
cunoaște și se consideră ca fiind aceeași), dispersia devine:

iar abaterea medie pătratică:

Matlab ne pune la dispoziție o comandă prin care putem calcula


direct dispersia și abaterea medie pătratică. Acestea sunt var
pentru dispersie și std pentru abaterea medie pătratică. Cu cât
valorile pentru aceste două mărimi sunt mai mari, cu atât
distribuția șirului nostru de măsurători este mai împrăștiată
(practic, pentru o funcționare eficientă a unei operațiuni stabile,

76
se urmărește a se obține valori cât mai mici pentru aceste
mărimi)
Exemplu:
Să se calculeze dispersia și abaterea medie pătratică a șirului de
măsurători x=[7 8 8 7 8 12 13 12 12 13].
Pas1: Definim șirul de valori:

Pas2: Calculăm dispersia și abaterea medie pătratică:

Relația dintre dispersie și


abaterea medie pătratică

Pas3: Interpretarea rezultatelor:


Pentru a interpreta rezultatele, calculăm media aritmetică și
mediana șirului de valori:

77
Se observă că ambele au valoarea 10, deci șirul nostru ar trebui
să conțină elemente în jurul acestei valori. Din păcate, abaterea
medie pătratică este prea mare, măsurătorile noastre arată că este
ceva în neregulă cu fenomenul măsurat. Pentru lămurire, să
vedem cum ar fi arătat cei doi operatori statistici pentru un șir cu
valori apropiate de 10:

!Atenție!
Matlab folosește o formulă de calcul modificată pentru dispersie
(relația cu abaterea medie pătratică rămâne), dar care este
întâlnită în mod comun în perioada recentă:

78
5.5 Exerciții
1. Să se genereze un șir de 10 numere aleatoare între 0 și 10, să
se calculeze și să se pună în evidență grafic media aritmetică,
mediana, dispersia și abaterea medie pătratică.
Rezolvare:
Pas1: Generăm șirul de numere aleatoare între 0 și 10:

Pas2: Calculăm operatorii statistici ceruți în enunț:

Media aritmetică Abaterea medie


și mediana pătratică și dispersia

79
Urmează să așezăm punctele șirului x și operatorii statistici pe
un grafic:
Definim y ca fiind o scală
de la 1 la 10
Definim 3 șiruri cu 10
elemente, primul (z) cu
valoarea mediei aritmetice,
al doilea (t) cu valoarea
medianei și ultimul (v) cu
Realizăm graficul și, folosind valoarea dispersiei.
elemente de lucru direct pe
grafic, punem în evidență mărimile dorite:

80
6. ANALIZĂ MODALĂ

6.1 Introducere
În mecanică, analiza modală se regăsește în domeniul
vibrațiilor. Analiza la vibraţii înseamnă o analiză de vectori şi
valori proprii.
- vibraţiile sunt de 2 feluri – de torsiune (răsucire) şi
longitudinale (încovoiere)
- de torsiune – piese în mişcare de rotaţie - arbore cotit
- longitudinale – de încovoiere – şasiu

6.2 Exemplu – arbore cotit


Vom considera un exemplu pentru un arbore cotit cu 3
cilindri.
Arborele cotit e un sistem mecanic continuu (dintr-o bucată) iar
pentru a fi analizat la vibraţii i se ataşează un sistem elastic
echivalent – practic, arborele şi toate elementele lui sunt
înlocuite cu un sistem elastic echivalent, format din rotori
caracterizaţi prin momentele de inerţie date de sistemul bielă –
manivelă şi constantele elastice ce leagă aceşti rotori (aceste
momente de inerţie).

81
Analiza la vibraţii se face pentru a determina vibraţiile
proprii (în cazul în care sistemul mecanic este liber) şi vibraţiile
forţate (în cazul în care sistemul mecanic este solicitat).
Când se proiectează un arbore cotit, trebuie avut în
vedere ca turaţiile critice date de vibraţii să nu fie egale cu
turaţiile funcţionării motorului la cuplu maxim sau la putere
maximă. De exemplu, dacă un motor este proiectat la 2500 de
ture pentru puterea maximă şi 1800 pentru cuplu maxim, e
foarte important ca turaţiile critice de vibraţii să nu fie egale cu
acestea sau în jurul valorii acestora.
La sistemul solicitat se află doar amplitudinile
vibraţiilor. Pentru analiză, se scriu ecuaţiile de echilibru.
În cazul cel mai general, ecuaţiile de echilibru, dacă apar
şi amortizări şi solicitări, acestea se vor scrie sub forma:

J    C    K   F 


.. .

   

82
J  matricea momentelor de inerţie
C  matricea amortizărilor
K  matricea constantelor elastice (matricea de rigiditate)
F  vectorul solicitărilor

Pentru F=0 avem cazul vibraţiilor libere (F~=0  vibraţii


forţate)

Sistemul nostru simplificat arată cam aşa:

J1 J3

J2

k1 k2

  pulsaţiile proprii, necunoscuta care se calculează. Pentru


simplificare se ia un sistem echivalent cu 3 rotori (volanţi),
pentru care {F}=0 şi [C]=0 – solicitările şi amortizările sunt
nule. Sistemul se reduce la:

J    K   0


..

 

83
Rezolvarea acestui sistem se face căutând soluţii de
forma i (t )  ai cos(t   ) , soluţii armonice de aceeaşi pulsaţie
dar cu amplitudini diferite.
Se calculează a doua derivată pentru  , se înlocuieşte în
sistemul (1), din care rezultă sistemul de ecuaţii omogen:
K    2  j*    0
care admite soluţii (în afară de cea banală, 0) dacă şi numai dacă
determinantul sistemului e 0
Dacă se dezvoltă determinantul se obţine un polinom în
P   det K    2  j *    0 , un polinom de gradul n,
2

unde n este dimensiunea sistemului (n e egal cu numărul de


rotori) – polinomul poartă denumirea de polinom caracteristic.
Ecuaţia P( )  0 (unde    2 ) poartă numele de ecuaţie
caracteristică, sau ecuaţia valorilor proprii. Mărimile i se
numesc pulsaţiile proprii ale sistemului (sau valori proprii ale
sistemului). Pulsaţia cea mai joasă se numeşte pulsaţie
fundamentală.
Frecvenţele proprii se calculează fi  i / 2 şi turaţiile critice
t i  2 / i
Turaţia de funcţionare a motorului la puterea maximă
sau la cuplul maxim nu trebuie să se suprapună peste turaţia
critică t i calculată mai sus.
Să luăm un exemplu concret pentru 3 volanţi cu aplicaţie în
Matlab. Pornind de la nişte date iniţiale pentru J şi K, se obţine
determinantul:

84
2 2 0
D  3 5 2 0
0 2 2
Rezultă ecuaţia 3  92  14  0

Se caută rădăcinile ecuației. Soluţiile se obţin în Matlab prin:

Soluţiile se pot obţine direct din matricea caracteristică:

cu comanda eig:

unde eig=eigenvalues=valori proprii ale sistemului.


Soluţiile în cazul nostru sunt {0, 2, 7}

85
Pentru o soluție completă care să includă și vectorii proprii, se
va folosi comanda:

Valorile proprii se ordonează crescător şi se obţin cele trei


moduri de vibraţie corespunzătoare celor din figura de mai jos:

86
7. MODUL PROGRAM. INTRODUCEREA ȘI AFIȘAREA
DATELOR. STRUCTURI REPETITIVE ȘI STRUCTURI
CONDIȚIONALE

7.1 Introducere
Până acum am lucrat doar în modul linie de comandă,
adică am scris fiecare linie de cod, de la tastatură, direct în
fereastra care se deschide implicit în Matlab, apăsând tasta
<Enter> după și așteptând un rezultat. Pentru operații simple,
modul linie de comandă este atât suficient cât și eficient, dar
când problemele se complică (vom prezenta anumite structuri
mai complicate din programare în acest capitol) lucrul direct în
linie de comandă nu mai este eficient.
Principalele avantaje ale modului de lucru program sunt
faptul că putem modifica în cod atunci când greșim și ne putem
salva munca sub forma unui fișier (fișierele clasice în Matlab au
extensia .m). Modul program poate fi pornit fie din meniul File
New Blank M-File fie cu combinația de taste <Ctrl> <N>

87
Odată cu pornirea modului program se va deschide o
fereastră a editorului de cod din Matlab. După terminarea
introducerii codului, programul poate fi rulat la apăsarea tastei
<F5>.

7.2 Introducerea datelor de la tastatură.


Unul dintre avantajele utilizării informaticii în tehnică
este că, folosind programe informatice, o problemă este
rezolvată în mod generic. De exemplu, dacă trebuie să calculați
raportul de transmisie al unui reductor pe baza unor date de
intrare, nu va trebui să scrieți de fiecare dată când aceste date de
intrare se schimbă un nou program. Pentru aceasta însă va trebui
să folosim instrucțiuni care „cer” utilizatorului date de la
tastatură. În Matlab, o astfel de instrucțiune este input:

La rularea programului (cu <F5>) vi se va deschide o


fereastră în care vi se va cere să salvați fișierul cu un anumit
nume și într-o anumită locație. Dacă locația pe care o alegeți nu
este cea implicită, este foarte probabil ca să trebuiască să o
adăugați în lista de locații cunoscute Matlab-ului (din fereastra
de dialog care apare, alegeți Add to Path). Acest lucru va trebui
să-l faceți o singură dată pentru fiecare locație nouă. După
salvare, programul va rula iar pe ecran va apărea mesajul
„introduceți valoarea”.

88
89
Observăm în exemplul de mai sus că atunci când
introducem valoarea 15, aceasta apare lipită de text.
Recomandarea noastră este să evitați astfel de situații, acest
lucru realizându-se foarte ușor din codul programului (adăugăm
un spațiu înainte de a închide apostroful).
Codul vechi
Codul nou
Variabilei i se pot asocia și valori matriceale:

Variabilei i se pot asocia și „valori” text, acestea trebuie


introduse între apostrofuri:

90
7.3 Instrucțiuni de afișare
O importanță aparte în programare o are și modul de
afișare a datelor. De exemplu, să presupunem că dorim să
realizăm un program de calcul al rădăcinilor ecuațiilor.
Realizăm programul în două moduri și iată rezultatele:
Prima variantă:

Programul ne întâmpină cu:

Având în vedere că știm despre ce este vorba, introducem între


paranteze pătrate șirul coeficienților funcției ale cărei rădăcini le
calculăm, fie aceasta :

La prima vedere nimic greșit, programul returnează în


mod corect rădăcinile funcției alese de noi, ordonate crescător
sub forma unei matrici linie. Acum să presupunem că altcineva
va rula acest program, fără a ști ce am urmărit noi atunci când l-
am creat. Nu va ști nici la ce se referă variabila a, nici că
programul așteaptă introducerea unei matrici linie între
paranteze pătrate, și chiar dacă va „nimeri” tipul de date
introdus, combinația va trebui să fie destul de inspirată pentru a
putea interpreta rezultatele (pentru a-și putea da seama „ce face
programul”, anume că respectivele rezultate reprezintă

91
rădăcinile unei funcții cu coeficienții conținuți în variabila a). Să
comparăm acum funcționalitatea programului cu următoarea:
Varianta a doua:
Codul programului este următorul:

Ca rezultate vom avea:

Este evident că, din punct de vedere al prezentării, a


doua variantă este mult mai explicită. Pentru afișarea textului
am folosit comanda disp, cu textul de afișat între apostrofuri.
Ceva este totuși neplăcut la afișarea de mai sus, am fi preferat ca
prezentarea să arate cam așa, cu textul și rezultatele una lângă
cealaltă:

Din păcate, Matlab nu știe în mod implicit să afișeze


legat cele două tipuri de informație, deoarece prima parte este de
tip șir de caractere, iar cea de-a doua sub formă numerică.
Pentru a le putea afișa împreună va trebui să transformăm partea
numerică în șir de caractere, cu ajutorul comenzii int2str. Iată
sintaxa:

Trebuie reținute două aspecte la care uneori se greșește


în codul de acest gen: în comanda disp trebuie folosite

92
parantezele drepte din interiorul celor rotunde, iar în partea de
text, pentru a nu fi afișată lipită de rezultate, trebuie adăugat un
spațiu înainte de ultimul apostrof.

7.4 Exerciții
1. Să se realizeze un program care să împartă în factori primi un
număr introdus de la tastatură.
Rezolvare:
Codul programului:

Din motive de afișare s-a lăsat un spațiu și după primul apostrof


din cadrul textului în comanda disp.
Rezultat:

2. Să se calculeze şi să se afişeze pe ecran suma şi produsul a


două numere introduse de la tastatură.
Rezolvare:
Codul programului:

Rezultat:

93
3. Să se calculeze şi să se afişeze restul împărţirii a două numere
întregi
Rezolvare:
Codul programului:

Rezultat:

Afișarea este elegantă dar incorectă. Restul împărțirii


celor două numere este 2 dacă împărțim 7 la 5, în schimb dacă
împărțim 5 la 7, restul este 5, așadar formularea cum că „restul
împărțirii celor două numere este 2” este incorectă. Trebuie
acordată atenție deosebită acestor aspecte, pentru a nu se crea
confuzii.
Codul corect se complică puțin:

Rezultate (programul a fost rulat de două ori):

Recomandarea noastră este de a nu folosi diacritice în


lucrul cu Matlab. Unele sunt recunoscute și altele nu, iar chiar

94
dacă editorul de texte vă va lăsa să introduceți ș și ț, acestea nu
vor fi afișate corect.

7.5 Structuri repetitive


Structurile repetitive sau iterative (sau pur și simplu,
iterațiile) reprezintă structuri de bază în programare. Cu ajutorul
acestor structuri, programul cere calculatorului să execute în
mod repetat (de un număr de ori specificat de obicei la începutul
structurii) o serie de instrucțiuni, mai exact un anumit procedeu
de calcul prin aplicarea lui la rezultatul calculului din etapa
precedentă. În Matlab, comanda care determină începutul unei
structuri repetitive este for, iar cea care stabilește sfârșitul
ciclului este end. Instrucțiunile cuprinse între for și end
reprezintă procedeul de calcul care se va repeta de-a lungul
ciclului. Exemplu:
Realizați un program care să calculeze și să afișeze suma
numerelor naturale de la 1 la 10:
Codul:

Rezultat:

Codul se poate citi „pentru i de la 1 la 10 cu pas de 1,


noii variabile s i se atribuie valoarea din pasul anterior al
variabilei s la care se adună valoarea curentă a lui i”.

95
Pentru o mai bună înțelegere vom face o prezentare a
procesului, pe pași:

Și rezultatul final:

Ca exercițiu pentru a vă testa cunoștințele în ceea ce


privește afișarea, vă recomandăm să modificați programul
prezentat de noi inițial într-un fel în care afișarea se realizează
explicit, pe pași, ca mai sus.

96
7.6 Structuri condiționale
Ca și cele repetitive, structurile condiționale reprezintă
structuri de bază în programare. Când scriem un program, apar
multe situații în care ne-am dori ca sistemul de calcul să aleagă
execuția doar a unuia dintre două sau mai multe procedee
matematice diferite, în funcție de un anumit eveniment. Pentru
aceasta, limbajul de programare trebuie să aibă abilitatea de a
evalua diferite situații și de a alege acțiunea potrivită în urma
acestei evaluări. Întregul proces se numește în programare
testarea condițiilor, sau parcurgerea unei structuri condiționale.
Deși structurile condiționale există în absolut toate
limbajele de programare iar funcționalitatea lor este similară,
sintaxa folosită diferă de la un mediu de programare la altul. În
Matlab, prima și cea mai importantă structură condițională este
cea al cărei început este determinat prin comanda if și care se
sfârșește prin comanda end, pe parcurs putând apărea ramificații
condiționale precum elseif și else:
if <condiţie 1> Dacă se îndeplineşte condiţia 1, se execută primul set de
comenzi și structura ia sfârșit
<comenzi 1>
elseif <condiţie 2> Dacă nu se îndeplinește condiția 1 dar se îndeplineşte condiţia 2,
<comenzi 2> se execută al doilea set de comenzi și structura ia sfârșit

Dacă nu se îndeplinește niciuna dintre condițiile de la 1 la n-2


elseif <condiţie n-1> dar se îndeplineşte condiţia n-1, se execută setul de comenzi n-1
<comenzi n-1> și structura ia sfârșit
else Dacă nu se îndeplinește nici o condiție dintre cele anterioare, se
<comenzi n> execută setul de comenzi n și structura ia sfârșit

end

97
Exemplu:
Să se dezvolte un program care să ceară utilizatorului să-și
introducă de la tastatură vârsta. Dacă vârsta este sub 3 ani, să se
afișeze mesajul „Ești un bebeluș”, dacă vârsta este între 3 și 15
ani să se afișeze „Ești un copil”, între 15 și 39 „Ești un tânăr”,
între 40 și 65 „Ești în floarea vârstei” iar peste 65 „Ești bătrân”.
Rezolvare:
Codul:

Rezultatele (program rulat de 5 ori, 5 valori diferite):

98
Se pot observa în cod, în interiorul condițiilor, o serie de
operatori. Aceștia sunt de două feluri, operatori condiționali,
care testează dacă o anumită condiție este îndeplinită, și
operatori logici, care conectează doi operatori condiționali și
returnează adevărat sau fals în funcție de valorile returnate de
cei doi operatori condiționali. În logica booleană, rezultatul unei
condiții care se adeverește (adevărat) este 1, iar rezultatul unei
condiții care nu se adeverește (fals) este 0. Vom folosi aceste
notații pentru a explica operatorii condiționali și logici.

Fie a,b două valori. Vom numi Condiție relația dintre a și b,


descrisă de un operator condițional ca în tabelul ce urmează:
Condiție Efectul condiției
a>b Dacă a este mai mare decât b returnează 1
a<b Dacă a este mai mic decât b returnează 1
a>=b Dacă a este mai mare sau egal cu b returnează 1
a<=b Dacă a este mai mic sau egal cu b returnează 1
a==b Dacă a este egal cu b returnează 1
a~=b Dacă a este diferit de b returnează 1

Fie A, B două condiții de genul celor de mai sus (col. stângă):


A B Logic Rez. Explicație
0 0 0 „Și” logic. Dacă și A și B
1 0 0 sunt condiții adevărate,
A&B
0 1 0 atunci rezultatul logic al
1 1 1 operațiunii este „adevărat”
0 0 0 „Sau” logic. Dacă măcar una
1 0 A or B 1 dintre A și B sunt condiții
0 1 1 adevărate, atunci rezultatul

99
1 1 1 logic este „adevărat”
0 0 0 „Sau” exclusiv. Dacă A și B
1 0 1 sunt condiții cu rezultate
A xor B
0 1 1 diferite, atunci rezultatul
1 1 0 logic este „adevărat”
0 1 Negație, primește valoarea
not A
1 0 opusă condiției A

!Atenție!
O greșeală comună care apare în cazul operatorilor condiționali
este folosirea simbolului „=” în loc de „==”. Secvența de cod
„a=1” atribuie variabilei a valoarea 1, pe când secvența de cod
„a==1” este o condiție care testează dacă variabila a are
valoarea 1 și este sintaxa corectă care trebuie introdusă într-o
structură condițională.

O altă structură condițională este structura de tip while:


while <condiţie>
cât timp se îndeplineşte condiţia, se execută lista de comenzi
<comenzi>
end
Exemplu: Scrieți valorile lui pentru toate numerele naturale
ce satisfac expresia .

Rezultatul ar fi afișat pe coloană și ar ocupa mult spațiu pentru


a-l prezenta. Vom modifica enunțul astfel încât să stocăm într-

100
un șir valorile lui , iar apoi acel șir să îl afișăm sub formă de
matrice linie. Codul devine:

Rezultat:

Ultima structură condițională folosește comanda switch:


switch <a>
case<valoare 1> Dacă variabila a are valoarea valoare 1, se execută primul set de
comenzi și structura ia sfârșit
<comenzi 1>
case <valoare 2> Dacă variabila a are valoarea valoare 2, se execută al doilea set
<comenzi 2> de comenzi și structura ia sfârșit

case <valoare n-1> Dacă variabila a are valoarea valoare n-1, se execută setul de
comenzi n-1 și structura ia sfârșit
<comenzi n-1>
otherwise Dacă valoarea variabilei a nu este egală cu niciuna dintre cele
<comenzi n> anterioare, se execută setul de comenzi n și structura ia sfârșit

end
Comanda switch evaluează valoarea variabilei a (scalar
sau șir de caractere). În structură, secvențele <valoare 1>,
<valoare 2> etc. pot fi și grupuri de valori, nu doar valori
singulare.
Exemplu:

101
Să se realizeze un program care să ceară utilizatorului de la
tastatură clasa în care este, apoi pe baza acelei valori să
încadreze utilizatorul în clasa 1, școala primară, gimnaziu sau
liceu.
Codul:

Rezultatul (programul rulat de 5 ori pentru toate condițiile):

Dacă în structura de mai sus, în linia a 5-a, adăugam și


valoarea 1 la listă (codul devenind case{1,2,3,4}),

102
funcționalitatea programului nu se schimba, rezultatul era
același deoarece se iese din ciclu în momentul în care se atinge
prima condiție adevărată (case 1).

Uneori este necesară ieșirea forțată dintr-o structură


repetitivă. Acest lucru se realizează cu ajutorul comenzii break.
Fie codul:

Atâta timp cât se îndeplinește


condiția 1==1, lui x i se adaugă 1

Observăm că, dacă nu ar exista break, ciclul nostru ar fi


infinit, deoarece condiția pusă va fi întotdeauna adevărată (1 va
fi întotdeauna egal cu 1). De asemenea, se remarcă folosirea a
două structuri condiționale în cadrul aceluiași cod, atât while cât
și if. Aceste două structuri se închid fiecare cu end-ul lor
propriu. Metoda după care se face închiderea structurilor este
ultimul deschis - primul închis, sau cu alte cuvinte primul end îi
corespunde ultimii structuri deschise (în cazul nostru, primul
end închide if-ul, iar cel de-al doilea închide while-ul).

!Observații finale!
De foarte multe ori structurile repetitive și structurile
condiționale se regăsesc împreună în programe, formează așa
numitele structuri compuse.

103
Toate structurile repetitive și condiționale se închid cu end.
Atunci când lucrați cu mai multe astfel de structuri în același
cod, acordați o atenție deosebită locului unde închideți fiecare
structură. Fiecărei structuri deschise trebuie să-i corespundă
propriul end.
Matlab vă ajută să identificați structurile repetitive și
condiționale în modul program, în sensul în care grupează și
aliniază instrucțiunile sub forma blocurilor de text, un bloc de
text corespunzând uneia dintre aceste structuri.
Pentru o mai ușoară identificare a secțiunilor unui program sau
pentru a face accesibil altora codul pe care îl scrieți, Matlab
oferă posibilitatea de a introduce comentarii în codul scris în
modul program. Aceste comentarii se introduc cu „%” la început
de rând și nu au nici un efect activ asupra funcționării
programului, doar fac codul pe înțelesul celor care îl citesc. De
exemplu codul nostru:

ar putea fi scris și ca:

Funcționarea celor două secvențe de cod este identică,


dar dacă un începător în Matlab va citi cele două variante, o va

104
înțelege mult mai ușor pe cea de-a doua, tocmai datorită acestor
comentarii ajutătoare.

7.7 Exerciții
1. Să se genereze un șir x de 100 numere întregi aleatoare între 1
și 10 și pe baza acestuia să se calculeze valorile funcției:

folosind structuri repetitive și condiționale.


Rezolvare:
Pas1: Se generează șirul de 100 numere întregi aleatoare:

Pas2: Se realizează structura compusă (condițională și


repetitivă) pentru determinarea valorilor funcției:

Pas3: Realizarea graficului:

105
Codul complet, cu comentarii explicative:

Atenție, în acest caz nu se folosește sintaxa cu punct în


cadrul structurii switch în cazul ridicării la pătrat a valorilor lui
x. Șirul, în cazul nostru, este parcurs element cu element cu
ajutorul structurii for și pentru fiecare element se calculează
valorile funcției. La capitolul dedicat șirurilor, metoda aleasă era
de a ridica tot șirul la putere, înmulțindu-l cu el însuși element

106
cu element, deoarece structura funcțiilor prezentate acolo ne
permitea folosirea acestei metode.

2. Folosind structuri repetitive, realizați suma elementelor unei


matrici de 5x5 conținând numere generate aleator.
Rezolvare:

Se observă folosirea funcției num2str și nu int2str, cea


învățată în cadrul acestui capitol. Având în vedere că lucrăm cu
numere între 0 și 1 (matricea de 5x5 conține numere între 0 și 1
generate aleator) probabilitatea ca suma acestora să fie un număr
întreg este foarte mică. Funcția int2str consideră și afișează
doar partea întreagă a rezultatului, pe când num2str ține cont și
de partea zecimală.
De remarcat că , dacă în enunț nu era specificată obligația de a
folosi structuri repetitive, am fi putut rezolva problema și prin
altă metodă:

107
Funcția sum(A) realizează suma elementelor pe coloane (rezultat
- un șir de 5 elemente) iar sum(sum(A)) realizează suma celor 5
elemente (de fapt suma totală a elementelor matricei, rezultatul
căutat de noi).
Codul, modificat pentru exemplificare:

Rezultat:

3. Să se genereze un șir de 10 numere întregi între 1 și 10 și să


se realizeze sortarea lui descrescătoare, cu ajutorul structurilor
repetitive și condiționale.
Rezolvare:
Codul ales pentru această problemă este destul de complicat și
probabil, dacă nu veți lucra în programare, veți fi rar în situația
de a rezolva astfel de exerciții. Exemplul se potrivește însă
perfect pentru ilustrarea structurilor repetitive și condiționale.
Plan de lucru:
Vom începe să parcurgem șirul comparând elementele două câte
două - primul cu al doilea, al doilea cu al treilea etc. Dacă
primul element din comparație este mai mic decât cel de-al
doilea, schimbăm locurile celor două elemente între ele.

108
Repetăm procesul până când, pentru oricare două elemente
consecutive, primul element nu va fi niciodată mai mic decât cel
de-al doilea (cu alte cuvinte, șirul este ordonat descrescător).
Iată codul:

Am realizat captura de ecran incluzând numărul de linie, vom


face referire la acest număr când vom analiza codul pe bucăți,
după cum urmează:
Linia 1 - se generează șirul de 10 numere întregi aleatoare între
1 și 10
Linia 2 - definim variabila s ca o variabilă de control, inițial
aceasta luând valoarea 1

109
Liniile 3 și 17 - structura while care de fapt este „inima”
programului, ciclul de instrucțiuni se repetă atâta timp cât
variabila noastră de control s păstrează valoarea 1
Liniile 4 și 11 - structura for care parcurge șirul element cu
element. Se observă că alegem un contor i de la 1 la 9, chiar
dacă avem 10 elemente - facem acest lucru pentru că vom lucra
în interiorul structurii for și cu x(i+1), care va acoperi acest al
10-lea element
Liniile de la 5 la 10 - structura if care realizează algoritmul de
calcul al programului. Dacă elementul din stânga x(i) este mai
mic decât elementul din dreapta x(i+1), atunci pozițiile celor
două elemente se schimbă între ele, folosind o variabilă
ajutătoare a. Foarte important, valoarea variabilei de control s
crește și devine mai mare decât 1
Liniile de la 12 la 16 - este testată variabila de control s. Dacă,
în urma ciclului dintre liniile de la 5 la 10, variabila de control s-
a incrementat, înseamnă că s-a realizat minim o inversare între
două elemente din șir și algoritmul matematic nu trebuie să ia
sfârșit. În acest caz, s devine 1 și structura while continuă. Dacă,
în urma ciclului dintre liniile de la 5 la 10, variabila de control
nu s-a incrementat, înseamnă că nu a fost nevoie să se realizeze
nici o inversare de poziții între elementele șirului, sau cu alte
cuvinte, pentru oricare două elemente, elementul din stânga x(i)
este mai mare decât elementul din dreapta x(i+1) sau practic
șirul este ordonat descrescător - se comandă ieșirea forțată din
program, cu comanda break
Linia 18 - este afișat șirul ordonat descrescător

110
În continuare vom prezenta modul de lucru al programului, pas
cu pas, pentru a face mai ușor de înțeles algoritmul utilizat. În
momentul în care veți înțelege acest exemplu, puteți considera
că ați înțeles funcționarea structurilor repetitive și condiționale.
Ce se întâmplă în interiorul primei structuri if:

Să explicăm prima secvență dintre liniile separatoare. Se


ia șirul inițial, se compară primele două elemente, cum 3<9 se
face rocada între ele. Se compară apoi elementul al doilea cu cel
de-al treilea, (valoarea 3 cu valoarea 2), cum 3>2, poziția lor
rămâne neschimbată. Se compară apoi elementul al treilea cu cel
de-al patrulea (valoarea 2 cu valoarea 5), se schimbă între ele,
apoi al patrulea cu cel de-al cincilea (valoarea 2 cu valoarea 4),
se schimbă între ele etc. până se ajunge la șirul final al acestei
iterații. La fiecare schimbare, valoarea variabilei de control s
crește cu 1.
Acest șir final va deveni șir inițial pentru o nouă iterație
dacă variabila de control s este mai mare decât 1, până când nu
se vor mai face schimbări între elemente (variabila s rămâne 1).

111
Când această nouă iterație se pornește, variabila de control s are
valoarea reinițializată la 1 (acest lucru are loc în a doua structură
if). După cum am spus, ultima variantă a șirului din imaginea de
mai sus reprezintă șirul după prima iterație, șir devenit acum
inițial pentru cea de-a doua iterație, după cum se poate observa
în imaginea de mai jos.
Ce se întâmplă în restul programului, în exteriorul algoritmului
de calcul conținut în prima structură if:

Există mai multe metode pentru a rezolva problema de


mai sus, cea prezentată de noi fiind una dintre cele mai greu de
înțeles. Scopul alegerii acestei variante de lucru este exclusiv
didactic, problema se poate rezolva foarte ușor utilizând funcția
sort. De altfel, acolo unde este posibil, se recomandă a folosi
modul de lucru cu vectori în locul structurilor repetitive
deoarece programul este procesat mult mai rapid.

112
7.8 Obiecte (structuri de date) în Matlab

Să presupunem că aveți de realizat un inventar la o


magazie cu piese pentru autovehicule. Fiecare piesă trebuie să
fie descrisă de nume, greutate, o dimensiune sau un set de
dimensiuni și un preț. Să luăm un exemplu despre cum s-ar
putea realiza acest lucru în Matlab:

113
Se observă că am creat un obiect piesa având cele patru
caracteristici urmărite de noi. Toate aceste caracteristici pot fi
apelate (așa cum facem cu variabilele) în Matlab și pot fi supuse
la diferite calcule matematice.
Dacă vrem să adăugăm încă o piesă în lista de obiecte
creată, va trebui să extindem piesa cu încă o poziție, creând
practic un șir, în felul următor:

După ce terminăm de introdus al doilea element, Matlab


nu ne va afișa caracteristicile acestuia ci ne va transmite că piesa
este o structură de 1x2 cu câmpurile nume, greutate, dimensiuni
și pret. Pentru a vizualiza al doilea element, va trebui să îl
apelăm folosindu-ne de indicele acestuia, așadar piesa(2):

114
De asemenea, dacă vom compara caracteristicile
câmpului dimensiuni pentru cele două elemente, ne dăm seama
că nu este obligatoriu ca un câmp de tip matrice să aibă aceleași
dimensiuni pentru toate elementele. Nici măcar tipul de câmp
(scalar, matriceal, șir de caractere) nu trebuie să fie la fel dar
recomandarea este să lucrați cu același tip de câmpuri, deoarece
aspectul este util pentru eventuale prelucrări ulterioare ale
obiectelor.
Generarea obiectului piesa cu cele două elemente alese
de noi se poate face și cu ajutorul comenzii struct:

Apelarea celor două elemente existente se face la fel,


folosind indicii (piesa(1) și piesa(2))

115
Exemplu de lucru cu acest tip de obiecte: să presupunem
că vrem să extragem dimensiunile primei piese și să realizăm un
grafic care să ne ofere o idee despre profilul piesei. Putem lucra
în acest fel:

cu rezultatul:

Practic, am colectat într-un șir dimensiunile elementului


1 din obiectul piesa, apoi am definit un nou șir care începe de la

116
1 și are același număr de elemente ca și dimensiunile
elementului 1 (acest al doilea șir îl vom folosi ca scală) iar în
final am afișat graficul cu comanda bar. Graficul e corect dacă
dimensiunile din câmpul dimensiuni sunt raze, dacă sunt trecute
diametrele segmentelor piesei, va trebui să realizăm graficul
considerând șirul x/2.
Putem adăuga elemente diferitelor câmpuri. Să
presupunem că la câmpurile pret ar trebui să schimbăm obiectul
pentru a adăuga și prețul cu un TVA de 20%. Iată cum putem
realiza acest lucru, pentru al doilea element:

având ca rezultat:

Scriind piesa(2).pret(2) cerem să adăugăm (sau dacă


există, să îl modificăm) al doilea element în câmpul pret al
obiectului piesa(2), iar valoarea acestui nou element este dată de
valoarea primului element (prețul fără TVA).
Pentru a elimina unul dintre elemente, ca și în cazul
șirurilor, îi înlocuim valoarea cu []. Presupunem că dorim să
eliminăm acest nou preț:

iar rezultatul:

117
118
8. EXERCIȚII RECAPITULATIVE

1. Presupunem că depuneți 10000 lei la bancă, cu o dobândă de


7% pe an. Calculați suma pe care o veți avea după un an.
Rezolvați apoi problema generic, cu suma depusă, o sumă
posibil deja existentă și rata dobânzii introduse de la tastatură.
Rezolvare:
a) Pentru problema concretă:

b) Pentru rezolvarea generică folosim modul program:

119
Rezultate:

2. Un inginer ce urmărește să se documenteze foarte bine într-un


domeniu nu se va limita doar la materialele din limba română, ci
va cerceta și lucrări internaționale. În unele dintre acestea sunt
folosite unități de măsură de genul grade Fahrenheit, livre, inci
etc. Realizați un program cu ajutorul căruia convertiți
următoarele mărimi, cunoscând formulele de conversie:
Celsius - Fahrenheit

Metri - Inci

Atmosfere - Pascali

Kilograme - Livre

m/s - Km/h (metri pe secundă - kilometri pe oră)

Rezolvare:
Pas1: Stabilirea tipului de conversie dorit:
În acest pas vom cere utilizatorului să introducă tipul de
conversie pe care dorește să-l efectueze. Acest lucru îl vom
realiza cu ajutorul unei structuri Switch.

120
a) Pregătirea pentru structura Switch: cerem explicit
utilizatorului să introducă de la tastatură în mod exact șirul de
caractere pe care-l considerăm noi potrivit pentru respectiva
conversie:

b) Realizarea structurii Switch:

Mare atenție: având în vedere că alegerea în Switch nu se face


după caractere numerice, respectivele caractere trebuie introduse

121
de către utilizator între apostrofuri. Recomandarea noastră în
acest caz ar fi fie să specificați în prima linie de program acest
lucru (ceva de genul disp('Alegeti intre apostrofuri
tipul de conversie dorit:')) sau pur și simplu obligați
utilizatorul să aleagă după caractere numerice (adică în loc de c,
m, a, kg și mps folosiți 1,2,3,4,5).
Codul complet necesar execuției programului se obține prin
alipirea celor două secțiuni de cod de la punctele a) și b).
Rezultate:

Evident, conversia funcționează în acest program doar


într-o direcție. Pentru a obține și conversia inversă, fie adăugați
încă 5 variante în structura Switch existentă, fie folosiți o nouă

122
structură Switch unde conversia se realizează invers dacă de
exemplu utilizatorul introduce tipul de conversie cu litere mari.

3. Calculați seria:

Rezolvare:
Pentru calculul acestei serii este necesar să folosim o structură
repetitivă. Deoarece semnul se schimbă întotdeauna de la un
termen la altul, vom defini o variabilă prin care vom controla
acest semn. Iată codul:

Iar ca rezultate avem:

Același lucru îl puteam realiza și dacă lucram cu șiruri. Pentru


aceasta va fi nevoie să definim două șiruri, unul pentru
elementele de ordin impar, cu semn pozitiv, iar celălalt pentru
elementele de ordin par, cu semn negativ. În final vom scădea
din suma elementelor primului șir suma elementelor celui de-al
doilea șir. Iată cum:

123
Remarcați sintaxa cu punct în codul de mai sus - împărțirea are
loc element cu element. Șirurile din codul de mai sus arată așa
(au fost afișate primele 5 elemente):

Ca și temă de lucru, vă recomandăm să scrieți codul cu care s-a


realizat afișarea celor 5 elemente ale șirurilor de mai sus. Dacă
întâmpinați dificultăți, consultați această variantă:

Atenție, instrucțiunile de genul x1(1:5) accesați primele 5


elemente ale șirului x1, 1:5 sunt în acest caz indici, nu au nici o
legătură cu valorile elementelor. De asemenea, pentru o
vizualizare mai bună s-au afișat șirurile s1 și s2 folosind

124
formatul sub formă de fracție, iar la sfârșitul programului s-a
revenit la formatul clasic, cu 4 zecimale.

4. Generați un program cu ajutorul căruia stocați într-un șir un


număr n de aruncări cu zarul ( n introdus de la tastatură).
Calculați media aritmetică, mediana și abaterea medie pătratică
a șirului și așezați-le pe grafic, alături de distribuția de la stânga
la dreapta (de la mic la mare) valorilor din șir.
Rezolvare (grafic realizat pentru 10000 de aruncări):

125
Ca temă suplimentară, scrieți codul prin care numărați câte
zaruri de 1 ați aruncat, câte zaruri de 2 etc. până la 6.

5. Scrieți un program care calculează consumul de combustibil.


Utilizatorul introduce de la tastatură distanța parcursă și numărul
de litri de combustibil consumați, iar programul trebuie să
returneze consumul pe suta de kilometri precum și câți kilometri
ați realizat cu 1 litru de combustibil.
Rezolvare:

Răspuns:

6. Generați o listă de conversie (sub forma unei matrici de 2


rânduri și 19 coloane) între grade și radiani, din 20 în 20 de
grade, între 0 și 360 de grade. Vă reamintim că 360 de grade =
2π radiani.
Rezolvare:

Răspuns:

126
7. Aveți sarcina de a vă angaja o echipă de lucru. Conducerea vă
indică să oferiți următorul model de plată a salariilor
potențialilor angajați:
- celor ce lucrează maxim 40 de ore pe săptămână, 25 de lei pe
oră
- celor ce lucrează minim 40 de ore pe săptămână dar cel mult
50, le oferiți 1000 de lei pe cele 40 de ore și apoi 35 de lei
pentru fiecare oră suplimentară
- celor care lucrează peste 50 de ore pe săptămână le oferiți 1350
de lei pe lună, plus 50 de lei pentru fiecare oră suplimentară
Adițional, pentru salariile de până în 1000 de lei va trebui să
plătiți un impozit de 16%, pentru cele între 1001 și 1300 de 18%
iar pentru cele de peste 1301 lei de 20%. Realizați un program
prin care, introducând de la tastatură numărul de ore, să calculați
costurile pe care le aveți cu respectivul angajat.

8. Introducând de la tastatură valorile pentru coeficienții


a,b,c,d,e,f realizați un program care, fără a folosi instrucțiunile

127
de rezolvare a sistemelor liniare specifice Matlab-ului, să obțină
soluțiile sistemul de două ecuații liniare cu două necunoscute de
forma:

9. Aveți de proiectat un automat de vânzare produse retail, de


genul cafea, batoane de ciocolată etc. Scrieți o aplicație care știe
să dea restul la o bancnotă de 10 lei, în cât mai puține bancnote
plus monede, în urma valorii achiziției făcută de client (de
exemplu, dacă cineva cumpără ceva de 2.5 lei, aparatul ar trebui
să returneze 7.5 lei în cât mai puține bancnote și monede - o
bancnotă de 5 lei, două de 1 leu și o fisă de 50 bani). De la
tastatură se introduce valoarea achiziției clientului.
a) Partea de stabilire a restului total și de definire a variabilelor:

b) Codul programului prin care se calculează câte elemente


monetare din fiecare categorie trebuie returnate. Prima structură
este if și nu while deoarece niciodată restul nu va putea conține
mai mult de o bancnotă de 5 lei:

128
Dacă restul este mai mare de 5 lei, se
va contabiliza o bancnotă de 5 lei iar
din restul inițial se vor sustrage 5 lei.

Din restul rămas de mai sus, atâta


timp cât valoarea este mai mare de 1
leu, se va retrage câte un leu iar
fiecare operațiune de retragere se va
contabiliza în variabila s1.
Structurile while care urmează au o
funcționalitate identică cu aceasta,
doar valoarea diferă.

c) Afișarea:

Dacă punem cap la cap subpunctele a), b) și c), obținem


programul nostru, ale cărui rezultate arată de felul următor:

129
10. Scrieți un program prin care să implementați algoritmul lui
Zeller de calcul a zilei din săptămână în care cade o dată
oarecare.
Formula lui Zeller pentru calendarul gregorian este:

unde:
- partea întreagă din respectiva expresie
z = a câta zi din lună (de exemplu 17 ianuarie = 17)
l = a câta lună din an
în acest algoritm, ianuarie și februarie sunt considerate lunile 13
și 14 din anul anterior: de exemplu februarie 2011 trebuie
calculat ca fiind decembrie 2010 (l=14, an=10), dar mai 2011
rămâne luna a cincea, anul 2011
an = al câtelea an din secol (de exemplu 2011 = 11, în afară de
cazul în care luna este ianuarie sau februarie - vezi mai sus)
s = al câtelea secol activ (de exemplu pentru 2011 secolul activ
este 20, partea întreagă din 20.11, și nu 21)
valorile lui h:
h=0 - sâmbătă, h=1 - duminică, h=2 - luni, h=3 - marți etc.

130
Ca date de intrare se va introduce data căutată de la tastatură,
sub forma [zz/ll/aaaa] a anului dorit.

Rezolvare:
a) Introducerea datelor și corelarea lunilor ianuarie și februarie
cu formula:

b) Calculul valorilor din formulă și a expresiei:

c) Corelarea valorii calculate pentru h cu ziua din săptămână, cu


ajutorul unei structuri Switch:

131
Rezultatele sunt prezentate sub următoarea formă:

Valorile pentru ziuă, lună, an și secol (z,l,an,s) au fost afișate


doar pentru verificare. În cazul în care un algoritm nu merge,

132
este recomandată această metodă pentru a identifica ușor
greșeala.

11. Realizați un program prin care generați un număr întreg între


1 și 100 și apoi invitați utilizatorul să-l „ghicească”. Dacă
numărul ales de utilizator e mai mic decât cel generat aleator,
utilizatorul trebuie înștiințat de acest lucru, la fel și dacă
numărul ales este mai mare. Algoritmul se va repeta până când
utilizatorul va reuși să ghicească numărul.
Rezolvare:

Rezultat:

133
12. Determinați numărul natural i pentru care suma pătratelor
numerelor de la 1 la i este mai mică decât un număr natural a
introdus de la tastatură.
Rezolvare:

Răspuns:

În exemplul de mai sus trebuie acordată atenție locului unde


incrementăm contorul i. Dacă o facem după calculul sumei,
acesta va fi incrementat suplimentar o dată, iar algoritmul va
returna 8 pentru exemplul luat de noi, ceea ce este greșit.

134
9. CALCULATORUL DE FUNCȚII

9.1 Introducere
Pentru a ne face mai ușor lucrul cu operații curente care
implică funcții, Matlab ne pune la dispoziție o unealtă pe care
am denumit-o „calculator de funcții” și care poate fi accesată
prin comanda funtool.

Funcționarea acestei unelte seamănă cu cea a unui


calculator de buzunar, diferența făcând-o faptul că lucrează cu
funcții, iar operațiunile capabile să le realizeze sunt ceva mai
complicate: derivare, integrare, realizarea graficului sumei,
produsului, diferenței sau rației dintre două funcții precum și

135
operații de genul adunare sau înmulțire a valorilor funcției cu un
scalar etc. Vom prezenta în continuare funcționarea acestei
unelte și, pe rând, comenzile.

9.2 Zone și comenzi funtool


Unealta este împărțită în două zone, cea superioară și cea
inferioară. În zona superioară se regăsesc patru câmpuri ce pot fi
editate:

f= Expresia simbolică a funcției f


g= Expresia simbolică a funcției g
x= Domeniul pe care sunt realizate graficele lui f și g
a= Scalar utilizat pentru modificarea funcției f

Când unealta e deschisă, valorile pentru cele patru


câmpuri editabile sunt cele din imaginea de mai sus. De
asemenea, Matlab realizează și graficele pentru cele două
funcții, și , pe intervalul .
Graficele se modifică automat în momentul în care modificați
funcțiile și . De exemplu, să observăm comportarea
uneltei pentru și ,
intervalul ales pentru x fiind :

136
137
Zona inferioară a funtool ne pune la dispoziție operațiile
ce pot fi realizate cu acest calculator:

df/dx Derivata funcției f față de x


int f Integrala funcției f față de x
simple f Forma simplificată a lui f, dacă aceasta există
num f Numărătorul funcției f (funcții reale, de transfer)
den f Numitorul funcției f (funcții reale, de transfer)
1/f Reciproca funcției f
finv Inversa funcției f

Prin apăsarea butonului


df/dx am realizat
derivarea funcției noas-
tre inițiale,

138
f+a Înlocuiește cu
f-a Înlocuiește cu
f*a Înlocuiește cu
f/a Înlocuiește cu
f^a Înlocuiește cu
f(x+a) Înlocuiește cu
f(x*a) Înlocuiește cu

Am stabilit 4 ca noua valoare a lui a, apoi am executat f(x+a),


rezultatul îl aveți mai jos:

Funcționalitatea este foarte simplă și evidentă. Al treilea


rând de comenzi se ocupă cu operații între cele două funcții ale
noastre, f și g.

139
f+g Înlocuiește cu
f-g Înlocuiește cu
f*g Înlocuiește cu
f/g Înlocuiește cu
f(g) Calculează
g=f Funcția primește expresia lui
swap Schimbă între ele și

Pe ultimul rând se află utilitățile, de genul memorare, resetare,


ajutor, demo etc.

Insert Adaugă la sfârșitul listei de funcții stocate


Înlocuiește cu următorul element din lista de
Cycle
funcții stocate
Delete Șterge din lista de funcții stocate
Reset Reinițializează calculatorul la starea inițială
Help Afișează fereastra de Ajutor
Prezintă o scurtă demonstrație a funcționării
Demo
calculatorului
Close Închide calculatorul

140
ANEXĂ

LISTA FUNCȚIILOR ȘI CONSTANTELOR


DESCRISE ÎN ACEST VOLUM

Funcția Descriere Pag.

round(x) Rotunjește o valoare către cel mai apropiat întreg 15


Rotunjește o valoare către cel mai apropiat întreg
ceil(x) 15
superior
Rotunjește o valoare către cel mai apropiat întreg
floor(x) 15
inferior
Rotunjește o valoare către cel mai apropiat întreg
fix(x) 15
spre zero
rem(x,y) Restul împărțirii lui x la y 16
sqrt(x) Rădăcina pătrată a lui x 16
factor(x) Împarte valoarea x în factori primi 16
factorial(x) Calculează x factorial 16
lcm(x,y) Calculează cel mai mic multiplu comun pentru x și y 16
gcd(x,y) Calculează cel mai mare divizor comun pentru x și y 16
eps Epsilon (simplificat, cea mai mică valoare posibilă) 17
i,j Partea imaginară a unui număr complex 17
pi Numărul π 17
r=1:0.1:7 Definește un șir r de la 1 până la 7 cu pas de 0.1 21
r=linspace(1,7,50) definește un șir r care împarte
linspace 22
spațiul între 1 și 7 în 50 de puncte echidistante
Returnează valoarea elementului cu indice i din șirul
r(i) 26
r
sort(r) Sortează crescător șirul r 26
sum(r) Realizează suma elementelor șirului r 26
prod(r) Realizează produsul elementelor șirului r 26
length(r) Determină lungimea șirului r 26
Definește o matrice de x rânduri și y coloane cu
zeros(x,y) 28
elemente nule
Definește o matrice unitate pătratică (de x rânduri și
eye(x) 28
x coloane)
ones(x,y) Definește o matrice de x rânduri și y coloane cu 29

141
elemente având valoarea 1
Definește o matrice de x rânduri și y coloane cu
rand(x,y) 29
elemente numere aleatoare între 0 și 1
Pentru scopurile acestui volum, poate fi considerată
A' 31
ca fiind transpusa matricei A
det(A) Calculează determinantul matricei A 31
inv(A) Inversa matricei A 32
Operații cu șiruri element cu element - sintaxa cu
x.^2 etc. 33
punct
Stabilește formatul de afișare, cu 3 opțiuni: short (4
format zecimale), long (15 zecimale) rat (sub formă de 35
fracție)
sin(x) sinus(x) 43
cos(x) cosinus(x) 43
tan(x) tangentă(x)
Calculează valorile unui polinom (sau ale unei
polyval 45
funcții) cu ajutorul șirului coeficienților acestuia
plot(x,y) Realizează graficul lui y în funcție de x 48
xlabel Stabilește eticheta abscisei într-un grafic 49
ylabel Stabilește eticheta ordonatei într-un grafic 49
title Stabilește titlul unui grafic 49
grid on/off Realizează un caroiaj pe grafic 52
Comandă folosită pentru realizarea graficelor
hold on/off 52
suprapuse
plot3(x,y,z) Realizează graficul în 3 dimensiuni pentru x,y,z 54
linsolve(A,B) Rezolvă sistemul liniar AX=B 57
A\B Rezolvă sistemul liniar AX=B 58
Generează funcția spline cubică de aproximare
csapi(x,y) 63
pentru perechile de valori (x,y)
Returnează lista coeficienților funcției spline cubică
cs.coefs 63
de aproximare
Cel mai popular solver de ecuații diferențiale de
ode45 64
ordinul întâi din Matlab
Definește o funcție ce poate fi apelată din alt
function 65
program Matlab
mesh(x,y,z) Reprezintă grafic o suprafață în Matlab 69
Realizează grid-ul [x,y] necesar reprezentării
meshgrid 69
suprafeței f(x,y)
mean(x) Calculează media aritmetică a șirului x 72

142
median(x) Calculează mediana șirului x 73
var(x) Calculează dispersia șirului x 76
Calculează abaterea medie pătratică (sau abaterea
std(x) 76
standard) a șirului x
eig(A) Calculează valorile proprii ale matricei A 85
Stochează vectorii proprii ai matricei A în matricea
[v,d]=eig(A) 86
v, iar valorile proprii în matricea d, pe diagonală
input Cere utilizatorului să introducă date de la tastatură 88
Afișează pe ecran valori ale variabilelor, șiruri de
disp 92
caractere, șiruri de caractere concatenate etc
Convertește o valoare numerică în valoare întreagă
int2str 92
și apoi pe aceasta din urmă în șir de caractere
num2str Convertește o valoare numerică în șir de caractere 92
for - end Structură repetitivă în Matlab 95
if - end Structură condițională în Matlab 97
& „Și” logic 99
or „Sau” logic 99
xor „Sau” exclusiv 100
not Negație 100
while-end Structură condițională în Matlab 100
switch-end Structură condițională de selecție în Matlab 101
break Forțează ieșirea dintr-o structură repetitivă 103
obiect.nume Definește proprietatea „nume” a obiectului „obiect” 113
Comandă cu care se pot genera structuri gen obiecte
struct 115
în Matlab
funtool Calculator de funcții în Matlab 135

În anexa de mai sus au fost luate în calcul doar funcțiile,


comenzile, constantele și instrucțiunile utilizate în acest volum.
Matlab pune la dispoziția utilizatorilor un număr mult mai mare
de instrucțiuni, funcții, constante și comenzi dar, pentru
utilizarea la un nivel de bază al aplicației, am preferat abordarea
de față. Cei interesați de aprofundarea cunoștințelor în Matlab
pot folosi cu încredere secțiunea Help, precum și resursele
existente pe site-ul http://www.mathworks.com.

143
144
BIBLIOGRAFIE

Beaton RK, Chacko E. Which cubic spline should one use?,


SIAM J. Scient. Stat. Comp. 13, pp. 1009-1024 (1992)

Chapman SJ. Matlab Programming for Engineers, Cengage


Learning (2008)

Chapra SC, Canale R. Numerical Methods for Engineers,


McGraw-Hill, Inc. New York, NY, USA (2006)

Dufy, DG. Advanced Engineering Mathematics with Matlab,


3rd ed., CRC Press, Taylor & Francis Group (2010)

Floater MS, Surazhsky T. Parameterization for curve


interpolation, in Topics in multivariate approximation and
interpolation, K. Jetter et al. (eds.), pp. 39-54, Elsevier (2006)

Gerald CF, Wheatley PO. Applied Numerical Analysis,


Addison-Wesley, Reading (1989)

Hanselman D, Littlefield B. Mastering Matlab 7, Pearson


Education (2005)

Hahn BD, Valentine DT. Essential Matlab for Engineers and


Scientists, 3rd Edition, Butterworth - Heinemann, Elsevier
(2007)

145
Hunt BR, Lipsman RL, Rosenberg JM. A Guide to Matlab for
Beginners and Experienced Users, Cambridge University Press
(2001)

Ingle DVK, Proakis JG. Digital Signal Processing using Matlab,


Cengage Learning (2010)

James DG, Burley D, Clements D, Dyke P, Searl J. Modern


Engineering Mathematics, 4th ed., Pearson Education Ltd.
(2007)

Kano H, Nakata H, Martin CF. Optimal Curve Fitting and


Smoothing using Normalized Uniform B-Splines: A Tool for
Studying Complex Systems, Applied Mathematics and
Computation (2005)

Kiusalaas J. Numerical Methods in Engineering with Matlab,


Cambridge University Press (2005)

Knight A. Basics of Matlab and Beyond, Chapman & Hall/CRC


(2000)

Lyshevski SE. Engineering and Scientific Computations Using


Matlab, John Wiley & Sons (2003)

Magrab EB, Azarm S, Balachandran B, Duncan J, Herold K,


Walsh G. Engineers Guide to Matlab, Prentice Hall Press Upper
Saddle River, NJ, USA (2007)

146
Manassah JT. Elementary Mathematical and Computational
Tools for Electrical and Computer Engineers Using Matlab,
CRC Press LLC (2001)

Mazel DS, Hayes MH. Using Iterated Function Systems to


Model Discrete Sequences, IEEE Transactions on Signal
Processing, Vol. 40 (7),pp. 1724-1734 (1992)

Mihoc G, Micu N. Teoria Probabilităților și Statistică


Matematică. Editura Didactică și Pedagogică, București (1980)

O'Neil PV. Advanced Engineering Mathematics, 7th ed.,


Cengage Learning (2010)

Oppenheim AV, Schafer RW. Discrete-Time Signal Processing,


Prentice Hall (1999)

Otto SR, Denier JP. An Introduction to Programming and


Numerical Methods in Matlab, Springer-Verlag London Limited
(2005)

Pao YC. Engineering Analysis Interactive Methods and


Programs with Fortran, QuickBasic, Matlab and Mathematica,
CRC Press LLC (2001)

Sarfraz M, Raheem MA. Curve Designing Using a Rational


Cubic Spline with Point and Interval Shape Control, IEEE

147
Conference on Digital Object Identifier, Information
Visualization (2000)

Shampine LF, Gladwell I, Thompson S. Solving ODE's with


Matlab, Cambridge University Press (2003)

Tofan MC, Vlase S. Vibrațiile Sistemelor Mecanice,


Universitatea „Transilvania” din Brașov (1985)

Vassu O, Mihălcică V. Metodologii perfecționate de calcul și


modelare pe calculator a produselor proiectate și componentelor
acestora, st.11.112, INAR Brașov (1990)

Vassu O, Mihălcică V. Studierea posibilității de determinare a


fiabilității previzionale pentru principalele ansambluri ale
autovehiculelor, INAR Brașov (1990)

van der Heijden F, Duin RPW, de Ridder D, Tax DMJ.


Classification, Parameter Estimation and State Estimation, An
Engineering Approach using Matlab, John Wiley & Sons
(2004)

Wilson HB, Turcotte LH, Halpern D. Advanced Mathematics


and Mechanics Applications Using Matlab, 3rd Edition,
Chapman & Hall/CRC (2003)

Yang X. Curve Fitting and Fairing using Conic Spines,


Computer Aided Design (2004)

148
Yang WY, Cao W, Chung TS, Morris J. Applied Numerical
Methods Using Matlab, John Wiley & Sons (2005)

Zill DDG, Wright WS, Cullen MR. Advanced Engineering


Mathematics, 4th ed., Jones and Bartlett Publishers, Sudbury,
MA (2011)

149

S-ar putea să vă placă și