You are on page 1of 321

Dumitru D.

Nicoară

Metode numerice în inginerie


utilizând MATLAB

UNIVERSITATEA TRANSILVANIA DIN BRAȘOV

FACULTATEA DE INGINERIE MECANICĂ

BRAȘOV 2014
Prefață

Metodele numerice sunt tehnici prin care problemele matematice sunt formulate
astfel încât să poată fi rezolvate prin operații aritmetice și operații logice.
Sunt mai multe moduri de a preda tehnicile aproximațiilor numerice.
Cursurile de Analiză Numerică tradițională prezintă atât metodele de aproximare
cât și partea de analiză matematică din care au rezultat aceste metode.
Cursurile de Metode Numerice sunt mai concentrate pe aplicarea acestor tehnici
numerice la rezolvarea problemelor din inginerie decât pe deducere teoretică a
acestora.
Acesta este și modul în care am gândit acest curs de Metode Numerice.
Fiecare metodă este motivată și descrisă din punctul de vedere al implementării
algoritmului numeric. Scopul este de a convige studentul că această metodă este
suficient de riguroasă atât din punct de vedere matematic cât și din punct de
vedere computațional. O descriere matematică completă este inclusă numai dacă
metoda nu poate fi înțeleasă altfel.
Cursul folosește ca suport pentru implementarea algoritmilor numerici pachetul de
programe MATLAB, care este un mediu de programare accesibil studenților.
Metodele numerice și programarea lor în cod program folosind MATLAB, au
devenit un mod de lucru nou, foarte util în înțelegerea și surmontarea eventualelor
dificultăți matematice.
Dezvoltarea calculatoarelor a făcut din metodele numerice un instrument de lucru
fundamental în rezolvarea problemelor din ingineria modernă.
De aceea consider că însușirea metodele numerice trebuie să fie parte din
pregătirea fiecărui inginer.
Acest curs este conceput ca suport al cursului de Metode Numerice, predat de
autor studenților anului II de la Facultatea de Inginerie Mecanică.

Brașov, decembrie 2014 Dumitru D. Nicoară


Universitatea Transilvania din Brașov
Facultatea de Inginerie Mecanică
www. unitbv.ro
tnicoara@unitbv.ro
Dumitru D. Nicoara METODE NUMERICE IN INGINERIE FOLOSIND MATLAB

CUPRINS

1. CAPITOLUL 1 INTRODUCERE ÎN MATLAB 1

1.2 Variabile şi constante în Matlab ........................................................................ 4


1.3 Funcţii matematice din biblioteca Matlab (built-in functions) ................................ 11
1.4 Vectori în Matlab ............................................................................................... 20
1.5 Matrice în Matlab .............................................................................................. 27
1.6 Operaţii cu vectori şi matrice................................................................................... 30
1.8 Programare în Matlab.............................................................................................. 39
1.9 Grafice în Matlab..................................................................................................... 74
1.10 Calcul simbolic în Matlab...................................................................................... 90
1.11 Polinoame în Matlab ............................................................................................. 100

2. CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR


ALGEBRICE ȘI TRANSCENDENTE 106

2.1 Metoda grafică ........................................................................................................ 106


2.2 Metode numerice .................................................................................................... 111
2.2.1 Metoda înjumătăţirii intervalului - metoda bisecţiei......................................... 111
2.2.2 Metoda secantei ................................................................................................ 119
2.2.3 Metoda tangentei - metoda Newton-Raphson .................................................. 125
2.2.4 Analiza erorii pentru metoda Newton .............................................................. 136
2.3 Funcția Matlab fzero ........................................................................................... 138
2.4 Probleme ................................................................................................................. 142

3. CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE


METODE NUMERICE 146

3.1 Sisteme algebrice liniare. Existenţa şi unicitatea soluţiei........................................ 146


3.2. Metode directe de rezolvare a sistemelor liniare................................................... 149
3.3 Metode numerice - sisteme liniare.......................................................................... 157
3.3.1 Metoda Gauss ................................................................................................... 157
3.3.2 Metoda de ȋmpărţire la stânga Matlab....................................................... 165
3.3.3 Factorizarea LU................................................................................................. 167
3.4.1 Metoda Jacobi ................................................................................................. 172
3.4.2 Metoda Gauss-Seidel ........................................................................................ 176
3.5 Acuratețea soluției numerice a sistemelor algebrice liniare ................................... 182
3.6 Probleme ................................................................................................................. 189

4. CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE


METODE NUMERICE 190

4.1 Forma generală a sistemelor neliniare.................................................................... 190


4.2 Soluția sistemelor neliniare. Metoda grafică ......................................................... 191
Dumitru D. Nicoara METODE NUMERICE IN INGINERIE FOLOSIND MATLAB

4.3 Soluția sistemelor neliniare cu metoda Newton - Raphson................................... 195


4.5 Probleme ............................................................................................................... 199

5. CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR 200

5. 1 Introducere........................................................................................................... 200
5. 2. Interpolare polinomială........................................................................................ 201
5.2.1 Metoda directă ............................................................................................... 202
5.2.2 Interpolare cu polinomul Newton................................................................... 208
5.3 Implementare ȋn Matlab a metodei Newton ......................................................... 221
5.4 Interpolare cu polinoame Lagrange....................................................................... 222
5.5 interpolare spline................................................................................................... 233
5.6 Interpolare cu funcţia matlab interp1 ........................................................... 244
5.7 Interpolare cu funcţia Matlab polyfit ........................................................... 251
5.8 Probleme............................................................................................................... 253

6. CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ 255

6.1 Aproximarea derivatelor prin diferențe finite ........................................................ 256


6.2 Derivarea numerică folosind Matlab...................................................................... 257
6.3 Integrarea numerică ............................................................................................... 262
6.3.1 Metoda dreptunghiurilor................................................................................. 264
6.3.2 Metoda trapezelor........................................................................................... 266
6.3.3 Metoda lui Simpson......................................................................................... 267
6.4 Calculul numeric al integralei duble...................................................................... 268
6.5 Calculul simbolic al integralelor............................................................................269
6.6 Probleme................................................................................................................271

7. CAPITOLUL7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR


DE ECUAȚII DIFERENȚIALE ORDINARE 274

7.1 Ecuaţii diferenţiale cu condiţii iniţiale....................................................................274


7.2 Reprezentarea ecuaţiilor diferenţiale în spaţiul stărilor.......................................... 275
7.3 Determinarea soluţiilor analitice folosind calculul simbolic din Matlab............... 278
7.4 Exemple de soluţii analitice obţinute în Matlab cu funcția dsolve.................... 279
7.5 Metode de rezolvare numerică a ecuaţiilor diferenţiale ordinare.......................... 285
7.5.2 Metoda Euler.................................................................................................. 287
7.5.3 Metoda Runge-Kutta(RK2)............................................................................ 300
7.5.4 Metoda Heun.................................................................................................. 301
7.5.5 Metoda Ralston............................................................................................... 302
7.5.6 Metoda Runge-Kutta(RK4)............................................................................ 303
7.6 File Matlab built-in pentru soluții ecuații diferențiale............................................ 306
7.7 Probleme ................................................................................................................ 315

BIBLIOGRAFIE 317
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1
INTRODUCERE ÎN MATLAB

1.1 Prezentare generală

MATLAB® este un pachet de programe de înaltă performanţă cu aplicabilitate în ştiinţă și


inginerie. În particular, MATLAB oferă instrumente foarte utile pentru implementarea
metodelor numerice.
Numele MATLAB provine de la MATrix LABoratory. Firma producătoare este The
MathWorks, Inc., SUA, http://www.mathworks.com. MTLAB are la origine un program
FORTRAN publicat de Cleve Moler.
MATLAB lucrează sub Windows, Unix, LINUX şi Machintosh. MATLAB include toate
facilităţile unui limbaj complet de programare, admiţând interfeţe cu limbajul de
programare C, C++ şi FORTRAN.
Așa cum sugerează numele, limbajul de programare MATLAB lucrează cu
matrice/vectori și include instrucţiuni de control al buclelor, funcţii, structuri de date,
comenzi de intrare/ieşire şi instrucţiuni de programare orientată pe obiecte.
MATLAB conţine o serie Toolbox-uri și de Blockset-uri, care permit rezolvarea unor
aplicaţii specifice din diverse domenii cum ar fi: inginerie mecanică și electrică, industria
aeronautică şi de automobile, procesarea materialelor, procesare de semnal, control de
sisteme, statistică, finanţe ș.a..
Aceste toolbox-uri sunt colecţii de funcţii MATLAB (M-files), uşor de asimilat, care
extind puterea de calcul a pachetului de programe MATLAB în vederea rezolvării unor
clase particulare de probleme. Colecţia de Toolbox-uri și de Blockset-uri MATLAB
conţine: Simulink, Control System, SimPowerSystems, SimMechanics, Data Acquisition,
Curbe Fitting, Fuzzy Logic, Image Processing, Partial Differential Equations, Neural
Network, Optimization, System Identification, Financial, Statistics, Communications,
Database, Virtual Reality etc.

1
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Prin modulul Handle Graphics®, sistemul de grafică MATLAB permite vizualizarea 2D


şi 3D a datelor, procesarea de imagini, animaţie şi grafică, cât şi comenzi de jos nivel ce
permit personalizarea completă a reprezentărilor grafice şi construirea integrală a
interfeţelor grafice (GUI) pentru aplicaţiile MATLAB.
Biblioteca de funcţii matematice din MATLAB, built-in function, conține o vastă colecţie
de algoritmi de calcul, pornind de la funcţii elementare precum sumă, sinus, cosinus şi
aritmetică complexă, pană la funcţii mai sofisticate precum inversare de matrici, calcul de
valori proprii, ecuații diferențiale, transformata Laplace, transformata Fourier, funcţii
Bessel ș.a..
Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite
scrierea de programe în C sau Fortran care interacţionează cu MATLAB-ul. Include
facilităţi pentru apelarea rutinelor din MATLAB, apelarea MATLAB-ului ca maşină de
calcul, scrierea şi citirea fişierelor de tip .MAT .

1.1.1 Pachetul SIMULINK


SIMULINK® este un pachet software ataşat MATLAB-ului şi reprezintă un sistem
interactiv pentru simularea dinamicii sistemelor liniare și neliniare, continue, discrete,
multivariabile etc.
SIMULINK beneficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci
suplimentare care conţin aplicaţii specializate din domenii cum ar fi: comunicaţii,
procesarea semnalelor etc.
Real-time Workshop® este un program foarte important care permite generarea unui cod
C pentru schemele bloc create în SIMULINK şi prin urmare permite rularea de aplicaţii în
timp real de o mare diversitate.

MATLAB a cunoscut o puternică evoluţie în decursul ultimilor ani, reprezentând astăzi în


mediile universitare o unealtă standard de calcul, fiind asociată diverselor cursuri
introductive sau avansate în matematică, ştiinţă şi inginerie. În industrie, MATLAB este
recunoscut ca un mijloc de investigaţie numerică performant, utilizat în sprijinul unei
activităţi de cercetare, dezvoltare şi analiză de înalt nivel.

1.1.2 Lansarea programului MATLAB

Pentru lansarea în execuţie a programului se acţionează dublu click pe pictograma Matlab


de pe Desktop sau se selectează StartAll Programs Matlab.

2
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Mediul de dezvoltare Matlab este alcătuit dintr-un set de unelte care facilitează folosirea
funcţiilor şi fişierelor MATLAB. Multe dintre acestea reprezintă de fapt interfeţele grafice
şi includ fereastra principală MATLAB sau MATLAB Desktop, fereastra de comenzi sau
Command Window, fereastra ce memorează istoria comenzilor sau Command History, şi
browser-ele de Help, Workspace, Files, Search Path etc.

Fereastra principală MATLAB, figura 1.1, are trei subferestre:

 Command Window - în care sunt introduse comenzile;


 Command History - în care sunt stocate comenzile lansate în execuţie în fereastra
de comenzi;
 Workspace - în care vedem variabilele curente din memorie cu numele, valoarea şi
tipul acestora.

Workspace

Command Window
Current Folder

Command History

Fig. 1.1 Fereastra principală MATLAB - Matlab Desktop

 Command Window - în care sunt introduse comenzile;


 Command History - în care sunt stocate comenzile lansate în execuţie în fereastra
de comenzi;
 Workspace - în care vedem variabilele curente din memorie ,cu numele, valoarea şi
tipul acestora.

3
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.2 Variabile şi constante în MATLAB

Variabilele în Matlab sunt numeric sau de tip şir şi sunt reprezentate ca matrice.
Variabilele sunt folosite pentru a memora valorile numerice sau variabile şir, atat în
modul de lucru interactiv, în Command Window, cât şi în modul de lucru cu M-file.
Valorile momentane ale variabilelor se definesc prin operaţia de atribuire:

>> variabila = expresie


(>> x = expresie)

unde variabila este un nume legal în Matlab, iar expresia este: o constantă, o expresie
aritmetică, o expresie logica sau o funcţie Matlab.
Operatorul de atribuire este semnul egal " = ".
Numele variabilelor în MATLAB
 încep cu o literă a-z sau A-Z urmată de alte caractere: a-z, A-Z, sau _;
 au lungimea maximă din 31 caractere;
 numele variabilelor nu trebuie să coincidă cu numele funcţiilor din biblioteca
Matlab, built-in functions, sau cu funcţiile definite de utilizator;
 Matlab este case sensitive, variabila raspuns_1 este diferită de variabila
RASPUNS_1 .
Variabilele definite se pot vedea în Workspace Window. Când se atribuie o expresie unei
variabile de la prompter " >> ", în fereastra de comandă Command Window, Matlab
răspunde, dupa apasarea tastei Enter, prin afişarea valorii memorate pentru variabilă.
Dacă la sfârşitul expresiei se pune semnul punct şi virgula (semicolon) " ; " se suprimă
afişarea rezultatului.
Constantele numerice pot fi numere reale sau numere complexe. Constantele de tip şir
sunt definite prin şiruri de caractere alcătuite din litere, cifre, spaţii, delimitate prin
apostrof ( 'a1 aria_cerc r a2' ).
Pentru a afişa valoarea unei variabila se tastează numele ei.

Exemplul 1.1
>> r=4

r =
4

>> aria_cerc = pi*r^2

4
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

aria_cerc =

50.2655

>> b = r+aria_cerc

b =
54.265

>> c = r+(aria_cerc)^2; % ; suprimă afişarea

>> d = c+b

d =
2.5849e+003

>> z = 3+2i

z =
3.0000 + 2.0000i

>> z = 3+2j

z =

3.0000 + 2.0000i

>> sqrt(-1) (sqrt == radical)

ans =
0 + 1.0000i

>> 'a1 a2'


ans =
a1 a2

1.2.1 Formatul de afişare a datelor

 Comanda format

Comanda format controlează formatul numeric al valorilor afişate pe ecran. Comanda

5
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

are efect asupra afişării numerelor, şi nu asupra modului intern de reprezentare a acestora.
Pe sistemele Windows, se poate schimba setarea implicită a formatului prin selectarea
meniului Preferences din meniul File şi selectarea formatului dorit din General.
Formatele de afişare a numerelor sunt cele din Tabelul 1.1.

Tabelul 1.1 Formatele de afişare a numerelor

Comanda Rezultat Exemple

>> format Afişează 4 >> 372/7


short zecimale după ans = 53.1429
virgulă

>> format Afişează 14 >> 372/7


long zecimale după ans =
virgulă 53.142857142857146

>> format Afişează 4 >> 372/7


short e zecimale după ans = 5.3143e+001
virgulă, cu
exponent

>> format Afişează 14 >> 372/7


long e zecimale după ans =
virgulă, cu 5.314285714285715e+001
exponent

>> format Afişează 5 cifre >> 372/7


short g (ȋn virgulă fixă ans = 53.143
sau mobilă)

>> format Afişează 15 cifre >> 372/7


long g (ȋn virgulă fixă ans =
sau mobilă) 53.1428571428571

>> for at Afişează 2 >> 372/7


bank zecimale după ans = 53.14
virgulă

1.2.2 Constante pre-definite (built-in) în Matlab

Prezentăm în Tabel 1.2 funcțiile care furnizează valorile unor constante pre-definite în
Matlab.

6
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Tabel 1.2 Constante pre-definite

variabilă implicită atribuită de


ans Matlab rezultatului unei
expresii introdusă în Command
Window când aceasta nu a fost
atribuită unei variabile

eps precizia relativă (în virgulă


>> eps mobilă); în reprezentarea
numerelor este aproximată cu 16
ans =
cifre semnificative
2.2204e-016

pi
>> format long
>> pi , (3.141592653589793.....)
ans =
3.141592653589793

i,j
>> sqrt(-1)
ans = unitatea imaginară
0 + 1.0000i
>> i^2
ans =
-1

realmax
>> format short limita superioară a numerelor
>> realmax 1.7977e+308 = 1.7976*10308
ans =
1.7977e+308

realmin
>> realmin limita inferioară a numerelor
ans = 2.2251e-308=2.2251*10-308
2.2251e-308

7
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Inf
>> 1/0
ans = ∞ infinit
Inf

NaN
>> 0/0 " not a number"; 0 0
ans =
NaN

1.2.3 Operatori aritmetici. Expresii aritmetice

Operatorii aritmetici pentru operaţii cu scalari sunt prezentaţi ȋn Tabelul 1.3.

Tabelul 1.3 Operatori aritmetici

Operaţia aritmetică Simbol Exemple

adunarea + 5+2=7
scăderea - 5-2=7
ȋnmulţire * 5*2=10
ȋmpărţirea la dreapta / 5/2=2.5
ȋmpărţirea la stânga \ 5\2=2/5=0.4
ridicare la putere ^ 5^2=25

Ordinea operaţiilor din Matlab este aceeaşi cu cea a operaţiilor aritmetice, cunoscute din
matematica elementară, adica se efectuează întâi operaţiile cuprinse în paranteze, apoi
ridicarea la putere, înmulţirea şi împărţirea, adunarea şi scăderea.

1.2.4 Comenzi pentru lucrul cu variabile

Pentru a şterge o variabilă sau pentru a obţine informaţii despre variabile curente, create
într-o sesiune de lucru, vom introduce în Command Window următoarele comenzi:

8
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Tabel 1.4 Comenzi pentru lucrul cu variabilele

clear Şterge din memorie toate variabilele

clear Şterge din memorie variabilele x şi y


x,y

who Listează variabilele curente din


workspace

whos Afişează o listă cu variabilele curente

>> who

Your variables are:


ans aria_cerc b c d r z

>> whos

Name Size Bytes Class Attributes


a 1x1 16 double complex
ans 1x1 16 double complex
arg_z 1x1 16 double complex
aria_cerc 1x1 8 double
b 1x1 8 double
c 1x1 8 double
d 1x1 8 double
modu_z 1x1 8 double
r 1x1 8 double
z 1x1 16 double

1.2.5 Help și opțiuni de salvare a datelor

Pentru aflarea tuturor informaţiilor utile despre o comandă sau o funcţie Matlab se
tastează help urmat de numele comenzii sau funcţiei respective.

>> help comanda


9
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

MATLAB dispune de asemenea de informaţii complete despre utilizare sub forma unei
documentaţii tip .pdf.
Comenzi utile pentru aflarea de informaţii sunt: help, helpdesk, helpwin, lookfor, help
help, demo.

>> help demo

DEMO Access product demos via Help browser.

DEMO opens the Help browser and selects the MATLAB Demos
entry in the table of contents.

DEMO SUBTOPIC CATEGORY opens the Demos entry to the


specified CATEGORY.
CATEGORY is a product or group within SUBTOPIC. SUBTOPIC is
'matlab', 'toolbox', 'simulink', 'blockset', or 'links and
targets'. When SUBTOPIC is 'matlab' or 'simulink', do
not specify CATEGORY to show all demos for the product.

Examples:

demo 'matlab'
demo 'toolbox' 'signal'
demo 'matlab' 'getting started'

See also echodemo, grabcode, help, helpbrowser.

Reference page in Help browser


doc demo

Exemplul 1.2

>> help cos

COS Cosine of argument in radians.


COS(X) is the cosine of the elements of X.

See also acos, cosd.


Overloaded methods:
codistributed/cos

Reference page in Help browser


doc cos
 Opțiuni de salvare a datelor
10
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

 Comanda save - pentru salvarea variabilelor din sesiunea curentă de lucru


 Variabilele curente se vor salva într-un fișier cu extensia mat.
nume_fisier.mat
 Comanda load - pentru restituirea variabilelor într-o sesiune de lucru ulterioară.

Exemplul 1.3

>> a = abs(3+4i)

a =
5

>> rho = (1+sqrt(5))/2

rho =
1.6180

>> save date_2 a rho % salvează variabilele a și rho în fișierul


cu numele date_2 și extensia mat date_2.mat

>> clear all % sterge variabilele din memorie

>> load date_2 % restabilește variabilele

>> who

Your variables are:

a rho

1.3 Funcţii matematice din biblioteca Matlab (built-in functions)

Pentru calcule matematice elementare Matlab conţine funcţiile matematice uzuale. Matlab
conţine de asemenea multe funcţii matematice pentru calcule avansate, ca de exemplu
funcţiile Bessel şi funcţiile gama.
Detalii despre funcţiile elementare se obţin cu comanda

>> help elfun

 Elementary math functions.


 Trigonometric.

11
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

sin - Sine.
sind - Sine of argument in degrees.
sinh - Hyperbolic sine.
asin - Inverse sine.
asind - Inverse sine, result in degrees.
asinh - Inverse hyperbolic sine.
cos - Cosine.
cosd - Cosine of argument in degrees.
cosh - Hyperbolic cosine.
acos - Inverse cosine.
acosd - Inverse cosine, result in degrees.
acosh - Inverse hyperbolic cosine.
tan - Tangent.
tand - Tangent of argument in degrees.
tanh - Hyperbolic tangent.
atan - Inverse tangent.
atand - Inverse tangent, result in degrees.
atan2 - Four quadrant inverse tangent.
atanh - Inverse hyperbolic tangent.
sec - Secant.
secd - Secant of argument in degrees.
sech - Hyperbolic secant.
asec - Inverse secant.
asecd - Inverse secant, result in degrees.
asech - Inverse hyperbolic secant.
csc - Cosecant.
cscd - Cosecant of argument in degrees.
csch - Hyperbolic cosecant.
acsc - Inverse cosecant.
acscd - Inverse cosecant, result in degrees.
acsch - Inverse hyperbolic cosecant.
cot - Cotangent.
cotd - Cotangent of argument in degrees.
coth - Hyperbolic cotangent.
acot - Inverse cotangent.
acotd - Inverse cotangent, result in degrees.
acoth - Inverse hyperbolic cotangent.
hypot - Square root of sum of squares.

 Exponential.

12
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

exp - Exponential.
expm1 - Compute exp(x)-1 accurately.
log - Natural logarithm.
log1p - Compute log(1+x) accurately.
log10 - Common (base 10) logarithm.
log2 - Base 2 logarithm and dissect floating

 Complex.

abs - Absolute value.


angle - Phase angle.
complex - Construct complex data from real and
imaginary parts.
conj - Complex conjugate.
imag - Complex imaginary part.
real - Complex real part.
unwrap - Unwrap phase angle.
isreal - True for real array.

 Coordinate transforms.

cart2sph - Transform Cartesian to spherical


coordinates.
cart2pol - Transform Cartesian to polar coordinates.
pol2cart - Transform polar to Cartesian coordinates.
sph2cart - Transform spherical to Cartesian
coordinates.

Vom prezenta câteva funcţii din MATLAB utilizate în calcule matematice fundamentale.

Tabel 1.5 Funcții matematice (built-in) Matlab

Funcţia Rezultat

abs(x) Calculează modulul unui număr real


sau complex x

acos(x) Calculează arccos x

asin(x) Calculează arcsin x

base2dec('strn', base) Converteşte nr. strn din baza base

13
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

în baza 10

[theta,rho]=cart2pol(x,y) Transformă coordonatele carteziene


(x,y) în coordonate polare
(unghiul theta este returnat în
radiani)

[x,y]= pol2cart( th,rho) Transformă coordonatele polare


(th,rho) în coordonate carteziene
(unghiul th este dat în radiani)

[theta,phi,r]=cart2sph(x,y,z) Transformă coordonatele carteziene


(x,y,z) în coordonate sferice
(unghiurile theta şi phi sunt
returnate în radiani)

[x,y,z]=sph2cart(theta,phi,r) Transformă coordonatele sferice


(theta,phi,r) în coordonate
carteziene (unghiurile theta şi
phi sunt date în radiani)

complex(a,b) Construieşte z  a  ib

conj(z) Determină conjugatul numărului


complex z

cos(x) Calculează cos x


cot(x) Calculează ctgx

dec2base(d,base) Converteşte numărul din baza 10 în


baza base

exp(x)
Calculează ex
log(x) Calculează ln x

log2(x) Calculează log 2 x

pow2(x)
Calculează x2

rats(d) Aproximează d printr-o fracţie


raţională

sin(x) Calculează sin x

14
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

sqrt(x) Calculează x

tan(x) Calculează tg x

unitsratio(to, from) Converteşte unităţi de măsură


pentru lungimi şi unghiuri

1.3.1 Funcții speciale din Matlab

>> help specfun

Tabel 1.6 Funcţiile speciale

 Specialized math functions.

airy - Airy functions.


besselj - Bessel function of the first kind.
bessely - Bessel function of the second kind.
besselh - Bessel functions of the third kind
(Hankel function).
beta - Beta function.
ellipj - Jacobi elliptic functions.
ellipke - Complete elliptic integral.
erf - Error function.

expint - Exponential integral function.


gamma - Gamma function.
legendre - Associated Legendre function.
cross - Vector cross product.
dot - Vector dot product.

 Number theoretic functions.

factor - Prime factors.


isprime - True for prime numbers.
primes - Generate list of prime numbers.
gcd - Greatest common divisor.
lcm - Least common multiple.
rat - Rational approximation.

15
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

rats - Rational output.


perms - All possible permutations.
nchoosek - All combinations of N elements taken K at
a time.
factorial - Factorial function.

1.3.2 Funcţiile de matrice

Funcţiile de matrice se obţin cu comanda

>> help elmat

Tabel 1.7 Funcţiile de matrice

 Elementary matrices.

zeros - Zeros array.


ones - Ones array.
eye - Identity matrix.
repmat - Replicate and tile array.
linspace - Linearly spaced vector.
logspace - Logarithmically spaced vector.
freqspace - Frequency spacing for frequency response.
meshgrid - X and Y arrays for 3-D plots.
accumarray - Construct an array with accumulation.
: - Regularly spaced vector and index into
matrix.

 Basic array information.

size - Size of array.


length - Length of vector.
ndims - Number of dimensions.
numel - Number of elements.
disp - Display matrix or text.
isempty - True for empty array.
isequal - True if arrays are numerically equal.

 Matrix manipulation.

16
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

cat - Concatenate arrays.


reshape - Reshape array.
diag - Diagonal matrices and diagonals of
matrix.
blkdiag - Block diagonal concatenation.
tril - Extract lower triangular part.
triu - Extract upper triangular part.
rot90 - Rotate matrix 90 degrees.
: - Regularly spaced vector and index into
matrix.
find - Find indices of nonzero elements.
end - Last index.

 Specialized matrices.

compan - Companion matrix.


gallery - Test matrices.
hadamard - Hadamard matrix.
hankel - Hankel matrix.
hilb - Hilbert matrix.
invhilb - Inverse Hilbert matrix.
magic - Magic square.
pascal - Pascal matrix.
rosser - Classic symmetric eigenvalue test
problem.
toeplitz - Toeplitz matrix.
vander - Vandermonde matrix.
wilkinson - Wilkinson's eigenvalue test matrix.

1.3.3 Funcţii pentru operaţii cu numere complexe

abs - calculează modulul


angle - calculează unghiul
complex - Construieşte numărul complex
când se dau partea reală şi partea
imaginară
conj - determină conjugatul numărului
imag - determină partea imaginară
real - determină partea reală

Exemplul 1.4 Funcţii pentru operaţii cu numere complexe:


17
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

În figura 1.2 avem reprezentarea în planul complex a numărul complex z  x  iy .

y  Imz 

iy z  x  iy
z


x  Rez 

Fig.1.2 Planul complex

z = Comanda Matlab
2.5981 + 1.5000*i

partea reală: x  Rez   z cos >> x=real(z)


x = 2.5981

partea imaginară y  Imz   z sin  >> y=imag(z)

y = 1.5000

conjugatul numărului complex z  x  iy


>> z_conj=conj(z)

z_conj = 2.5981 - 1.5000i


>> mod=sqrt(z*conj(z))
modulul z  abs( z )  x2  y2

mod = 3

y >> theta=angle(z)
argumentul- unghiul   arctan theta = 0.5236
x
18
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> theta_grade=theta*180/pi
theta_grade = 30.0000
cu notaţia lui Euler >> mod=3;theta=pi/6;

z  z e i  z (cos  i sin  ) >> z=mod*exp(i*theta)


z =
2.5981 + 1.5000i

În Matlab unghiurile se măsoară în radiani. Pentru transformarea în grade se foloseşte


relaţia:
180
unghi_grade =unghi_radiani*180/pi;  0   rad *

1.3.5 Calculatorul de funcții funtool

În MATLAB putem accesa o funcție calculator grafic interactiv pentru lucrul cu funcții de
o variabilă. Acesul la această funcție se face cu comanda:

>> funtool

Se va afișa interfață grafică din figura 1.3:

Fig. 1.3 Calculatorul de funcții


19
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Pentru detalii, recomand consultarea M-File Help: >> help funtool.

1.4 Vectori în MATLAB

Variabilele în Matlab sunt numeric sau de tip şir şi sunt reprezentate ca matrice.
Vectorii şi matricele sunt tablouri de numere aranjate în linii şi/sau coloane.
Ele se vor introduce între paranteze drepte, element-by-element .

 o mărime scalară este reprezentată ca o matrice de tip (1 x 1)


 un vector linie ca o matrice (1 x n),
 un vector coloană ca o matrice (n x 1)
 o matrice (tablou) ca o matrice de tip (m x n).

1.4.1 Vector linie

Pentru introducerea manuală a unui vector linie

v  [v1 v 2 . . v n ],

unde v1, v 2 ,.., v n sunt scalari (numere reale sau complex), vom introduce elementele
separate printr-un spaţiu sau o virgulă.

Exemplul 1.5

>> v = [9 -6 3 2]

v =
9 -6 3 2

>> whos('v')

Name Size Bytes Class Attributes

v 1x4 32 double

% calculează numărul de elemente ale vectorului

20
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> length(v)
ans =
4

1.4.2 Vector coloană

Pentru introducerea manuală a unui vector coloană, vom introduce elementele separate
prin semicoloana (punct şi virgulă) (;).

Exemplul 1.6

>> v = [9; -6; 3; 2]

v =

9
-6
3
2

>> whos('v')

Name Size Bytes Class Attributes


v 4x1 32 double

1.4.3 Selectarea unui element și schimbarea valorii elementului

Pentru un vector v, elementul de pe poziţia k se selectează cu comanda:


>> v(k)

>> v=[9; -6; 3; 2];


>> v(2) % selectează elementul de pe pziția 2

ans =
-6

Putem atribui o nouă valoarea acestuia, tipărind:

>> v(k) = valoarea:

>> v(2)=10

v =
9 10 3 2
21
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.4.4 Operatorul de transpunere a vectorilor

Operatorul de transpunere, simbolizat în Matlab cu un singur apostrof ' , transformă un


vector linie în vector coloană şi invers.

>> v=[9 -6 3 2]

v =
9 -6 3 2

>> u=v'

u =
9
-6
3
2

1.4.5 Metode pentru generarea vectorilor

Prezentăm doua metode foarte utile pentru generarea vectorilor.

a) Generarea unui vector cu operatorul " : "

O primă metodă este să generăm un vector pornind de la o valoare iniţială, prima


componentă a vectorului, crescând această valoare cu un pas dat, până la valoarea finală:

>> v = valoarea_iniţială : pas : valoare_finală

Exemplul 1.7:

10. Generarea unui vector cu operatorul " : " se face pornind de la valoarea iniţială 1 şi
până la valoarea finală 4, cu pasul 0.8:

>> x=1:0.8:4
x =
1.0000 1.8000 2.6000 3.4000

20. În cazul în care nu este trecut pasul, Matlab consideră pasul egal cu valoarea 1:
22
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> x = 1:5
x =
1 2 3 4 5

30. Putem genera un vector coloană folosind aceeaşi metodă împreună cu operatorul de
transpunere

>> y=(0:0.2:1)'
y =
0
0.2000
0.4000
0.6000
0.8000
1.0000

b) Generarea unui vector folosind funcţia Matlab linespace

Metoda a doua de generare a unui vector, frecvent utilizată în programele din capitolele
următoare, foloseşte funcţia Matlab linspace.
Comanda se poate folosi cu următoarele două sintaxe:

a) sintaxa:

>> x = linspace(val_initiala, val_finala)

generează un vector linie cu 100 elemente, egal distanţate, între valoarea iniţială şi
valoarea finală.

b) sintaxa:

>> x = linspace(val_initiala, val_finala, nr_comp)

generează un vector linie cu numărul componentelor dat de nr_comp, egal distanţate


între valoarea iniţială şi valoarea finală.

Exemplul 1.8

23
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

10)
>> v = linspace(0,0.25,6)
v =
Columns 1 through 4
0 0.0500 0.1000 0.1500
Columns 5 through 6
0.2000 0.2500

20)
>> v = linspace(0,0.25,6)'

v =
0
0.0500
0.1000
0.1500
0.2000
0.2500

30)
>> x=linspace(0,2*pi,4)';
>> y=sin(x);
>> z=cos(x);

>> [x y z] % afișează vlorile în formă de tabel

ans =
0 0 1.0000
2.0944 0.8660 -0.5000

40)
>> x=linspace(0,4);

% definim funcția
>> y=x.^2-3*x+2;

% folosim calculul element cu element pentru valorile funcției


% obținem graficul funcției din figura 1.4

>> plot(x,y)
>> grid
24
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.5

0.5

-0.5
0 0.5 1 1.5 2 2.5 3 3.5 4

Fig. 1.4 Graficul din Exemplul 1.8 (40)

1.4.6 Funcţii din Matlab utilizate în calcule cu vectori

Prezentăm în Tabelul 1.8 câteva funcţii din Matlab 7.0 utilizate în calcule cu vectori.

Tabel 1.8 Funcţii din Matlab utilizate în calcule cu vectori

Funcţia Rezultat

cross(x,y) Calculează produsul vectorial al vectorilor x


şi y

dot(x,y) Calculează produsul scalar al vectorilor x şi


y

sort(x) Sortează în ordine crescătoare elementele


vectorului x

sort(x,’descend’) Sortează în ordine descrescătoare elementele


vectorului

length(x) Calculează lungimea vectorului

sum(x) Calculează suma elementelor vectorului

prod(x) Calculează produsul elementelor vectorului

25
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.9

1. Să se calculeze produsul scalar şi unghiul vectorilor:

       
a  2i  j  k și b  3i  j  4k .

Folosim relaţiile :

         
a  b  a  b  cos(a, b )  a  b  cos , a  b  a x bx  a y b y  a z bz

   
a b
  arccos(   ) ; a  a x2  a 2y  a z2  norm(a )
ab

În Command Windows scriem comenzile:

% introducem vectorii

>> a=[2 1 -1];


>> b=[3 -1 4];
% calculăm produsul scalar cu funcţia dot
>> c = dot(a,b)
c =
1

% calculăm unghiul (Matlab afişează rezultatul în radiani)

>> theta=acos(c/(norm(a)*norm(b)))

theta =
1.4906 (rad)

% calculăm unghiul în grade

>> theta_grade=theta*180/pi

theta_grade = 85.4078

26
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.5 Matrice în MATLAB

În MATLAB, o matrice este un tablou dreptunghiular, A(m,n), unde m este numărul


liniilor iar n este numărul coloanelor .

1.5.1 Introducerea matricelor în Matlab

Matricele se pot introduce în mai multe moduri.


1) Introducerea directă în Command Window
2) Încărcarea unor date din fişere externe de date.
3) Generarea de matrice utilizând funcţii Matlab built-in.
4) Crearea de matrice în fişierele M-files.

Exemplul 1.10

a) Introducerea directă în Command Window a unei matrice

o matricea se introduce linie cu linie, între paranteze drepte


o elementele liniei sunt separate prin spaţiu sau virgulă
o liniile sunt separate prin punct-virgulă " ; ".

>> A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2]

% tastăm Enter și Matlab afișează

A =
2 2 4 -2
1 3 2 -1
3 1 3 1
1 3 4 2

O dată introdusă, matricea este memorată în workspace şi poate fi apelată simplu, cu


comanda: >> A.

b) Comenzi pentru accesarea elementelor, a liniilor și a coloanelor

10. Un element al matricei A, de exemplu elementul de pe linia i şi coloana j se poate


accesa cu comanda A(i,j)
27
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2];

>> A(3,2)
ans = 1

20. O linie, de exemplu linia 2, sau o coloană, de exemplu coloana 3, se selectează cu


comenzile

>> A(2,:) % afişează linia 2


ans =
1 3 2 -1
>> A(:,3) % afişează coloana 3

ans =
4
2
3
4

c) Matricea transpusă

Matricea transpusă se obţine, ca şi în cazul vectorilor, folosind operetorul de transpunere.

>> A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2]

A =
2 2 4 -2
1 3 2 -1
3 1 3 1
1 3 4 2

>> A_transpusa=A' % AT se obţine cu comanda Matlab A|

A_transpusa =

2 1 3 1
2 3 1 3
4 2 3 4
-2 -1 1 2

28
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.5.2 Funcții Matlab pentru lucrul cu matrice

Prezentăm în Tabelul 1.9 câteva funcţii din Matlab 7.0 utilizate în lucrul cu matrice.

Tabel 1.9 Funții Matlab pentru lucrul cu matrice


Funcţia Rezultat
det(A) determinantul matricei A

inv(A) inversa matricei A

sum(A) un vector linie cu


elementele suma elementelor
de pe coloane

diag(A) lista elementelor de pe


diagonală

[m n] = size(A) dimensiunile matricei A

1.5.3 Funcţii Matlab pentru generarea matricelor speciale

Exemplul 1.11

Nume funcţie Rezultat/Exemple


size >> A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2];
>> size(A)

ans =
4 4

diag Extrage elementele de pe diagonală sau


creează o matrice diagonală cu elementele
date

>> diag(A)'
ans =
2 3 3 2

>> v=[1 2 3];


>> A=diag(v)

29
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

A =
1 0 0
0 2 0
0 0 3

Creează matricea identitate


eye
>> eye(3)

ans =
1 0 0
0 1 0
0 0 1

Creează o matrice cu elementele egale cu unu


ones
>> ones(2,3)
ans =
1 1 1
1 1 1

Creează o matrice cu elementele egale cu zero


zeros
>> zeros(3)
ans =
0 0 0
0 0 0
0 0 0

1.6 Operaţii cu vectori şi matrice

1.6 .1 Operaţiile de adunare, scădere şi înmulţire

Operaţiile de adunare, scădere şi înmulţire pentru vectori şi matrice se fac folosind


respectiv comenzile: +, -, *.
Trebuie să fim atenţi ca dimensiunile tablourilor respective să fie compatibile.

Exemplul 1.12

% introducem matricele A și B

30
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> A=[0 1 2; 5 1 4; 3, 2 -4], B=eye(3)

A =
0 1 2
5 1 4
3 2 -4

B =
1 0 0
0 1 0
0 0 1

% suma matricelor cij  aij  bij

>> C=A+B

C =
1 1 2
5 2 4
3 2 -3
n
% produsul matricelor, d ij   a ik bkj
k 1
>> D=A*B

D =
0 1 2
5 1 4
3 2 -4

1.6.2 Inversa unei matrice

În Matlab inversa unei matrice pătratice nesingulare, cu determinantul diferit de


zero, det( A)  0 , se poate obţine cu comanda:

>> inv(A)

Calculul determinantului se face cu comanda:

>> det(A)

31
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.13

>> A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2];

% verificăm dacă matricea este nesingulară det( A)  0

>> det(A)

ans =
-68
% calculăm inversa

>> inv(A)

ans = -0.1912 0.2647 0.4706 -0.2941


-0.2500 0.5000 0 0
0.3529 -0.4118 -0.1765 0.2353
-0.2353 -0.0588 0.1176 0.1765

% verificăm dacă A-1*A = I

>> inv(A)*A

ans =
1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 1.0000 0.0000
0.0000 0.0000 0.0000 1.0000

1.6.3 Împărţirea matricelor. Împărţirea la stânga

Împărţirea la stânga este folosită pentru rezolvarea sistemelor de ecuaţii algebrice liniare
(vezi Capitol 3) de forma

A x = b sau Ax  b (1.1)

unde

32
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

 a11 a21 . . an1   b1   x1 


a    x 
a22 . . a21 b2 
 ; b    ; x   2 
A   21 (1.2)
 . . . . .  . .
  
 an1 an 2 . . ann  bn   xn 

Pentru o matrice A bine condiţionată (vezi secțiunea 3.5) şi nesingulară, soluţia ecuaţiei
matriceale se obţine prin înmulţirea în ambele părţi ale ecuaţiei (1.1) cu inversa matricei
sistemului, [ A ] 1 :

[ A] 1 [ A]x  A b


1
(1.3)

1
Deoarece A A  I , din (1.3) obţionem soluţia:

x  A1 b (1.4)

În Matlab ecuaţia matriceală se rezolvă cu împărţirea la stânga, care foloseşte operatorul


" \ " şi se obţine cu comanda

>> A\b

Exemplul 1.14

>> A=[1 2 1;0 -1 2;0 0 3], b=[2;1;9]

A =
1 2 1
0 -1 2
0 0 3

b =
2
1
9

>> det(A)

ans = -3

33
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> x=A\b

x =
-11
5
3

>> x=inv(A)*b

x =
-11.0000
5.0000
3.0000

1.6.4 Împărţirea matricelor. Împărţirea la dreapta

Împărţirea la dreapta este folosită pentru rezulvarea ecuaţiei matriceale de forma

x A  b
unde x şi b sunt vectori linie.
Soluţia ecuaţiei este
x  b  A1

În Matlab, ecuaţia se rezolvă folosind operatorul de împărţire la dreapta " / " şi se obţine
cu comanda

>> x= b/A

Exemplul 1.15

>> A=[1 2 1;0 -1 2;0 0 3], b=[2 1 9]

A =
1 2 1
0 -1 2
0 0 3

b =
2 1 9

>> x=b/A

x = 2.0000 3.0000 0.3333


34
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> b*inv(A)

ans =
2.0000 3.0000 0.3333

1.6.5 Operaţii element cu element

Operaţiile element cu element, de înmulţire, împărţire şi ridicare la putere a doi vectori


sau două matrice se introduc în Matlab scriind în faţa operatorului semnul pentru punctul
zecimal " . ". Operaţiile au loc pentru matrice de dimensiuni egale.

 .* înmulţire element cu element


 ./ împărţire element cu element
 .^ ridicare la putere element cu element

Exemplul 1.16

10. Ridicarea la putere a unui vector

>> v=[ 1 2 3 4];

% ridicarea la putere element cu element

>> u=v.^2

u =
1 4 9 16

% simpla ridicare la putere a vectorului, fără punctul scris după


v, produce mesaj de eroare

>> w=v^2
??? Error using ==> mpower
Inputs must be a scalar and a square matrix.

20. Produsul matricelor și împărțirea matricelor element cu element

>> A = [1 2;3 4], B = [-1 5;3 1]

A =
1 2
3 4

35
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

B =
-1 5
3 1

% produsul element cu element

>> C=A.*B

C =
-1 10
9 4

% produsul dupa regula de înmulțitre a matricelor

>> D=A*B

D =
5 7
9 19

% observăm că rezultatele sunt diferite, C este diferită de D

30. Împărțirea matricelor element cu element

>> E=A./B

E =
-1.0000 0.4000
1.0000 4.0000

% împărțirea la dreapta / (fără punct ./)

>> F=A/B % este echivalentă cu >> A*inv(B)

F =
0.3125 0.4375
0.5625 1.1875

>> A*inv(B)
ans =
0.3125 0.4375
0.5625 1.1875
36
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

40. Operaţii element cu element pentru funcții de matrice

Tot element cu element se fac calculele şi pentru unele dintre funcţiile din biblioteca
Matlab când argumentul este o matrice. De exemplu, pentru A matrice, comenzile
sin(A), cos(A) sau exp(A)au ca rezultat matrice de aceași dimensiune cu matricea
A și cu elementele valoarea funcției pentru fiecare element (element cu element).

>> A = [pi/6 pi/2; pi/4 pi/3];


>> sin(A)

ans =
0.5000 1.0000
0.7071 0.8660

1.7 Matricea magică

Un exemplu celebru de matrice apare în gravura renascentistă Melancholia, figura 1.5,


realizată de marele artist Albrecht Dürer. Gravura este încărcată de simbolism matematic
şi la o atentă observare a acesteia se poate distinge în colţul din dreapta sus o matrice.
Matricea respectivă este cunoscută sub numele de pătrat magic, în timpul lui Dürer se
considera că are proprietăţi magice.

Fig. 1.5 Gravura Melancholia

37
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Pentru introducerea matricii lui Dürer tastăm:

>> D = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]

D =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1

Caracterul magic derivă din faptul că prin efectuarea unor operaţii asupra elementelor
matricei obținem rezultate surprinzătoare.
Dacă de exemplu, însumăm elementele pe orice linie sau coloană sau de pe cele două
diagonale vom obţine acelaşi număr. Să verificăm acest lucru cu MATLAB-ul.
Suma elementelor de pe cele 4 coloane se calculează cu comanda:
» sum(A)
ans =

34 34 34 34

Pentru calcularea sumelor pe linii, efectuăm întâi transpunerea matricei şi apoi se aplică
din nou comanda sum.

» A'
ans =
16 5 9 4
3 10 6 15
2 11 7 14
13 8 12 1

» sum(A')'

ans =
34
34
34
34

Suma elementelor de pe diagonale:

» diag(A)

ans =
38
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

16
10
7
1

» sum(diag(A))

ans =
34

1.8 PROGRAMARE ÎN MATLAB

Programarea este pregătirea pas cu pas a instrucțiunilor de program, într-un limbaj de


programare, pentru rezolvarea cu calculatorul a unei probleme, pe baza unei scheme
logice și a unui algoritm de calcul.
Schema logică este o reprezentare grafică a secvenței de instrucțiuni logice.
Algoritmul este o succesiune de instrucțiuni cu care se rezolvă o problemă specifică.
Programarea în Matlab se realizează parcurgând următorii pași:
 pasul 1: se crează o m-fila script
 pasul 2: scriem instrucțiunile Matlab în m-fila creată
 pasul 3: salvăm și executăm m-fila (Editor/ File Menu și Editor/ Debug).

1.8.1 Crearea fişierelor MATLAB M-files (.m files)

Deoarece în modul de lucru Command Window, comenzile nu pot fi salvate și executate


din nou, modul de lucru Command Window nefiind interactiv, este mult mai util să se
lucreze cu fişiere care conţin cod MATLAB. Aceste fișiere sunt numite M-files sau
fișiere cu extensia .m.
Fişierele se creează utilizând un editor de text şi apoi se salvează cu extensia '.m':
nume_fisier.m.
Conținutul fișierelor M-file se afișează cu comanda: >> type nume_fisier
și se execută prin tastarea numelui fișierului (fără extensia .m): >> nume_fisier
Sunt două tipuri de fişiere .m:
 Fişiere Script - nu acceptă argumente de intrare şi nu returnează argumente de
ieşire (rezultate). Aceste fişiere operează cu datele din spaţiul de lucru sau pot crea
date noi.
 Fișiere Funcţie - acceptă argumente de intrare (variabilele independente) şi
returnează argumente de ieşire (variabilele dependente). Variabilele utilizate sunt
variabile locale (interne) ale funcţiei.
39
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.8.1.1 Fişiere Script M - files

Fișierul script poate fi editat (modificat și/sau corectat) și executat de mai multe ori. Orice
editor de text poate fi folosit pentru a crea fișiere script. În MATLAB fișiere script sunt
create și editate în Editor / Debugger Window. Această fereastră poate fi deschisă din
fereastra de comandă (Command Window). Din această fereastă selectați File, New și
apoi M-file (Script).

Atunci când se apelează la un fişier script, MATLAB-ul execută comenzile găsite în


fişierul respectiv. Fişierele script pot lucra cu date din spaţiul de lucru (workspace) sau
pot crea date noi cu care operează. Script-urile nu furnizează argumente de ieşire,
variabilele create rămân în workspace și pot fi folosite în calculele ulterioare.
Fişierele script pot furniza ieşiri grafice folosind funcţii cum ar fi plot, bar.
Pentru mai multe informații tastează >> help script.

Exemplul 1.17 Vom scrie o M-fila pentru calculul rădăcinilor ecuației de gradul doi.
parcurgem următorii pași:

1. Alegem New..din File menu, apoi M-file (Script) și scriem comenzile în noua m-fila:
40
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

% script pentru determinarea radacinile ecuatiei de grad doi

format short;
a=1; b=5; c=6;
m = -b/(2*a);
n = sqrt(b^2-4*a*c)/(2*a);
x1 = m+n
x2 = m-n

2. Salvăm m-fila cu numele rad_ec_grad2.m.


Conținutul M-filei se poate afișa în Comand Window cu comanda:
>> type rad_ec_grad2

3. Pentru executarea M-filei se tastează numele ei (fără extensia .m)

>> rad_ec_grad2

x1 =
-2

x2 =
-3

Fişierele script pot furniza ieşiri grafice folosind funcţia plot.

Exemplul 1.17 Vom scrie o M-fila pentru a obține graficul funcției sin(x)pe care o
salvăm cu numele sin_grafic.m.
Conținutul ei se afișează cu comanda:

>> type sin_grafic

x = 2*pi*(0:0.02:1);% genereaza vectorul valorilor pentru x


plot(x, sin(x)) % comanda pentru grafic
title('Figura 1.5: Graficul functiei sinus')
xlabel('x')
ylabel('sin(x)')

41
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Figura 1: Graficul functiei sinus


1

0.8

0.6

0.4

0.2
sin(x)
0

-0.2

-0.4

-0.6

-0.8

-1
0 1 2 3 4 5 6 7
x

Fig.1.5 Graficul funcției sin(x)

1.8.1.2 Fișiere Funcţie M-files

Aceste fişiere permit utilizatorului să extindă funcțiile de bază (built-in) din biblioteca
MATLAB prin adăugarea de funcții proprii. Fișierele M-file de tip funcție acceptă
argumente de intrare şi furnizează argumente de ieşire. Numele fişierului MATLAB (M-
file) şi cel al funcţiei (subrutinei) respective trebuie să fie identice. Funcţiile (subrutinele)
lucrează cu variabile proprii separate de spaţiul de lucru uzual al MATLAB-ului.
M-filele de tip funcție încep cu o linie de forma:

function [ param_iesire ] = nume( param_intrare )


% linii de comentariu
comenzi
end

Prima linie a unei funcţii M-file începe cu cuvântul cheie function. Această linie dă
numele funcţiei, ordinea şi numărul argumentelor.
Liniile care încep cu caracterul % sunt linii de comentariu.

Exemplul 1.18

M-fila funcție pentru calculul radacinilor unei ecuații de gradul 2. Exemplul conține și o
demonstratie pentru utilizarea comenzii keybord.
42
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

function x = rad_ec_grad2(a,b,c)

% rad_ec_grad2_functia calculeaza radacinile ecuatiei de grad 2


% a*x^2 + b*x + c = 0
% am introdus si o demonstratie pentru utilizarea comenzii
% keybord
% apelare cu: x = rad_ec_grad2(a,b,c)
%
% Input (parametrii de intrare): a,b,c
% Output (param iesire): x = vectorul coloana al radacinilor

disc = b^2 - 4*a*c;


if disc<0
disp('Atentie in functia rad_ec_grad2_functia');
disp('Discriminant negativ')
disp('Tasteaza "return" pentru continuare');
keyboard
end
% calculeaza valoarea intermediara q
q = -0.5*( b + sign(b)*sqrt(disc) );

% prealoca memorie pentru vectorul solutiei calculate

x=zeros(1,2);
x(1)=q/a;
x(2)=c/q;

% memoreaza radacinile in vectorul coloana x

x = [x(1); x(2)]

% folosim m-fila functie rad_ec_grad2.m pentru calculul


radacinilor ecuației

x 2  5x  6  0 (   0 )
>> x=rad_ec_grad2(1,5,6)

x =
-3
-2

43
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

% folosim m-fila functie pentru calculul radacinilor ecuației

x2  x  1  0 (   0 )

cu utilizarea comenzilor keybord și return

>> x=rad_ec_grad2(1,1,1)

Atentie in functia rad_ec_grad2_functia:\n


Discriminant negativ
Tasteaza "return" pentru continuare
K >> return
x =
-0.5000 - 0.8660i
-0.5000 + 0.8660i

1.8.2 Metode pentru definirea funcțiilor

În Matlab putem defini funcțiile prin trei metode:

1. function M-files
2. anonymus functions sau function handles @(x)

3. inline functions

1.8.2.1 Definirea funcțiilor cu comanda function

Pentru a defini funcții noi, diferite de funcțiile (built-in) matematice din Matlab putem
folosi comanda function.
Din File-New-Function obținem:

function [ arg_iesire ] = numele_functiei( arg_intrare )

% scriem funcția

end

Funcția se va salva într-o M-fila cu numele funcției. (Matlab salvează implicit funcțiile
în acest mod).

44
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.19

Vom crea o funcție cu numele viteza:


 numele_functiei: viteza
 arg_iesire: v
 arg_intrare: t,m,b

function v = viteza(t,m,b)
v=10*(1-exp((-b/m)*t));

1.8.2.2 Anonymus functions

Cea mai simplă metodă pentru a crea funcții în Matlab este să folosim semnul @. Astfel
definim funcțiile ca handle functions sau anonymus functions.
Sintaxa:

nume_functie = @(var1,var2,..)expresie

unde expresie specifică funcția iar var1,var2,..sunt variabilele independente.

Exemplul 1.20

Pentru a simula (pentru a crea și memora) comportarea funcției f ( x)  x 2  3x  2


vom scrie comanda:

>> f=@(x) x^2-3*x+2

f =
@(x)x^2-3*x+2

% calculăm valoarea funcției în x = 1

>> f(1)

ans =
0

% calculăm valoarea funcției într-un vector


% rescriem funcția pentru a putea face calculele element cu
element
45
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> x=1:4;
>> f=@(x) x.^2-3*x+2

f =
@(x)x.^2-3*x+2

>> f(x)

ans =
0 0 2 6

1.8.2.3 Definirea funcțiilor inline și utilizarea funcției feval

În Matalb putem defini funcții matematice simple nu numai în M-file tip funcție. O altă
metodă este de a scrie direct, în programe sau în Command Window, funcțiile folosind
comanda inline.
Sintaxa:
nume_functie = inline('expresie',var1,var2,..)

unde 'expresie' specifică funcția iar var1,var2,..sunt variabilele independente.


Putem defini funcțiile și scriind expresia literală a funcției pentru a fi evaluată cu
comanda eval.
Valorile funcţiilor definite inline, calculate în diferite valori ale argumentelor se pot
obține folosind M-funcția (built in) feval.
Sintaxa:

[y1,..,yn] = feval(f,x1,...,xn)

Exemplul 1.21

10. Definim funcția f ( x)  x 2  3x  1 ca funcție inline.


>> f=inline('x.^2+3*x+1','x')

f =
Inline function:
f(x) = x.^2+3*x+1

>> argnames(f)

46
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

ans =
'x'

>> formula(f) % scrie expresia funcției


ans =
x.^2+3*x+1

>> feval(f,1) % calcutează valoarea funcției în x =


ans =
5

20. Definim funcția f ( x, y)  x 2  y 2


>> g = inline ('xˆ2 + yˆ2','x','y');
>> g(3,5)
ans = 34

1.8.3 Comenzi de intrare - ieșire a argumentelor funcțiilor

În definiția m-file tip funcție

function [ arg_iesire ] = numele_functiei( arg_intrare )

avem argumente de ieșire și argumente de intrare care sunt, respectiv, date de ieșire și
date de intrare.

1.8.3.1 Comenzi de intrare

Argumentele de intrare, arg_intrare, se pot introduce în două moduri:


a) folosim comenzi de intrare de la tastatură
b) argumentele se scriu direct în funcție.

a) Comanda de intrare de la tastatură: comanda input.

Exemplul 1.22

Pentru a introduce valoarea variabilei x direct de la tastatură folosim comanda input

>> x = input('valoarea x=')


% se afișează
47
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

valoarea x =

% introducem valoarea, de exemplu 4, apoi Enter


% obținem
x =
4

b) Se scriu argumentele direct în funcție.

Exemplul 1.23

Pentru a calcula rădăcinile ecuației de gradul doi x  11x  30  0 apelăm funcția


2

rad_ec_grad2 definită în Exemplul 1.18. Argumentele de intrare, coeficienții ecuației,


se vor scrie direct în funcție (așa s-a procedat și în Exemplul 1.18)

>> rad_ec_grad2(1,11,30)

x =
-6
-5
Recomandăm introducerea parametrilor de intrare direct în funcție.

1.8.3.2 Comenzi de ieșire. Funcțiile disp și fprintf

În MATLAB dispunem de trei modalități pentru afișarea argumentelor de ieșire, a


valorilor numerice și a textelor:
10. Folosind funcția disp.
20. Folosind funcția disp împreună cu funcția num2str.
30. Folosind funcția fprintf.

1.8.3.3 Funcția disp

Funcția disp - se folosește pentru afișarea pe ecran a unui șir de caractere.

Exemplul 1.24

a.
>> display('Buna ziua')

48
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

% Matlab afișează

Buna ziua

b.
>> format short
>> x=1:3;
>> disp(x)

1 2 3
c.
>> x=1:3;
>> y=4-x;
>> disp([x; y])

1 2 3
3 2 1

20. Utilizarea funcției disp împreună cu funcțiile num2str și str2num.

 Funcția num2str

Funcția num2str, number-to-string, se folosește pentru a converti o valoare


numerică, numericValue într-un șir de caracter, stringValue. Acesta este apoi
afișat folosind disp.

stringValue = num2str(numericValue)

 Funcția str2num

Funcția str2num se folosește pentru a converti un șir de caractere într-o valoare


numerică. (>> help str2num)

Exemplul 1.25 a)
>> A = ones(3)
A =
1 1 1
1 1 1
1 1 1
49
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> S = num2str(A)

S =

1 1 1
1 1 1
1 1 1

Aparent A și S au aceleași valori, dar nu sunt echivalente deoarece A este o matrice


numerică iar S este o matrice tip șir de caractere, ceea ce se observă din cele de mai jos.

>> A=ones(3);
>> S=num2str(A);
>> B=str2num(S);

>> A-S

??? Error using ==> minus


Matrix dimensions must agree.

>> A-B

ans =

0 0 0
0 0 0
0 0 0

>> whos

Name Size Bytes Class

A 3x3 72 double
B 3x3 72 double
S 3x7 42 char
ans 3x3 72 double

Exemplul 1.25 b)

50
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Utilizarea funcției disp împreună cu funcția num2str

>> x = sqrt(3);
>> disp(['x = ',num2str(x)])
x = 1.7321

1.8.3.4 Funcția fprintf

Funcția fprintf se folosește pentru formatarea (aranjarea) datelor pe ecran sau pentru
tipărire.
Sintaxa:

fprintf('format',lista de variabile)

Format este un șir ce conține text dar și indicații despre modul în care variabilele, din
lista de variabile, se convertesc (formatul) și se poziționează (afișează).
În tabelul 1.10 sunt date codurile de bază cu care se formatează variabilele din lista de
variabile.

Tabel 1.10 codurile pentru formatul variabilelor

Cod Formatul rezultat

%s format tip șir

%d format număr întreg

%f format în virgulă mobila (floating-point)

%e format în virgulă mobila (floating-point) notația științifică

%g format în cea mai compactă formă dintre %f sau %e

\n insert linie nouă

\t insert tab

În tabelul 1.11 sunt date codurile pentru a preciza în format atât numărul total de
caractere precum și numărul de zecimale.

51
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Tabel 1.11 codurile pentru formatul variabilelorși al numărului de caractere

Cod Formatul rezultat

%wd format număr întreg cu w - numărul total de caractere


%w.vf format în virgulă mobila, cu w numărul total de
caractere și v numărul de zecimale
%w.ve format în virgulă mobila, ca mai sus, dar cu notația
științifică

Exemplul 1.26

Calculăm valorile funcției sin(x) cu afișarea lor în 2 variante

% varainta 1 % varianta 2
>> x=0:pi/4:2*pi; >> x=0:pi/4:2*pi;
>> y=sin(x); >> y=sin(x);
>> fprintf('%8.3f\n',y) >> fprintf('y = %8.3f\n',y)
0.000 y = 0.000
0.707 y = 0.707
1.000 y = 1.000
0.707 y = 0.707
0.000 y = 0.000
-0.707 y = -0.707
-1.000 y = -1.000
-0.707 y = -0.707
-0.000 y = -0.000

Exemplul 1.27

Calculăm valorile funcției sin(x) cu afișarea și a vectorului variabilei și a vectorului


valorilor calculate pentru funcție.

x = 0:0.2:1;
fprintf(' x sin(x)\n')
for i = 1:length(x)
fprintf('%4.1f %11.6f\n',x(i),sin(x(i)))
end
52
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

x sin(x)
0.0 0.000000
0.2 0.198669
0.4 0.389418
0.6 0.564642
0.8 0.717356
1.0 0.841471

Exemplul 1.28

Dacă o declaraţie (comandă) nu încape într-o linie de comandă, se vor utiliza trei puncte .
. . urmate de Return sau Enter pentru a indica faptul că expresia continuă pe linia
următoare.

fprintf(' k a f(a) b f(b) xr ...


f(xr) semn(fa*fr)\n')

s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ...


- 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

display(['Solutiile sunt a =' num2str(a)', b ='num2str(b)' ...


'c = ' num2str(c)']);

Spaţiile albe din jurul semnelor =, +, - sunt opţionale şi pot îmbunătăţi citirea liniilor.
Maximul numărului de caractere pe o singură linie este de 4096.

1.8.4 Operatori relaționali. Expresii relaționale

O expresie relaţională este formată din două expresii aritmetice separate de un operator
relaţional. Operatorii de relație în Matlab sunt cei din Tabelul 1.11 Rezultatul unei
expresii relaţionale este true (adevărat) sau false (fals) ce au valorile 1 şi respectiv 0.

Tabel 1.11 Operatori relaționari


Operator Semnificație Expresie Rezultat-
relațională Valoare
< mai mic >> 3 < 5 ans = 1

53
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

<= mai mic sau >> -3< = -2 ans = 1


egal

> mai mare >> 2 > 7 ans = 0

>= mai mare sau >> -3> = -2 ans = 0


egal

== identic >> 2 = = 2 ans = 1

~= diferit >> 2~=2 ans = 0

În Matlab, operatorii relaționali compară doua matrice element cu element si returnează


rezultatul într-o matrice de aceleași dimensiuni, cu elementele 0 sau 1.

1.8.5 Operatori logici

Operatorii logici au în Matalb simbolurile din Tabelul 1.12. Valorile logice de adevăr sau
fals sunt 1 respectiv 0.
Tabel 1.12 Operatori logici

& AND (și)

| OR (sau)

~ NOT (nu)

Operațiile logice sunt prezentate în tabelele de mai jos.

A B A&B A B A|B
1 1 1 1 1 1 A ~A
1 0 0 1 0 1 1 0
0 1 0 0 1 1 0 1
0 0 0 0 0 0

(a) AND (b) OR (c) NOT

Fiecare operator logic lucrează element cu element. Funcția Matlab (built-in) logical
convertește elementele vectorior sau maticelor în valorile logice 1 (True) și 0 (False).
Orice element real diferit de zero al matricei este convertit în 1, valorile 0 ale matricei
devin valoarea logică 0.

54
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Numerele complexe nu se pot converti in valori logice, rezultatul fiind un mesaj de eroare
(>> help logical).

Exemplul 1.29

a) Operații logice cu matrice

>> A=[2 -1 2 -2; 0 1 2 3], B=ones(2,4),

A =
2 -1 2 -2
0 1 2 3

B =
1 1 1 1
1 1 1 1

>> A<B

ans =
0 1 0 1
1 0 0 0

>> A<=B

ans =
0 1 0 1
1 1 0 0

>> A~=B

ans =
1 1 1 1
1 0 1 1

b) Vom crea, pornind de la doi vectori a și b, vectorii cu valori logice corespunzători, apoi
vom face operațiile logice cu ei.

>> a=[ 2 3 4 0 0];


>> u=logical(a)
u =
1 1 1 0 0

>> b=[-1 0 3 0 10];

55
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> v=logical(b)

v =
1 0 1 0 1

>> w = u & v

w_and =

1 0 1 0 0

w_ori =

1 1 1 0 1

>> w_si = ~u

w_si =

0 0 0 1 1

Nu este necesar să convertim vectorii în vectori logici. Dacă vectorii sau matricele nu sunt
tablouri de valori logice, operatorul logic va converti mai întâi operanzii în tablouri logice
și apoi va executa comanda cerută.

c)
>> a=[ 2 3 4 0 0];
>> b=[-1 0 3 0 10];
>> a&b

ans =
1 0 1 0 0

>> A=[1 2 0;4 -5 6;7 0 9];


>> B=[ -2 3 9;9 0 43; 10 -12 99];
>> A&B

ans =

1 1 0
1 0 1
56
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1 0 1

1.8.6 Instrucțiuni de salt și bucle de control

În MATLAB există mai multe tipuri de instrucțiuni de salt și bucle.

1.8.6.1 Instrucțiunea for


Comanda for este comanda cu care se execută repetat o operație pentru toate elementele
unui vector. În figura 1.6 este prezentată schema logică pentru o buclă for.

Sintaxa 2: for
i = start

for index = start:pas:final


False
i < = final set de instructiuni

end
i = i + pas
True

set de instructiuni

Fig. 1.6 Schema logică comanda for

Exemplul 1.30

a) Calculul puterilor numerelor întregi de la 1 la 4

n=4;x=zeros(1,4);
for i=1:n
x(i)=i^2;
end
x

x =
1 4 9 16

57
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

b) Calculul valorilor funcției cos x, varianta 1

% calculul valorilor cos x pentru x = 0 la π/2 cu pasul π/10


for n=0:5
y(n+1)=cos(n*pi/10);
end
y
y =
1.0000 0.9511 0.8090 0.5878 0.3090 0.0000

c)
Calculul valorilor funcției cos(x)

x = 0:0.2:1;
fprintf(' x cos(x)\n')
for i = 1:length(x)
fprintf('%4.1f %11.6f\n',x(i),cos(x(i)))
end

x cos(x)
0.0 1.000000
0.2 0.980067
0.4 0.921061
0.6 0.825336
0.8 0.696707
1.0 0.540302

d) Calculul repetat pentru o expresie depinzând de 2 indici

m=4; n=5;
for i=1:m
for j=1:n
A(i,j)=1/(i+j-1);
end
end

A
A =

1.0000 0.5000 0.3333 0.2500 0.2000


0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250
58
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.10.2 Instrucțiunea if
Instrucțiunea if este instrucțiunea de testare pe baza unei condiții logice.
În general condiția logică apare sub forma:
expresie operator relațional expresie
Bucla if este folosită pentru luarea unor decizii multiple, executarea lor fiind
condiționată. Sunt trei moduri de construcție a buclei if:
 if..end
 if..else..end
 if..elseif..else ..end

1.8.6.2 Instrucțiunea if..end

În figura 1.7 este prezentată schema logică și sintaxa pentru comanda condițională
if..end.

False True(1) Sintaxa 1: if..end


cond logica
(0)
if conditie logica
IF
Set de instructiuni set de instructiuni

end

Fig. 1.7 Schema logică și sintaxa if..end

Setul de instrucțiuni este executat numai dacă conditie logica este adevărată.

Exemplul 1.31

Scriem un program, pentru a testa dacă un număr este par.

n = input('introduceti un numar intreg');


if (mod(n,2)==0)
59
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

fprintf('numarul introdus %d este par.\n',n)


end
% am apelat functia (built-in) mod (help mod)pentru calculul
% restului impartirii la doi a numărului n
% salvăm ca m-fila si executam
introduceti un numar intreg 18
numarul introdus 18 este par.

1.8.6.3 Instrucțiunea if..else..end

În figura 1.8 este prezentată schema logică și sintaxa pentru comanda condițională
if..else..end.

if..else..end

Sintaxa: if..else..end
Nu -False(0) Da -True(1)
cond logica if conditie logica
set de instructiuni 1
else
set de instructiuni 2
Set de instructiuni 2 Set de instructiuni 1
end

Fig. 1.8 Schema logică și sintaxa if..else..end

Exemplul 1.32

Scriem un program, pentru a testa dacă un număr este par sau impar, în m-fila
script cu conținutul de mai jos, salvată cu numele par_impar.m

% par_impar.m

n=input('Introduceti un numar intreg: ');


if (rem(n,2)==0)
fprintf('Numarul %d este un numar par.\n',n)
else
fprintf('Numarul %d este un numar impar.\n',n)
end
60
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> par_impar
Introduceti un numar intreg: 5
Numarul 5 este un numar impar.
>> par_impar
Introduceti un numar intreg: 9
Numarul 9 este un numar impar.
Exemplul 1.33 Scriem un program care testează dacă un număr este par; dacă da, este
,scrie numărul, dacă nu, adună 1 la număr și scrie numărul. Schema logică este în figura
1.9.

Start

x=input('scrie un numar intreg:');


intrare x if(rem(x,2)==0)
x=x;
else
x=x+1;
rem(x,2)==0 end
x
D
N a
u
x = x+1 x=x

iesire: scrie x

Stop

Fig. 1.9 Schema logică Exemplul 1.32

% executam fila salvata cu rest_rem

>> rest_rem

Scrie un numar intreg: 3


61
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

x =
4

 Comentariu asupra algoritmului Exemplul 1.33

% introducem valoarea lui x


x=input('scrie un numar intreg:');
% testăm dacă restul împărțirii la doi este sau nu este zero (x
este par sau nu)
if(rem(x,2)==0)
% daca raspunsul este da execută bucla da
% dacă raspunsul este nu execută bucla nu
Este apelată m-fila (built-in) rem din biblioteca Matlab. Cu comanda rem se calculează
restul împarțirii a două numere întregi (>> help rem)

>> rem(5,2)
ans =
1

1.8.6.4 Comanda condițională if..elseif..else..end

Sintaxa: if..elseif..else..end

if conditie logica 1
set de instructiuni 1
elseif conditie logica 2
set de instructiuni 2
elseif conditie logica 3
set de instructiuni 3
else
set de instructiuni 4
end
Exemplul 1.34

a) Scriem o m-fila tip funcție pentru a testa semnul unui număr real, signum.m.
62
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

function sgn = signum(a)


if a > 0
sgn = 1;
elseif a < 0
sgn = -1;
else
sgn = 0;
end

>> signum(6) % executăm funcția pentru a = 6

ans = 1

b) Calculul radicalului dintr-un număr real. Se testează condiția ca numărul să fie pozitiv,
dacă da, se calculează și se scrie radicalul, dacă condiția nu este satisfăcută, scrie că
numărul este negativ sau zero.

x=input('numar real:')
if x>0
fprintf('radical din %g este 8.4f\n', x,sqrt(x))
elseif x<0
disp('x este negativ;nu exista radical de ordin doi')
else
disp('x este egal cu zero')
end

c) Scriem un program pentru operații aritmetice cu două numere reale oarecare.


Salvăm fila script, cu conținutul de mai jos, cu numele varianta_elseif.

% varianta_elseif.m
%
a=input('Introduceti numarul a: ');
b=input ('Introduceti numarul b: ');
fprintf('\n')
fprintf('1) aduna a si b.\n')
fprintf('1) scade b din a.\n')
fprintf('3) inmulteste a si b.\n')
fprintf('4) imparte a la b.\n')
fprintf('\n')
n=input('Alege cazul: ');

if n==1
fprintf('suma numerelor %0.2f si %0.2f este %0.2f.\n',a,b,a+b)
elseif n==2

63
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

fprintf('diferenta numerelor %0.2f si %.2f este .2f.\n’\',a,b,a-


b)
elseif n==3
fprintf('produsul numerelor %.2f si %.2f este %.2f.\n',a,b,a*b)
elseif n==4
fprintf('catul numerelor %.2f si %.2f este %.2f.\n',a,b,a/b)
else
fprintf('Nu este optiunea buna.\n')
end

Executăm m-fila tastând:

>> varianta_elseif

Introduceti numarul a: 4528077


Introduceti numarul b: 35476

1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.
4) imparte a la b.

Alege cazul: 1
suma numerelor 4528077.00 si 35476.00 este 4563553.00.

>> varianta_elseif

Introduceti numarul a: 87786.3232


Introduceti numarul b: 897.54

1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.
4) imparte a la b.

Alege cazul: 4
catul numerelor 87786.32 si 897.54 este 97.81.

1.24 Instrucțiunea while


Instrucțiunea while are o structură care combină bucla for cu instrucțiunea if.

64
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Setul de instrucțiuni se execută repetat atâta timp cât condiția logica specificată
rămîne adevărată - true (valoarea este 1). În figura 1.10 este redată schema logică și
sintaxa instrucțiounii while.

False Sintaxa: while ... end


cond logica
while conditia logica
True
set de instructiuni
end
set de instructiuni

Fig. 1.10 Schema logică și sintaxa comanda while

Exemplul 1.35

Sa se determine primul numar întreg pentru care n! (n factorial) este un număr de 4 cifre.

% bucla va fi executata cat timp conditia este indeplinita


% este utilizata functia built-in 'prod'; (>> help prod)

n = 1;
while prod(1:n) < 1.e3
n = n+1;
end
n

Raspuns
n = 7

1.8.7 Instrucțiunea break

Instrucțiunea break interupe execuția buclelor for sau while.

65
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.36

Scriem o m-fila, numere_prime.m, care să afișeze numerele prime dintr-o listă dată.
Arătăm variantele cu și fără comanda break.
În varianta fără comanda break se scriu toate numerele prime din listă.
Selectarea numerelor prime se face cu funcția Matlab isprime(n) (>> help
isprime)

for n = 2:50;
if isprime(n)
fprintf('numerele prime gasite, %d\n',n)
end
end

>> numere_prime

numerele prime gasite, 2


numerele prime gasite, 3
numerele prime gasite, 5
numerele prime gasite, 7
numerele prime gasite, 11
numerele prime gasite, 13
numerele prime gasite, 17
numerele prime gasite, 19
numerele prime gasite, 23
numerele prime gasite, 29
numerele prime gasite, 31
numerele prime gasite, 37
numerele prime gasite, 41
numerele prime gasite, 43
numerele prime gasite, 47

În varianta cu instrucțiunea break observăm ca instrucțiunea break a întrerupt


execuția buclei for după prima evaluare.

for n=2:50;
if isprime(n)
fprintf('numerele prime gasite, %d\n',n)
break
end
end

>> prime_numere

numerele prime gasite, 2


66
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.8.8 Instrucțiunea continue

Instrucțiunea continue trece controlul la următoarea iterație din bucla for sau while,
în care apare, sărind peste orice alte comenzi din interiorul buclei.

Exemplul 1.37

Scriem o m-fila, multipli_3.m, care să calculeze și să afișeze multiplii lui 3 din


primele 15 numere.

n=15;
i=1;
while i <= n
if rem(i,3)~=0
i=i+1;
continue
end
fprintf('multiplul lui 3: %d\n',i)
i=i+1;
end

>> multipli_3
multiplul lui 3: 3
multiplul lui 3: 6
multiplul lui 3: 9
multiplul lui 3: 12
multiplul lui 3: 15

Exemplul 1.38 Scriem o m-fila sol_sistem.m pentru a găsi soluția sistemului algebric
liniar:

5a + 2b +c = 12
a + 4b + 2c = 15
a + 2b + 5c = 20

% sol_sistem.m
a=0;
b=0;
c=0;

while 1
a1 = (12 - 2*b - c)/5;
67
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

b1 = (15 - a1 - 2*c)/4;
c1 = (20 - a1- 2*b1)/5;
if((a==a1)&&(b1==b)&&(c1==c))
break;
end;
a = a1;
b = b1;
c = c1;
end;

display(['Solutiile sunt a=' num2str(a) ', b = ' num2str(b)' ...


', c = ' num2str(c)']);

>> sol_sistem
Solutiile sunt a = 1, b = 2, c = 3

Exemplul 1.39

Folosim for și while pentru a studia convergența seriei Euler

 1 1 1 1
 2
 1  2  2  2  
n 1 n 2 3 4
2
Pînă la anul 1795, când la Leonard Euler a deteminat suma seriei, s  , s-a crezut că
6
seria este divergentă, suma tinzând la infinit.
Fie șirul sumelor parțiale al seriei Euler și S limita sa

1 1 1 1
Sn  1  2
 2  2       2 , lim S n  S
2 3 4 n n

Dacă șirul sumelor parțiale este convergent cu limita finită S, atunci seria este
convergentă și are suma S.

a) Vom scrie, mai întâi o m-fila, sume_partiale_Euler.m, în care vom utiliza bucla
for pentru a calcula suma șirului sumelor parțiale pentru n  25 și vom calcula eroarea
relativă dintre această sumă parțială și  2 6 .

% m-fila sume_partiale_Euler.m
% sirul sumelor partiale pentru seria Euler

68
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

n=25;
s=0;
for i=1:25
s=s+1/i^2;
end
% calculam eroarea relativa
erel=abs(s-pi^2/6)/abs(pi^2/6);
% folosim fprintf pentru afisarea rezultatelor
fprintf('suma partiala a primilor %d termeni este s=%f.\n',n,s)
fprintf('eroarea relativa este erel= %e.\n',erel)

>> sume_partiale_Euler

suma partiala a primilor 25 termeni este s = 1.605723.


eroarea relativa este er = 3.921066e-002.
eroarea relativa este err = 2.383722e-002.

Observăm că eroarea este mai mică decât 4  10  2 . Cu cât luăm mai mulți termeni în șirul
sumelor parțiale cu atât mai mult se va micșora eroarea.
b) Scriem o m-fila, seria_Euler.m, cu care, folosind bucla while, vom determina
de câți termeni este nevoie în șirul sumelor parțiale pentru a calcula suma seriei cu o
eroare relativă dată.
% seria_Euler.m
% determina numarul necesar de termeni pentru aproxima suma...
% cu o eroare, tol, data
tol=4e-5; % toleranta
s=0;
i=1;
err=1;
while err >= tol
s=s+1/i^2;
i=i+1;
err=abs(s-pi^2/6)/abs(pi^2/6);
end
% folosim fprintf pentru afisarea rezultatelor
fprintf('valoarea lui pi^2/6 = %f.\n',pi^2/6)
fprintf('suma primilor %d termeni este s = %f.\n',i-1,s)
fprintf('eroarea relativa este err = %f.\n',err)

>> seria_Euler
valoarea lui pi^2/6 = 1.644934.
suma primilor 15.198 termeni este s = 1.644868.
eroarea relativa este err = 0.000040.

69
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.8.9 Instrucțiunea switch

Un număr mare de comenzi elseif, pentru controlul unui cod Matlab, îngreunează
execuția acestuia și chiar înțelegerea lui. Pentru asemenea situații , avem în Matlab o
metoda mai simplă de control a execuției programului prin instrucțiunea switch.
Structura unei instrucțiuni switch este formată din mai multe secvențe de comenzi
cuprinse între două cazuri: case valoare i. Forma generală și schema logică a
instrucțiunii switch este prezentată în figura 1.9.

Sintaxa: switch
Expresie
switch expresie
case valoare 1
set de instructiuni 1
T case valoare 2
Caz Set set de instructiuni 2
r
valoare 1 instructiuni 1 .
u .
e case valoare n
False set de instructiuni n
True otherwise
Caz Set set de instructiuni n+1
valoare 2 end
instructiuni 2
% expresie - scalar sau șir
False de caractere
True
Set % setul de instructiunii n
Caz se executa daca:
valoare n instructiuni n
expresie == valoare n =>
False true (1)

Set % setul de instructiuni n+1


se executa daca:
instructiuni n+1 expresie nu egaleaza nici
un caz

Fig. 1.8 Schema logică și sintaxa comanda switch

În comanda switch, expresie poate fi un scalar sau un șir de caractere. In timpul execuției
switch compară intrarea expresie cu valoarea fiecărui case și execută setul de
instrucțiuni n, al cazului pentru care este adevarată expresie == valoare n.

70
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Dacă nici un caz nu satisface condiția, se vor executa liniile de comandă din set de
instrucțiuni n+1 care urmează după otherwise.

Exemplul 1.40

Vom rescrie m-fila din Exemplul 1.33 c), folosind în locul instrucțiunii elseif
instrucțiunea switch. Scriem un program pentru operații aritmetice cu două numere reale
oarecare. Salvăm fila script, cu conținutul de mai jos, cu numele varianta_switch.

% varianta_switch.m

a=input('Introduceti numarul a: ');


b=input ('Introduceti numarul b: ');
fprintf('\n')
fprintf('1) aduna a si b.\n')
fprintf('1) scade b din a.\n')
fprintf('3) inmulteste a si b.\n')
fprintf('4) imparte a la b.\n')
fprintf('\n')
n=input('Alege cazul: ');

switch n
case 1
fprintf('suma numerelor %0.2f si %0.2f este %0.2f.\n',a,b,a+b)
case 2
fprintf('diferenta numerelor %0.2f si %.2f este %.2f.\n’\',a,b,a-b)
case 3
fprintf('produsul numerelor %.2f si %.2f este %.2f.\n',a,b,a*b)
case 4
fprintf('catul numerelor %.2f si %.2f este %.2f.\n',a,b,a/b)
otherwise
fprintf('Nu este optiunea buna.\n')
end

Pentru a vedea care variantă consumă mai puțin timp, rulăm cele două variante de
program, varianta cu elseif și varianta cu switch, din Exemplele 1.33 c) și 1.39.

>> varianta_elseif

Introduceti numarul a: 123456789


Introduceti numarul b: 1234

1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.

71
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

4) imparte a la b.

Alege cazul: 3
produsul numerelor 123456789.00 si 1234.00 este 152345677626.00.

Elapsed time is 0.000435 seconds.

>> varianta_switch

Introduceti numarul a: 123456789


Introduceti numarul b: 1234

1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.
4) imparte a la b.

Alege cazul: 3
produsul numerelor 123456789.00 si 1234.00 este 152345677626.00.

Elapsed time is 0.000353 seconds.

Observăm că varianta care folosește instrucțiunea switch are un timp mai bun cu 18,8%
față de varianta de program cu elseif.
Timpul de rulare a fost măsurat cu funcțiile Matlab tic și toc.
Funcțiile tic și toc lucrează împreună pentru a măsura timpul de rulare al unui
program Matlab. Comanda tic pornește cronometrul iar comanda toc oprește
cronometrul și afișează timpul cu mesajul Elapsed time is ... seconds.

1.8.10 Vectorizarea algoritmilor

Pentru a obţine o viteză de calcul mare, este foarte importantă aşa-numita vectorizare a
algoritmilor în codurile MATLAB. Acolo unde alte limbaje folosesc bucle de tip for sau
DO, MATLAB-ul poate utiliza operaţii matriceale sau vectoriale. Ori de câte ori este
posibil , recomandăm acest mod de lucru.
Majoritatea funcţiilor din Matlab (built - in functions) suportă vectorizarea. Dacă mărimea
de intrare este un scalar, rezultatul este tot un scalar. Dacă intrarea este un vector sau o
matrice, ieşirea va fi un vector sau o matrice cu acelaşi număr de linii sau coloane ca la
intrare.

72
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Prezentăm mai jos câteva exemple, pentru a compara vitezele de execuție ale operațiilor
matriceale (vectorizate) versus bucle for și while.
Pentru a măsura timpul de execuție în Matlab, avem funcțiile tic și toc (help
tic).

 Funcțiile tic și toc

Funcțiile tic și toc lucrează împreună pentru a măsura timpul de rulare al unui cod
Matlab. Comanda tic pornește cronometrul, iar comanda toc oprește cronometrul și
afișează timpul cu mesajul Elapsed time is ... seconds.

Exemplul 1.41

Calculul valorilor funcției sinus cu:


a) folosirea instrucțiuni for
b) folosind vectorizarea

a) folosirea instrucțiuni for


% varainta bucla for

i=0;
tic
for t=0:0.01:10;
i=i+1;
y(i)=sin(t);
end
toc

% timpul de calcul varianta bucla for

Elapsed time is 0.004865 seconds.

b) folosind vectorizarea
% varianta vectorizata

tic
t=0:0.01:10;
y=sin(t);
toc

% timpul de calcul varianta vectorizare (operații matriceale)

Elapsed time is 0.000053 seconds.


73
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Observăm că timpul de execuție este de aproape 10 ori mai mic în varianta vectorizată a
calculelor.

Exemplul 1.42

Calculul valorilor funcției log 10 ( x) cu cele două variante.

% Versiunea cu bucla for

tic
x = 0;
for k = 1:1001
y(k) = log10(x);
x = x + .01;
end
toc,y

Elapsed time is 0.008068 seconds.

% Versiunea vectorizată a aceluiaşi program este

tic
x=0:0.01:10;
y=log10(x);
toc, y

Elapsed time is 0.000361 seconds.

Recomandăm folosirea variantei cu vectorizarea algoritmului de calcul deoarece este


mult mai rapidă decât varianta cu buclele for.

1.9 GRAFICE ÎN MATLAB

MATLAB are mai multe comenzi care pot fi folosite pentru a crea grafice.
În acest paragraf vom introduce metode de a trasa grafice de funcții. Vom începe cu
grafice în plan.

1.9.1 Funcții Matlab pentru reprezentări grafice în plan (2D)


1.9.1.1 Funcția ezplot

Cea mai simplă funcție Matlab (built-in) prentru grafice este funcția ezplot.
74
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Sintaxa:

ezplot('fun',[a,b])

Rezultă graficul funcției fun pe intervalul [a,b].


Putem folosi și function handle cu comanda ezplot:

ezplot(@cos,@sin)

Exemplul 1.43

Graficul parabolei f ( x)  x 2 ,  1  x  1 , figura 1.9, se obține cu comanda

>> ezplot('x^2',[-1,1])
x2+2

2.9

2.8

2.7

2.6

2.5

2.4

2.3

2.2

2.1

-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1


x

Fig.1.9

1.9.1.2 Funcția plot

Fie dat un set discret de n  1 date numerice

x0 , y0 , x1, y1  , ......,xn 1, yn1  , xn , yn  unde yi  f ( xi ), i  0,1,...., n .

Pentru a face graficul setului de puncte y versus x, vom introducem vectorii x respectiv y

75
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

x  [ x0 , x1,...., xn ] și y  [ y0 , y1,...., yn ] , y  f (x)

și vom utiliza funcția Matlab plot.

 Funcția plot

Avem două variante pentru sintaxa funcției:


 sintaxa: plot(x,y)
 sintaxa: plot(x,y,'caracter_sir')

Varianta a doua va permite alegerea diferitelor tipuri de linie, a simbolului de plotare și a


culorii graficului.
Opțiunea de alegere a combinațiilor de culoare, simbol și tip linie trebuie specificată în
'caracter_sir'. Opțiunile sunt prezentate în tabelul 1.13.

Tabel 1.13 Combinații de culoare, simbol și tip linie pentru grafice

Culoare linie Simbol plotare Tip linie


b blue . point - solid

g green o circle : dotted

r red x x-mark -. dashdot

c cyan + plus -- dashed

m magenta * star

y yellow s square

k black d diamond

w white v triangle (down)

Pentru a scrie diverse informații despre grafic, funcția plot se poate folosi cu
următoarele funcții:

76
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Funcția și sintaxa Acțiunea funcției

figure(variabila) creează o fereastră noua pentru figura curentă


(variabila=nr.figură)

grid creează careiaj de linii la axele curente

axis ([xmin xmax ymin ymax]) seteaza scalarea axelor curente

xlabel(`text`) adaugă texte la axele x, y și la titlu


ylabel(`text`)
title(`text`)

legend(varibila,`text`) scrie pe figură text pentru variabila dată

text(x,y,`text`) scrie text pe figură la locația de coordonate


(x,y)

gtext(x,y,`text`) folosește mouse-ul pentru a scrie cu text pe


figură la locația de coordonate (x,y)

hold on hold on - reține figura curentă pentru a


primi și comenzile grafice ulterioare ; astfel
se pot obține mai multe grafice pe o singură
figură
hold off
hold off – oprește hold on și
determină întoarcerea la modul implicit

1.9.2 Grafice - modul de lucru în Command Window

Pentru a face graficul unei funcții de o variabilă, mai întâi, vom crea un vector de valori
ale variabilei și apoi vom genera un vector al valorilor funcției calculate în vectorul
variabilei. Problema este redusă la problema anterioară – graficul funcției printr-un set de
date numerice discrete.

Exemplul 1.44

>> x = [-4 -2 -3 -1 0 1 2 3 4];


>> y = x.^2+1
77
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> y

y =[17 10 5 2 1 2 5 10 17]

În figura 1.10 sunt prezentate două variante ale graficului funcției y.

>> plot(x,y,) >> plot(x,y,'*')


18 18

16 16

14 14

12 12

10 10

8 8

6 6

4 4

2 2

0 0
-4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4

Fig.1.10

Exemplul 1.45

Graficul funcției y  x3  3x  1

Introducem comenzile:

>> x=-4:0.1:4; % generează vectorul variabilei


>> y=x.^3-3*x+1; % generează vectorul valorilor funcției
>> plot(x,y) % realizează graficul lui y versus x
>> xlabel('x') % eticheta pentru axa x
>> title('f(x)=x^3-3*x+1') % titlu graficului

Obținem graficul din figura 1. 11.

78
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

f(x)=x3-3*x+1
60

40

20

-20

-40

-60
-4 -3 -2 -1 0 1 2 3 4

Fig.1.11

1.9.3 Grafice - modul de lucru cu m-file script

Pentru numeroase situații este recomandat modul de lucru cu m-file script.


Putem crea două sau mai multe grafice pe aceeași figură folosind ccomanda plot.
De exemplu, comanda

>> plot(x,y,'-b',u,v,'--r',t,s,'g:s')

creează trei grafice în aceeași figură:


 graficul funcției y versus x cu linie albastră continuă;
 graficul funcției v versus u cu linie roșie întreruptă;
 graficul funcției s versus t cu linie verde și cu markere patrate;

Exemplul 1.46

Vom scrie într-o m-fila script un program pentru obținerea în aceeași figură a graficelor
funcțiilor y  sin(x) și z  cos(x) , folosind opțiunille grafice prezentate în tabelul 1.13.
% exe_grafic3.m
79
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

% graficele funcțiilor y=sin(x) si z=cos(x)


&
x=0:pi/100:2*pi;
y=sin(x);
plot(x,y)
x=0:pi/100:2*pi;
y=sin(x);
z=cos(x);
plot(x,y,'r-.',x,z,'go')
grid
xlabel('x [rad]')
ylabel('y, z')
text(3,0.7,'Exemplu grafice')
title('grafice y=sin(x) si z=cos(x)')
legend('y=sin(x)','z=cos(x)')

Executăm m-fila și obținem graficele din figura 1.12.

>> exe_grafic3
grafice y=sin(x) si z=cos(x)
1
y=sin(x)
z=cos(x)
0.8
Exemplu grafice
0.6

0.4

0.2
y, z

-0.2

-0.4

-0.6

-0.8

-1
0 1 2 3 4 5 6 7
x [rad]

Fig.1.12

80
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.47
Graficul funcției
 x2 x0

f ( x)   1 0  x 1
 x2 1 x

% graficul functíei cu mai multe ramuri


%
x=linspace(-2,3,3000);
y=(x.^2).*(x<0)+1.*((0<=x)&(x<1))+(-x+2).*(1<=x);
plot(x,y)
grid on
title('functia cu trei ramuri')

functia cu trei ramuri


4

3.5

2.5

1.5

0.5

-0.5

-1
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3

Fig.1.13

1.9.4 Curbe reprezentate parametric

Fie curba cu ecuațiile parametice


r (t )  x(t ) , y(t ), t  [a, b]
81
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.48

 
r (t )  2 cos3 (t ) , 2 sin 3 (t ) , t  [ ,  ]

>> t=linspace(-pi,pi,1000);
>> plot(2*(cos(t)).^3,2*(sin(t)).^3)
>> grid
>> xlabel('t')
>> title('r(t)=((2(cos(t))^3,2(sin(t))^3)')

Obținem graficul din figura 1. 14.

r(t)=((2(cos(t))3,2(sin(t))3)
2

1.5

0.5

-0.5

-1

-1.5

-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
t

Fig.1.14

1.9.5 Curbe în coordonate polare

Ecuația unei curbe în coordonate polare este

r  u( ),  [1 , 2 ]
Exemplul 1.49
Graficul funcției
82
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

r  3  6 sin( ),  [ ,  ]

>> theta=linspace(-pi,pi,1000);
>> r=3-6*sin(theta);
>> polar(theta,r)

Obținem graficul din figura 1. 15.

90
10
120 60
8

6
150 30
4

180 0

210 330

240 300

270

Fig.1.15

1.9.6 Grafice multiple. Funcția subplot

Pentru situatiile în care dorim să obținem mai multe subgrafice în aceeași fereastră
grafică, folosim comanda subplot(m,n,p).
Comanda împarte figura într-o matrice cu mxn părți, fiecare parte cu subgraficul ei, și
selectează partea cu indicatorul p ca fiind cea curentă. Numerotarea părților se face pe
linii, începând cu cea din stânga sus.
Exemplul 1.50

83
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Pentru a obține în aceeași fereastră grafică graficele funcțiilor sin(x), exp(x), x^2 și
sin(x) /x , executăm comenzile:

>> subplot(2,2,1);ezplot('sin(x)');
>> subplot(2,2,2);ezplot('exp(-x)');
>> subplot(2,2,3);ezplot('x^2');
>> subplot(2,2,4);ezplot('sin(x)/x');

Obținem cele patru grafice în aceeași fereastră grafică, figura 1.16

sin(x) exp(-x)
250
1
200
0.5
150
0
100
-0.5
50
-1 0
-5 0 5 -6 -4 -2 0 2 4
x x

x2 sin(x)/x
40 1
0.8
30
0.6
20 0.4
0.2
10
0

0 -0.2

-5 0 5 -5 0 5
x x

Fig.1.16

84
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.9.7 Grafice specializate

Programul Matlab are o serie de funcții, built-in, pentru reprezentări grafice specializate.

 Funcția fplot

Sintaxa: fplot(fun,lims)

Creează graficul funcției fun între limitele x-axis limits, lims = [xmin xmax].

Exemplul 1.51

Graficul funcției
f ( x)  e  x sin( x) , x  [3, 3]

>> fplot('exp(-x)*sin(x)',[-3,3])
>> grid
>> title('y=exp(-x)*sin(x)')

y=exp(-x)*sin(x)
1

-1

-2

-3

-4

-5

-6

-7

-8
-3 -2 -1 0 1 2 3

Fig.1.17
85
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.52

Graficele funcțiilor handle @(x)tan(x), @(x)sin(x), @(x)cos(x):

>> fplot(@(x)[tan(x),sin(x),cos(x)], 2*pi*[-1 1 -1 1])

6
tan(x)
sin(x)
cos(x)
4

-2

-4

-6
-6 -4 -2 0 2 4 6

Fig.1.18

 Funcția bar. Diagrame din bare

Sintaxa: bar(x,y)

Exemplu 1.53:

% bare_bare.m

x=[11 3 4 5 17 26 19 ];
subplot(2,2,1),bar(x),title('Bare verticale')
subplot(2,2,2),barh(x),title('Bare orizontale')
86
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

subplot(2,2,3),bar3(x),title('Bare Verticale 3D')


subplot(2,2,4),bar3h(x),title('Barras orizontale 3D')

Bare verticale Bare orizontale


30
7
25
6
20
5
15 4

3
10
2
5
1

0
1 2 3 4 5 6 7 0 5 10 15 20 25 30

Bare verticale 3D Barras orizontale 3D


30
7
20 6
5
10 4
3
0 2
1 1
2
3
4 0
5
6 20
7
40

Fig.1.19

 Funcția hist. Histograme

Histogramele sunt grafice care arată distribuția datelor.

Sintaxa: hist(y,M)

unde y este vectorul punctelor de date, iar M este numărul de subdiviziuni în care este
divizat setul de date. Histograma arată cât de multe puncte sunt în fiecare diviziune.

87
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.54

Vom genera 10.000 de numere aleatoare după distribuția Gauss. Histograma sa va avea
forma clopotului lui Gauss.

>> y = randn(10000,1);
>> hist(y,100)

350

300

250

200

150

100

50

0
-4 -3 -2 -1 0 1 2 3 4

Fig.1.20

1.9.8 Grafice de curbe în spațiu

 Funcția Matlab plot3(x,y)

Pentru a genera grafice de curbe în 3-D folosim funcția Matlab plot3(x,y.

88
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.55

Graficul curbei parametrice

>> t=linspace(0,8*pi,2000);
>> plot3(sin(t),cos(t),t),grid on

30

25

20

15

10

0
1

0.5 1
0.5
0
0
-0.5
-0.5
-1 -1

Fig.1.21

1.9.9 Grafice ale funcțiilor de forma z  f ( x, y)

Graficele se pot realiza cu una din comenzile:

>>plot3(x,y,z)
>>mesh(x,y,z)
>>surf(x,y,z)
>>surf(x,y,z),shading flat

89
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Exemplul 1.56

Graficul funcției
z  e ( x ^ 2  y ^ 2) ,

pe domeniul D  ( x, y) /  2  x  2 ,  2  y  2 .

[x,y]=meshgrid(-2:.5:2);
z=exp(-(x.^2+y.^2));
subplot(2,2,1),plot3(x,y,z),title('comanda plot3')
subplot(2,2,2),mesh(x,y,z),title('comanda mesh')
subplot(2,2,3),surf(x,y,z),title('comanda surf')
subplot(2,2,4),surf(x,y,z),shading flat,title('comanda surf shading')

Fig.1.22

1.10 CALCUL SIMBOLIC ÎN MATLAB

Calculul simbolic operează cu obiecte simbolice: variabile, matrice expresii și ecuații.


Este util pentru lucrul cu formule, cu ecuații și pentru determinarea soluțiilor analitice.
Pentru calculul simbolic în Matlab dispunem de funcțiile și comenzile modulului
Symbolic Math Toolbox care asigură accesul la interfața MuPAD.
Prezentăm în acest paragraf, prin exemple, diferite tipuri de calcule matematice:
 algebră liniară;
 soluții simbolice ale ecuațiilor algebrice;
 analiză matematică: limite, sume, calcul diferențial, calcul integral;
 soluții simbolice pentru ecuații diferențiale;

1.10.1 Definirea variabilelor simbolice

Sintaxa:

>> syms lista_variabile

>> sym('x') % definește o singură variabilă simbolică

Exemplul 1.57

90
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> pi_simbolic=sym('pi')

pi_simbolic =
pi

>> R=sym('R')
>> aria_cerc=2*pi*R

aria_cerc =
2*pi*R

>> syms a b c % definește mai multe variabile simbolice


>> whos
Name Size Bytes Class Attributes

a 1x1 112 sym


b 1x1 112 sym
c 1x1 112 sym

1.10.2 Crearea funcțiilor simbolice

Exemplul 1.58

Funcția de gradul doi


1)
>> syms a b c x
>> f = a*x^2+b*x+c

f =
a*x^2 + b*x + c

2)
>> syms a b c x
>> f=sym('a*x^2+b*x+c')

1.10.3 Atribuirea de valori numerice variabilelor simbolice - substituții

 Funcția Matlab subs

Aceste substituții se fac cu funcția Matlab subs

91
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Sintaxa:
subs(expresie_simbolica,{variabile_simbolice},{valori_numerice})

Exemplul 1.59

>> syms f x
>> f=x^2+log(x)+cos(x)

f =
cos(x) + log(x) + x^2

>> subs(f,pi)
ans =
10.0143

1.10.4 Calcul simbolic cu matrice

Exemplul 1.60

>> syms a b c d e f g h
>> A=[a b;c d]

A =
[ a, b]
[ c, d]

>> B=[e f;g h]


B =
[ e, f]
[ g, h]

>> C=A+B

C =
[ a + e, b + f]
[ c + g, d + h]

>> D=A*B

D =
[ a*e + b*g, a*f + b*h]
[ c*e + d*g, c*f + d*h]
92
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> E=inv(A)

E =
[ d/(a*d - b*c), -b/(a*d - b*c)]
[ -c/(a*d - b*c), a/(a*d - b*c)]

>> a=1;b=-2;c=-1;d=4;e=1;f=6;g=7;h=3;
>> eval(A)

ans =
1 -2
-1 4

>> eval(E)

ans =
2.0000 1.0000
0.5000 0.5000
>> E1=inv(eval(A))

E1 =
2.0000 1.0000
0.5000 0.5000

 Funcțiile Matlab pretty și simplify

 pretty - afișează un format matematizat al rezultatului


 simplify - simplifică afișarea rezultatului

>> I=A*inv(A)

>> pretty(I) % afișează un format matematizat al expresiei

+- -+
| a d b c |
| --------- - ---------, 0 |
| a d - b c a d - b c |
| |
| a d b c |
| 0, --------- - --------- |

93
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

| a d - b c a d - b c |
+- -+

>> simplify(I) % simplifică expresia

ans =
[ 1, 0]
[ 0, 1]

>> syms x t
>> R=[cos(t) sin(t);-sin(t) cos(t)]

R =

[ cos(t), sin(t)]
[ -sin(t), cos(t)]

> R_inv=inv(R)

R_inv =

[ cos(t), -sin(t)]
[ sin(t), cos(t)]

>> I=R*R_inv

I =

[ cos(t)^2 + sin(t)^2, 0]
[ 0, cos(t)^2 + sin(t)^2]

>> pretty(I)

+- -+
| 2 2 |
| cos(t) + sin(t) , 0 |
| |
| 2 2 |
| 0, cos(t) + sin(t) |
+- -+

94
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> simplify(I)

ans =

[ 1, 0]
[ 0, 1]

1.10.5 Derivarea simbolică a funcțiilor

Derivatele simbolice ale funcțiilor de una sau mai multe variabile se obțin cu funcția
diff.

Sintaxa:

 diff(f,x) % derivata de ordin întâi în raport cu x


 diff(f,x,n) % derivata de ordin n în raport cu x
 diff(f) % derivata lui f după variabila implicită

Exemplul 1.61

a)
>> syms x
>> f=x*sin(2*x)
f =
x*sin(2*x)
>> diff(f)
ans =
sin(2*x) + 2*x*cos(2*x)

b)
>> syms x y
>> g=sqrt(x^2+y^2)

g =
(x^2 + y^2)^(1/2)

>> diff(g,x)% derivata parțială în raport cu x

ans =

95
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

x/(x^2 + y^2)^(1/2)

>> diff(g,y,2)% derivata parțială de ordinul doi în raport


cu y
ans =

1/(x^2 + y^2)^(1/2) - y^2/(x^2 + y^2)^(3/2)

>> pretty(ans)

2
1 y
------------ - ----------
2 2 1/2 3
(x + y ) -
2
2 2
(x + y )

1.10.6 Calculul matricei Jacobian

Calculul matricei Jacobian:

 f g h 
 x x x 
D( f , g , h)  f g h
J  
D( x, y, z )  y y y 
 f g h 
 
 z z z 

se obține cu funcția Matlab Jacobian.


Sintaxa:

>> jacobian ([f; g; h;],[x, y,z])

Exemplul 1.62

Calculul jacobianului al transformării la coordonate polare:


96
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> syms r t
>> x=r*cos(t)
>> y=r*sin(t);
>> J= jacobian([x; y],[r,t])

J =

[ cos(t), -r*sin(t)]
[ sin(t), r*cos(t)]

>> D = det(J)
D =
r*cos(t)^2 + r*sin(t)^2

>> simplify(D)

ans = r

1.10.7 Dezvoltarea în serie Taylor

Sintaxa:

taylor(f)
taylor(f,n) % rezultă primii n-1 termeni din dezvoltarea
Maclaurin

>> taylor(exp(x))

ans =
x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1

>> taylor(cos(x),10)

ans =
x^8/40320 - x^6/720 + x^4/24 - x^2/2 + 1

>> pretty(ans)

8 6 4 2

97
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

x x x x
----- - --- + -- - -- + 1
40320 720 24 2
1.10.8 Rezolvarea simbolică a ecuațiilor algebrice. Funcția solve

Exemplul 1.62

Fie ecuația matriceală Ax  b.

Determinăm soluția simbolică folosind operatorul backslash ( \ ).

>> syms a11 a12 a21 a22 b1 b2


>> A=[a11 a12;a21 a22]; b=[b1;b2];
>> x = A\b

x =
-(a12*b2 - a22*b1)/(a11*a22 - a12*a21)
(a11*b2 - a21*b1)/(a11*a22 - a12*a21)

Exemplul 1.63

 Funcția solve (>> help solve)

a) Soluția ecuației de gradul doi folosind funcția solve

>> syms a b c x
>> fx=a*x^2+b*x+c;
>> solve(fx)% formula pentru radacinile ecuatiei gr.2

ans =

-(b + (b^2 - 4*a*c)^(1/2))/(2*a)


-(b - (b^2 - 4*a*c)^(1/2))/(2*a)

 x1  x 2  b1
b) Soluția unui sistem liniar  folosind funcția solve
 1
x  2 x 2  b 2

>> syms x1 x2 b1 b2

98
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> fx1=x1+x2-b1;
>> fx2=x1+2*x2-b2;% sistem de 2 ecuatii
>> [x10,x20]=solve(fx1,fx2)

x10 = 2*b1 - b2
x20 = b2 - b1

1.10. 9 Rezolvarea simbolică a ecuațiilor diferențiale. Funcția dsolve

Pentru determinarea simbolică a soluțiilor analitice ale ecuațiilor diferențiale cu Matlab


folosim funcția dsolve.

Exemplul 1.64
dx
a) Soluția ecuației diferențiale  ax  0
dt

>> syms a b c x
>> x0=dsolve('Dx+a*x=0')

x0 = C2/exp(a*t)

dx
b) Soluția ecuației diferențiale  ax  0 cu condiția inițială x(0)  1
dt

>> x0=dsolve('Dx+a*x=0','x(0)=1')

x0 =
1/exp(a*t)

c) Soluția ecuației diferențiale de ordinul doi x  x  0

>> x0=dsolve('D2x=-x','t')

x0 =

C1*cos(t) + C2*sin(t)

d) Soluția ecuației diferențiale de ordinul doi x  x  0 cu condițiile inițiale


x(0)  1, x (0)  0
99
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> x0=dsolve('D2x=-x','x(0)=1, Dx(0)=0','t')


x0 = cos(t)
1.11 Polinoame în MATLAB

1.11.1 Reprezentarea polinoamelor în Matlab

Un polinom de grad n este o funcție de forma

p( x)  an x n  an 1x n 1  ....... a1x  a0 , ai  R. i  1, 2,...,n

În Matlab polinoamele se reprezintă printr-un vector linie ale carui elemente sunt
coeficienții polinomului scriși în ordinea descrescătoare a puterilor lui x.

Exemplul 1.65

Polinomul

p( x)  6 x 4  2 x 3  7 x  12

se reprezintă în Matlab prin vectorul

>> p = [6 -2 0 7 12]

1.11.2 Calculul valorilor polinoamelor. Funcția polyval

Valoarea unui polinom într-un punct x se obține folosind funcția Matlab polyval.
Sintaxa:

>> polyval(p,x)

Exemplul 1.66

Valoarea polinomului p( x)  6 x 4  2 x 3  7 x  12 în x  15

>> polyval(p,15)
ans = 297117

100
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

Putem evalua polinomul și pentru un vector sau o matrice. Comanda polyval


returnează un vector cu valorile corespunzătoare ale polinomului.

>> polyval(p,[1 2 3 4])

ans =
23 106 465 1448

1.11.3 Graficul unui polinom

Putem utiliza comanda polyval împreună cu comanda linspace pentru a obține


graficul unui polinom.

Exemplul 1.67

Graficul polinomului p( x)  x3  2 x 2  5x  10

p = [1 -2 5 -10];
x = linspace(-3,5,100);
px = polyval(p,x);
plot(x,px)
grid
title('p(x)=x^3-2x^2+5x-10')
xlabel('x')

3 2
p(x)=x -2x +5x-10
100

80

60

40

20

-20

-40

-60

-80
-3 -2 -1 0 1 2 3 4 5

x
101
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

1.11.4 Rădăcinile unui polinom. Funcția roots

Rădăcinile unui polinom se obțin cu comanda roots.

Exemplul 1.68

>> p = [1 -2 5 -10];
>> roots(p)

ans =

2.0000
-0.0000 + 2.2361i
-0.0000 - 2.2361i

1.11.5 Operații cu polinoame

 Înmulțirea polinoamelor. Funcția conv

Sintaxa: conv(p,q)

Exemplul 1.69

% definim polinomul p(x) = 5x^3 + 2x^2 -3 x + 27

>> p = [5 2 -3 27];

% definim polinomul f(x) = x^2 + 3x + 1

>> f = [1 3 1];

% Produsul polinoamelor p și f

g = conv(p,f)

g =
5 17 8 20 78 27

 Împărțirea polinoamelor. Funcția deconv

Împărțirea polinoamelor se face cu comanda deconv(p,q).

% Impartirea polinoamelor p și f
102
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

>> [q r]=deconv(p,f)

q =
5 -13

r =
0 0 31 40

% cătul este q(x)=5x-13 iar restul r(x)=31x+40

 Derivata unui polinom. Funcția polyder

Derivata unui polinom se obține cu comanda polyder.


Sintaxa:
 polyder(p) % returnează derivata polinomului p
 polyder(p,f) % returnează derivata produsului
polinoamelor p și f

Exemplul 1.70

% definim polinomul p(x) = 5x^3 + 2x^2 -3 x + 27

>> p = [5 2 -3 27];

>> der_p = polyder(p)

der_p =
15 4 -3

1.12 Probleme

P1.1 Faceți în aceeași fereastră grafică, graficele funcțiilor f ( x)  x  4 ,


g ( x)  x 2  1 , f ( x) g ( x) pentru x  [1,1] .

P1.2 Calculați, pentru N=10, următoarele sume

N 1 1  N
a)   
(i  2)(i  3) 
; b) k p , p  1 și p  2 , N = 10.
i 1  i k 1

103
CAPITOLUL 1 INTRODUCERE ÎN MATLAB

P1.3 Calculați funcția

x sin x
f ( x) 
( x 2  1)( x  3)

pentru x  [0, 1] cu pasul de 0.1.

P1.4 Evaluați funcția și faceți graficul funcției

 0 x0
 0  x 1
 x
f ( x)  
 2 x 1 x  2
 0 x2

P1.5 Fie polinomul:

p( x)  x 5  13x 4  10 x 3  12 x  8x  15

Determinați valoarea p(2) și rădăcinile polinomului.

P1.6 Considerăm următoarea serie Taylor (seria geometrică)

1 
f ( x)   1  x  x 2  x 3  .....   x i
1 x i 0

(a) Folosiți Matlab pentru calculul sumei primilor 20 termeni ai seriei pentru x  0.9 .
Care este eroare absolută și eroarea relativă?
(b) Câți termeni ai seriei sunt necesari pentru ca eroarea să fie mai mică decât 1% ?
Indicațe:

eroarea absolută dintre valoarea exactă u și valoarea calculată u*

E abs (u * )  u *  u

104
CAPITOLUL 1 INTRODUCERE ÎN MATLAB


eroarea relativă în procente

u*  u
% e rel (u ) 
*
 100%
u

F
P1.7 Coeficientul de frecare  este determinat experimental, prin măsurarea
mg
forței necesară pentru a mișca corpul de masă m , figura P1.7. Rezultatele măsurătorilor
pentru șapte valori ale forțelor sunt date in tabelul P7.1

Fig. P1.1

Determinați coeficientul de frecare pentru fiecare măsurătoare test.


Calculați coeficientul de frecare mediu, pentru toate măsurătorile. Afișați rezultatele
tabelar și grafic.

Tabel P7.1
Test nr. 1 2 3 4 5 6 7
Masa [kg] 3 5 6 9 15 25 50
Forta [N] 13.5 21.35 30 59 80 119 312

Determinați cît este coeficientrul de frecare pentru masa m = 12 kg.

105
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

2
REZOLVAREA NUMERICĂ A
ECUAŢIILOR ALGEBRICE ŞI
TRANSCENDENTE

În acest capitol vom analiza metode numerice pentru calculul soluţiilor ecuaţiilor
algebrice și transcendente. Vom scrie programe ȋn MATLAB pentru
implementarea acestor metode. Metodele studiate sunt:
 metoda grafică
 metoda înjumătăţirii intervalului - metoda bisecţiei intervalului
 metoda secantei
 metoda tangentei - metoda Newton-Raphson
 Funcția Matlab fzero
Există numeroase situaţii în care avem de rezolvat ecuaţii polinomiale sau
nepolinomiale (ecuaţii transcendente) cu o singură variabilă

f ( x)  0 (2.1)

ale căror soluţii nu se pot determina prin metodele algebrice cunoscute.

2.1 Metoda grafică

Pentru rezolvarea numerică a ecuațiilor (2.1) este necesar mai întâi să se identifice,
printr-o anumită metodă, intervalele în care se află exact o rădăcină a ecuaţiei.
O metoda simplă pentru a obţine o estimare a pozițiilor radaciniilor ecuaţiei (2.1)
este metoda grafică: din graficul funcţiei observam unde şi de câte ori graficul
intersectează axa x. Vom utiliza Matlab pentru a obţine graficele.
106
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Fie o funcție continuă f : [a, b]  R . Pentru graficul funcţiei pe [a, b] putem avea
urmatoarele situaţii, figura 2.1:

a) f (a) și f (b) au acelaşi semn - nu sunt rădăcini în [a, b]


b) f (a) și f (b) semne diferite – o singură rădăcină în [a, b]
c) f (a) și f (b) acelaşi semn - două rădăcini în [a, b]
d) f (a) și f (b) semne diferite- trei radacini în [a, b]

Fig. 2.1

Exemplul 2.1

Să se determine cu metoda grafică numărul şi intervalele ȋn care se află rădăcinile


ecuaţiei polinomiale

107
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

f ( x)  0.5x 3  4 x 2  6 x  2  0 (2.2)

Graficul funcţiei, figura 2.2, se obţine cu comenzile Matlab:

>>x=0:0.01:7;
>> f=0.5*x.^3-4*x.^2+6*x-2;
>> plot(x,f);
>> grid

20

15

10

5
r1 r3

r2
-5

-10

-15
0 1 2 3 4 5 6 7

Fig. 2.2 Graficul funcţiei f (x )  0.5x 3  4x 2  6x  2

Observăm că ecuaţia are trei rădacini reale în intervalele (0, 1), (1, 2) și (6, 7).

Exemplu 2.2

Să determinăm grafic numărul rădăcinilor şi intervalele ȋn care se află rădăcinile


ecuaţiei

sin x  x  0 sau sin x  x (2.3)


108
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Vom face, ȋn aceeaşi fereastră grafică, graficele funcţiilor: f1 ( x)  sin x şi


f 2 ( x)  x , figura 2.3.
Numărul rădăcinilor coincide cu numărul punctelor de intersecţii ale graficelor.

>>x=0:0.01:2*pi;
>> y1=sin(x);
>>plot(x,f1)
>> hold on
>> y2=x;
>> plot(x,f2)
>> grid
>> gtext('x')
>> gtext('sin x')

x
3

1 sin x

-1
0 1 2 3 4 5 6 7

Fig. 2.3

109
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Observăm ca există un singur punct comun in x=0, care este singura rădăcină a
ecuaţiei sin x  x  0 .
Exemplul 2.3

Să se determine grafic numărul rădăcinilor şi intervalele ȋn care se află rădăcinile


ecuaţiei

tan x  x  0 sau tan x  x (2.4)

>>x=0:0.01:4*pi;
>> y1=tan(x);
>> plot(x,y1)
>> y2=x;
>> hold on
>> plot(x,y2)
>> grid
>> gtext('x')
>> gtext('tan x')

10

6
tan x
4
x
2
tan x
0
tan x
-2

-4

-6

-8

-10
0 pi/2 2 4 3*pi/2 6 8 10 12 14

Fig. 2.4

110
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Din figura 2.4 observăm că ecuaţia are o infinitate de soluţii:


x = 0,±4.493,±7.725, . . ..

2.2 Metode numerice

Metodele cele mai utilizate în calculul numeric al rădăcinilor ecuaţiei f ( x ) = 0


sunt:
 Metoda înjumătăţirii intervalului - metoda bisecţiei;
 Metoda secantei (coardei);
 Metoda tangentelor Newton - Raphson .

Aplicarea acestor metode se bazează pe teorema valorii intermediare - teorema


Cauchy- Bolzano.
Teorema 2.1 Cauchy-Bolzano (Teorema valorii intermediare)
Dacă funcţia f(x) este continuă în intervalul [a, b] atunci pentru orice y dintre f(a)
şi f(b) exista c [a, b] astel încât f (c)  y .

Teorema este utilă în condiţiile următoare:


 funcţia f(x) este continuă în intervalul [a, b]
 funcţia f(x) este strict monotonă, adică derivata f '(x) are semn constant pe
intervalul [a,b]
 valorile funcţiei în a şi b, f(a) şi f(b) au semne diferite adica f(a) * f(b) < 0
atunci există o singură radăcină a ecuaţiei f ( x)  0 în intervalul [a, b].

2.2.1 Metoda înjumătăţirii intervalului - metoda bisecţiei intervalului

Metoda bisecţiei sau metoda ȋnjumătăţirii intervalului este una din primele metode
dezvoltate pentru determinarea rădacinilor ecuaţiei f(x) = 0 .
Pentru determinarea unei rădăcini, din intervalul [a,b] prin metoda bisecţiei,
funcţia f(x) trebuie să satisfacă condiţiile:
 f : [a, b]  R continuă şi strict monotonă;
 f (a)  f (b)  0;
  f x  are o singură rădăcină xr  (a, b) , f ( xr )  0 .
111
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Algoritmul 2.1 -algoritmul metodei bisecţiei:


ab
pasul 1: c
2
verificăm daca f (a)  f (b)  0;
dacă nu algoritmul se opreşte
stop;
dacă da se trece la pasul 2; da nu
f(c) < 0

pasul 2:
iniţializăm numărul iteraţiei : k=1;
calculăm mijlocul a=c b=c
ab
intervalului [a,b], c 
2 verifica oprirea
ba
dacă f (c)  0 sau 0 iteratiilor
2
stop ;

pasul 3: Fig. 2.5 Schema Algoritmului 2.1

(căutarea rădăcinii se va face ȋn subintervalele ȋn care funcţia ȋşi schimbă


semnul)
dacă
f (a)  f (c)  0  a  c  rădăcina este în intervalul [c,b]
altfel
f (a)  f (c)  0  b  c  rădăcina este în intervalul [a,c]
(este cazul din figura 2.6)

pasul 4: înapoi la pasul 2.

Algoritmul se opreşte după n iteraţii dacă este satisfăcută o anumită condiţie


stabilită asupra erorii, de exemplu condiţia de a avea valoarea  ca ordin de
convergenţă.
Numărul iteraţiilor necesare, dacă dorim ca eroarea să fie mai mică decât  , se
determină din condiţia ca mărimea intervalului după n paşi să fie mai mică ca  .

112
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

xr

Fig. 2.6 Metoda bisecţiei

Mărimea intervalului [an, bn ] după n paşi este

ba
bn  an  (2.5)
2n

şi la fiecare iteraţie corespunde cu maximul erorii pentru rădăcină

ba
En  (2.6)
2n

Dacă dorim ca eroarea să fie mai mică decât   tol trebuie ca să avem

ba
ln  
ba ba   
  2n   n 
2 n
 ln 2

  b  a 
n  1.443 ln    1 (2.7)
   
Ȋn relaţia (2.7) paranteza [x] este notaţia pentru partea ȋntreagă a numărului.
Partea intreaga a lui x, [x] = k, este numărul ȋntreg k cu proprietatea:

113
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

k ≤ x < k + 1, adică [x] ≤ x < [x] + 1.


Din (2.7) rezultă numărul n al iteraţiilor care trebuie executate pentru a avea  ca
ordin de convergenţă în metoda bisecţiei.

Cod Matlab 2.1 Algoritmul 2.1 este implementat in M-fila


metoda_bisectiei.m

function [c fc er,I] = metoda_bisectiei(f,a,b,tol)


% metoda_bisectiei.m
% Inputs: f -- functie inline
% a,b -- capetele intervalului
% tol -- toleranta (ordinul) convergentei
% Outputs: c -- radacina aproximata
% fc -- valoarea functiei f(c)
% er -- eroarea
format short
I=[a b];
fa = f(a); fb = f(b);
if fa*fb > 0.0
error('Functia are acelasi semn in capetele intervalului')
return
end
niter = 1 + round((log(b-a)-log(tol))/log(2))
for i = 1:niter
c = (a + b)/2;
fc = f(c);
if fc == 0.0
a = c;
b = c;
elseif fb*fc > 0
b = c;
fb = fc;
else
a = c;
fa = fc;
end
I = [I;a b];
if b-a < tol
break
end
end
c =(a+b)/2;
fc = feval(f,c);
er = abs(b-a)/2

114
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

În programul Matlab 2.1 am folosit formula (2.7) pentru calculul numărului de


iterații niter necesare pentru a obține rădăcina cu un ordin de convergență
precizat de variabila tol.

Exemplul 2.4

Să se determine rădăcina ecuaţiei

f ( x)  0.5x 3  4 x 2  6 x  2  0

aflată în intervalul [0, 1].


Am văzut, folosind metoda grafică, Exemplul 1.1, că ecuația are trei rădăcini reale.
Pentru a afla rădăcina din intervalul [0, 1] vom utiliza m-fila tip funcție
metoda_bisectiei.m.
Vom defini funcția ca funcție inline:

>> f = inline('0.5*x.^3 - 4*x.^2+6*x -2','x')

f =

Inline function:
f(x) = 0.5*x.^3 - 4*x.^2+6*x -2

Apelăm m-fila metoda_bisectiei.m, în care introducem capetele intervalului


în care căutăm radăcina și ordinul de convergență tol.

>> [c fc er,I] = metoda_bisectiei(f,0,1,1e-5)

niter =
18

c =
0.4746
fc =
6.6163e-006

115
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

er =

3.8147e-006

I =

0 1.0000
0 0.5000
0.2500 0.5000
0.3750 0.5000
0.4375 0.5000
0.4688 0.5000
0.4688 0.4844
0.4688 0.4766
0.4727 0.4766
0.4727 0.4746
0.4736 0.4746
0.4741 0.4746
0.4744 0.4746
0.4745 0.4746
0.4745 0.4746
0.4745 0.4746
0.4746 0.4746
0.4746 0.4746

Valoarea aproximată a rădăcinii din intervalul [0, 1] este x = 0.4746 şi a fost


obţinută după n = 18 iteraţii, cu eroarea e = 3.8147e-006.
Lăsăm ca exerciţiu determinarea celorlalte două rădăcini ale ecuaţiei din Exemplul
1.1.

Exemplul 2.5

Soluţia numerică pentru ecuaţia transcendentă din Exemplul 2.3.


>> f=inline('tan(x)-x')

f =

Inline function:
f(x) = tan(x)-x

116
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

>> [c fc er,I] = metoda_bisectiei(f,2,4.6,1e-4)

niter =

16

c =

4.4934

fc =

-2.1018e-004

er =

3.9673e-005

I =

2.0000 4.6000
3.3000 4.6000
3.9500 4.6000
4.2750 4.6000
4.4375 4.6000
4.4375 4.5187
4.4781 4.5187
4.4781 4.4984
4.4883 4.4984
4.4934 4.4984
4.4934 4.4959
4.4934 4.4946
4.4934 4.4940
4.4934 4.4937
4.4934 4.4935
4.4934 4.4934

Exemplul 2.6

Exemplu în care metoda bisecţiei eşuează pentru o anumită rădăcină.


Fie ecuaţia
f ( x)  x 3  3 x  2  0 . (2.8)

Din graficul funcţiei, figura 2.6, observăm ca ecuaţia are rădăcina dublă
x1  x 2  1 , ( f (1)  0 , f (1)  0 ) şi rădăcina x 3  2 .
117
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

60

50

40

30

20 x3=2
x1=x2=-1
10

-10

-20

-30

-40

-50

-60
-4 -3 -2 -1 0 1 2 3 4

Fig. 2.6 Graficul funcţiei f ( x)  x 3  3x  2

Pentru rădăcina dublă x1  x 2  1 nu putem găsi un interval [a, b], în care să se


afle numai rădăcina dublă şi să satisfacă condiţia f (a) * f (b)  0 .
Metoda bisecţiei aplicată pentru intervalul [-2, 3] în care se află atât rădăcina dublă
x1  x2  1cît și rădăcina x3  2 , va determina doar rădăcina x3  2 .

>> f=inline('x^3-3*x-2')
f =

Inline function:
f(x) = x^3-3*x-2

>> [c fc er,I] = metoda_bisectiei(f,-2,3,1e-4)

niter =

17

c =
2.0000

118
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

fc =

-2.0599e-004

er =

3.8147e-005

I =
-2.0000 3.0000
0.5000 3.0000
1.7500 3.0000
1.7500 2.3750
1.7500 2.0625
1.9063 2.0625
1.9844 2.0625
1.9844 2.0234
1.9844 2.0039
1.9941 2.0039
1.9990 2.0039
1.9990 2.0015
1.9990 2.0002
1.9996 2.0002
1.9999 2.0002
1.9999 2.0001
1.9999 2.0000

Observaţia 2.1. Metoda bisecţiei eşuează dacă:

 Funcţia are mai mult de o rădăcină în intervalul [a,b];


 Funcţia are rădăcină dublă;
 Funcţia are singularităţi (este discontinuă într-un punct din intervalul în care
se caută rădăcina).

2. 2.2 Metoda secantei

Se ştie din cele de mai sus, teorema valorii intermediare, că dacă funcţia f(x) este
continuă în intervalul [a, b] şi strict monotonă, adică derivata f '(x) are semn

119
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

constant pe intervalul [a,b] şi valorile funcţiei în a şi b, f(a) şi f(b) au semne


diferite adica f(a) * f(b) < 0 , atunci există o singură radăcină a ecuaţiei f ( x)  0
în intervalul [a, b].
Aceasta rădăcină se poate aproxima cu abscisa punctului de intersecţíe a secantei
(coardei) care trece prin punctele A(a, f(a)) şi B(b, f(b)) cu axa Ox, figura 2.7.

Fig. 2.7 Metoda secantei

Algoritmul 2.2 -algoritmul metodei secantei

pasul 1: verificăm daca f (a)  f (b)  0;


dacă nu algoritmul se opreşte: stop;
dacă da se trece la pasul 2;
pasul 2:
iniţializăm numarul iteraţiei : k=1;
calculăm un punct x 1 , la intersecţia dreptei (secanta) care trece prin
punctele A şi B cu axa Ox;
Ecuaţia secantei este:

120
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

f (b)  f (a)
y  f (a)  x  a  (2.8)
ba

Din (2.8) se obţine abscisa x 1 a punctului de intersecţie al secantei cu axa Ox

ba
x1  a  f (a) (2.9)
f (b)  f (a)

dacă f (x1 )  0 stop ;

pasul 3:
(căutarea rădăcinii se va face ȋn subintervalele ȋn care funcţia ȋşi schimbă
semnul)
dacă
f (a)  f ( x1 )  0  noul subinterval este [a, x1]
(cazul din figura 2.7).
altfel

f (a)  f ( x1 )  0  noul subinterval este [x1, b]

pasul 4:
înapoi la pasul 2.

Procedeul se repetă dupa relaţia de recurenţă

x n  x n 1
x n 1  x n  f (x n ) . (2.10)
f (x n )  f (x n 1 )
Cod Matlab 2.2 Algoritmul 2.2 este implementat in m-fila metoda_secantei.m

% metoda_secantei.m
% Inputs:
% f = functia
% x0; x1 = valorile initiale intre care este localizata solutia
% tol = criteriul de convergenta (tol > 100*eps)
% maxiter = numarul maxim de iteratii
%
% Outputs: x = estimarile pentru radacinile f(x) = 0
% k = numarul iteratiilor

121
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

% apelare
% >> metoda_secantei(f, x0, x1, tol, maxiter)

function [x,k] = metoda_secantei(f,x0,x1,tol,maxiter)


fx0 = f(x0);
fx1 = f(x1);
if fx0*fx1 > 0.0
error('Functia are acelasi semn in ambele capete')
end
% Formula iteratiilor (formula (2.10)
% x1 <-- x1 - ( (x1 - x0)/(f(x1) - fx(0)) * f(x1)
disp( ' k x eroare')
k = 1;
while k <= maxiter
dfx = fx1 - fx0;
if dfx == 0
error('impartire cu zero');
end
x2 = x1-fx1*(x1 - x0) / dfx; fx2 = feval(f,x2);
eroare = abs(fx2);
x0 = x1;
fx0 = fx1;
x1 = x2;
fx1 = fx2;
disp([ k x1 eroare])
if eroare < tol
break;
end
k = k + 1;
end
x = x1; k = k-1;
if k > maxiter
fprintf('convergenta la solutie nu s-a obtinut in %d
iteratii\n', maxiter);
end

Exemplul 2.7 Calculul soluţiei ecuaţiei din Exemplu 2.1 din intervalul (1, 2).

Daca funcţia este dată prin comanda inline

>> f = inline('0.5*x.^3 - 4*x.^2+6*x -2','x')

f =

Inline function:

122
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

f(x) = 0.5*x.^3 - 4*x.^2+6*x -2

apelarea metodei secantei se face cu comanda:

>> [x k] = metoda_secantei(f,1,2,1e-5,10)

k x eroare

1.0000 1.2000 0.3040


2.0000 1.3056 0.1281
3.0000 1.3824 0.0288
4.0000 1.3683 0.0017
5.0000 1.3691 0.0000
6.0000 1.3691 0.0000

x =

1.3691

k =

Daca funcţia este dată ca anonymus function, apelarea metodei secantei se


face cu comanda:

>> [x k] = metoda_secantei(@(x)0.5*x.^3-4*x.^2+6*x-2,1,2,1e-
5,10)

Exemplul 2.8
Determinaţi rădăcinile ecuaţiei

ln( x  1)  6 x 2  3x  1  0 (2.11)

Pentru a vizualiza grafic, figura 2.8, numărul rădăcinilor, facem ȋn aceeaşi fereastră
graficele funcţiilor

f 1  ln( x  1) şi f 2  6 x 2  3x  1
123
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

3
f1
f2
2

-1

-2

-3

-4

-5
0 0.5 1 1.5 2 2.5 3

Fig.2.8 Graficele funcţiilor f 1  ln( x  1) şi f 2  6 x 2  3x  1

Observăm că funcţiile se intersectează ȋntr-un singur punct. Rezultă că ecuaţia are


o singură rădăcină ȋn intervalul (0, 1).
Determinăm numeric rădăcina folosind metoda secantei.
Apelăm M-fila metoda_secantei.m ȋn care funcţia se scrie ca o funcţie
anonymus

>> [x k]=metoda_secantei(@(x) log(x+1)+6*x.^2-3*x-1,0,1,1e-5,10)

k x eroare

1.0000 0.2708 1.1328


2.0000 0.4867 0.6423
3.0000 0.7695 0.8147
4.0000 0.6113 0.1145
5.0000 0.6308 0.0157
6.0000 0.6339 0.0004
7.0000 0.6339 0.0000

124
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

x =
0.6339

k =
6

2.2.3 Metoda tangentei - metoda Newton-Raphson

Algoritmul 2.3 Algoritmul metodei tangentei


Metoda Newton-Raphson poate fi folosită pentru a rezolva problemele la care
metodele bisecţiei sau secantei nu se pot aplica. Metoda cere ca să existe prima
derivată a funcţiei f(x) şi să fie continuă în vecinătatea soluţiei.
Strategia metodei Newton-Raphson constă în aproximarea curbei f(x) prin tangenta
sa într-o estimare oarecare. De exemplu, în estimarea xk obţínută la pasul k, figura
2.5., ecuaţia tangentei (o dreaptă) în punctul ( xk , f ( xk )) este:

y  f ( xk )  f ( xk ) ( x  xk ) (2.12)

La pasul următor, alegem pentru estimarea xk+1 punctul în care tangenta


intersectează axa Ox

0  f ( xk )  f ( xk ) ( xk 1  xk ) (2.13)

de unde rezultă formula iterativă a metodei Newton,figura 2.9:

f ( xk )
x k 1  x k  , k  0,1, 2, .... (2.14)
f ( x k )

Pentru x 0 estimarea iniţială a soluţiei, formula (2.14) generează iteraţiile care


aproximează succesiv soluţia căutată x r .
Vom prezenta trei variante de cod Matlab pentru implementarea algoritmului
metodei Newton.

125
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

xr
x
x2 x1 x0

Fig. 2.9 Metoda Newton-Raphson

Cod Matlab 2.3.1

Algoritmul 2.3 este implementat in M-fila function metoda_newton.m.

% metoda_newton.m
% metoda_newton.m pentru determinarea radacinilor ecuației
% f(x) = 0 folosind metoda Newton

function [x,fx,xx] = metoda_newton(f,df,x0,TolX,MaxIter)


%
%input: f = functia care se va defini printr-o M-fila sau inline
% df = df(x)/dx (daca nu este data derivata de utilizator)
% x0 = valoarea initiala de start al algoritmului
% TolX = limita superioara pentru |x(k) - x(k-1)|
% MaxIter = maximum pentru numarul de iteratii
%
%output: x = valoarea (punctul) solutiei aproximate
% fx = f(x(final)), xx = istoria lui x
%
h = 1e-4; h2 = 2*h; TolFun=eps;
if nargin == 4 & isnumeric(df)
MaxIter = TolX; TolX = x0; x0 = df;
126
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

end
xx(1) = x0; fx = feval(f,x0);
for k = 1: MaxIter
if ~isnumeric(df), dfdx = feval(df,xx(k)); % derivata
else dfdx = (feval(f,xx(k) + h)-feval(f,xx(k) - h))/h2;

%derivarea numerica

end
dx = -fx/dfdx;
xx(k+1) = xx(k)+dx;
fx = feval(f,xx(k + 1));
if abs(fx)<TolFun | abs(dx) < TolX,
break;
end
end
xx = xx'
x = xx(k + 1);
if k <= MaxIter, fprintf('Aproximatia dupa %d iteratii\n',k)
end

În acest cod Matlab avem două variante de a introduce funcția și derivata ei:
 varianta1 : scriem o M-fila tip funcție în care vom defini funcția și derivata
ei.
 varianta2 : funcția se introduce ca funcție inline și derivata ei este
calculată numeric în codul Matlab 2.3.1.
În exemplele următoare folosim aceste variante de lucru cu programul 2.3.1.

Exemplul 2.9

Determinaţi rădăcinile ecuaţiei din Exemplul 2.8


ln( x  1)  6 x 2  3x  1  0
folosind codul Matlab 2.3.1 cu varianta 1de introducere a funcției.
Mai înti vom scrie o M-fila tip funcție, f_ex_2_8.m, în care definim funcția și
derivatea ei, după care apelăm codul Matlab metoda_newton.

function f = f_ex_2_8(x)
f = log(x+1)+6*x.^2-3*x-1;
df = 12*x+1./(x+1)-3;

127
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

>> [x,fx,xx] = metoda_newton(@f_ex_2_8,1,1e-4,20)

xx =

1.0000
0.7165
0.6403
0.6339
0.6339

Aproximatia dupa 4 iteratii

x =

0.6339

fx =

1.2051e-008

Exemplul 2.10

Reluăm ecuaţia din Exemplul 2.6. Metodele bisecţiei şi secantei au eşuat la


determinarea rădăcinii duble x  1.
Vom ȋncerca determinarea acestei rădăcini cu metoda tangentei. Calculele
numerice sunt făcute pentru două valori iniţiale: x0 = 0 şi x0 = -2.
Apelăm codul Matlab 2.3.1 cu ambele variante de introducere a funcției.

 Cazul 1 valorea iniţială x0 = 0, varianta 1 pentru codul 2.3.1

>> x0=0;
>> f=inline('x.^3-3*x-2','x')

f =
Inline function:
f(x) = x.^3-3*x-2
>> [x,fx,xx] = metoda_newton(f,x0,1e-4,10)

xx =

128
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

0
-0.6667
-0.8444
-0.9244
-0.9627
-0.9815
-0.9908
-0.9954
-0.9977
-0.9988
-0.9994

Aproximatia dupa 10 iteratii

x =
-0.9994

fx =
-9.9395e-007

 Cazul 2 valorea iniţială x0 = -2 , varianta 2 pentru codul 2.3.1

Scriem M-fila pentru introducerea funcției și a derivatei funcției:

function f = f_ex_2_6(x)
f = x.^3-3*x-2;
df = 3*x.^2-3;
>> [x,fx,xx] = metoda_newton(@f_ex_2_6,-2,1e-4,20)

xx =
-2.0000
-1.5556
-1.2979
-1.1554
-1.0796
-1.0403
-1.0203
-1.0102
-1.0051
-1.0025
-1.0013
129
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

-1.0006
-1.0003
-1.0002
-1.0001

Aproximatia dupa 14 iteratii

x =
-1.0001

fx =
-1.9076e-008 -1.2206e-006

Exemplu 2.11

Să se determine rădăcinile ecuației

f ( x)  tg (  x)  x  0 . (2.15)

În funcție de cum este dată derivata, avem două modalităţi de apelare a rutinei de
calcul metoda_newton.m:
a) Dacă derivata se calculează numeric în codul Matlab metoda_newton.m
(urmează să studiem problema derivării numerice) folosim comenzile:

f = inline('tan(pi - x)-x','x')

f =

Inline function:
f(x) = tan(pi - x)-x

>> x0 = 1.8; TolX = 1e-5; MaxIter = 50;


>> [x,fx,xx] = metoda_newton(f,x0,TolX,MaxIter)

xx =

1.8000
2.0333
130
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

2.0007
2.0000
2.0000

Aproximatia dupa 4 iteratii

x =

2.0000

fx =

7.0699e-013

b) Dacă funcția și derivata este dată de utilizator (mai jos este dată prin
comanda „inline” vom folosi comenzile:

>> f = inline('tan(pi - x)-x','x');


>> df = inline('-(sec(pi-x)).^2-1', 'x'); % prima derivată
>> x0 = 1.8; TolX = 1e-5; MaxIter = 50;
>> [x,fx,xx] = metoda_newton(f,df,x0,TolX,MaxIter)

>> f = inline('tan(pi - x)-x','x')

f =

Inline function:
f(x) = tan(pi - x)-x

>> df = inline('-(sec(pi-x)).^2-1', 'x')

df =

Inline function:
df(x) = -(sec(pi-x)).^2-1

>> x0 = 1.8; TolX = 1e-5; MaxIter = 50;


>> [x,fx,xx] = metoda_newton(f,df,x0,TolX,MaxIter)

131
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

xx =

1.8000
1.9220
2.0075
2.0280
2.0288
2.0288

Aproximatia dupa 5 iteratii

x =
2.0288

fx =
1.1446e-011

Cod Matlab 2.3.2

Prezentăm un cod Matlab, interactiv, pentru determinarea rădăcinilor cu metoda


Newton salvat ca M-fila script Newton_grafic.m.
Acest program permite alegerea punctului de start și produce o fereastră grafică cu
graficul iterațiilor și soluția finală. Programul permite găsirea atât a soluțiilor
simple cât și a soluțiilr multiple. Funcția ale carei rădăcini trebuie determinate se
va da într-o M-fila de tip funcție.

% Newton_grafic(f_nume, x0, xmin, xmax, n_puncte)


% determina radacina functiei f_nume prin
% metoda iterativa newton (cu grafic)
% adaptare dupa Copyright S. Nakamura, 1995
%
while 1
clear, clf,clc
fprintf( ' Metoda iterativa Newton (cu grafic) \n' );
fprintf('Introducem valorile Xmin, Xmax ale abscisei:\n');
while 1
xmin = input( 'Xmin = ' );
xmax = input( 'Xmax = ' );
if xmin < xmax; break; end
fprintf( ' \n Xmin mai mic ca Xmax!!! ')

132
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

fprintf( ' \n Repeta input pentru Xmin si Xmax ! ')


end
fprintf( '\n Introduceti numarul de puncte\n ')
n_points = input('N_puncte = ');
fprintf( '\n Introduceti puctul initial\n ')
x0 = input('Xo = ');
clf, hold off
% xmin, xmax: min si max pentru grafic
del_x=0.001;
axa_x = xmax - xmin; dx = (xmax- xmin)/n_points;
xp=xmin:dx:xmax; yp=feval('f_nume', xp);
plot(xp,yp); xlabel('x');ylabel('f(x)');
title('Iteratia Newton'),hold on
ymin=min(yp); ymax=max(yp);axa_y = ymax-ymin;
yp=0.*xp; plot(xp,yp)
x = x0; xb=x+999; n=0;
while abs(x-xb)>0.000001
if n>300 break; end
y=feval('f_nume', x);
plot([x,x],[y,0],'--');
plot(x,0,'o')
fprintf(' n=%3.0f, x=%12.5e, y=%12.5e\n', n,x,y);
xsc=(x-xmin)/axa_x;
if n<4,
text(x, -axa_y/20, [ num2str(n)], 'FontSize', [14]),
end
y_driv=(feval('f_nume', x+del_x) - y)/del_x;
xb=x;
x = xb - y/y_driv; n=n+1;
plot([xb,x],[y,0],':')
end
plot([x x],[0.02*axa_y 0.2*axa_y])
text( x, 0.1*axa_y, 'Solutia finala','FontSize', [14])
plot([x (x-axa_x*0.004)],[0.02*axa_y 0.03*axa_y])
plot([x (x+axa_x*0.004)],[0.02*axa_y 0.03*axa_y])
axis([xmin,xmax,ymin,ymax])
kont = input('Scrie 1 pentru continuare,sau 0 pentru stop:');
if kont == 0, break; end
end

Exemplul 2.12

În acest exemplu reluăm calculul rădăcinilor ecuației din Exemplul 2.6. Calculele
sunt realizare cu Cod Matlab 2.3.2 pentru valorile inițiale x0 = 1 și x0 = -2.

133
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Funcția este dată în M-fila f_ex2_6.m.

function fv=f_ex2_6(x);
fv=x.^3-3*x-2;

În M-fila script Newton_grafic numele funcției f_nume se înlocuiește cu


f_ex2_6.
Vom executa M-fila cu punctul de start Xo = 1.

>> Newton_grafic

Metoda iterativa Newton (cu grafic)


Introducem valorile Xmin, Xmax ale abscisei:
Xmin = 0
Xmax = 3

Introduceti numarul de puncte


N_puncte = 25

Introduceti puctul initial

Xo = 1

n= 0, x=1.00000e+000, y=-4.00000e+000
n= 1, x=1.33389e+003, y=2.37333e+009
n= 2, x=8.89260e+002, y=7.03210e+008
n= 3, x=5.92841e+002, y=2.08359e+008
n= 4, x=3.95229e+002, y=6.17359e+007
n= 5, x=2.63488e+002, y=1.82921e+007
n= 6, x=1.75662e+002, y=5.41985e+006
n= 7, x=1.17112e+002, y=1.60586e+006
n= 8, x=7.80806e+001, y=4.75789e+005
n= 9, x=5.20627e+001, y=1.40959e+005
n= 10, x=3.47219e+001, y=4.17548e+004
n= 11, x=2.31680e+001, y=1.23641e+004
n= 12, x=1.54758e+001, y=3.65800e+003
n= 13, x=1.03636e+001, y=1.07999e+003
n= 14, x=6.98056e+000, y=3.17209e+002
n= 15, x=4.76551e+000, y=9.19283e+001
n= 16, x=3.35436e+000, y=2.56793e+001
n= 17, x=2.51968e+000, y=6.43780e+000

134
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

n= 18, x=2.11866e+000, y=1.15412e+000


n= 19, x=2.00846e+000, y=7.65555e-002
n= 20, x=2.00005e+000, y=4.75773e-004
n= 21, x=2.00000e+000, y=3.33752e-007

Scrie 1 pentru continuare,sau 0 pentru stop:0 n= 14,

Am obținut soluția x = 2, figura 2.10, după n = 20 iterații și cu punctul de start


Xo = 1.
Iteratia Newton

15

10
f(x)

5 Solutia finala

0
0

0 0.5 1 1.5 2 2.5 3


x

Fig.2.10
Vom executa din nou M-fila Newton_grafic cu punctul de start Xo = -2,
pentru a determina rădăcina x = -1.

>> Newton_grafic

Metoda iterativa Newton (cu grafic)


** Introducem valorile Xmin si Xmax ale abscisei:
Xmin = -3
Xmax = 0

135
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Introduceti numarul de puncte


N_puncte = 25

Introduceti puctul initial

Xo = -2

n= 0, x=-2.00000e+000, y=-4.00000e+000
n= 1, x=-1.55526e+000, y=-1.09613e+000
n= 2, x=-1.29746e+000, y=-2.91761e-001
n= 3, x=-1.15488e+000, y=-7.56751e-002
.
.
n= 31, x=-9.99947e-001, y=-8.49015e-009
n= 32, x=-9.99949e-001, y=-7.69307e-009
n= 33, x=-9.99952e-001, y=-7.00162e-009
n= 34, x=-9.99954e-001, y=-6.39811e-009
n= 35, x=-9.99956e-001, y=-5.86840e-009
n= 36, x=-9.99958e-001, y=-5.40102e-009
n= 37, x=-9.99959e-001, y=-4.98667e-009
n= 38, x=-9.99961e-001, y=-4.61767e-009
n= 39, x=-9.99962e-001, y=-4.28771e-009
n= 40, x=-9.99964e-001, y=-3.99150e-009
n= 41, x=-9.99965e-001, y=-3.72464e-009
n= 42, x=-9.99966e-001, y=-3.48339e-009
n= 43, x=-9.99967e-001, y=-3.26462e-009
n= 44, x=-9.99968e-001, y=-3.06562e-009

Scrie 1 pentru continuare, sau 0 pentru stop: 0

Am obținut soluția x = -1, figura 2.11, după n = 44 iterații cu punctul de start


Xo = -2.

2.2.4 Analiza erorii pentru metoda Newton

Pentru a face o analiză a erorilor vom considera dezvoltarea taylor de ordinul doi a
funcţiei f(x) în punctul x = xk:

136
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Iteratia Newton
10

5 Solutia finala

0
0 1 2 3

-5
f(x)

-10

-15

-20

-3 -2.5 -2 -1.5 -1 -0.5 0


x

Fig.2.11

f ( x k )
f ( x)  f ( x k )  f ( x k ) ( x  x k )  ( x  xk ) 2 (2.16)
2

Vom substitui x cu soluţia x r , f ( x0 )  0 şi vom obţine:

f ( xk )
 f ( xk )  f ( xk ) ( x0  xk )  ( x0  x k ) 2 (2.17)
2

Introducem (2.17) în relaţia (2.14) si obţinem:

f ( xk )
xk 1  xk  ( x0  xk )  ( x0  xk ) 2 (2.18)
2 f ( xk )

137
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

Definim eroarea estimării xk prin ek  xk  x0 şi obţinem

f ( xk ) 2
ek 1  ek  Ak ek2  Ak ek ek (2.19)
2 f ( xk )

Din relaţia (2.19) rezultă că ordinul de mărime al erorilor succesive va fi mic dacă
marimea eroarii iniţiale e0 este mică, astfel ca , Ae0  1.
Spunem că metoda Newton este “pătratic convergentă” deoarece, aşa cum se vede
din relaţia (2.19), marimea eroarii estimate la un anumit pas este proporţională cu
pătratul erorii estimate la pasul anterior.

2.3 Funcția Matlab fzero

În biblioteca Matlab găsim funcția (built-in) fzero cu care putem determina


zerourile ecuațiilor algebrice și transcendente.
Sintaxa:

 x = fzero(function, x0)
 [x, fx] = fzero(function, x0)
 [x, fx] = fzero(function,x0,options)

• function este funcția care este definită anterior


• x0 este punctul inițial
• x vectorul radacinilor
• fx vectorul valorilor lui f

fzero Options

 options = optimset('par1,val1, par2,val2,...)

– parn este numele parametrului care va fi definit


– valn este valoarea atribuită acestui parametru

Parametrii folosiți uzual cu fzero sunt:

Display: care se setează cu valorea 'iter'

138
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

 options = optimset('Display','iter')

Astfel se tipăresc toate detaliile pentru fiecare iterație.

Exemplul 2.13

Să se determine rădăcinile funcției f ( x)  e  x  x .

>> [X, fx] = fzero(@(x) exp(-x)- x,0.1,optimset('Display','iter'))

Search for an interval around 0.1 containing a sign change:


Func-count a f(a) b f(b)
Procedure
1 0.1 0.804837 0.1 0.804837
initial interval
3 0.0971716 0.810229 0.102828 0.799453
search
5 0.096 0.812464 0.104 0.797225
search
7 0.0943431 0.815627 0.105657 0.794076
search
9 0.092 0.820105 0.108 0.789628
search
11 0.0886863 0.826446 0.111314 0.783344
search
13 0.084 0.835431 0.116 0.774475
search
15 0.0773726 0.848172 0.122627 0.761966
search
17 0.068 0.86626 0.132 0.744341
search
19 0.0547452 0.891981 0.145255 0.719547
search
21 0.036 0.92864 0.164 0.684742
search
23 0.00949033 0.981064 0.19051 0.636028
search
25 -0.028 1.0564 0.228 0.568124
search
27 -0.0810193 1.16541 0.281019 0.473994
search
29 -0.156 1.32483 0.356 0.344473
search

139
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

31 -0.262039 1.56162 0.462039 0.167959


search
33 -0.412 1.92183 0.612 -0.0697347
search

Search for a zero in the interval [-0.412, 0.612]:

Func-count x f(x) Procedure


33 0.612 -0.0697347 initial
34 0.576145 -0.0140835 interpolation
35 0.567137 1.01076e-005 interpolation
36 0.567143 -1.64405e-008 interpolation
37 0.567143 -1.90958e-014 interpolation
38 0.567143 1.11022e-016 interpolation
39 0.567143 1.11022e-016 interpolation

Zero found in the interval [-0.412, 0.612]

X =
0.5671

fx =
1.1102e-016

Exemplul 2.15

Să se determine rădăcinile funcției f ( x)  cos(x)  x .

Scriem mai întâi o M-fila funcție

function f=ex_2_14(x)
f = cos(x)-x;

>> X = fzero(@ex_2_14,1,optimset('Display','iter'))

Search for a zero in the interval [0.68, 1.22627]:


Func-count x f(x) Procedure
16 0.68 0.0975727 initial
17 0.734053 0.00841281 interpolation

140
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

18 0.739105 -3.35596e-005 interpolation


19 0.739085 3.73884e-008 interpolation
20 0.739085 1.65534e-013 interpolation
21 0.739085 0 interpolation

Zero found in the interval [0.68, 1.22627]

X =

0.7391
Pentru a calcula rădăcinile vom folosi funcția fzero

>> X = fzero(@ex_2_14,1)

X =
0.7391

>> eroare=feval('ex_2_14',X)

eroare =
0

Exemplul 2.16

Să se determine rădăcinile funcției f ( x)  0.5x 3  4 x 2  6 x  2 .


a) Deoarece funcția este un polinom, rădăcinile se pot determina folosind comanda
Matlab roots (vezi paragraful 1.11.4).

>> p=[0.5 -4 6 -2]

p =
0.5000 -4.0000 6.0000 -2.0000

>> r = roots(p)

r =
6.1563
1.3691
0.4746

141
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

b) Pentru a detrmina rădăcinile cu funcția fzero trebuie să apelăm funcția de trei


ori cu valori inițiale diferite x0 = 0, x0 = 1, x0 = 4.

>> X = fzero(@(x) 0.5*x.^3 - 4*x.^2+6*x -2,0)

Zero found in the interval [-0.64, 0.64]

X =
0.4746

>> X = fzero(@(x) 0.5*x.^3 - 4*x.^2+6*x -2,1)

Zero found in the interval [0.547452, 1.45255]

X =
1.3691

>> X = fzero(@(x) 0.5*x.^3 - 4*x.^2+6*x -2,4)

X =
6.1563

2.4 Probleme

P2.1 Verificați că următoarele ecuații au cel puțin o rădăcină în intervalele


specificate:

(a) x cos x  2 x 2  3x  1  0, [0.2, 0.3] si 1.2,1.3]


(b) ( x  2) 2  ln x  0, 1, 2 si e, 4]

P2.2 Determinați intervalele care conțin soluțiile următoarelor ecuații:

(a) 4 x 2  e x  0
(b) x 3  4.001x 2  4.002 x  1.101  0

P2.3
142
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

(a) Folosiți metoda grafică pentru a determina intervalele în care sunt soluțiile
ecuației

x 4  2x 3  4x 2  4x  4  0

(b) Determinați cu metoda bisecției pentru a determina cu o eroare de 10 2 soluția


ecuației din fiecare interval.

P2.4 Determinați folosind metoda secantei soluțiile ecuațiilor următoare:

(a) 2 x cos x  ( x  2) 2  0 , pe [2, 3]


(b) e x  3x 2  0 pe [0, 1] și [3, 5]

P2.5 Folosind comanda roots determinați rădăcinile ecuațiilor:

(a) x 3  x 2  x  1  0
(b)  2 x  x 5  x 2  4

P2.6 Folosind comanda fzero determinați rădăcinile funcțiilor:

(a) x sin x  cos x


(b) (sin x) 3  sin x
(c) x 3  sin x  1

P2.7 Determinați cu o eroare de 10 4 folosind metoda Newton-Raphson zerourile


următoarelor polinoame:
(a) p( x)  x 3  2 x 2  5
(b) p( x)  x 5  x 4  2 x 3  3x 2  x  4

P2.8 Determinați cu o eroare de 10 4 o soluție a ecuației

143
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

600 x 4  550 x 3  200 x 2  20 x  1  0 , pentru 0.1  x  1

folosind :
(a) metoda bisectiei
(b) metoda lui Newton
(c) metoda secantei

P2.9 Fie f ( x)  33 x1  7  5 2 x ,

(a) Folosiți funcțiile solve și fsolve pentru a determina rădăcinile funcției.


(b) Faceți graficul funcției pentru a determina aproximații inițiale pentru rădăcini.
(c) Folosiți metoda lui Newton pentru a determina rădăcinile cu eroare de 10 16 .
(d) Rezolvați algebric ecuația f ( x)  33 x1  7  5 2 x =0.
P2.10 Fie bara simplu rezemată, figura P2.10, cu EI y  const.
Ecuația diferențială a liniei elastice este

d 2w ql qx 2
EI y   M y , M y  x 
dx 2 2 2

d 2w ql qx 2
EI y   x 
dx 2 2 2

Fig. P2.10

Integrăm ecuația cu condițiile la capete w(0)  w(l )  0 și obținem expresia săgeții

144
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR

q
w ( x 4  2lx 3  l 3 x)
24 EI y
10. Pentru l  600cm, E  50kN / cm 2 , I y  30cm 4 , q  2.5kN / cm faceți graficele
următoarelor cantități versus x, folosiți funcția subplot:
(a) săgeata w,
dw
(b) panta  ( x) 
dx
(c) momentului M y
20. Determinați unde este deplasarea maximă și care este valoarea ei.

145
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

3
SISTEME DE ECUAȚII ALGEBRICE
LINIARE
METODE NUMERICE

În acest capitol vom studia metode numerice pentru calculul soluțiilor sistemelor
de ecuații algebrice liniare:
 Metode directe:
o Regula lui Cramer
o Soluția cu matricea inversă
o Metoda Gauss
o Factorizarea LU
 Metode indirecte
o Metoda Jacobi
o Metoda Gauss- Seidel

3.1 Sisteme algebrice liniare. Existenţa şi unicitatea soluţiei

Fie sistemul liniar de m- ecuaţii algebrice cu n necunoscute

 a11x1  a12 x2  ..  a1m xm ...  a1n xn  b1


 a x  a x  ..  a x ...  a x  b
 21 1 22 2 2m m 2n n 2
 . (3.1)
 .

a m1 x1  a m 2 x2  ..  a mm xm ...  a mn xn  bm

146
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Introducem notațiile matriceale:

 a11 a 21 . . an1   b1   x1 
a a 22 a 21  b  x 
 ; b   2  ; x    2
. .
A mn   21   (3.2)
 . . . . .   .   . 
  bm  
 am1 an 2 . . amn  x m 

și rescriem sistemul în forma matriceală:

Ax  b sau Ax = b (3.3)

Definim matricea extinsă:

 a11 a12 . a1n | b1 


 a a 22 . a2n | b2 
 21 
 . . . . | . 
[ A | b]    (3.4)
 . . . . . . 
a m 11 a m 12 . a m1n | bm 1 
 
 a m1 am2 . a mn | bm 

Teorema 3.1. Existenţa şi unicitatea soluţiei


Sistemul

Ax  b

cu m ecuaţii şi n necunoscute are soluţie dacă şi numai dacă rangul matricei


sistemului este egal cu rangul matricei extinse

rang [A] = rang [A b] (3.5)

Fie r = rang[A] sau r=rank(A) în notația din Matlab.


● Dacă condiţia (3.5) este satisfăcută şi dacă r = n, atunci soluţia este unică,
sistemul este compatibil determinat.
147
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

● Dacă condiţia (3.5) este satisfăcută dar r < n, sistemul are o infinitate de soluţii
şi r necunoscute, se scriu ca o combinaţie liniară de celelalte n - r necunoscute
care iau valori arbitrare.
Ȋn Matlab, rangul unei matrice se calculează cu comanda : r = rank(A)

>> A=[1 2 -1; 2 1 0; -1 2 2];


>> r=rank(A)
r=
3

Vom considera ȋn continuare sistemele pentru care m = n

 a11 x1  a12 x 2  ..... a1n x n  b1


a x  a x  ..... a x  b
 21 1 22 2 2n n 2
 . (3.6)
 .

a n1 x1  a n 2 x 2  ..... a nn x n  bn

unde aij şi bi i, j  1, 2,..,n , sunt coeficienţi constanţi, iar x1 , x2 , ..., xn sunt


necunoscutele. Scriem sistemul în notație matriceală

 a11 a 21 . . a n1   x1   b1 
a a 22 . . a 21   x 2  b2 
 21       , Ax  b (3.7)
 . . . . .  .   . 
 
 a n1 an2 . . a nn   x n  bn 

 a11 a 21 . . a n1   b1   x1 
a a 21  b  x 
 ; b   2  ; x   2 
a 22 . .
A   21 (3.8)
 . . . . .  . . 
  bn   x n 
 a n1 an 2 . . a nn 
Matricea extinsă este

148
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

 a11 a12 . a1n | b1 


a a 22 . a2n | b2 
 21 
 . . . . | . 
[ A | b]    (3.9)
 . . . . . . 
a n11 a n 12 . a n1n | bn 1 
 
 a n1 an2 . a nn | bn 

3.2. Metode directe de rezolvare a sistemelor liniare

3.2.1 Regula lui Cramer

Fie sistemul

[ A]x  b (3.10)

compatibil determinat, adică r = rank(A) = n, det( A)  0 .


Regula lui Cramer: fiecare necunoscută se determină ca raportul a doi
determinanţi

det[ Ak ] Ak D
xk    k , k  1,2,...,n (3.11)
det[ A ] A D

Determinantul de la numărător este determinantul matricei [ Ak ] , obţinută din


matricea sistemului [A ] prin ȋnlocuirea coloanei corespunzătoare necunoscutei x k
cu coloana termenilor liberi, iar determinantul de la numitor este determinantul
matricei sistemului.

Observaţia 3.1. Pentru un sistem cu mai mult de trei ecuaţii, regula lui Cramer
devine greu de folosit deoarece calculul determinanţilor necesită o durată mare ȋn
timp.
Cu Programul Matlab3.1, M-fila cost_Cramer.m, obţinem durata ȋn timp
(exprimată ȋn ani) pentru calculul soluţiei, ȋn funcţie de numărul necunoscutelor,
figura 3.1.

149
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

 a11 a12 . . a1k 1 a1k a1k 1 . . a 1n 


a a 22 . . a 2 k 1 a2k a 2 k 1 . . a2n 
 21` 
 . . . . . . . . . . 
 
[ A]   . . . . . . . . . . 
 a k1 a k 2 . . a kk 1 a kk a kk 1 . . a kn 
 
 . . . . . . . . . . 
 a n1 a n 2 . . a nk 1 a nk a nk 1 . . a nn 

 a11 a12 . . a1k 1 b1 a1k 1 . . a 1n 


a a 22 . . a 2 k 1 b2 a 2 k 1 . . a2n 
 21` 
 . . . . . . . . . . 
 
[ Ak ]   . . . . . . . . . . 
 a k1 a k 2 . . a kk 1 bk a kk 1 . . a kn 
 
 . . . . . . . . . . 
 a n1 a n 2 . . a nk 1 bn a nk 1 . . a nn 

Programul Matlab 3.1 M-fila cost_Cramer.m

% cost_Cramer.m
SecAn=365*24*3600;
n=[5, 10, 15, 20, 50, 100];
Clock=100*1e9;
Cost=factorial((n+1))/Clock;
CostAn=Cost/SecAn;
loglog(n, CostYear,'ko-')
xlabel('n'); ylabel('CPU Time [Ani]'); title('Durata calcul
solutie cu regula lui Cramer')

150
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

160 Durata calcul solutie cu regula lui Cramer


10

140
10

120
10

100
CPU Time [Ani]
10

80
10

60
10

40
10

20
10

0
10

-20
10 0 1 2
10 10 10
n

Fig. 3.1 Durata ȋn timp - versus numărul de necunoscute


la calculul soluției cu regula Cramer

Programul Matalb 3.2

Soluția cu Matlab a sistemelor liniare folosind regula lui Cramer.


Pentru un sistem de trei ecuaţii cu trei necunoscute regula lui Cramer (3.11) este
implementată ȋn M-fila Cramer.m.

% Cramer.m
% Intrare: - matricea A
% - matricea b
% Iesire: -vectorul solutiei x
A1=A;A1(:,1)=b;
A2=A;A2(:,2)=b;
A3=A;A3(:,3)=b;
D=det(A);
D1=det(A1);
D2=det(A2);
D3=det(A3);
x(1)=D1/D; x(2)=D2/D; x(3)=D3/D;
x=[x(1); x(2);x(3)]
verificare_b=A*x

151
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Exemplul 3.1 Să se rezolve, ȋn Matlab, sistemul liniar folosind regula lui Cramer

3 2  4  x1  2
1  5 1   x   1
 2   
(3.12)

7 2  1  x3  7

Vom utiliza M-fila Cramer.m.

A=[3 2 -4;1 -5 1;7 2 -1];


b=[2;1;7];
A1=A;A1(:,1)=b;
A2=A;A2(:,2)=b;
A3=A;A3(:,3)=b;
D=det(A);
D1=det(A1);
D2=det(A2);
D3=det(A3);
x(1)=D1/D; x(2)=D2/D; x(3)=D3/D;
x=[x(1); x(2);x(3)]
% verificare
verificare_b=A*x

>> Cramer
A = b =
D = -123.0000
3 2 -4 2
1 -5 1 1
7 2 -1 7

A1 = A2 = A3 =
2 2 -4 3 2 -4 3 2 2
1 -5 1 1 1 1 1 -5 1
7 2 -1 7 7 -1 7 2 7

D1 = -126.0000 D2 = -8 D3 = -37
x = verificare_b =
1.0244 2
0.0650 1
0.3008 7

152
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Rezolvarea în Matlab, cu regula lui Cramer, a sistemelor cu mai mult de trei ecuații
este nerecomandată.

3.2.2 Soluţia sistemelor liniare folosind matricea inversă

Fie sistemul

Ax  b (3.13)

O cale formală, dar nu foarte eficientă, pentru a determina soluţia sistemului este
să înmulţim ambele părţi ale ecuaţiei (3.13) cu inversa matricei sistemului [ A ] 1

[ A]1[ A]x  A b


1

de unde, cu I  [ A]1[ A] , obținem soluţia:

x  A1 b (3.14)

Inversa unei matrice

Dacă matricea [A] este nesingulară, adică valoarea determinantului este diferită de
zero
a11 a 21 . . a n1
a a 22 . . a 21
det[ A]  0 ; det  A  21 (3.15)
. . . . .
a n1 a n 2 . . a nn
matricea este inversabilă.

Inversa matricei este:

1 [ A]*
[ A]  (3.16)
det[ A]

153
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

unde matricea [ A]*  [ Aij ] este matricea adjunctă a matricei [A] . Elementele
matricei adjuncte se obţin înlocuind fiecare element al matricei transpuse
(schimbăm linile în coloane), [ A]T  [a ji ] , cu complementul sau algebric:

Aij  (1) i  j M ij (3.17)

unde M ij sunt minorii elementului aij ai matricei transpuse, adică determinanţii


obţinuţi din determinantul matricei transpuse prin suprimarea liniei i şi coloanei j.

Exemplul 3.2 Calculul matricei inverse.

Fie matricea
1 1  1
[ A]  2 1 0
 
1  1 1 
Pasul 1: Calculăm determinantul:

1 0 2 0 2 1
det [ A]  1(1)11  1(1)1 2  (1)(1)1 3  1  2  (3)  2
1 1 1 1 1 1

Pasul 2: Obţinem matricea transpusă

1 2 1
[ A]   1 1  1
T
 
 1 0 1 

Pasul 3: Calculăm complemenţii algebrici

1 1 1 1
A11  (1)11  1; A12  (1)1 2  0 ...
0 1 1 1

154
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

1 0 1 
Pasul 4: Obţinem matricea adjunctă: A   2 2  2
*

  3 2  1
Pasul 5: Obţínem matricea inversă

 1 1 
 2 0
 A
* 2 
A1   1 1 1
 (3.18)
det A  3 1
 1  
 2 2 

Programul Matalb 3.2

Calculul matricei inverse MATLAB.

>> A=[1 1 -1;2 1 0;1 -1 1]; % introducem matricea


>> d=det(A) % calculăm determinantul
d =
2

>> inv(A) % comanda de calcul a inversei

inv(A)=

0.5000 0.0000 0.5000


-1.0000 1.0000 -1.0000
-1.5000 1.0000 -0.5000

>>I=A*inv(A)

I=
1 0
0 1

Observaţia 3.2 Nu este recomandată rezolvarea sistemelor liniare cu matricea


inversă. Metoda cere multe operaţii. Ȋn cazul n x n metodele directe descrise mai
sus necesită costuri mari ȋn timp.

155
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

3.3 Sisteme triunghiulare. Soluţia unui sistem triunghiular

 spunem că o matrice L  R nn este inferior triunghiulară dacă toate


elementele matricei de deasupra diagonalei sunt egale cu zero, adică

lij  0 pentru j > i.

 spunem că o matrice U  R nn este superior triunghiulară dacă toate


elementele matricei de sub diagonală sunt egale cu zero, adică

u ij  0 pentru i > j.

Un sistem liniar cu matricea A superior triunghiulară se poate rezolva prin metoda


substituţiei "ȋnapoi" - substituţie regresivă sau inversă.

Exemplul 3.3. Fie sistemul superior triunghiular

 x1  2 x 2  x3  2

  x 2  2 x3  1 (3.19)
 3 x3  3

1 2 1  x1  2
   
U x  b  0  1 2  x 2   1
 
0 0 3    
 x3  9

Rezolvarea se face prin substituţie regresivă (inversă), pornind de la ecuaţia a


treia, din care rezultă x 3 , apoi din ecuaţia a doua rezultă x 2 şi ȋn final, din prima
ecuaţie se determină x1 :

156
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

x3  9 / 3  3;
x 2  (1  2 x3 ) /(1)  (1  2  3) /(1)  5;
x1  2  2 x 2  x3  2  2  5  3  11

3.3 Metode numerice de rezolvarea a sistemelor algebrice liniare

Metodele numerice pentru rezolvarea a sistemelor liniare sunt metode directe și


metode indirecte.

1. Metode dirtecte - soluţia se determină ȋntr-un număr finit de paşi:


 metoda Gauss
 metode Cholevsky
 metoda Householder

Prin metodele directe sistemul este transformat ȋntr-un sistem triunghiular


echivalent şi care se rezolvă prin metoda substituției inverse descrisă mai sus.
Metodele directe dau rezultate bune daca nu avem erori de rotunjire. Numărul
operaţiilor aritmetice efectuate este de ordinul n 3 , astfel că pentru un număr mare
de ecuaţii (n  100) erorile de rotunjire pot altera soluţia.

2. Metode indirecte:
 metoda Jacobi
 metoda Gauss-Seidel
 metodele de relaxare

3.3.1 Metoda Gauss

3.3.1.1 Metoda Gauss - varianta "naivă"

Metoda Gauss numită şi metoda "naiva" de eliminare Gauss este una dintre cele
mai populare metode numerice pentru rezolvarea sistemelor algebrice liniare de
forma (4.2). Metoda Gauss se aplică ȋn doi paşi:
Pasul 1. Aducerea sistemului, prin transformări elementare, la un sistem
triunghiular superior echivalent (reducând matricea coeficienţilor la o marice de
formă triunghiulară superior).

157
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Pasul 2. Rezolvarea sistemului triunghiular superior prin metoda substituţiei


inverse (substituţia ȋnapoi).
Transformările elementare prin care se obţine acest sistem echivalent sunt:
 ȋnlocuirea unei ecuaţii cu suma dintre această ecuaţie şi altă ecuaţie
ȋnmulţită cu un scalar;
 schimbarea locului a două ecuaţii;
 ȋnmulţirea unei ecuaţii cu un număr.

Aceste transformări se vor aplica matricei extinse [ A b] , adică matricei obţinută


prin adăugarea la matricea coeficienţilor sistemului [A] a matricei coloană a
termenilor {b} liberi

 a11 a12 . a1n | b1 


a a 22 . a 2n | b2 
 21 
 . . . . | . 
[ A |b]   
 . . . . . . 
an11 an12 . an1n | bn1 
 
 an1 an 2 . ann | bn 

Exemplu 3.3 Soluţia numerică - Metoda Gauss "naiva"

Să se determine soluția numerică a sistemului liniar

 1 2  1  x1  0
 2 1 0   x   2 
  2    (3.20)
 1 2 2   x3  1

Construim matricea extinsă:

 1 2  1 | 0
[ A | b]   2 1 0 | 2 (3.21)
 
 1 2 2 | 1

Pasul 1: Eliminăm necunoscuta x1 din liniile doi şi trei:


158
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

a. linia (1) rămâne neschimbată -elementul a11  1 este numit pivot;


b. pentru a face zero pe poziţia a21 vom ȋnmulţi linia unu (1) cu -2 şi o
vom aduna cu linia doi (2) : (2) ← (2) - 2*(1)
c. pentru a face zero pe poziţia a31 vom ȋnmulţi linia unu (1) cu 1 şi o
vom aduna cu linia trei (3) : (3) ← (3) + 1*(1)
Obţinem:

1 2  1 | 0
0  3 2 | 2 
 
0 4 1 | 1

Pasul 2: Facem zero şi elementul a 32 :

1 2  1 | 0
0  3 2 | 2 
 
0 4 1 | 1

Astfel, am obţinut un sistem triunghiular superior


 x1  2 x 2  x3  0

  3 x 2  2 x3  2
 11 11
 x 

3
3 3

a cărui soluţie se determină prin metoda substituţiei regresive (inverse):

x 3  1, x 2  0, x1  1.

159
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Observaţia 3.3 Folosind suma seriei

n n(n  1)(2n  1)
 k2 
2
k 1

putem aproxima numărul operaţiilor aritmetice efectuate ȋn metoda Gauss cu


2n 3 / 3 (pentru sistemele cu multe ecuaţii , valori mari ale lui n).

3.3.1.2 Metoda Gauss - varianta cu pivotare

Mai ȋntâi, pentru simplitate, vom prezenta metoda pe cazul unui sistem cu matricea
[A] nesingulară de tip 3x3.
Fie sistemul

a11 x1  a12 x 2  a13 x3  b1


a 21 x1  a 22 x 2  a 23 x3  b2 (3.22)
a31 x1  a32 x 2  a33 x3  b3

Etapa 1. Pivotarea

Pivotarea - rearanjarea liniilor pentru a avea la fiecare pas al eliminării un pivot


maxim. Astfel se ȋmbunătăţeşte stabilitatea numerică a metodei Gauss, se
minimizează erorile de rotunjire şi se evită ȋmpărţirile cu zero.
Pivotul se va alege astfel: ȋn pasul i, găsim linia j > i astfel ȋncât a ji  a ki pentru
toţi k > i şi apoi schimbăm liniile i şi j; pivotul va fi ales coeficientul a ji .
Folosim observaţiile de mai sus pentru alegerea pivotului.
Matricea extinsă este:

 a11 a12 a13 | b1 


a a 22 a 23 | b2 ` (3.23)
 21 
a 31 a 32 a 33 | b3 

Algoritmul 3.1 Metoda Gauss cu pivot

160
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Pasul 1: Presupunem că pivotul este a11 ; vom elimina pe x 1 din ecuaţiile doi şi
trei:
 ȋmpărţim prima linie la elementul pivot a11 ;
 scădem prima linie ȋnmulţită cu primul element din celelalte linii:

1 a12
(1) (1)
a13 | b1(1) 
 (1) (1) 
0 a 22 a 23 | b2(1)  (3.24)
0 a32
(1) (1)
a33 | b3(1) 

unde

 (1) a1 j
a1 j  , j  1, 2, 3
 a11
b (1)  1
b
1 a11
(3.25)
 (1)
aij  aij  ai1 a1(1j) , j 1, 2, 3; i  2, 3
b (1)  bi  ai1b1(1)
 i

Pasul 2: eliminăm pe x 2 din ecuaţia a treia:

1 a12
(1) (1)
a13 | b1(1) 
 ( 2) 
0 1 a 23 | b2( 2)  (3.26)
0 0 ( 2)
a33 | b3( 2) 

unde:
 ( 2) a 2(1j)
a 2 j  (1)
, j  2, 3
 a 22
 ( 2) b2(1)
b2  (1) (3.27)
 a 22
aij( 2)  aij(1)  ai(21) a 2( 2j) , j  2, 3; i  3
 ( 2)
bi  bi(1)  ai(21) b2( 2)

( 2)
Pasul 3: ȋmpărţim linia trei din (3.27) cu a33 şi obţinem:

161
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

1 a12
(1) (1)
a13 | b1(1) 
 ( 2) 
0 1 a 23 | b2( 2)  . (3.28)
0 0 1 ( 2) 
| b3( 2) / a33
 

Sistemul (3.28) este un sistem triunghiular echivalent cu sistemul iniţial (3.22).


Soluţia sistemului se obţine prin metoda substituţiei inverse:

 x3  b3(3)

 x 2  b2  a 23 x3
( 2) ( 2)
(3.29)
 x  b (1)  (a (1) x  a (1) x ).
 1 1 12 2 13 3

3.3.1.3. Programul Matalb 3.3

Implementarea in Matlab a Algoritmului 3.1


Algoritmul 3.1 al metodei Gauss cu pivotare, pentru determinarea soluţiilor
sistemelor liniare ȋn cazul general, cu matricea A bine condiţionată, este
implementat ȋn M-fila de tip funcţie Gauss_Pivot.m.

Gauss_Pivot.m.

function x = Gauss_Pivot(A,b,ptol)
% Gauss_Pivot determina solutia sistemelor liniare
%
% Apelarea: x = GaussPivot(A,b)
% x = Gauss_Pivot(A,b,ptol)
%
% Intrare: A,b = matricea coeficientilor, matricea termenilor liberi
% ptol = (optional) toleranta pentru detectarea pivotului zero
% Default: ptol = 50*eps
% Iesire (raspuns): x = vectorul solutie

A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2];


b=[10;17;18;27];

if nargin<3, ptol = 50*eps; end


[m,n] = size(A);
if m~=n, error('matricea A trebuie sa fie patratica'); end
disp(sprintf('\nMatricea extinsa'))
nb = n+1; Ab = [A b];

162
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Ab
disp(sprintf('\n**Etapa de eliminare directa cu matricea extinsa**'))
disp(sprintf('\nPasul 1: determinam linia pivot\nvaloarea cea mai mare si
indexul ei\np este indexul in subvectorul i:n\nip este indexul liniei
pivotului ales'))
for i = 1:n-1
[pivot,p] = max(abs(Ab(i:n,i)));
ip = p + i - 1;
if ip~=i
fprintf('\nschimbam liniile %d and %d; pivot nou =
%g\n',i,ip,Ab(ip,i));
Ab([i ip],:) = Ab([ip i],:); % face schimbul liniilor
end
pivot = Ab(i,i);
if abs(pivot)<ptol, error('dupa schimbarea liniilor a gasit pivot cu
valoarea zero');
end
for k = i+1:n % k = indexul liniei urmatoare care va fi eliminata
Ab(k,i:nb) = Ab(k,i:nb) - (Ab(k,i)/pivot)*Ab(i,i:nb);
end
fprintf('\nDupa eliminare in coloana %d cu pivot = %f\n',i,pivot);
disp(Ab);
end
disp(sprintf('\n**** Etapa de determinare a soltiei ****'))
disp(sprintf('Determinam solutia prin metoda substitutiei inverse incepand
cu ultima ecuatie'))
x = zeros(n,1);
x(n) = Ab(n,nb)/Ab(n,n);
for i=n-1:-1:1
x(i) = (Ab(i,nb) - Ab(i,i+1:n)*x(i+1:n))/Ab(i,i);
end

Exemplu 3.4 Metoda Gauss cu pivotare. Aplicaţie numerică în Matlab

Să se determine soluția sistemul algebric liniar:

2 x1  2 x 2  4 x3  2 x 4  10
 x  3x  2 x  x  17
 1 2 3 4
 (3.30)
 3x1  x 2  3x3  x 4  18
 x1  3x 2  4 x3  2 x 4  27

A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2];


b=[10;17;18;27];

163
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Matricea extinsă a sistemului este

Ab =
2 2 4 -2 10
1 3 2 -1 17
3 1 3 1 18
1 3 4 2 27

*********** Etapa de eliminare ***********

Pasul 1: determinam linia pivot (linia 3) si eliminam


necunoscuta x1 Pivotarea -aleg pivot maxim ==> interschimbam
linile 1 cu linia 3 Se înmulţeşte pe rând linia pivot cu
elementele (-1/3); (-2/3); (-1/3)si se adună la linia 2, apoi 3
şi respectiv 4 Matricea s-a transfomat în matricea următoare:

Ab =
3 1 3 1 18
0 2.6667 1 -1.3333 11
0 1.3333 2 -2.6667 -2
0 2.6667 3 1.6667 21

Pasul 2: eliminam necunoscuta x2


Nu avem in acest caz nevoie de pivotare si vom inmulti linia
pivot,linia a doua rând pe rand cu elementele (-4/3 . 3/8) = (-
1/2); (-1)si o vom aduna la linia 3, respectiv 4
Matricea s-a transfomat în matricea următoare:

Ab =
3 1 3 1 18
0 2.6667 1 -1.3333 11
0 0 1.5 -2 -7.5
0 0 2 3 10

Pasul 3: eliminam necunoscuta x3


Nu avem nevoie de pivotare. Vom înmulţi linia pivot, linia 3, cu
elementul (-3) 2 . 2=(-3/4) si apoi o vom aduna la linia 4
Matricea s-a transfomat în matricea următoare:

Ab =
3 1 3 1 18
0 2.6667 1 -1.3333 11
0 0 1.5 -2 -7.5

164
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

0 0 0 5.6667 20

************* Etapa de determinare a solutiei ***********


Determinam solutia prin metoda substitutiei inverse incepand cu
ultima ecuatie.

Obtinem solutia:

x =
3.1176
6
-0.29412
3.5294

3.3.2 Metoda cu operația de ȋmpărţire la stânga oferită de MATLAB

Fie sistemul algebric liniar

Ax  b
În Matlab ecuaţia matriceală se rezolvă cu metoda împărţirea la stânga, care
foloseşte operatorul " \ ". Metoda este bazată pe eliminarea Gauss cu pivotare.
Soluția se obţine cu comanda:

>> x = A\b

Exemplu 3.5

>> A=[2 2 4 -2;1 3 2 -1;3 1 3 1;1 3 4 2];


>> b=[10;17;18;27];
>> x=A\b
x =
3.1176
6.0000
-0.2941
3.5294

165
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Exemplu 3.6

Prezentăm o M-filă, ex_3_6.m, ȋn care se cercetează, mai ȋntâi, dacă este


satisfacută condiţia (3.5) din teorema 3.1 şi apoi se determină soluţia cu metoda
ȋmpărţirii la stânga.

% Script file sisteme_liniare.m


% Rezolvarea sistemelor liniare Ax = b, se dau A si b.
% Comparam rangul matricelor A si [A b]
% Inputs: A,b
A=[3 2 -4;1 -5 1;7 2 -1]
b=[2;1;7]
if rank(A) == rank([A b])
% rangurile egale
Size_A = size(A);
% Este rangul matricei A egal cu numarul necunoscutelor ?
if rank(A) == Size_A(2)
% Daca rangul matricei A este egal cu numarul
necunoscutelor
disp('Sistemul are solutie unica, solutia este:')
x = A\b % Calculeaza solutia prin inpartire la stanga
else
% Daca rangul matricei A nu este egal cu numarul
necunoscutelor.
disp('Sistemul are o infinitate de solutii')
disp('Matricea extinsa a sistemului redus este:')
rref([A b]) % Calculeaza matricea estinsa
end
else
% Cand rangul matricelor A si [A b] nu este acelasi
disp('Sistemun nu are solutii')
end

>> ex_3_6

A =
3 2 -4
1 -5 1
7 2 -1
b =
2

166
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

1
7

Sistemul are solutie unica, solutia este:

x =
1.0244
0.0650
0.3008

3.3.3 Factorizarea LU

Presupunem că există o matrice inferior triunghiulară L şi o matrice superior


triunghiulară U, astfel ȋncât matricea A se factorizeaza

A  L  U . (3.31)

Dacă matricea A este nesingulară, det( A)  0 , atunci din relaţia

det( A)  det( L)  det(U ) (3.32)

rezultă că lii  0 şi uii  0 , i  1, 2,...,n .


Folosind factorizarea LU pentru matricea unui sistem algebric liniar se poate
construi o altă metodă directă pentru rezolvarea sistemelor liniare.
Fie sistemul liniar

Ax  b (3.33)

Rescriem sistemul folosind (3.31) și obținem

LU x  b (3.34)


167
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Astfel, rezolvarea sistemului (3.31) revine la rezolvarea următoarele 2 sisteme


triunghiulare:

Ly  b (3.35a)

U x  y (3.35b)

Soluţiile acestor sisteme triunghiulare se determină cu metoda substituţiei directe


respectiv metoda substituţiei inverse.
Sistemul (3.35a) cu matricea [L] inferior triunghiulară se poate rezolva prin metoda
substituţiei "ȋnainte" - substituţie sau directă.

Algoritmul 3.2

Algoritmul substituţiei directe este descris ȋn M-fila substitutie_directa.m

function y = substitutie_directa(L,b)
n = length(b);
y = zeros(n,1);
y(1) = b(1)/L(1,1);
for i=2:n
y(i) = (b(i)-L(i,1:i-1)*y(1:i-1))/L(i,i);
end

Sistemul (3.35b) cu matricea [U] superior triunghiulară se poate rezolva prin


metoda substituţiei "ȋnapoi" - substituţie inversă.

Algoritmul 3.3

Algoritmul substituţiei directe este descris ȋn M-fila substitutie_inversa.m

function x = substitutie_inversa(U,y)
n = length(y);
x = zeros(n,1);
x(n) = y(n)/U(n,n);
for i=n-1:-1:1
x(i) = (y(i)-U(i,i+1:n)*x(i+1:n))/U(i,i);
end

Factorizarea LU în MATLAB
168
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Factorizarea LU în MATLAB se obţine cu M-funcţia lu. Aceasta se apelează cu


comanda

>> [L,U] = lu(A).

Matlab returnează matricele L şi U.

Exemplu 3.6

>> A =

14 2 3 5
3 32 9 6
3 1 23 2
3 6 4 16

>> b =

22
36
31
11

>> [L,U]=lu(A)

L =

1.0000 0 0 0
0.2143 1.0000 0 0
0.2143 0.0181 1.0000 0
0.2143 0.1765 0.0848 1.0000

U =
14.0000 2.0000 3.0000 5.0000
0 31.5714 8.3571 4.9286
0 0 22.2059 0.8394
0 0 0 13.9877

>> y = substitutie_directa(L,b)

y =
22.0000
169
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

31.2857
25.7195
-1.4155

>> x = substitutie_inversa(U,y)

x =
1.2587
0.6991
1.1621
-0.1012

Exemplu 3.6

Fie sistemul de bare articulate din Fig. 6.6, simplu rezemat în A şi articulat în D.
Folosind metoda echilibrului nodurilor să se determine eforturile din bare.
Necunoscutele sunt eforturile din cele 9 bare S1 , S2 ,.......S9 şi reacţiunile din
reazemul A şi articulaţia D, N A respectiv X D ,YD .
După izolarea nodurilor şi introducerea eforturilor din bare, scriem ecuaţiile de
YD
D
XD
2 3 12
4 E
B 1200 N
1 5 12
7 6
A 8 C 9 F
9 9
NA
2400 N 1200 N

Fig.6.6
echilibru pentru fiecare nod şi obţinem următorul sistem pentru determinarea
eforturilor din bare şi a reacţiunilor

170
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

 0.6 0 0 0 0 0 0 1 0 0 0 0  S1   0 
 0.6 0.6
 0 1 0 0.6 0 0 0 0 0 0  S 2   0 
  0.8 0.8 0 0 0  0.8  1 0 0 0 0 0  S 3   0 
    
 0 0 0 1 0 0 0 0 0 0 0 0  S 4  1200
 0 0 0 0 1 0.8 0 0 0 0 0 0  S 5  1200
    
 0 0 0 0 0  0.6 0 0  1 0 0 0  S 6   0 
 0   
0 0 0 0 0 1 0 0 0 0 0  S 7  2400
 
 0 0 0 0 0 0 0 1 1 0 0 0  S 8   0 
    
 0 0 1 0 1 0 0 0 0 0 0 0  S 9   0 
 0  0.6 0 0 0 0 0 0 0 1 0 0  X D   0 
    
 0  0.8  1 0 0 0 0 0 0 0 1 0  Y D   0 
 0.8
 0 0 0 0 0 0 0 0 0 0 1 N A   0 

 0.6 0 0 0 0 0 0 1 0 0 0 0  S1 
 0.6 0.6 0 1 0 0.6 0 0 0 0 0 0 S 
  2 
  0.8 0.8 0 0 0  0.8  1 0 0 0 0 0  S3 
   
 0 0 0 1 0 0 0 0 0 0 0 0  S4 
 0 0 0 0 1 0.8 0 0 0 0 0 0  S5 
   
 0 0 0 0 0  0.6 0 0  1 0 0 0  S6 
[A ]   [b]   
0 0 0 0 0 0 1 0 0 0 0 0  S7 
 
 0 0 0 0 0 0 0 1 1 0 0 0  S8 
   
 0 0 1 0 1 0 0 0 0 0 0 0  S9 
 0  0.6 0 0 0 0 0 0 0 1 0 0 X 
   D
 0  0.8  1 0 0 0 0 0 0 0 1 0 YD 
 0.8 1 N 
 0 0 0 0 0 0 0 0 0 0  A

Pentru rezolvarea numerică vom utiliza metoda Gauss. Apelăm m-fila


Gauss_Pivot.m, cu matricele de intrare [A] şi [b] de mai sus.

>> Gauss_Pivot

Obţinem eforturile din bare şi reacţiunile din legăturile exterioare:

171
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

 S1  - 2500 
 S   - 2000 
 2  
 S3   3200 
   
 S4   1200 
 S5   3200 
   
 S6   - 2500 
 = 
 S 7   2400 
 S8   1500 
   
 S9   1500 
 X   - 1200 
 D  
 YD   1600 
 N   2000
 A  

3.4 Metode indirecte

În cazul sistemelor cu numar mare de ecuaţii metodele directe pot conduce la erori
mari de rotunjire. Metodele iterative permit un control al acestor erori. În această
secţiune vom analiza mai ȋntâi metoda Jacobi şi apoi varianta modificată a metodei
cunoscută ca metoda iterativă Gauss-Seidel.

3.4.1 Metoda Jacobi

Fie sistemul liniar de n ecuaţii şi n necunoscute

 a11x1  a12 x2  ..... a1n xn  b1


a x  a x  ..... a x  b
 21 1 22 2 2n n 2
 . (3.36)
 .

an1x1  an 2 x2  ..... ann xn  bn

172
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Algoritmul 3.4 Metoda Jacobi

Dacă elementele de pe diagonală sunt diferite de zero, aii  0 , rezolvând ecuaţia i


vom putea determina fiecare necunoscută x i (i = 1,2,..,n):

n
b1   a1 j x j
j 1
b  a12 x 2  a13x 3   a1n x n j 1
x1  1 
a11 a11

n
b2   a 2 j x j
j 1
b  a 21x1  a 23x 3   a 2n x n j2
x2  2 
a 22 a 22
.
.
n
bn1   an1, j x j
j 1
bn1  an1,1x1  an1, 2 x 2   an1,n2 x n2  an1,n x n j n1
x n1  
an1,n1 an1,n1

n
bn   anj x j
j 1
bn  an1x1  an 2 x 2    an,n1x n1 j n
xn  
ann ann

Astfel, fiecare necunoscută x i se determină din ecuaţiile:

n
bi   aij x j
j 1
j i
xi  , i  1,2,, n. (3.37 )
aii

173
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Pentru a determina necunoscutele x i , vom ȋncepe calcululul iterativ, pentru prima


iteraţie, cu o valoari iniţiale xi( 0) şi din ecuaţiile (3.37 ) vom calcula, pentru fiecare
necunoscută, urmatoarea estimare, x 1i .
Procedeul iterativ continuă folosind întotdeauna cele mai recente estimări pentru a
calculul următoarelor estimări.
Formulele generale ale metodei Jacobi sunt:

  
x ( 0)  x1( 0) , x2( 0) ,...,xn( 0)  arbitrar
 n
 bi   aij x (jk )
 j 1
(3.38)
 x ( k 1)  j i
, i  1, 2,, n; k  0
 i
 a ii

Dupa fiecare iteraţie se va calcula, pentru fiecare necunoscută, valoarea absolută a


erorilor releative dintre noua valoarea (cea mai recent calculată) şi valoarea veche
(anterior calculată)

x inou  x ivechi
err i   100 . (3.39)
x inou

Procesul iterativ se opreşte dacă valoarea absolută a erorilor releative, pentru


fiecare necunoscută xi , este mai mică decât toleranţa stabilită anterior.

Programul MATLAB 3.4

Implementarea Algoritmului 3.4 Metoda Jacobi - M-fila Jacobi.m

% Script Jacobi.m
% Metoda Jacobi - solutia iterativa a sistemelor liniare Ax = b
% Intrarile care se modifica de utilizator
%
% [A] = nxn matricea coeficientilor
% [b] = nx1 matricea termenilor liberi
% x0 = 1xn vectorul valorilor initiale x0

174
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

% k_max = numarul maxim de iteratii


% err Partametrul pentru controlul convergentei err

A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];

% Valoarea initiala a vectorului necunoscutelor


x0=zeros(1,4);
% Numarul maxim al iteratiilor k_max
k_max=1000;
% Partametrul pentru controlul convergentei err
err=0.0001;
% matricea diagonala
D=diag(diag(A))
% bucla for pentru iteratii
for k=1:k_max
for i=1:4
s=0.0;
for j=1:4
if j==i continue
else s=s+A(i,j)*x0(j);
end
end
x1(i)=(b(i)-s)/A(i,i);
end
if norm(x1-x0)<err
break
else
x0=x1;
end
end
% solutia finala
x=x1
% numarul total de iteratii
n_iteration=k

Exemplul 3.7

A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];
x0=zeros(1,4);
k_max=1000;
% Parametrul pentru controlul convergentei err

175
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

err=0.0001;
>> Jacobi

D =
14 0 0 0
0 32 0 0
0 0 23 0
0 0 0 16

x =
1.2587 0.6992 1.1621 -0.1012

n_iteration =
19

3.4.2 Metoda Gauss-Seidel

O eventuală ȋmbunătăţire a metodei Jacobi se obţine dacă ȋn relaţia (3.38), toate


componentele x (k1) sunt folosite la calculul fiecăreia dintre x i( k1) .
Astfel, dacă avem calculate componentele x1(k1) ,.....,x i(k11) pentru x (k1) şi dacă ele
sunt o aproximaţie mai bună pentru actuala soluţie x1 ,....,x i1 decât sunt
componentele x1(k ) ,.....,x i(k1) atunci vom calcula x i( k1) folosind aceste ultime valori
calculate.

3.4.2.1 Algoritmul 3.5 Metoda Gauss-Seidel

Formulele generale ale metodei Jacobi se modifică şi obţinem formulele generale


ale metodei Gauss-Seidel:

 
 x ( 0)  x1( 0) , x2( 0) ,...,xn( 0)  arbitrar

 i 1 n
 (bi   aij x (jk 1)   aij x (jk ) (3.40)
 x ( k 1)  j 1 j  i 1
, i  1,2,...,n ; k  0
 i
aii

3.4.2.2 Convergența metodei Gauss-Seidel


176
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Condiția suficientă pentru convergenţa metodei Gauss-Seidel este ca matricea


coeficienţilor [A] să fie o matrice diagonal dominantă, adică

n
aii   aij , i  1,2,..n (3.41)
j 1
j i

Dacă matricea [A] nu este matrice diagonal dominantă metoda poate sau nu poate
fi convergentă.

3.4.2.3 Programul MATLAB 3.5

Implementarea Algoritmului 3.4 Metoda Gauss-Seidel

M-fila Gauss_Seidel.m

% Script Gauss_Seidel
% Metoda Gauss-Seidel pentru sisteme liniare %

% Intrarile care se modifica de utilizator


% n = numarul ecuatiilor
% [A] = nxn matricea coeficientilor
% [b] = nx1 matricea termenilor liberi
% [X] = nx1 vectorul valorilor initiale x0
% maxit = numarul maxim de iteratii

disp(sprintf(' Datele de intrare '))


disp(sprintf('n = numarul ecuatiilor'))
disp(sprintf('[A] = nxn matricea coeficientilor'))
disp(sprintf('[b] = nx1 matricea termenilor liberi'))
disp(sprintf('[Xold] = nx1 vectorul valorilor initiale'))
disp(sprintf('maxit = numarul maxim de iteratii'))
disp(sprintf('\nDatele de interare se dau la inceputul M-
filei\n'))

A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];
X=[0,0,0,0];
maxit=6;
n = length(b)
177
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

A
b
X
maxit

% verificam daca matricea este diagonal dominanta

for i = 1:n
j = 1:n;
j(i) = [];
D = abs(A(i,j));
Check(i) = abs(A(i,i)) - sum(D);
if Check(i) < 0
fprintf('Matricea nu este strict diagonal dominanta in
linia %2i\n\n',i)
else
fprintf('Matricea este strict diagonal dominanta in linia
%2i\n\n',i)
end
end

for m=1:maxit

disp('-----------------------------------------------')
disp(sprintf('Iteratia nr% d', m))
disp(' ')
disp(sprintf('Valorile vectorului solutie din iteratia
anterioara'))
Xanterior=X;
Xanterior

% Bucla de generare a noului vector al solutiei:

for i=1:n
suma=0;
for j=1:n
if (i<j)
suma=suma+A(i,j)*X(j);
end
if (i>j)
suma=suma+A(i,j)*X(j);
end
end
X(i)=(b(i)-suma)/A(i,i);
end

178
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

disp(sprintf('Valorile vectorului solutie din noua iteratie'))


X
end

Exemplul 3.8

A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];
X=[0,0,0,0];
maxit=6;
n = length(b)

>> Gauss_Seidel

Datele de intrare

n = numarul ecuatiilor
[A] = nxn matricea coeficientilor
[b] = nx1 matricea termenilor liberi

[Xold] = nx1 vectorul valorilor initiale

maxit = numarul maxim de iteratii

Datele de interare se dau la inceputul M-filei

n =

A =

14 2 3 5
3 32 9 6
3 1 23 2
3 6 4 16

b =

179
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

22
36
31
11

X =

0 0 0 0

maxit =

Matricea este strict diagonal dominanta in linia 1

Matricea este strict diagonal dominanta in linia 2

Matricea este strict diagonal dominanta in linia 3

Matricea este strict diagonal dominanta in linia 4

-----------------------------------------------
Iteratia nr 1

Valorile vectorului solutie din iteratia anterioara

Xanterior =

0 0 0 0

Valorile vectorului solutie din noua iteratie

X =

1.5714 0.9777 1.1003 -0.2489

-----------------------------------------------
Iteratia nr 2

Valorile vectorului solutie din iteratia anterioara

180
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Xanterior =

1.5714 0.9777 1.1003 -0.2489

Valorile vectorului solutie din noua iteratie

X =

1.2848 0.7417 1.1696 -0.1240

-----------------------------------------------
Iteratia nr 3

Valorile vectorului solutie din iteratia anterioara

Xanterior =

1.2848 0.7417 1.1696 -0.1240

Valorile vectorului solutie din noua iteratie

X =

1.2591 0.7012 1.1639 -0.1025

-----------------------------------------------
Iteratia nr 4

Valorile vectorului solutie din iteratia anterioara

Xanterior =

1.2591 0.7012 1.1639 -0.1025

Valorile vectorului solutie din noua iteratie

X =

1.2585 0.6989 1.1622 -0.1011

-----------------------------------------------

181
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Iteratia nr 5

Valorile vectorului solutie din iteratia anterioara

Xanterior =

1.2585 0.6989 1.1622 -0.1011

Valorile vectorului solutie din noua iteratie

X =

1.2586 0.6991 1.1621 -0.1012

-----------------------------------------------
Iteratia nr 6

Valorile vectorului solutie din iteratia anterioara

Xanterior =

1.2586 0.6991 1.1621 -0.1012

Valorile vectorului solutie din noua iteratie

X =

1.2587 0.6991 1.1621 -0.1012

3. 5 Acuratețea soluției numerice a sistemelor algebrice liniare

În acest paragraf vom analiza acuratețea soluției numerice a sistemelor algebrice


liniare, anume analizăm efectul pivotării și al numărului de condiționare al matricei
sistemului asupra exactității soluției sistemelor liniare.
Utilizarea calculatorelor în calculele numerice, conduce inevitabil la erorile de
rotunjire, deoarece calculatoarele memorează numerele ca șiruri finite de cifre în
virgulă mobilă. Astfel, numerele sunt rotunjite la un număr fix de cifre
semnificative fapt care afectează acuratețea calculelor numerice

182
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Pivotarea asigură metodei de eliminare Gauss o precizie mai mare în determinarea


soluției.

3.5.1 Norma și numărul de condiționare al unei matrice

Pentru a analiza erorile în problemele numerice care lucrează cu vectori și matrice,


este necesar și util să folosim noțiunea de normă.

Norma unui vector

p - norma unui vector se defineşte prin

1p
   xip 
n
x l p - norma (3.42)
p
 i 1 

x 2  x12  x22  ...... xn2 l 2 - norma sau 2-norma (3.43)

Norma unei matrice

Norma unei matrice corespunzătoare unei norme vectoriale dată este definită prin

Ax 2
A 2  max 2 - norm (3.44)
x 0 x 2

A 2 (2 -norma) este cea mai mare valoare proprie a matricei

Numărul de condiționare

Numărul de condiţionare al matricei nesingulare A se definește ca fiind produsul


normelor:

cond ( A)  A  A1 (3.45)

183
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

1
 Ax   Ax 
A A 1
  max    min
  x 0 x 
 (3.46)
x 0 x
  

Spunem că o matrice A este rău - condiționată dacă schimbări relativ mici în


mărimile de intrare (matricea A) pot cauza schimbări mari în marimile de ieșire
(soluția sistemului Ax = b).
Astfel, acuratețea soluției sistemelor algebrice liniare depinde de numărul de
condiționare.
O valoare mare a numărului de condiționare arată că matricea este aproape o
matrice singulară. Prin convenție cond (A)   dacă matricea este singulară.
Dacă considerăm schimbări relativ mici ale matricelor sistemului liniar A x  b ,
 A în A și  b în b obținem mici schimbări  x în soluția sistemului.
Acuratețea soluției la aceste mici schimbări este dată de numărul de condiționare.

3.5.2 Eroare și eroare relativă

Fie x soluția sistemului liniar A x  b , și xc soluția calculată numeric.


Definim
 eroarea în soluția sistemului e  x  xc
e x  xc
 eroarea relativă în soluția sistemului erel  
x x
În general, nu putem verifica eroarea sau eroarea relativă deoarece nu știm soluția
exactă x. O cale posibilă pentru a găsi eroarea este testăm precizia calculelor înapoi
în sistem, prin calcularea erorii reziduale

Ax  Axc b  b r
erez   
Ax b b

Pentru o matrice A dată, eroarea relativă în soluția sistemului satisface relația

1 r e r
  cond ( A) (3.47)
cond ( A) b x b

184
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

 x 
 
 x   eroarea relativa a raspunsului 
cond ( A)  max  max   (3.48)
A b   eroarea relativa a intrarii 
 
 A  b 
 

Astfel, numărul de condiționare ne ajută să găsim o limită superioară în soluția


sistemului.
Dacă numărul de condiționare este apropiat de 1 eroarea relativă erel și eroarea
reziduală erez sunt apropiate. Dacă numărul de condiționare este mare, atunci
eroarea reziduală este mult mai mare decât eroarea relativă.
Micile schimbări în datele de intrare se vor regăsi multiplicate cu numărul de
condiționare în modificările datelor de ieșire (răspuns). Rezultă că un număr mare
de condiționare afectează semnificativ soluția sistemului liniar.

Exemplul 3.9

Fie sistemul liniar. Să se studieze acuratețea soluției la schimbări relativ mici ale
matricelor de intrare.

 1 3
x 2 y  2
1 1
 x  y 1
2 3

A = [1 1/2;1/2 1/3]; b = [3/2;1];

A =
1.0000 0.5000
0.5000 0.3333

b =
1.5000
1.0000

185
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Calculăm numărul de condiționare al matricei A

>> ca=cond(A,2)

ca =
19.2815

Observăm că numărul de condiționare este relativ mare, matricea fiind apropiată de


o matrice singulară.

>> d = det(A)

d =
0.0833

Este de așteptat ca schimbări relativ mici în matricea b să afecteze acuratețea


soluției exacte

x =
0.0000
3.0000

Vom face o mică schimbare în matricea termenilor liberi b . Matricea b =


[3/2;1] este înlocuită cu matricea b = [3/2; 8/9]:

b =  b1 =
1.5000 1.5000
1.0000 0.8889

Obținem soluția:

>> x1=A\b1

x1 =
0.6667
1.6667

186
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

Pentru altă schimbare relativ mică în matricea termenilor liberi b . Matricea b =


[3/2;1] este înlocuită cu matricea b2 = [3/2; 5/6]:

b =  b2 =
1.5000 1.5000
1.0000 0.8333

x2 =
1.0000
1.0000

Observăm că aceaste schimbări relativ mici au modificat semnificativ soluția


sistemului.
Pentru a determina limitele între care este cuprinsă eroarea relativă vom folosi
relația (3.47). Facem calculele în Matlab:

Observăm că numărul de condiționare al matricei A este relativ mare, matricea


fiind apropiată de o matrice singulară.

>> linf = (norm(b-b2)/norm(b))/ca

linf =
0.0048

lsup=ca* (norm(b-b2)/norm(b))

lsup =

1.7826

Astfel, am obținut limitele pentru eroarea relativă: 0.0048  erel  1.7826 .

3.6 Probleme

P3.1 Determinați grafic, dacă este posibil soluțiile sistemelor liniare:

187
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

 x  2 x2  3  x  2 x2  3
(a)  1 (b)  1
 x1  x 2  0 2 x1  4 x 2  6

P3.2 Rezolvați următoarele sisteme folosind metoda Gauss cu pivotare (une este
cazul):

4  1 3  x1  8
   
(a) 2 5 2  x 2   3
 
1 2 4  x3  11
 

1  1 3  x1  2
   
(b) 3  3 1  x 2    1
 
1 2 0  x3  3
 

1 1 1 1  x1  3
 2 1 3 0  x 2  3
(c)      
0 2 0 3  x3  1
 
 1 0 2 1  x 4  0

P3.3 Fie sistemul liniar:

 1  1 a   x1   2 
 1 2  a   x    
  2 3
 a 1 1   x3  2
 

(a) Determinați valorile lui a pentru care sistemul nu admite soluție.


(b) Determinați valorile lui a pentru care sistemul are o infinitate de soluții.
(c) Pentru valoarea lui a la care sistemul are soluție, determinați această soluție.

P3.4 Folosiți Matlab pentru rezolvarea sistemului liniar:

188
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE

2 1  1 1  3  x1   7 
1 0 2  1 1   x2   2 
     
0  2  1 1  1  x3    5
 
3 1  4 0 5   x4   6 
   
1  1  1  1 1   x5   3 

P3.5 Rezolvați sistemul liniar:

6 1 2  x1   9 
2 2 5  x   13
   2  
1 1 6  x3   6 

(a) folosind metoda de eliminare Gauss,


(b) folosind factorizarea LU
(c) folosind metoda iterativă Jacobi (eroarea mai mică ca 0.01),
(d) folosind metoda iterativă Gauss -Seidel (eroarea mai mică ca 0.01).

P3.6 Folosiți Matlab pentru determinați eforturile din barele structurii de barea
articulate

189
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

4
SISTEME DE ECUATII ALGEBRICE
NELINIARE. METODE NUMERICE

În acest capitol studiem următoarele metode numerice pentru detrminarea soluțiilor


sistemelor algebrice neliniare:

 metoda grafică
 metoda Newton-Raphson
 funcția Matlab fsolve

4. 1 Forma generală a sistemelor neliniare

Forma generală a unui sistem de n- ecuatii algebrice neliniare este

 f1 ( x1, x2 ,.....,xn )  0
 f ( x , x ,.....,x )  0
 2 1 2 n
 . (4. 1)
 .

 f n ( x1, x2 ,.....,xn )  0

Pentru n = 2 obținem un sistem de doua ecuaţii neliniare:

 f1 ( x1 , x2 )  0
 (4.2)
 f 2 ( x1 , x2 )  0

190
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

4.2 Soluția sistemelor neliniare. Metoda grafică

Cele două ecuații din (4.2) reprezintă nişte suprafeţe. Soluţiile sistemului se vor
găsi la intersecţia linilor conturului celor doua suprafeţe, Figura 4.1.

Fig. 4.1

Pentru a desena conturul trebuie să gasim valorile punctelor de intersecţie x1 şi x2 .


Vom folosi funcțiile Matlab meshgrid și contour.

Exemplul 4.1

Să se determine soluțiile sistemului neliniar

 f1 ( x1 , x2 )  x12  x22  2  0
 (4.3)
 f 2 ( x1 , x2 )  0.25 x1  0.75 x2  1  0
2 2

Codul Matlab pentru rezolvarea grafică este în M-fila scrtipt:

ex_4_1_grafic.m

% Solutia grafica
%
clear
clc

191
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

format compact
% informatii pentru axe si generarea matricelor cu valorile pe
contur
% axele
x1 = -2:0.1:2;
x2 = -2:0.1:2;

% matricele de valori

[X1 X2] = meshgrid(x1,x2);

f1 = X1.^2 + X2.^2 -2;

f2 = 0.25*X1.^2 + 0.75*X2.^2 - 1;

contour(x1,x2,f1,[0 0],'r')
axis square

% pentru un singur contur in MATLAB trebuie sa specificam un


vector
% cu 2 elemnte

hold on
contour(x1,x2,f2,[0 0],'k')
xlabel('\bfx_1 ','FontSize',12,'FontName','Arial', ...
'Color','b','VerticalAlignment','top')
ylabel('\bfx_2 ','FontSize',12,'FontName','Arial', ...
'Color','b')
title('\bf\itSolutia grafica a sistemului x1^2+x2^2-2=0;
0.25x1^2+0.75x2^2-1=0','Color','k')
grid
legend('f_1 = 0','f_2 = 0',1)

Exectăm M-fila și obținem graficul din Figura 4.2

>> ex_4_1_grafic

192
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

Solutia grafica a sistemului x12 +x22 -2=0; 0.25x12 +0.75x22 -1=0


2
f1 = 0
1.5 f2 = 0

0.5
x2

-0.5

-1

-1.5

-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
x1
Fig. 4.2

Punctele de intersecție ale celor două contururi sunt soluţiile sistemului (4.3):

x1 x2

1 1

-1 1

1 -1

-1 -1

4.3 Soluția sistemelor neliniare folosind funcția Matlab fsolve

Descriere : fsolve determină rădăcinile (zerourile) unui sistem de ecuaţii neliniare


193
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

Sintaxa:

a) x = fsolve(fun,x0)
b) [x, fval] = fsolve(fun,x0)
c) x = fsolve(fun,x0,options)
d) [x,fval] = fsolve(fun,x0,options)

options=optimset('Display','iter')

Funcția se poate da folosind @:


x = fsolve(@myfun,[2 3 4],optimset('Display','iter'))

unde myfun este o M-fila funcție.

Deasemenea, funcția poate fi anonymous function:


x = fsolve(@(x) sin(3*x),[1 4],optimset('Display','off'))

Exemplul 4.2

Să se detremine soluția sistemului (4.3) folosind funcția Matlab fsolve.



 f1 ( x1, x2 )  x1  x2  2  0
2 2



 f 2 ( x1, x2 )  0.25 x1  0.75 x2  1  0
2 2

Scriem o M-filă tip funcţie, pentru introducerea sistemului de ecuaţii, salvată ca:
fun_ex4_3

function f = fun_ex3_3(x)
f=[(x(1)^2+x(2)^2-2),(0.25*x(1)^2+0.75*x(2)^2-1)];

Pentru determinarea celor patru soluții apelăm funcția fsolve cu patru variante
pentru punctul inițial:

>> x = fsolve(@fun_ex3_3,[0.5 0.5],optimset('Display','off'))

194
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

x =
1.0000 1.0000

>> x = fsolve(@fun_ex3_3,[-0.5 -0.5],optimset('Display','off'))


x =
-1.0000 -1.0000

>> x = fsolve(@fun_ex3_3,[0.5 -0.5],optimset('Display','off'))


x =
1.0000 -1.0000

>> x = fsolve(@fun_ex3_3,[-0.5 0.5],optimset('Display','off'))


x =
-1.0000 1.0000

4.3 Soluția sistemelor neliniare cu metoda Newton - Raphson

În Capitolul 2, paragrafuf 2.2.3 pornind de la formula Taylor, am dedus relația


pentru calculul iterațiilor prin metoda Newton pentru ecuații de forma f ( x)  0

f ( xi ) f ( xi )
xi1  xi  sau x   (4.4)
f ( xi ) f ( xi )

Pentru un sistem neliniar de doua ecuaţii cu două variabile, de forma (4.2) se poate
proceda la fel.
Fie sistemul

 f 1 ( x1 , x 2 )  0
 (4.5)
 f 2 ( x1 , x 2 )  0

Pentru fiecare ecuaţie scriem formula Taylor de ordinul unu şi obţinem sistemul

 f1,i f1,i
 f1,i 1  f1,i  ( x1,i 1  x1,i )  ( x 2,i 1  x 2,i )
 x1 x 2
 f f
(4.6)
 f 2,i 1  f 2,i  ( x1,i 1  x1,i ) 2,i  ( x 2,i 1  x 2,i ) 2,i
 x1 x 2

195
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

La acest pas, i+1, aproximarea rădăcinilor se obţine pentru f1,i1  0 , f 2,i1  0 .


Valorile de la pasul anterior i fiind cunoscute, din (4.6) obţinem sistemul de două
ecuaţii pentru determinarea a două necunoscte x1,i 1 şi x 2,i 1 :

 f 1,i f 1,i f 1,i f 1,i


 x1,i 1  x 2,i 1   f 1,i  x1,i  x 2 ,i
 x1 x 2 x1 x 2
 (4.7)
 f 2,i x 
f 2,i
x   f  x
f 2,i
 x
f 2,i
 x1 1,i 1 x 2 2,i 1 2,i 1,i
x1
2 ,i
x 2

Soluţia sistemului, obţinută, de exemplu, folosind regula lui Cramer, este:

f 2,i f 1,i
f 1,i  f 2 ,i
x 2 x 2
x1,i 1  x1,i  (4.8a)
f 1,i f 2,i f 1,i f 2,i

x1 x 2 x 2 x1

f 1,i f 2,i
f 2i  f 1,i
x1 x1
x 2,i 1  x 2,i  (4.8b)
f 1,i f 2,i f 1,i f 2,i

x1 x 2 x 2 x1

Ecuaţiile (4.8) sunt ecuaţiile iterative ale metodei Newton-Raphson pentru un


sistem neliniar cu două ecuaţii şi două necunoscute .
Observăm că la numitor este valoarea determinantului matricei Jacobian a
sistemului

 f 1 f 1 
 x x 2 
det J   det  1   det grad ( X ) (4.9)
 f 2 f 2 
 x1 x 2 

196
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

Prin analogie cu relaţia (4.4), putem rescrie relaţiile (4.9) ȋn forma vectorială

X  grad ( X ) 1 F ( x)  invgrad ( X )  F ( x) (4.10)

unde
 f1 f1 
 f ( X )  x x2 
F(X )   1 ; grad ( X )   f 1 
f 2 
(4.11)
 f 2 ( X )  2
 x1 x2 

4.4 Algoritmul 4.1

Algoritmul metodei Newton-Raphson pentru sisteme neliniare:

Pasul 1: Alegem: X (initial), N, nMax, eps,


i = 1
Pasul 2: Calculam F(X), Grad(X)
del X = -inv(Grad(X)) * F(X)
X = X + delX
if norm(f(X)) < eps
exit - convergent
if i == nMax
restart
i = i + 1

Implementarea algoritmului s-a făcut în M- fila metoda_newton_sysn.m

% MATLAB Code metoda Newton - Raphson pentru sisteme neliniare


% sol_newton_sys_nl1.m
%-------------------------------------%
% fie sistemul
% f1 = x1*x1 + x2*x2 - 2;
% f2 = 0.25*x1*x1 +0.75*x2*x2 -1;
%-------------------------------------%
format compact
nmax = 10; eps1 = 1.0e-08;
X= [0.3 0.2];
fprintf('Solutia numerica cu metoda Newton\n')
fprintf('-------------------------------------\n')

197
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

fprintf(' x(1) x(2) f(1) f(2) dx(1) dx(2) \n');


fprintf('-------------------------------------------------\n')
for i = 1:nmax
F = fun_ex3_3(X); % calculeaza functia
if norm(F) < eps1
break
end
GradF = grad_sysnl_ex4_3(X);%calculeaza matricea Jacobian (grad)
valX = -inv(GradF)*F';
if i == nmax
fprintf('Numarul maximum de iteratii depasit\n')
break
end
disp([X F valX']);

X = X + valX';
end

Exemplul 4.3

Să se determine soluția sistemului (4.3) folosind metoda Newton.


 f1 ( x1, x2 )  x12  x22  2  0



 f 2 ( x1, x2 )  0.25 x1  0.75 x2  1  0
2 2

Pentru determinarea soluției vom apela M-fila metoda_newton_sysnl.m.


Această funcție apelează, la rîndul ei, funcțiile fun_ex3_3 și
grad_sysnl_ex4_3, în care sunt definite funcțiile și, respectiv, jacobianul :

function f=fun_ex3_3(x)
f=[(x(1)^2+x(2)^2-2),(0.25*x(1)^2+0.75*x(2)^2-1)];

function df = grad_sysnl_ex4_3(x)
% x is a vector of x's [x(1) x(2) .. .. x(n)]
% f1 = x1*x1 + x2*x2 - 2;
% f2 = 0.25*x1*x1 +0.75*x2*x2 -1;
df = [2*x(1) 2.0*x(2) ; ...
0.5*x(1) 1.5*x(2)];

Obţinem soluţia prin executarea M-filei metoda_newton_sysnl:

>> metoda_newton_sysnl

198
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE

Solutia numerica cu metoda Newton


-------------------------------------
x(1) x(2) f(1) f(2) dx(1) dx(2)
--------------------------------------------------------------
0.3000 0.2000 -1.8700 -0.9475 1.5167 2.4000
1.8167 2.6000 8.0603 4.8951 -0.6331 -1.1077
1.1836 1.4923 1.6278 1.0204 -0.1693 -0.4111
1.0142 1.0812 0.1977 0.1339 -0.0141 -0.0782
1.0001 1.0030 0.0063 0.0046 -0.0001 -0.0030
1.0000 1.0000 0.0000 0.0000 -0.0000 -0.0000

4.5 Probleme

P4.1 Să se rezolve sistemele neliniare:

 f1 ( x1 , x 2 )  x12  x 22  5  0
(1) 
 f1 ( x1 , x 2 )  x 2  e  1  0
x

 f1 ( x1 , x 2 )  x12  x1 x 2  10  0
(2) 
 f1 ( x1 , x 2 )  x 2  3x1 x 2  57  0
2

(a) folosind metoda grafică


(b) folosind metoda Newton - Raphson
(c) folosind funcția Matlab fsolve.

P4.2 Să se rezolve sistemul neliniar:

 xy  z 2  2

 xyz  x  y  4
2 2

 x
e  e  z  7
y

folosind metoda Newton - Raphson cu punctele inițiale (2, 2,-1) și (1,1,1).

199
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

5
INTERPOLAREA ŞI APROXIMAREA
FUNCŢIILOR

În acest capitol studiem problema aproximării unei funcții folosind polinoame


sau polinoame pe porțiuni.
Vom studia și vom implementa în MATLAB următoarela metode de
interpolare:
 interpolare directă;
 interpolare cu polinoame Newton;
 interpolare cu polinoame Lagrange
 interpolare cu funcții spline
 interpolare cu funcția Matlab interp1

5. 1 INTRODUCERE. Ce este interpolarea ?

Fie un set de n  1 date numerice

x 0 , y0 , x1 , y1  , ......, x n1 , yn1 , x n , yn  (5.1)

Problema de interpolare constă în determinarea (estimarea) funcţiei f (x ) care


trece prin punctele date sau altfel spus, al cărui grafic interpolează punctele de date,
adică
yi  f ( xi ), i  0,1,....,n (5.2)
Tabel 5.1
x0 x1 x2 ... xn
f (x 0 ) f (x1 ) f (x 2 ) ... f (x n )

şi care să estimeze cât mai bine valorile intermediare (valorile dintre valorile date),
Fig. 5.1.

200
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Funcţia f (x ) o numim funcţie de interpolare. Punctele xi , i  0,1, 2,.....,n


sunt nodurile de interpolare.
Ȋn cele ce urmează vom folosi frecvent reprezentarea datelor numerice
pentru interpolare sub forma tabelară

Tabel 5.1
x0 x1 x2 ... xn
f (x 0 ) f (x1 ) f (x 2 ) ... f (x n )

f(x)

f(x2)
f (x )

x1
x2
x
f(x1)

Fig.5.1

Se pune ȋntrebarea: ce tip de funcţie conduce la rezultatele cele mai bune?

5. 2. INTERPOLARE POLINOMIALĂ

Dacă funcţia de interpolare f (x) este un polinom, interpolarea este


interpolare polinomială şi constă în determinarea unui polinom de gradul n
care conţine (trece prin) cele n  1 puncte de interpolare.
Ȋn această secţiune vom analiza trei metode de interpolare polinomială:

 metoda directă;
 metoda Newton;
 metoda Lagrange

201
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

5.2.1 METODA DIRECTĂ

Teorema 5.1 Pentru n  1 puncte de date numerice x i , y`i , i  0,1,2...n


există doar un singur polinom de ordin n care trece prin toate punctele (conţine
toate punctele)

f ( x)  P( x)  a n x n  a n1 x n1  ...........  a0 , ai  R , (5.3)

Ȋn metoda directă, coeficienţii polinomului a0 , a1 ,.....an se calculează


(direct) din sistemul algebric liniar obţinut prin impunerea condiţiei ca
polinomul să treacă prin cele n  1 puncte de date numerice x i , y`i ,
i  0,1,2...n . Se obţine sistemul de n  1 ecuaţii pentru determinarea celor n  1
coeficienţi ai polinomului de interpolare

 an x 0n  an1x 0n1  ....... a 2 x 02  a1x 0  a0  y0


 n n 1
 an x1  an1x1  ....... a 2 x1  a1x1  a0  y1
2

 ........................................................ (5.4)


an x nn  an1x nn1  ....... a 2 x n2  a1x n  a0  yn

Sistemul este un sistem de tip Vandermonde cu determinantul

x0n x0n1 .... x02 x0 1


x1n x1n1 .... x12 x1 1
det(V )  x 2n x 2n1 .... x 22 x2 1 (5.5)
. . . . .
x nn x nn1 .... x n2 xn 1

Se demonstrează, prin metoda inducţiei, că valoarea determinantului este:

det(V )   (x j  x i )
1i jn1

Determinantul este diferit de zero pentru x i  x j ( i  j) . Rezultă că


sistemul (5.4) admite o soluţie unică, deci polinomul de interpolare este unic.
202
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Fie n  2 şi datele numerice din tabelul următor

x0 x1 x2
f (x 0 ) f (x1 ) f (x 2 )

Vom determina un polinom de interpolare de gradul doi

y  f x   a2 x 2  a1x  a0 (5.6)

care să treacă prin punctele xi , f (x`i ) i  0,1, 2 .


Coeficienţii polinomului sunt soluţiile sistemului:

a 2 x12  a1x1  a0  f x 0 

a 2 x 2  a1x 2  a0  f x1 
2
(5.7)

a 2 x 3  a1x 3  a0  f x 2 
2

sau ȋn forma matriceală

x 02 x 0 1 a 2   f x 0 
 2    
 x1 x1 1  a1    f x1  (5.8)
x 22
 x 2 1 a0   f x 2 

Examplu 5.1 Soluţia cu metoda direcră


Fie datele numerice din Tabelul 5.2. Aceste date s-au obţinut experimental
din masurători ale distanţei parcurse de un automobil ȋn funcţie de timp.

Tabel 5.2
t (s) d(t ) (m/s)
0 0
10 142.04
15 224.18
20 317.35
23.5 402.97

203
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Să se determine:
a) Distanţa parcursă de automobil după t  18 secunde.
b) Viteza şi acceleraţia automobilului după t  18 secunde.

Pentru determinarea distanţei parcursă de automobil după t  18 secunde,


vom folosi metoda directă de interpolare. Aproximăm distanţa ca funcţie de
timp cu un polinom de ordinul doi (interpolare pătratică).

Avem nevoie de trei puncte de interpolare, din tabelul 5.2, puncte care
ȋncadrează valoarea t  18 . Aceste puncte sunt t0  10, t1  15, si t2  20 ,
pentru care avem

t0  10, dt0   142.04


t1  15, dt1   224.18
t2  20, dt2   317.35

Sistemul pentru determinarea coeficienţilor polinomului de interpolare


(5.6) devine

d10  a2 10  a1 (10)  a0  142.04


2

d(15)  a2 15  a1 (15)  a0  224.18


2

d20  a2 20  a1 (20)  a0  317.04


2

sau ȋn formă matriceală

100 10 1 a 2  142.04 
225 15 1  a   224.18 (5.9)
   1  
400 20 1 a0  317.35

Prezentăm câteva variante de calcul al soluţiei sistemului (5.9).

Varianta 1. Determinăm soluţia sistemului cu metoda de eliminare Gauss,


folosind M-fila Gauss_Pivot.m (Capitol 3, paragraf 3.3.1.3)

>> Gauss_Pivot

204
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Matricea extinsa

Ab =
100.0000 10.0000 1.0000 142.0400
225.0000 15.0000 1.0000 224.1800
400.0000 20.0000 1.0000 317.3500

***Etapa de eliminare directa cu matricea extinsa***

Pasul 1: determinam linia pivot


valoarea cea mai mare si indexul ei
p este indexul in subvectorul i:n
ip este indexul liniei pivotului ales

schimbam liniile 1 si 3; pivot nou = 400

Dupa eliminare in coloana 1 cu pivot = 400.000000


400.0000 20.0000 1.0000 317.3500
0 3.7500 0.4375 45.6706
0 5.0000 0.7500 62.7025

schimbam liniile 2 si 3; pivot nou = 5

Dupa eliminare in coloana 2 cu pivot = 5.000000


400.0000 20.0000 1.0000 317.3500
0 5.0000 0.7500 62.7025
0 0 -0.1250 -1.3562

***Etapa de determinare a solutiei***


Determinam solutia prin metoda substitutiei inverse
incepand cu ultima ecuatie

Obţinem coeficienţii polinomului de interpolare

a 2   0.2206 
   
 a1   10.9130
a  10.8500
 0  

şi polinomul de interpolare

y  dt   0.2206 t 2  10.9130 t  10.8500 , 10  t  20 (5.10)


205
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Distanţa parcursă dupa t  18 secunde este d(18)  278.7528m

Varianta 2. Calculele ȋn Matlab folosind ȋmpărţirea la dreapta şi funcţia


polyval

>>A=[100 10 1;225 15 1;400 20 1];


>> b=[142.04;224.18;317.35];

>> p=A\b
p =
0.2206
10.9130
10.8500

>> d=polyval(p,18)
d =
278.7584

Varianta 3. Calculele ȋn Matlab folosind funcţia rref:

>> help rref


R = rref(A) produces the reduced row echelon form of A using
Gauss Jordan elimination with partial pivoting.

>> Ab=[A b] % calculeaza matricea extinsa

Ab =

100.0000 10.0000 1.0000 142.0400


225.0000 15.0000 1.0000 224.1800
400.0000 20.0000 1.0000 317.3500

>> AbR=rref(Ab)

AbR =

1.0000 0 0 0.2206
0 1.0000 0 10.9130
0 0 1.0000 10.8500

Varianta 4. Matricea Vandermonde extinsa se calculeaza cu Matlab

% vectorul x={x1 x2 x3}al punctelor de interpolarer


206
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

>> x=[ 10 15 20]'

% vectorul corespunzator y={y1 y2 y3}

>> y=[142.04 224.18 317.35]'

% calculul matricei Vandermonde extinsa

>> M=[x.^2, x, ones(size(x)),y]

M =

100.0000 10.0000 1.0000 142.0400


225.0000 15.0000 1.0000 224.1800
400.0000 20.0000 1.0000 317.3500

>> R=rref(M)

R =

1.0000 0 0 0.2206
0 1.0000 0 10.9130
0 0 1.0000 10.8500

Varianta 5. Folosim funcţia polyfit pentru calculul coeficienţilor


polinomului de interpolare şi funcţia polyval pentu a calcula valoarea
polinomului.

>> x=[ 10 15 20]';


>> y=[142.04 224.18 317.35]';

>> p=polyfit(x,y,2)

p =
0.2206 10.9130 10.8500

>> d=polyval(p,18)

d =
278.7584

207
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Observația 5.1 Determinarea coeficientilor polinomului de interpolare


prin metoda directă conduce la rezolvarea unui sistem algebric de tip
Vandermonde. Matricele de acest tip sunt rău condiţionate, astfel soluţia este
foarte sensibilă la erorile de rotunjire. Din acest motiv s-au căutat soluţii
alternative pentru determinarea coeficienţilor polinomului de interpolare.

5.2.2 INTERPOLARE CU POLINOMUL NEWTON

Vom studia ȋn această secţiunea interpolarea polinomială cu două tipuri de


polinoame:
 interpolare cu polinoame Newton
 interpolare cu polinoame Lagrange

5.2.2.1 Interpolare liniară - polinomul Newton de gradul 1

Fie un set de două date numerice

x0 x1
f x 0  f x1 

Ȋntodeauna există o linie dreaptă, adică un polinom de gradul ȋntâi, care


uneşte cele două puncte (suntem ȋn geometria euclidiană), Fig. 5.2.

(x1 , y1 )

f1 (x )
(x 0 , y0 )
x
Figura 5.2

Vom construi polinomul Newton de gradul 1.


Prin cele două puncte trece o dreaptă f x   f1 x  , a cărei ecuaţie este

208
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

f1 x1   f1 x0 
f1 x   f1 x0   ( x  x0 ) (5.11)
x1  x0
sau
f1 (x )  a 0  a1 x  x 0  (5.12)
unde
f1 x1   f1 x 0 
a0  f1 (x0 ) (a) , a1  (b) (5.13)
x1  x 0

f1  x1   f1  x0 
Panta dreptei este o diferenţă finită care aproximează
x1  x0
prima derivată.

Examplu 5.2 Soluţia cu polinomul Newton de interpolare liniară


Reluăm problema din Exemplul 5.1

t (s) d(t ) (m/s)


0 0
10 142.04
15 224.18
20 317.35
23.5 402.97

Vom calcula distanţa parcursă după t  18 secunde folosind interpolarea


liniară cu polinomul Newton de ordinul 1.
Din (5.12) şi (5.13) avem

f1 (t)  d(t)  a0  a1t  t0 


unde
a0  f1 (x0 )  d(t0 )  d(15)  224.18

f1 x1   f1 x 0  dt1   dt0  317.35  224.04


a1     18.6620
x1  x 0 t1  t0 20  15

Obţinem polinomul Newton

209
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

f1 (x )  a0  a1 x  x 0   d(t)  224.18  18.6620(t  15) .

Pentru t  18 secude obţinem distanţa parcursă de automobil

d(18)  224.18  18.6629(18  15)  280.1660

Eroarea relativă ȋn valoare absolută ea , ȋntre rezultatele obţinute cu


polinomul de ordinul doi (metoda directă) şi polinomul Newton de ordinul 1
este

278.7584  280.1660
ea   100  0.5050 % .
278.7584
Cu cât este mai mic intervalul dintre x 0 şi x1 cu atât aproximaţia este mai
bună.

5.2.2.2 Interpolare pătratică - Polinomul Newton de ordinul doi

Fie trei date numerice (x 0 , y0 ), (x1 , y1 ) şi (x 2 , y2 ) . Să se determine


polinomul Newton de ordinul doi y  f2 (x ) , care trece prin datele y0  f (x 0 ),
y1  f (x1 ) şi y2  f (x 2 ) Figura 5.3.

x0 x1 x2
f x 0  f x1  f ( x2 )

Polinomul Newton de ordinul doi este de forma

f2 x   f (x )  a0  a1x  x0   a2 x  x0 x  x1  (5.14)

Vom determina coeficienţii polinomului inpunând condiţia să interpoleze


datele numerice.
Pentru x  x 0 avem

f2 (x0 )  f (x0 )  a0  a1 (x0  x0 )  a2 (x0  x0 )(x0  x1 )  a0

210
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

a0  f (x0 ) (5.15)
y

x1 , y1 

x2 , y2 

f2 x 

x 0 , y0 
x

Fig. 5.3

Pentru x  x1 avem

f2 (x1 )  f (x1 )  a0  a1 (x1  x0 )  a2 (x1  x0 )(x1  x1 )

f (x1 )  f (x0 )  a1 (x1  x0 )

f (x1 )  f (x 0 )
a1  (5.16)
x1  x 0

Pentru x  x 2 avem

f2 (x2 )  f (x2 )  a0  a1 (x2  x0 )  a2 (x2  x0 )(x2  x1 )

f (x1 )  f (x0 )
f (x 2 )  f (x 0 )  (x 2  x0 )  a2 (x 2  x 0 )(x 2  x1 )
x1  x0

f (x 2 )  f (x1 ) f (x1 )  f (x 0 )

x 2  x1 x1  x 0
a2  (5.17)
x 2  x0

211
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Astfel, obținem polinomul de interpolare Newton de ordinul doi

f2 (x )  a0  a1 (x  x0 )  a2 (x  x0 )(x  x1 ) (5.18)

f (x 2 )  f (x1 ) f (x1 )  f (x 0 )

f (x1 )  f (x 0 ) x 2  x1 x1  x 0
 f (x 0 )  (x  x 0 )  (x  x 0 )(x  x1 )
x1  x 0 x2  x0

Coeficienţii polinomului se calculează cu relaţiile

a0  f x0  (5.19a)

f x1   f x 0 
a1  (5.19b)
x1  x 0

f x 2   f x1  f x1   f x 0 

x 2  x1 x1  x 0
a2  (5.19c).
x2  x0

Relaţiile de calcul al coeficienţilor a0 , a1, a2 sunt diferenţele finite divizate


de ordinul unu, doi şi respectiv trei

a0  f [x0 ] ; (5.20a)

a1  f [x1, x0 ] ; (5.20b)

a2  f [x 2 , x1, x0 ] (5.20c)

Diferenţele finite divizate se definesc astfel:


 diferenţa de ordinul unu este definită prin

f [x 0 ]  f (x 0 ) (5.21a)

 diferenţa finită de ordinul doi este definită prin

212
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

f (x1 )  f (x 0 )
f [x1 , x 0 ]  (5.21b)
x1  x 0

 diferenţa finită de ordinul trei este definită prin

f ( x 2 )  f ( x1 ) f ( x 1 )  f ( x 0 )

f [x 2 , x1 ]  f [x1 , x 0 ] x 2  x1 x1  x 0
f [x 2 , x1 , x 0 ]   (5.21c)
x2  x0 x2  x0

Folosind definiţiile de mai sus rescriem polinomul de interpolare Newton


de ordinul doi ȋn forma

f2 (x )  f [x 0 ]  f [x1 , x 0 ](x  x 0 )  f [x 2 , x1 , x 0 ](x  x 0 )(x  x1 ) (5.22)

Trebuie observată diferenţa dintre calculul coeficienţilor polinomului de


ordinul doi cu metoda directă (calcul direct prin rezolvarea sistemului liniar
(5.7) şi calculul secvenţial al coeficienţilor prin metoda Newton.
Pentru calculul coeficienţilor polinomului Newton de ordinul doi putem
folosi schema de calcul din Fig.5.3

a0 a1
a2
x0 f x0 
f x1 , x0 
f x2 , x1 , x0 
x1 f x1 
f x2 , x1 

x2 f x2 
Fig.5.3

Examplu 5.3 Soluţia cu polinomul Newton de ordinul doi

Reluăm problema de interpolare din Exemplul.5.1.

t (s) d(t ) (m/s)


0 0
10 142.04
213
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

15 224.18
20 317.35
23.5 402.97

Vom evalua distanţa parcursă după t  18 secunde folosind interpolarea cu


polinomul Newton de ordinul 2

d(t)  a0  a1 (t  t0 )  a2 (t  t0 )(t  t1 )

Avem nevoie de trei puncte de date, din Tabelul 2, puncte care ȋncadrează
valoarea t  18 . Aceste puncte sunt t0  10, t1  15, si t2  20 .
Pentru aceste puncte avem

t0  10, dt0   142.04


t1  15, dt1   224.18
t2  20, dt2   317.35

Calculăm coeficienţii folosind relaţiile (5.19). Rezultă:

a0  d[t0 ]  d(t0 )  142.04

d (t1 )  d (t0 ) 224.18  142.04


a1  d [t1 , t0 ]    16.4280
t1  t0 15  10

d (t 2 )  d (t1 ) d (t1 )  d (t 0 )

d [t 2 , t1 ]  d [t1 , t 0 ] t 2  t1 t1  t 0
a2  d [t 2 , t1 , t 0 ]  
t 2  t1 t2  t0
317.35  224.18 224.18  142.04

 20  15 15  10  0.2206
20  10

Obţinem polinomul de interpolare Newton de ordinul doi

d(t)  a0  a1 (t  t0 )  a2 (t  t0 )(t  t1 )
 142,04  16,4280(t  10)  0,2206(t  10)(t  15)

214
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Pentru t  18 calculăm distanţa d (18)  274,1258 m.

5.2.2.3 Polinomul cubic de interpolare Newton

Pentru patru puncte de date (x 0 , y0 ), (x1 , y1 ), (x 2 , y2 ) şi (x 3 , y3 ), coeficienţii


polinomului cubic de interpolare Newton

f3 (x )  f [x 0 ]  f [x1 , x 0 ](x  x 0 )  f [x 2 , x1 , x 0 ](x  x 0 )(x  x1 )


(5.23)
 f [x 3 , x 2 , x1 , x 0 ](x  x 0 )(x  x1 )(x  x 2 )

se calculeaza recursiv dupa schema din Fig. 5.5

a0 a1
a2
x0 f x0 
a3
f x1 , x0 
f x2 , x1 , x0 
x1 f x1 
f x2 , x1  f x3 , x2 , x1 , x0 

x2 f x2  f x3 , x2 , x1 
f x3 , x2 

x3 f x3 
Fig. 5.4

Exemplul 5.4 Studiul comparativ al rezultatelor interpolării datelor


numerice din exemplele 5.1 prin interpolare directă, iterpolare cu polinoame
Newton liniare, pătratice şi cubice.

*********************** Date de intrare ******************

vectorul x:

x =
0 10.0000 15.0000 20.0000 23.5000

vectorul y:
215
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

y =
0 142.0400 224.1800 317.3500 402.9700

Valoarea lui x la care se calculeaza valoarea y


interpolata
xd = 18

******Simulare ******

INTERPOLARE LINIARA:

Punctele x de date alese: x1 = 15, x2 = 20

Valorile y corespunzatoare: y1 = 224.18, y2 = 317.35

Coeficientii polinomului de interpolare liniara,

a0 = 224.18, a1 = 18.634

Polinomul de ordin 1: f1(x) = 224.18 + 18.634(x - 15)

Valoarea finala a functiei f(xd) pentru

xd = 18, f(18) = 280.082

INTERPOLARE PATRATICA:

Punctele x de date alese: x1 = 15, x2 = 20, x3 = 23.5

Valorile y corespunzatoare punctelor de date alese:

y1 = 224.18, y2 = 317.35, y3 = 402.97

Coeficientii polinomului patratic de interpolare:

a0 = 224.18, a1 = 18.634, a2 = 0.685748

Polinomul de ordin doi:

f2(x) = 224.18 + 18.634(x - 15) + 0.68575(x - 15)(x - 20)

Valoarea finala a functie f(xd) pentru punctul xd = 18:

f(18) = 275.968
216
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Aproximarea erorii absolute relative, abrae = 1.49093%

INTERPOLARE CUBICA:
x punctele x de date alese:

x1 = 10, x2 = 15, x3 = 20, x4 = 23.5

y valorile y corespunzatoare punctelor de date alese:

y1 = 142.04,y2 = 224.18, y3 = 317.35, y4 = 402.97

Coeficientii polinomului de interpolare de ordinul trei:


a0 =

142.04, a1 = 16.428, a2 = 0.2206, a3 = 0.0344554

Polinomul Newton de ordinul trei:

f3(x) = 142.04+16.428(x-10)+0.2206(x-10)(x-15)+0.034455(x-
10)(x-15)(x-20)

Valoarea polinomului pentru xd = 18, f(18) = 275.968

Eroarea absoluta relativa, abater = 0 %

217
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Interpolare liniara (Punctele de date folosite)


320

300
valorile y
280

260

240

220
15 15.5 16 16.5 17 17.5 18 18.5 19 19.5 20
valorile x
Interpolare liniara (Full Data Set)
400

300
valorile y

200

100

0
0 5 10 15 20
valorile x

Interpolare patratica (Punctele folosite)


450

400
valorile y

350

300

250

200
15 16 17 18 19 20 21 22 23
valorile x
Interpolare patratica (Setul complet de date)
400

300
valorile y

200

100

0
0 5 10 15 20
valorile x

218
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Interpolare cubica (Punctele folosite)


500

400
valorile y
300

200

100
10 12 14 16 18 20 22
valorile x
Interpolare cubica (Toate punctele de date)
400

300
valorile y

200

100

0
0 5 10 15 20
valorile x

Exemplul 6.1 comparatie polinoame de interpolare


350
polinom gr.2 -metoda directa
polinom Newton ordin 1
300
polinom Newton ordin 2

250

200

150

100

50

0
5 10 15 20

Fig.5.5
219
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

5.2.2.4 Forma generală a polinomului Newton


Forma generală a polinomului Newton fn (x ) pentru setul de n  1 date
numerice xi , f (x `i ) i  0,1, 2...,n

x0 x1 x2 ... xn
f (x 0 ) f (x1 ) f (x 2 ) ... f (x n )

este

f n x   a0  a1 x  x0   ...  an x  x0 x  x1 ....x  xn1  (5.27)

Calculul coeficienţilor se face cu relaţiile

a0  f (x 0 )
a  f [x , x ]
 1 1 2
a2  f [x 2 , x1, x 0 ]
 (5.25)
.
.

an  f [x n , x n 1 ,.....,x1 , x 0 ]

unde parantezele calculează diferenţele finite


 f x i   f x j 
f x i , x j    
 x i  x j 

f [x i , x j ]  f [x j , x k ]
f x i , x j , x k   (5.26)
xi  x k

f xn , xn 1,...x 2   f xn 1,...,x1 


f xn , xn 1,...,x 2 , x1  
xn  x1

220
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

5.3 Implementare ȋn MATLAB a metodei Newton

Prezentăm mai jos o variantă de implementare ȋn Matlab a interpolării cu


polinoame Newton. Ȋn aceste scripturi s-au creat coduri de program pentru
calculul difereţelor divizate şi a polinomului de interpolare. Aceste scripturi se
pot folosi pentru a genera m-filele corespunzătoare. Apoi putem rezolva
aplicaţii noi introducând datele de intrare ale aplicaţiei şi executând aceste m-
file.
Diferenţele finite divizate (5.26) se calculează folosind codul Matlab din m-fila
intpol_newton_dfin.m

function f = intpol_newton_dfin(x,f)
n = length(x);
for i = 2:n
f(i:n) = (f(i:n) - f(i-1:n-1)) ./ ...
(x(i:n) - x(1:n+1-i));
end

Polinomul Newton de interpolare se obține executând codul Matlab din m-fila


intpopl_newton_val.m
function p = intpol_newton_val(x,a,t)
n = length(x);
p = a(n) * ones(size(t));
for i = n-1:-1:1
p = p.*(t-x(i)) + a(i);
end

Exemplul 5.5 Vom interpola cu polinomul Newton de ordinul doi datele


numerice din exemplul.5.1, folosind m-filele intpol_newton_dfin.m şi
intpopl_newton_val.m.

x=[10,15,20];
f=[142.04,224.18,317.35];

>>x = [10,15,20];
>>f = [142.04,224.18,317.35];
>>a = intpol_newton_dfin(x,f)
c =
142.0400 16.4280 0.2206
% calculăm distanţa parcursă la t=18 şi graficul polinomului
>> t=8:0.05:24;

221
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

>> p=intpol_newton_val(x,a,t);
>> plot(x,f,'o',t,p,'r-')
>> d=intpol_newton_val(x,a,18)
d=
278.7584
Solutia Exemplu 6.1
400

350

300

250

200

150

100
8 10 12 14 16 18 20 22 24

Fig. 5.6

5.4 Interpolare cu polinoame Lagrange

Ȋn secţiunea 5.2 am prezentat două metode pentru interpolarea


polinomială, metoda directă şi metoda polinoamelor Newton cu diferenţe
divizate.
O altă metodă de interpolare polinomială este metoda care utilizează
polinomul lui Lagrange, interpolare lagrangeană.
Polinomul de interpolare Lagrange de ordin n , care aproximează funcţia
y  f (x ) , pentru n  1 puncte de interpolare

x0 , y0 , x1 , y1 ,......,xn1 , y n1 , xn , y n 

este de forma

n
Ln (x )   li (x ) f (x i )  l0 (x ) f (x 0 ) l1 (x ) f (x1 )  ....... ln (x ) f (x n ) (5.28)
i 0

unde li (x ) sunt polinoamele fundamentale


222
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

n x  xj ( x  x0 ) ( x  x1 )   ( x  xi 1 ) ( x  xi 1 )   ( x  xn )
li ( x)    (5.29)
j  0 xi  xj ( xi  x0 ) ( xi  x1 )    ( xi  xi 1 ) ( xi  xi 1 )   ( xi  xn )
j i

Observăm că li (x ) este un produs de n  1 termeni din care lipseşte


termenul corespunzător lui j  i .
Avem

1 pentru j  i
li (x j )   (5.30)
0 pentru j  i

Evident polinomul Lagrange (5.28) ȋndeplineşte condiţia cerută de


interpolare

Ln (xi )  f (xi ) , i  0,1,...,n (5.31)

5.4.1 Interpolare liniară


Pentru n  1 obţinem polinomul de interpolare de ordinul unu

1
L1 ( x)   li ( x) f ( xi )  l0 ( x) f ( x0 ) l1 ( x) f ( x1 )
i 0
(5.32)
x  x1 x  x0
 f ( x0 )  f ( x1 )
x0  x1 x1  x0

5.4.2 Interpolare cu polinoame Lagrange de ordinul doi

Interpolare pătratică.
Pentru n  2 obţinem polinomul de interpolare de ordinul doi

2
L2 (x )   li (x ) f (x i )  l0 (x ) f (x 0 ) l1 (x ) f (x1 )  l2 (x ) f (x 2 ) (5.33)
i 0

unde polinoamele fundamentale sunt

223
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

2 x  xj ( x  x1 ) ( x  x 2 )
l0 (x )    (5.34)
j 0 x0  x j ( x 0  x1 ) ( x 0  x 2 )
j 0

2 x  xj (x  x 0 ) (x  x 2 )
l1 (x )    (5.35)
j  0 x1  x j ( x 1  x 0 ) ( x1  x 2 )
j 0

2 x  xj ( x  x 0 ) ( x  x1 )
l2 (x )    (5.36)
j 0 x 2  x j ( x 2  x1 ) ( x 0  x 1 )
j 0

Exemplul 5.6 Interpolarea cu polinomul Lagrange de ordinul 2

Rezolvăm problema de interpolare din exemplul 5.1.

t (s) d(t ) (m/s)


0 0
10 142.04
15 224.18
20 317.35
23.5 402.97

Vom evalua distanţa parcursă după t  18 secunde folosind interpolarea cu


polinomul Lagrange de ordinul 2 (interpolare pătratică).
Pentru datele numerice din aplicaţie

t 0  10, d t 0   142.04
t1  15, dt1   224.18
t2  20, dt2   317.35

polinomul Lagrange este:

2
d (t )  L2 (t )   l i (t ) f (t i )  l 0 (t )d (t 0 ) l1 (t ) d (t1 )  l 2 (t )d (t 2 )
i 0 (5.37)
 l 0 (t ) (142.04)  l1 (t ) (224.18)  l 2 (t ) (317.35)

224
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

unde polinoamele fundamentale sunt:

2 t  tj (t  t1 ) (t  t2 )
l0 (t )    , (5.38 a)
j 0 t 0  tj (t0  t1 ) (t0  t2 )
j 0

2 t  tj (t  t0 ) (t  t2 )
l1 (t )    , (5.38 b)
j 0 t1  tj (t1  t0 ) (t1  t2 )
j 0

2 t  tj (t  t0 ) (t  t1 )
l2 (t )    (5.38 c)
j 0 t 2  tj (t2  t0 ) (t2  t1 )
j 0

Pentru t  18 obţinem: l0  0.12; l1  0.64; l2  0.48 .


şi cu polinomul Lagrange de ordinul doi, relaţia (5.37), calculăm valoarea
interpolată pentru distanţa parcursă de automobil după t  18 secunde.
Rezultă d(18)  278.758 metri.

5.4.3 Implementarea ȋn MATLAB - interpolarea cu polinoame


Lagrange

O variantă de implementare ȋn Matlab a interpolării cu polinoame


Lagrange este prezentată ȋn codul din m-fila Lagrange_interp.m

function yint = Lagrange_interp(x,y,xd)

% interpolare cu polinomul Lagrange


% intrare:
% x = vectorul variabilelor independente
% y = vectorul variabilelor dependente
% xd = valuarea la care calculam interpolarea
% iesire:
% yint = valoarea obtinuta prin interpolare
n = length(x);
if length(y)~=n, error('x si y trebuie sa aiba aceeasi
lungime'); end
sum = 0;
for i = 1:n
p = y(i);
for j = 1:n
225
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

if i ~= j
p = p*(xd-x(j))/(x(i)-x(j));
end
end
sum = sum+p;
end
yint = sum;

Exemplul 5.7
Pentru interpolarea din Exemplul 5.1 vom scrie in spaţiul de lucru Matlab
comenzile:

>> x=[10 15 20];


>> y=[142.04 224.18 317.35];
>> xd=18;

>> d=Lagrange_interp(x,y,xd)
d =
278.7584

Prezentăm ȋn continuare simularea pentru soluţia numerică şi pentru


graficele polinoamelor liniare şi pătratice, Fig. 5.7.

INTERPOLARE LINIARA:

punctele x de date: x1 = 15, x2 = 20

valorile y: y1 = 224.18, y2 = 317.35

Valorile polinoamelor fundamentale, l0 = 0.4, l1 = 0.6

Polinomul, L1(xd) = 0.4(224.18) + 0.6(317.35)

Valoarea polinomului de ordin unu , L1(18) = 280.082


--------------------------------------------------------

INTERPOLARE PATRATICA:

punctele x : x1 = 10, x2 = 15, x3 = 20

valorile y: y1 = 142.04, y2 = 224.18, y3 = 317.35

226
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Valorile polinoamelor fundamentale:

l0 = -0.12, l1 = 0.64, l2 = 0.48

Polinomul Lagrange de ordin doi:

L2(xd) = -0.12(142.04) + 0.64(224.18) + 0.48(317.35)

Valoarea finala L2(xd),pentru xd = 18, L(18) = 278.758.

Eroare absoluta relativa , er = 0.47482


Interpolare liniara (Punctele de date folosite)
320

300
valorile y)

280

260

240

220
15 15.5 16 16.5 17 17.5 18 18.5 19 19.5 20
valorile x

Interpolare liniara (Setul complet de date)

300

250
L1(x)

200

150
10 11 12 13 14 15 16 17 18 19 20
valorile x

227
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Interpolare patratica (Punctele folosite)


350

300

valorile y
250

200

150

100
10 11 12 13 14 15 16 17 18 19 20
valorile x

Interpolare patratica (Setul complet de date)


350

300
L2(x)

250

200

150
10 11 12 13 14 15 16 17 18 19 20
valorile x

Fig.5.7

Exemplu 5.8
Se dau următoarele date reprezentând valorile vitezei unui automobil
versus timp. Să se interpoleze viteza automobilului pentru timpul t=73 s,
folosind polinoame Lagrange.

t=[0 10 26 68 80 90 100](secunde);
v=[0 21 38 76 49 50 83] (m/s);
xd=73;

t = x = 0 10 26 68 80 90 100

valorile y:

v = y = 0 21 38 76 49 50 83

Valoarea lui x pentru care facem interpolarea, xd = 73

228
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Prezentăm ȋn continuare simularea pentru soluţia numerică şi pentru


graficele polinoamelor liniare şi pătratice, Fig. 6.8.

INTERPOLARE LINIARA:

Punctele x de date: x1 = 68, x2 = 80

Valorile y: y1 = 76, y2 = 49

Valorile polinoamelor fundamentale:

l0 = 0.583333, l1 = 0.416667

Polinomul, L1(xd) = 0.58333(76) + 0.41667(49)

Valoarea polinomului de ordin unu , L1(73) = 64.75

INTERPOLARE PATRATICA:

Punctele x : x1 = 68, x2 = 80, x3 = 90

Valorile y: y1 = 76, y2 = 49, y3 = 50

Valorile polinoamelor fundamentale:


l0 = 0.450758, l1 = 0.708333, l2 = -0.159091

Polinomul, L2(xd) = 0.45076(76) + 0.70833(49) -0.15909(50)

Valoarea finala L2(xd),pentru xd = 73, L2(73) = 61.0114

Eroare absoluta relativa , er = 6.12777

229
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Interpolare liniara (Punctele de date folosite)


80

70

valorile y)
60

50

40
68 70 72 74 76 78 80
valorile x

Interpolare liniara (Setul complet de date)


80

60
L1(x)

40

20

0
0 10 20 30 40 50 60 70 80 90 100
valorile x

Interpolare patratica (Punctele folosite)


80

70
valorile y

60

50

40
65 70 75 80 85 90
valorile x

Interpolare patratica (Setul complet de date)


80

60
L2(x)

40

20

0
0 10 20 30 40 50 60 70 80 90 100
valorile x

Fig. 6.8
5.4.4 Limitările interpolării polinomiale. Exemplul Runge

Exemplul 5.9 Exemplul Runge

Vom studia exemplul prezentat de Runge, exempul care arată limitele


interpolări polinomiale.

230
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Dupa cum s-a văzut ȋn pargrafele anterioare, interpolarea polinomială cere


determinarea unui polinom de ordin n pentru a interpola n+1 puncte de date
numerice. Problema trebuie abordată cu prudenţă. Când n este mare, apar
situaţii ȋn care comportarea polinoamelor de interpolare este foarte diferită.
Este bine cunoscut exemplul lui Runge pentu interpolarea funcţiei

1
y
1  25x 2

pe intervalul [-1, 1].

Consideram şase puncte de interpolare, echidistante, din intervalul [-1, 1]

1
x y
1  25x 2
–1.0 0.038461
–0.6 0.1
–0.2 0.5
0.2 0.5
0.6 0.1
1.0 0.038461

Folosind funcţia Matlab polyfit, ȋn m-fila calc_coef_runge.m,


vom compara grafic rezultatele interpolării cu polinoame, de diferite grade, cu
funcţia original.
Pentru aceasta utilizăm codul Matlab din m-fila contraex_poly_runge.m.

calc_coef_runge.m

% calc_coef_runge.m
x=[-1.0 -0.6 -0.2 0.2 0.6 1.0];
y=1./(1+25*x.^2);

cp5=polyfit(x,y,5)
cp12=polyfit(x,y,12)
cp19=polyfit(x,y,19)

231
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

contraex_poly_runge.m

% graficele functiei original si polinoamelor de


% interpolare din exemplul Runge

x=-1:0.03:1;
y=1./(1+25*x.^2);
plot(x,y,'-k')

% p5=3.1378*10^-11*x.^5+1.2019*x.^4-3.3651*10^-11*x.^3+
% 1.7308*x.^2+1.0004*10^-11*x+0.5673

hold on
p5=1.2019*x.^4-1.7308*x.^2++0.5673;
plot(x,p5,'*g')

p12=92.2059*x.^12-301.4717*x.^10+384.0223*x.^8-...
240.8427*x.^6+77.6286*x.^4-12.3965*x.^2+0.9316
plot(x,p12,'--r')

p19=0.7387*x.^18-1.2502*x.^2+0.5500;
plot(x,p19,'+b')

Pentru ȋnceput vom vom determina coeficienţii polinomului de interpolare


de gradul cinci.
Din Fig. 5.9 observăm ca acest polinom nu se potriveşte bine cu funcţia
original.
Astfel, va trebui să mărim numărul datelor numerice.
Vom considera cazurile a 13 şi 20 de puncte de interpolare din intervalul
[-1, 1], pentru a obţine polinoamele de interpolare de gradul 12 şi respectiv
gradul 19.

232
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Graficele polinoamelor de interpolare din contraexemplu Runge


1
y
p5
0.8 p12
p19

0.6

0.4

0.2

-0.2

-0.4
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1

Fig. 5.9 Exemplul lui Runge

Din Fig. 5.9 observăm că mărirea numărului de puncte de interpolar, deci a


ordinului polinomului de interpolare, nu garantează o interpolare polinomială
mai bună. Acest exempul arată de ce trebuie prudenţa la utilizarea interpolării
polinomiale.
Pentru a rezolva asemenea situaţii s-au căutat alte metode de interpolare.
Ȋn secţiunea următoare prezentam una dintre aceste metode, metoda de
interpolare cu funcţii spline sau interpolarea spline.

5.5 Interpolare spline

Termenul de funcţie spline a fost introdus de matematicianul româno-


american Isaac Jacob Schoenberg, (1903 - 1990). Născut la Galaţi, Schoenberg
a studiat la Universitatea din Iaşi şi la Universităţile din Berlin si din Göttingen
(http://en.wikipedia.org/wiki/Isaac_Jacob_Schoenberg)

Termenul de funcţie spline a fost utilizat pentru a defini o funcţie formată


din polinoame pe porţiuni (subintervale) adiacente şi care se racordează ȋn
noduri ȋmpreună cu derivatele sale până la un anumit ordin.

233
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

5.5.1 Interpolarea spline liniară

Fie un set discret de n  1date numerice

x 0 , y0 , x1 , y1  , ......, x n1 , yn1 , x n , yn  (5.39)

Vom determina o funcţie continuă f (x ) care trece prin punctele date


xi , f (x `i ), i  0,1, 2...,n ,

x0 x1 x2 ... xn
f (x 0 ) f (x1 ) f (x 2 ) ... f (x n )

folosind funcţii spline liniare yi  f i (x) , Figura 5.10

(x3, y3)

(x2, y2)

(x0, y0)
x
Fig. 5.10

Funcţiile spline liniare (funcţii spline de ordinul I) sunt polinoame de


gradul unu pe subintervalele x i , x i 1 

yi  yi 1
f x   fi x   yi  x  x i  , x  x i ,x i1  (5. 40)
x i  x i 1

234
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

 f ( x1 )  f ( x0 )
 f ( x )  ( x  x0 ), x0  x  x1
x1  x0
0


 f ( x 2 )  f ( x1 )
 f ( x1 )  ( x  x1 ), x1  x  x 2
f ( x)   x 2  x1 (5.41)


 f ( x n 1 )  f ( x n )  f ( x n 1 ) ( x  x n 1 ), x n 1  x  x n
 x n  x n 1

5.5.2 Interpolare spline patratică

Funcţiile spline pătratice sau funcţiile spline de gradul II sunt date de


polinoame de gradul doi

f ( x )  a1x 2  b1x  c1 , x 0  x  x1
 a 2 x 2  b2 x  c2 , x1  x  x 2
.
. (5.42)
.
 an x 2  bn x  cn , x n1  x  x n

Pentu a determina funcţia trebuie să calculăm cei 3n coeficienţi


ai , i  1,2,.....,n , bi , i  1,2,.....,n şi ci , i  1,2,.....,n . Avem nevoie de
3n ecuaţii. Aceste ecuaţii se obţin astfel:
10. Fiecare polinom de ordinul doi trece prin două puncte consecutive.
Obţinem astfel 2n ecuaţii

a1x 0 2  b1x 0  c1  f ( x 0 )
a1x12  b1x1  c1  f ( x1 )
.
.
ai x i 12  bi x i 1  ci  f ( x i 1 )
ai x i 2  bi x i  ci  f ( x i )

235
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

.
.
an x n12  bn x n1  cn  f ( x n1 )
an x n 2  bn x n  cn  f ( x n )

20. Derivatele de ordinul ȋntâi ale celor două polinoame consecutive sunt
continue ȋn punctele interioare şi valorile lor sunt egale (funcţia spline este
netedă). Astfe, pentru primul punct interior obţinem o ecuaţie egalând cele două
derivate calculate ȋn x  x1

2a1x1  b1  2a2 x1  b2 sau 2a1x1  b1  2a2 x1  b2  0 .

Procedând la fel pentru toate cele n-1 puncte interioare vom obţine n-1
ecuaţii

2a1x1  b1  2a2 x1  b2  0
2a 2 x 2  b2  2a3 x 2  b3  0
.
.
2ai x i  bi  2ai1x i  bi1  0 (5.43)
.
.
2an1x n1  bn1  2an x n1  bn  0

Am obţinut până acum 2n  n  1  3n  1 ecuaţii. Mai avem nevoie


de ȋncă o ecuaţie. Putem alege prima funcţie spline liniară, astfel avem a1  0 şi
putem considera că aceasta este a -3 n -a ecuaţie.
Sistemul liniar de 3n ecuaţii cu 3n necunoscute se poate rezolva prin una
din metodele studiate ȋn Capitolul 3.

5.5.3 Interpolarea spline cubică

Interpolarea cubică se realizează cu polinoame de gradul trei. Pentru cele


n+1 puncte de date numerice avem n polinoame de gradul trei, deci vom avea
4n coeficienţi necunoscuţi. Aceştia se determină impunând condiţii de racordare

236
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

ȋn punctele interioare atât pentru funcţiile spline cât şi pentru derivalele lor de
ordinul unu şi doi.
Nu mai prezentăm aici aceste calcule. Pentru interpolarea spline cubică se poate
folosi funcţia Matlab spline( >> help spline).
Sintaxa:

>> pp = spline(x,y)

Vom reveni cu exemple ȋn secţiunea următoare.

5.5.3 Implementarea Matlab pentru interpolarea spline

Metodele de interploarea spline liniară, pătratică și cubică sunt programate în


Matlab în M-fila metode_interp_spline.m.
Pentru interpolarea spline liniară și pătratică sau calculat funcțiile folosind
metodele descrise în secțiunile 5.5.1 și 5.5.2, relațiile (5.41) respectiv (5.42).
Pentru interpolarea spline cubică am folosit funcția Matlab spline.

% M-file metode de interp_spline.m

%
clc
clf
clear all

% INPUTS:
% x-data
% y-data
% valoarea lui xd
% x=[ 0 20 40 56 68 80 84 96 104 110];
% y=[ 0 20 20 38 80 80 100 100 125 125];
% xd=60;

disp(sprintf('\n*****Simulare*****'))

% SOLUTIA
% sortarea crescatoare a datelor dupa datele x
xy=cat(1,x,y);
xy=xy';
xy=sortrows(xy,1);
for i = 1:numel(x)
x(i)=xy(i,1);
y(i)=xy(i,2);
end

% Datele de intrare
disp(sprintf('\n\n***Datele de intrare****'))
fprintf('\n');
disp(' valorile x:')
237
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

x
disp('valorile y:')
y
disp(sprintf('Valoarea x la care calculam y, xd = %g',xd))

%%%%%%%% INTERPOLAREA SPLINE LINIARA %%%%%%%%%

disp(sprintf('\nINTERPOLAREA SPLINE LINIARA:'))

% Crearea unei variabile simbolice 'z'.

z=sym('z');

% Scrie ecatiile functiilor spline

disp(sprintf('Ecuatiile functiilor spline liniare:'));

for i = 1:numel(x)-1
m = (y(i+1)-y(i))/(x(i+1)-x(i));
f = m*(z-x(i))+y(i);
M = (-m*x(i) + y(i));

% Scrierea ecuatiilor in spatiul command window

str1 = ['f(x)_',num2str(i),' = ',num2str(m),'x'];


if M > 0
str2 = [' + ',num2str(M)];
else
str2 = [' ',num2str(M)];
end

finalstr = [str1,str2];
disp(finalstr);
end

axis off
figure(1)
for i = 1:length(x)-1
m = (y(i+1)-y(i))/(x(i+1)-x(i));
z=sym('z');
f = m.*(z-x(i))+y(i);

if xd < x(i+1) & xd >= x(i)


fxld=subs(f,z,xd);
end

X = x(i):0.1:x(i+1);
Y = subs(f,z,X);

plot(X,Y);
hold on
Y = 0;
X = 0;
end

hold on
plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xd,fxld,'kx','Linewidth',2,'MarkerSize',12')

238
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

title('\bfInterpolarea spline liniara','FontSize',14)


xlabel('\bfx data');
ylabel('\bff(x)');
grid
% Afiseaza f(x) la xd (in figura)
text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),') =
',num2str(fxld)])
xlim([min(x) max(x)])
ylim([min(y) max(y)])
hold off

%%%%%%%%% INTERPOLAREA SPLINE PATRATICA %%%%%%%%%

disp('---------------------------------------')
disp(sprintf('\nINTERPOLAREA SPLINE PATRATICA:'));

% Generarea matricei necesara la calculul coeficientilor polinoamelor

n=numel(x);
A=zeros(3*(n-1));
for i=1:n-1
for j=0:1
for k=0:2
A(2*i-1+j+1,3*i-3+k+1)=x(i+j)^k;
end
end
end

for i=1:n-2
for j=0:1
for k=0:1
A(2*(n-1)+i+1,3*i-2+k+j*3+1)=((-1)^j)*(2*x(i+1))^k;
end
end
end

A(1,3)=1;
% Genereaza matricea Y
Y=zeros(3*(n-1),1);
for i=0:n-2
for j=0:1
Y(2*(i+1)+j)=y(i+j+1);
end
end

% Calculam matricea coeficientilor C


C=inv(A)*Y;

% Scriem ecuatiile splinurilor


disp(sprintf('\nEcuatiile functiilor spline patratice:'));

for i = 0:n-2
f=C(3*i+1)+C(3*i+2)*z+C(3*i+3)*z^2;
str1 = ['f(x)_',num2str(i+1),' = ',num2str(C(3*i+1))];

if C(3*i+2) > 0
str2 = [' + ',num2str(C(3*i+2)),'x'];
else
str2 = [' ',num2str(C(3*i+2)),'x'];

239
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

end
if C(3*i+3) > 0
str3 = [' + ',num2str(C(3*i+3)),'x^2'];
else
str3 = [' ',num2str(C(3*i+3)),'x^2'];
end
finalstr = [str1,str2,str3];
disp(finalstr);
end
% graficele
figure(2)
title('\bfInterpolarea spline patratica','FontSize',14)
xlabel('\bfx data');
ylabel('\bff(x)');
grid
for i=0:n-2
f=C(3*i+1)+C(3*i+2).*z+C(3*i+3).*z.^2;
if xd < x(i+2) & xd >= x(i+1)
fxqd=subs(f,z,xd);
end
X = x(i+1):0.1:x(i+2);
Y = subs(f,z,X);
plot(X,Y)
X = 0;
Y = 0;
hold on
end

plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xd,fxqd,'kx','Linewidth',2,'MarkerSize',12')
% Scrie f(x) pentru xd
text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),') =
',num2str(fxqd)])
title('\bfInterpolarea spline patratica','FontSize',14);
xlabel('\bfx data')
ylabel('\bff(x)')
xlim([min(x) max(x)])
grid
hold off

%%%%%%%%% INTERPOLAREA SPLINE CUBICA %%%%%%%%%

disp('-------------------------------------');
disp(sprintf('\nINTERPOLAREA SPLINE CUBICA:'))
disp(sprintf('\nVom folosi functia Matlab "spline"'))
ymax=max(y);
ymin=min(y);
xx=min(x):(max(x)-min(x))/1000:max(x);
yy=spline(x,y,xx);
axis on
figure(3)
hold on
plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xx,yy,'b')
fxcd=spline(xx,yy,xd);
% Afiseaza f(x) la xd (in figura)
text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),') =
',num2str(fxcd)])

plot(xd,fxcd,'kx','Linewidth',2,'MarkerSize',12')

240
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

title('\bfInterpolarea spline cubica','FontSize',14)


xlabel('\bfx data')
ylabel('\bff(x)')
xlim([min(x) max(x)])
tot=(max(yy)-min(yy))*0.05;
ylim([min(yy)-tot max(yy)+tot])
hold off
disp(sprintf('\n **********Rezultate:********'))
disp(' Functii spline Functii spline Functii spline ')
disp('xd liniare patratice cubice')
disp('---------------------------------------------------------');
disp(sprintf('%g %g %g %g',xd,fxld,fxqd,fxcd))

Exemplul 5.10

Să se interpoleze cu metodele de interpolare spline datele numerice: viteza


automobiluilui versus timp.
Vom apela M-fila metode_interp_spline.m, în care am introdus datele
de intrare, vectorii x, y și valoarea pentru care facem interpolarea xd.

x=[ 0 20 40 56 68 80 84 96 104 110];


y=[ 0 20 20 38 80 80 100 100 125 125];
xd=60;

>> metode_interp_spline

Obţinem polinoamele de interpolare liniare şi patratice . Valoarea vitezei


autovehiculului pentru xd= 60 secunde se determină prin cele trei tipuri de
funcţii spline. Valorile sunt trecute ȋn graficele pentru funcţiile de interpolare,
Figurile 5.11-5.13.

*****Simulare*****

***Datele de intrare****

valorile x:

x =
0 20 40 56 68 80 84 96 104 110

valorile y:

y =
0 20 20 38 80 80 100 100 125 125

Valoarea x la care calculam y, xd = 60

241
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

INTERPOLAREA SPLINE LINIARA:

Ecuatiile functiilor spline liniare:

f(x)_1 = 1x 0
f(x)_2 = 0x + 20
f(x)_3 = 1.125x -25
f(x)_4 = 3.5x -158
f(x)_5 = 0x + 80
f(x)_6 = 5x -320
f(x)_7 = 0x + 100
f(x)_8 = 3.125x -200
f(x)_9 = 0x + 125
---------------------------------------

INTERPOLAREA SPLINE PATRATICA:

Ecuatiile functiilor spline patratice:

f(x)_1 = 0 + 1x 0x^2
f(x)_2 = -20 + 3x -0.05x^2
f(x)_3 = 272.5 -11.625x + 0.13281x^2
f(x)_4 = -78.6667 + 0.91667x + 0.020833x^2
f(x)_5 = -1620 + 46.25x -0.3125x^2
f(x)_6 = 14380 -353.75x + 2.1875x^2
f(x)_7 = -9140 + 206.25x -1.1458x^2
f(x)_8 = 20860 -418.75x + 2.1094x^2
f(x)_9 = -38008.3333 + 713.3333x -3.3333x^2
--------------------------------------------

INTERPOLAREA SPLINE CUBICA:

Vom folosi functia Matlab "spline"

********** Rezultate: ********

Functii spline Functii spline Functii spline


xd liniare patratice cubice
----------------------------------------------------------
60 52 51.3333 54.5338

242
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Interpolare spline liniara


120

100 f(60) = 52

80
f(x)

60

40

20

0
0 10 20 30 40 50 60 70 80 90 100 110
x data

Fig. 5.11

Interpolarea spline patratica


160

140

120

100 f(60) = 51.3333


f(x)

80

60

40

20

0
0 10 20 30 40 50 60 70 80 90 100 110
x data

Fig. 5.12

243
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Interpolarea spline cubica

120

100 f(60) = 54.5338

80
f(x)

60

40

20

0 10 20 30 40 50 60 70 80 90 100 110
x data

Fig. 5.13

5.6 Interpolare cu funcţia Matlab interp1

Funcția interp1 (>> help interp1)interpolează date numerice folosind


funcţii 1-D (o singură variabilă).

Syntaxa:

yi = interp1(x,Y,xi)
yi = interp1(Y,xi)
yi = interp1(x,Y,xi,method)
yi = interp1(x,Y,xi,method,'extrap')

Descriere:

yi = interp1(x,Y,xi)

interpolează datele (x,Y) pentru a determina valorile yi ale fyncţiei Y ȋn


punctele xi, yi=Y(xi)
 x trebuie să fie vector

244
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

 Y poate să fie vector (trebuie să aibă aceeaşi dimensiune cu x,


dim(x)=dim(Y))
 Y poate fi un tabel de forma [n,d1,d2,...,dk], unde n este lungimea lui x .
Interpolarea, determinarea valorilor funcţiei, se face pentru fiecare d1,
d2..dk.
 xi poate fi un scalar, un vector sau un tabel multidimensional
 yi va avea aceeaşi dimensiune cu xi

Dimensiunile lui xi şi yi sunt relationate astfel:

 dacă xi este scalar sau vector, size(yi) este [length(xi), d1, d2, ..., dk].
 dacă xi este un tabel de mărimea size [m1,m2,...,mj], yi va avea mărimea
size [m1,m2,...,mj,d1,d2,...,dk].

Descriere:

yi = interp1(x,Y,xi,method)

Interpolare folosind următoarele metode :

 'nearest' - interpolare folosind valoarea invecinată (care este cea mai


aproape)
 'linear' - interpolare liniară (default)
 'spline'- interpolare spline cubică
 'pchip'- interpolare cu polinoame Hermite
.
Descriere:

yi = interp1(x,Y,xi,method,'extrap')

Comandă folosită pentru extrapolare, calcululează yi=Y(xi) ȋn puncte xi din


afara valorilor date ȋn vectorul x

Comanda interpl interpolează ȋntre punctele date. Cu ea determinăm valorile


funcţiei de interpolare ȋn puncte intermediare, figura 5.14.

245
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Fig. 5.14

Exemplul 5.11

x_data = [0 75];
Y_data = [28 189];

xi = 48;
yi = interp1(x_data,Y_data,xi)

yi =

131.0400

Exemplul 5.12

Interpolarea datelor pentru deformațiile unui arc elastic versus forțe.


% Se dau datele care leaga alungirile unui arc de fortele
care-l intind

x_forte = [0 6 11 17.5 23 31]; % fortele


Y_alung = [0 1 2 3 4 5]; % alungirile
plot(x_forte,Y_alung,'r o'); % grafic date numerice

% interpolare cu funcția interp1

xi = 20;
yi = interp1(x_forte,Y_alung,xi,'linear')

% extrapolare

x1i = 50;
y1i = interp1(x_forte,Y_alung,x1i,'linear','extrap')

246
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

% determinam valoarea interpolata cu polyfit pentru compararea


% rezultatelor

p = polyfit(x_forte,Y_alung,1);
y2i = polyval(p,xi)

% graficul punctelor obtinute (solutiile)

hold on
plot(xi,yi,'bo'); % solutia interpolare liniara
plot(xi,y2i,'g*'); % solutia cu polyfit
plot(x1i,y1i,'ko'); % valoarea extrapolata

% graficul celei mai bune aproximatii

xx1 = [0 60];
yy1 = polyval(p,xx1);
hold on;
plot(xx1,yy1,'b-');

% linia de extrapolare

xx1 = x_forte(end-1);
xx2 = 60;
yy1 = Y_alung(end-1);
yy2 = interp1(x_forte,Y_alung,60,'linear','extrap')
plot([xx1 xx2],[yy1 yy2],'k--');

xlabel('Forte');
ylabel('Alungirile');
legend('punctele de interpolare','val interpolata','valoarea
interp best','valoarea extrapolata','linia best fit','linia
extrapolare')

Rezultatele interpolării sunt date în fereastra grafică, figura 5.15.

Exemplu 5.13 Exemplu test drive cu interp1

Facem următorul test cu un automobil: la intervale de timp specificate


accelerăm şi apoi menţinem viteza constanta (!! nu decelerăm, nu ȋncetinim pe
timpul testului).
Masurătorile efectuate sunt date ȋn tabelul de mai jos:

t 0 20 40 56 68 80 84 96 104 110
v 0 20 20 38 80 80 100 100 125 125

247
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Alungire arc elastic versus forta interpolare -extrapolare


10

9
punctele de interpolare
val interpolata
8 valoarea interp best
valoarea extrapolata
linia best fit
7
linia extrapolare

6
Alungirile

0
0 10 20 30 40 50 60
Forte

Fig. 5.15

Vom folosi pentru interpolare funcţia Matlab interp1 cu cele trei opţiuni
pentru 'method'. Programul Matlab este salvat in fila test_drive_interp1.m

test_drive_interp1.m

% exemplu interpolare test drive

t=[ 0 20 40 56 68 80 84 96 104 110];


v=[ 0 20 20 38 80 80 100 100 125 125];

% interpolare liniara

tt=linspace(0,110);
v1=interp1(t,v,tt,'linear');
figure(1);
plot(t,v,'o',tt,v1)
title('interpolare liniara')

% interpolare spline

vs=interp1(t,v,tt,'spline');
248
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

figure(2);
plot(t,v,'o',tt,vs)
title('interpolare spline')

% interpolare cu polinoame Hermite

vh=interp1(t,v,tt,'pchip');
figure(3);
plot(t,v,'o',tt,vh)
title('interpolare polinoame cubice Hermite')

>> v1(60) = 71.4444;


>> vs(60) = 75.7560 ;
>> vh(60) = 76.1737

Rezultatele grafice:

interpolare liniara
140

120

100

80

60

40

20

0
0 20 40 60 80 100 120

249
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

interpolare spline
140

120

100

80

60

40

20

0
0 20 40 60 80 100 120

interpolare polinoame cubice Hermite


140

120

100

80

60

40

20

0
0 20 40 60 80 100 120

250
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

5.7 Interpolare cu funcţia Matlab polyfit

O alternativă pentru aproximarea funcției pentru un set de date numerice


discrete este obținută cu funcțiile Matlab polyfit și polyval.
Sintaxa:

coef_pol = polyfit(xdata, ydata, n)

Comanda polyfit returnează vectorul coef_pol al coeficienților


polinomului de cea mai bună aproximație (bazată pe metoda celor mai mici
pătrate). xdata și ydata sunt vectorii care conțin datele numerice iar n este
gradul polinomului care va fi determinat.
După ce s-a folosit comanda polyfit vom putea determina valorile
polinomului de cea mai bună apriximație folosind comanda polyval.

Exemplu 5.13 Exemplu test drive cu polyfit

>> test_drive_polyfit

coeff =

0.6953 -0.1996

% Exemplul 5.14 - test drive cu polyfit

t=[ 0 10 15 20 34 40 50 56 60 68 80 84 96 104 110];


v=[ 0 15 18 19 20 22 24 28 38 45 54 60 70 75 84];
coeff = polyfit(t,v,1)
v_fit = polyval(coeff,t);
plot(t,v,'r+',t,v_fit),
grid on,
xlabel('t-data')
ylabel('v-data')
title('Exemplul 5.14')
legend('Datele masurate','Lina de cea mai buna
aproximatie','Location','SouthEast')

251
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

Exemplul 5.14 - test drive cu polyfit


90

80

70

60

50
v-data

40

30

20

10

0 Datele masurate
Lina de cea mai buna aproximatie
-10
0 20 40 60 80 100 120
t-data

5.6 Rezumat al metodelor din Capitolul 5

În acest capitol am am studiat problema aproximării unei funcții folosind


polinoame sau polinoame pe porțiuni. Funcția poate fi dată printr-o ecuație sau
prin valorile ei într-un set de noduri x i , y`i , i  0,1,2...n . Problema de
interpolare constă în determinarea aproximativă a funcției care trece prin aceste
puncte. Polinomul de interpolare este polinomul de gradul cel mai mic care
satisface pentru, o funcție dată f , p( xi )  f ( xi ) , i  0,1,2...n .
Cu toate că acest polinom de interpolare este unic el poate lua forme
diferite: polinomul Lagrange, polinomul Newton sau polinomul Hermite.
Polinomul lui Lagrange este util, când n este mic, pentru deducerea
formulelor de aproximare a derivatelor și a intrgralelor.
Polinomul lui Newton produce o eroare de calcul mai mică și este foarte
util la rezolvarea ecuațiilor diferențiale.
Funcția de interpolare Matlab interp1 poate fi folosită pentru
interpolarea unui set de date discrete prin interpolare liniară, interpolare cubică
sau interpolare cubică cu funcții spline.
Funcția Matlab polyfit bazată pe aproximarea prin metoda celor mai
mici pătrate, poate fi utilizată pentru a produce o funcție de interpolare de grad
cel mult n și care trece prin cele n+1 puncte.

252
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

5.7 Probleme

P5.1 Determinați prin metoda directă un polinom P(x) de gradul 3 sau mai mic
care să treacă prin punctele (0, 0),(1, 1), (2, 2), (3, 7).

P5.2 Se datele

x 1 2 3 5 7 8
f (x) 3 6 19 99 291 444

Calculați f(4) folosind :


(a) polinomele de interpolare Newton de ordinul 1, 2 și ordin 3;(folosiți schema
din Fig. 5.3 -5.4)
(b) polinoamele Lagrange de ordin 1 și ordin 2;

P5.3 Repetați întrebările de mai sus (P5.2) pentru următoarele date numerice

x 1 2 3 5 6
f (x) 7 4 5.5 40 82

P.5.4 Accelerația gravitațională variază cu altitudinea z față de suprafața


pământului ; variația pentru 5 măsurători este dată în tabelul următor

z, (m) 0 30 60 90 120
2
g ( m / s ) 9.8100 9.7487 9.6879 9.6278 9.5682

Determinați accelerația gravitațională g la altitudinea z = 55,000 metri, folosind


funcțiile Matlab interp1 și polyfit.

P5.5 Rezultatele unui test experimental de încercarea la tracțiune monoaxială,


pentru stabilirea relației dintre tensiunile normale  și alungirile specifice 
pentru o epruvetă din aluminiu cu lungimea inițială L0= 25 mm și raza secțiunii
circulare r  6,4mm , figura P5.5, sunt date în tabelui P5.5.
De la cursul de Rezistența materialelor se cunosc relațiile:
F
 tensiunea normală  
A0
L L  L0
 alungirea specifică   
L0 L0
F L
 tensiunea normală reală (domeniul elasto-plastic)  
A0 L0
253
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR

L
 alungirea specifică reală   ln .
L0
a) Folosind datele din tabel P5.5 și formulele de calcul să se traseze, în aceeași
fereastră grafică, curbele caracteristice, tensiunea versus alungire și tensiunea
reală versus alungirea reală.
b) Determinați tensiunea normală și alungirea pentru o forță de 41.325 N.

Fig. P5.5
Tabel P5.5
Forța (N) 0 13345 26689 40479 42703 43592 44482 44927 45372 46276
Lungimea 25 25.037 25.074 25.113 25.122 25.127 25.141 25.144 25.164 25.208
(mm)

F
P5.6 Coeficientul de frecare  este determinat experimental, prin
mg
măsurarea forței necesară pentru a mișca corpul de masă m , figura P5.6.
Rezultatele măsurătorilor pentru șapte valori ale forțelor sunt date in tabelul
P5.6

Fig. P5.6

Tabel P5.6
Test nr. 1 2 3 4 5 6 7
Masa [kg] 3 5 6 9 15 25 50
Forta [N] 13.5 21.35 30 59 80 119 312

Determinați cît este coeficientrul de frecare pentru masa m = 12 kg.

254
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

6
DERIVARE ȘI INTEGRARE NUMERICĂ

În acest capitol studiem metode de aproximare numerică a derivatei si integralei


funcțiilor.

Metode de drivare numerică și calcul simbolic al derivatei:

 aproximarea derivatelor prin diferențe finite


 derivarea numerică folosind Matlab, funcția diff
 calculul simbolic al derivatei folosind Matlab

Metode de integrarea numerică și calculul simbolic al integralelor:


 metoda dreptunghiurilor
 metoda trapezelor
 metoda lui Simpson
 calculul simbolic al integralelor folosind Matlab

Aproximarea numerică este necesară deoarece primitivele multor tipuri de funcții


sunt imposibil de calculat în forma explicită. În alte situații, valorile funcțiilor pe
care dorim sa le integrăm sau derivăm sunt cunoscute doar într-un numar finit de
puncte (noduri), de exemplu ca urmare a unor măsuratori. Aceste aspecte justifică
folosirea metodelor numerice.

255
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

6.1. Aproximarea derivatelor prin diferențe finite

Fie o funcție f : [a, b]  R de clasă C 1[a, b] . O aproximație a derivatei funcției


f  într-un punct este

f ( x  h)  f ( x )
f ( x)  (6.1)
h

unde presupunem că h  0 . Aceasta este aproximația prin diferența finită


progresivă.
Pentru o funcție liniară relația (6.1) este exact derivata funcției.
Pentru alt tip de funcții relația (6.1) este o aproximație a derivatei. Pentru a estima
eroarea de aproximare se folosește dezvoltarea lui f ( x  h) în serie Taylor

h2
f ( x  h)  f ( x)  h f ( x)  f ( ) ,   ( x, x  h) (6.2)
2

Rezultă o formulă de aproximare de ordinul întâi în raport cu h

f ( x  h)  f ( x ) h
f ( x)   f ( ) ,   ( x, x  h) (6.3)
h 2

Analog, definim o aproximare cu diferența finită regresivă

f ( x )  f ( x  h)
f ( x)  (6.4)
h

a cărei eroare este tot de ordinul întâi.


O aproximație mai bună se obține cu diferența finită centrată

f ( x  h)  f ( x  h)
f ( x)  (6.5)
2h

256
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

Dacă funcția este de clasă C 3 (a, b) , atunci (6.5) reprezintă o aproximație de


ordinul 2 în raport cu h:

f ( x  h)  f ( x  h ) h 2
f ( x)   [ f (1 )  f ( 2 )] (6.6)
2h 12

unde

1  ( x, x  h) ,  2  ( x  h, x) .

Folosind teorema valorii intermediare , pentru funcția este de clasă C 3 (a, b) există
un punct   ( x  h, x  h) pentru care avem

1
f ( )  [ f (1 )  f ( 2 )]
2

Astfel, din (6.6) obținem

f ( x  h)  f ( x  h) h 2
f ( x)   f ( ) (6.7)
2h 6

Formula (6.7) este cunoscută ca formula celor trei puncte.

Procedând analog putem obține aproximații cu diferențe finite pentru derivatele de


ordin superior.

6.2 Derivarea numerică folosind Matlab

6.2.1 Funcția diff pentru valorile funcției date numeric

Descriem modul de implementare în Matlab al aproximării derivatei de ordinul 1


pentru o cazul în care cunoaștem valorile funcției în N+1 puncte.

257
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

Presupunem că x și y =f(x) sunt date numeric în N+1 puncte. Vom folosi


diferențele finite pentru calculul derivatei.
Definim vectorul u cu N compunente, vectorul diferențelor finite
u1  y 2  y1
u 2  y3  y 2
.
.
u N  y N 1  y N

Vectorul diferențelor finite se obține cu comanda Matlab

>> u = diff(y)

Folosind relațiile (6.1), (6.4) sau (6.5) aproximația pentru derivata y   f (x) se
obține în Matlab cu comanda

>> yprim = diff(y)/deltax

Pentru a putea face graficul derivatei și al funcției, vom ajusta vectorii x și y să


aibă N componete. Pentru aceasta folosim comenzile Matlab

>> x = x(1:N)
>> y = y(1:N)

Graficul se obține cu comanda

>> plot(x,yprim,x,y).

Exemplul 6.1
Să se determine numeric, derivata funcției y  cos(x) dacă se dau valorile funcției
în 15 puncte dintr-o periadă a funcției ( [0, 2 ] ).
Vom scrie și vom executa M-fila:

258
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

x = linspace(0, 2*pi, 15);


y = cos(x);
deltax = 2*pi/10;
yprim = diff(y)/deltax;
x = x(1:14);
plot(x, yprim, x, -sin(x),'o')

Obținem în fereastra grafică, figura 6.1, graficul derivatei numerice yprim și


graficul derivatei analitice a funcției cos( x)   sin( x)
Derivata numerica Exemplu 6.1 y = cos(x)
1

0.8

0.6

0.4

0.2

-0.2 yprim
-sin(x)

-0.4

-0.6

-0.8

-1
0 1 2 3 4 5 6

Fig.6.1 Derivata aproximată și derivata exactă, N=14

Observăm că derivata numerică nu este suficient de bună. Eroarea este mare


datorită numărului mic de puncte. Rafinăm aproximația dacă vom considera mai
multe puncte într-o perioadă, de exemplu 101 puncte.
Modificăm M-fila

x = linspace(0, 2*pi, 101);

259
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

y = cos(x);
deltax = 2*pi/100;
yprim = diff(y)/deltax;
x = x(1:100);
plot(x, yprim, x, -sin(x),'o')

Observăm, figura 6.2, că mărind numărul punctelor derivata numerică aproximează


foarte bine valorile reale ale derivatei funcției.

Derivata numerica Exemplu 6.1 N=100


1

0.8

0.6

0.4

0.2

-0.2 yprim
-sin(x)

-0.4

-0.6

-0.8

-1
0 1 2 3 4 5 6 7

Fig. 6.2 Derivata aproximată și derivata exactă, N=100

6.2.2 Calculul simbolic al derivatei folosind Matlab

Derivata exactă a unei funcții se poate obține folosind Symbolic Math Toolbox.
Declararea unor variabile ca variabile simbolice (vezi paragraful 1.10.1), de
exemplu variabilele a, x și y se face cu comanda
260
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

>> syms a x y

Derivata unei funcţii de o singură variabilă f(x) se obține cu comanda diff

Sintaxa: diff(f)

Exemplul 6.2

a) Derivata funcției f ( x)  cos2 x

>> syms x
>> f=cos(x^2);
>> fprim=diff(f)

fprim =

(-2)*x*sin(x^2)

b) Derivata funcției f ( x)  e x sin x

>> syms x
>> f=exp(x)*sin(x);
>> fprim = diff(f)

fprim =
exp(x)*cos(x) + exp(x)*sin(x)

6.2.3 Derivatele funcţiilor de mai multe variabile. Calcul simbolic cu Matlab

f f
f ( x, y)  şi
x y
>> syms x y
>> f
>> diff(f,x) sau diff(f,y)

% pentru calculul derivatelor de ordin superior


261
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

2 f
 >> diff(diff(f,y),x)
xy

Exemplul 6.3

>> syms x y

>> f=x^2+y^2-3*x*y-2*x-3*y-4
f =

x^2 - 3*x*y - 2*x + y^2 - 3*y - 4

>> diff(f,x)

ans =

2*x - 3*y - 2

>> diff(f,y,2)

ans = 2

6.3 Integrarea numerică

Integrarea este procesul de măsurare a ariei de sub graficul funcției. În multe


domenii din inginerie se întâlnesc aplicații ale calculului integral.

Un exemplu comun este determinarea vitezei unui corp pentru o accelerație dată
analitic sau determinarea deplasării pentru funcția viteză dată.
Fie y  f (x) o funcţie definită şi integrabilă pe intervalul [a, b] . Integrala
definită a funcției este

b
I   f x dx (6.8)
a

Folosind proprietatea de aditivitate, integrala este suma integralelor pe


subintervalele diviziunii
262
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

a=x1 x2 x3 xn b=xn+1

b n xi 1
I   f ( x)dx    f ( x)dx (6.9)
a i 1 xi

Uneori este greu sau imposibil de detrminat o primitivă pe cale analitică.


Sunt frecvente și situațiile în care avem de integrat funcții care sunt date numeric,
prin valori măsurate experimental.
De aceea, pentru calculul integralei (1), au foste dezvoltate o varietate de metode
numerice.
Termenul general folosit pentru aceste metode este de cuadratură numerică.
Formula de cuadratură generală este

b n
 f ( x)dx   ai f ( xi )  R (6.10)
a i 1

unde ai sunt constante independente de f , iar x1 , xn , .....,xn sunt nodurile


intervalului.
În secțiunile următoare vom analiza metode de integrare numerică, vom deduce
expresiile câtorva formule de cuadratură şi vom scrie M-file Matlab pentru
implementarea acestora.

6.3.1 Metoda dreptunghiurilor

Metoda dreptunghiurilor este metoda cea mai simplă de integrare numerică. Dacă
nodurile intervalului sunt egal distanțate, astfel ca xi 1  xi  x  h  const . , vom

263
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

împărți [a, b] în n  (b  a) x intervale și vom aproxima aria de sub graficul


funcției dintre a și b prin suma ariilor drepunghiurilor cu baza x și înălțimea
x  h xi 1  h
f ( i ) ,  i  i  mijloacele subintervalelor.
2 2
Obținem aproximația numerică pentru integrală cu metoda drepunghiurilor

b n
I   f x dx   f ( i )  x (6.11)
a i 1

În M-fila metdrep.m este realizată implementarea în Matlab a metodei


dreptunghiurilor.

metdrep.m

function Imd = metdrept(a, b, N, f)


h = (b-a)/N;
x = linspace(a+h/2, b-h/2, N); % mijloacele subintervalelor
fmd = feval(f, x);
Imd = h * sum(fmd); % formula (6.11)
return

Pentru introducerea funcției putem folosi metoda funcției inline sau putem scrie o
M-fila tip funcție cu expresia funcției de integrat numeric.

Exemplul 6.4

Să se calculeze numeric următoarele integrale

3  2 
x2 x 2
a)  xe dx ; b)  x sin xdx ; c)  e dx .
0 0 0

a) function y=a(x)
y=x.*exp(x.^2);

>> Imed=metdrept(0,3,15,'a')

264
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

Imed =
3.8074e+003

b) b =
Inline function:
b(x) = x.*sin(x)

>> Imed=metdrept(0,pi/2,10,b)

Imed =
0.9990

c) c =
Inline function:
c(x) = exp(-x.^2)

>> Imed=metdrept(0,pi,15,c)

Imed =
0.8862

Obseervația 6.1 Convergența metodei drepunghiurilor se îmbunătățește cu cât


pasul este mai mic. Faptul că pasul este constant face ca metoda să nu poată fi
aplicatăîn cazul integrării datelor experimentale.
Astfel, s-au dovedit necesare metode de ordin superior.

6.3.2 Metoda trapezelor

O altă metodă de aproximare a ariei de sub graficul curbei pe intervalul [a, b] este
de a construi trapeze folosind punctele adiacente. Suma ariilor trapezelor
aproximează aria de sub graficul funcției pe intervalul [a, b]

x  n 1 
I  f ( x1 )  2  f ( xi )  f ( x n ) (6.12)
2  i 1 
265
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

Metoda trapezelor are o eroare de ordinul doi în raport x  h .


Formula trapezelor este implementată în Matlab în M-fila funcția trapz, care se
apelează cu sintaxa:

>> z=trapz(x,y)
Vectorul x este vectorul care conține nodurile diviziunii, iar y este vectorul
valorilor funcției în aceste puncte.
Variabila de ieșire ne da aproximarea valorii integralei cu metoda trapezelor.

Exemplul 6.5

Să se determine prin integrare numerică valoarea integralei


a)
 /4
I e
x
cos xdx
0

>> x=0:0.1:pi/4;
>> f1=exp(x).*cos(x);
>> z=trapz(x,f1)

z =
0.9181

1 2
b) I   e  x sin x dx
0

>> x=0:0.01:1;
>> y=sin(x).*exp(-x.^2);
>> z=trapz(x,y)

z =
0.2947

266
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

6.3.3 Metoda lui Simpson

Metoda Simpson constă în înlocuirea funcției f pe fiecare subinterval cu polinomul


de interpolare de gradul doi.
Se obține formula de cuadratură a lui Simpson:
 n
1
n

x 
f ( x1 )  2  f ( x2i )  4 f ( x2i 1 )  f ( xn )
2 2
I (6.13)
3  i 1 i 1 
 

Metoda lui Simpson este convergentă de ordinul O(x) 4  O(h 4 ).


Formula lui Simpson este implementată în Matlab în M-fila funcție quad, care se
apelează cu sintaxa:

q = quad(f,a,b)

Funcția f este o funcție handle, @(x).

Exemplul 6.6

Să se determine prin integrare numerică cu metoda lui Simpson valoarea integralei

 /4
a) I  e
x
cos xdx
0

>> q=quad(@(x)exp(x).*cos(x),0,pi/4)

q =
1.0509

1 2
b) I   e  x sin x dx
0

>> q=quad(@(x)exp(-x.^2),0,1)

267
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

q =

0.7468

6.4 Calculul numeric al integralei duble

Pentru calculul unei integrale duble

 f ( x, y)dxdy pe domeniul de forma [a, b]x[c, d ]


D

în Matlab se apelează M-funcția dblquad cu sintaxa:


>> dblquad(f, a, b, c, d)

Exemplul 6.7

Să se calculeze prin integrare numerică integrala dublă:

 (2 x  3 y  xy )dxdy ;
2 2 3
D=[-2, 2]x[0, 4]
D

Funcția se poate da ca:


a) o funcție handle, @(x,y)
b) într-o M-fila funcție.

a)
>> q=dblquad(@(x,y)2*x.^2-3*y.^2-x*y.^3,-2,2,0,4)

q =
-213.3333

b) function f=integrant(x,y)
f = 2*x.^2-3*y.^2-x*y.^3

>> q=dblquad(@integrant,-2,2,0,4)

268
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

6.5 Calculul simbolic al integralelor

6.5.1 Integrala nedefinită  f ( x)dx


Pentru calculul simbolic al integralelor nedefinite în Matlab utilizăm M-funcția
int care se apelează cu sintaxa:

>> syms x
>> f
>> int(f)

Exemplul 6.8

2
a) e
x
sin x dx ; b)  e  x dx
a)

>> syms x
>> f=exp(x)*sin(x)

f =
exp(x)*sin(x)

>> int(f)

ans =
-(exp(x)*(cos(x) - sin(x)))/2 + const.

>> pretty(ans)=

exp(x) (cos(x) - sin(x))


- ------------------------ +const.
2
b)

>> syms x
>> f=exp(-x^2)

269
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

f =
1/exp(x^2)

>> int(f)

ans =
(pi^(1/2)*erf(x))/2 =

>> help erf


ERF Error function.
Y = ERF(X) is the error function for each element of X. X
must be
real. The error function is defined as:

erf(x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt.

b
6.5.2 Calcul simbolic pentru integrala definită  f ( x)dx
a
>> syms x
>> f
>> int(f,a,b)

Exemplul 6.8

 /4
a) I   e x cos xdx
0

>> syms x
>> f=exp(x)*sin(x)

f =
exp(x)*sin(x)

>> I=int(f,0,pi/4)

I =
1/2

270
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

1 2
b) I   e  x sin x dx
0
>> syms x
>> f=exp(-x^2)*sin(x)
f =
sin(x)/exp(x^2)

>> int(f,0,1)
Warning: Explicit integral could not be found.

Integrala nu sepoate calcula explicit. Trebuie să apelăm la integrare numerică, vezi


Exemplul 6.5 (b).

6.6 PROBLEME

P6.1 Calculați valorile funcției f ( x)  xe x pentru vectorul

>> x = 1.8:0.1:2.2
x=
1.8000 1.9000 2.0000 2.1000 2.200
și apoi aproximați valoarea derivatei funcției f (2.0) folosind formula celor trei
puncte (6.7). Comparați rezultatul cu valoarea exactă și determinați eroarea.

P6.2 Folosind formula (6.7) completați tabelul următor:

x f (x) f (x)
8.1 16.94410
8.3 17.56489
8.5 18.19056
8.7 18.82091

Valorile din tabel sunt obținute pentru funcția f ( x)  x ln x . Calculați erorile.

271
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

 

P6.3 Fie funcția f ( x)  sin( e x ) pentru 0  x  4 .

(a) Determinați, analitic, f (x) ;

(b) Evaluați numeric f (x) , în punctele determinate de vectorul x = 0.1:0.1:4, cu


pasul h = 0.1, folosind formula celor trei puncte (6.7);
(c) Faceți în aceeași fereastră grafică, graficul rezultatelor numerice și al soluției
analiteice;
P6.4 Aproximați numeric, folosind regula lui Simpson și metoda trapezelor,
următoarele integrale:
1 1 
dx
(a)  xe dx
x
(b)  (c)  x cos xdx
01 x
2
0 0

comparați rezultatele cu soluția analitică.

P6.5 Calculul lucrului mecanic folosind integrarea numerică

Asupra corpului din figura P6.5 acționează o forță variabilă F(x) pe o direcție ce
face unghiul variabi θ(x) cu orizontala. Prin măsurători experimentale cunoaștem
datele discrete pentru forță și unghiul θ măsurate la intervale de x =5 metri, tabelul
P6.5.

Tabel P6.5
x F(x) θ(x)
0 0.0 0.55
5 9.0 1.50
10 13.5 0.80
15 14.0 0.90
20 11.5 1.20
25 12.6 1.47
30 5 1.55

272
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ

F(x) F(x)

θ θ

x0 Fig. P6.5 x1

x1
Determinați lucrul mecanic L x0  xn   F ( x) cos ( x)dx folosind:
x0

(a) metoda dreptunghiurilor


(b) metoda trapezelor
(c) metoda lui Simpson

P6.6 Să se determine aria suprafeței de rotație obținută prin rotația curebei

y  f ( x)  1  x 2 , x [1, 1] .

Aria unei suprafețe 3-D formată prin rotația graficului unei curbe y  f (x) în jurul

b b
axei Ox, x [a, b] este A  2  ydl  2  f ( x) 1  ( f ( x)) 2 dx .
a a

În cazul de față suprafața este o sferă cu raza 1 și centrul în origine.


Determinați aria folosind:
(b) metoda trapezelor
(c) metoda lui Simpso

273
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

7
REZOLVAREA NUMERICĂ A
ECUAŢIILOR ŞI SISTEMELOR DE
ECUAŢII DIFERENŢIALE ORDINARE

În acest capitol studiem metode de aproximare a soluțiilor problemei cu valori


ințiale și la limită pentru ecuații diferențiale ordinare.
Metodel analizate sunt:

 determinarea soluţiilor analitice folosind calculul simbolic din Matlab


 metoda Euler
 metode Runge-Kutta de ordinul doi (RK2)
 metoda Heun
 metoda Ralston
 metoda Runge-Kutta de ordinul patru (RK4)
 funcţiile Matlab ode23 şi ode45

7.1 Problema cu valori iniţiale. Ecuaţii diferenţiale cu condiţii iniţiale

Problema determinării soluţiei unei ecuaţii diferenţiale cu condiţie iniţială dată


este numită problema cu condiţii iniţiale sau problema cu valori iniţiale.
Pentru o singură ecuaţie diferenţială ordinară, problema se formulează astfel:
să se determine o funcţie y (t ) care satisface ecuaţia diferenţială

dy (t )
 f (t , y (t )) , t 0  t  t f , (7.1)
dt

împreună cu condiţia iniţială

y(t 0 )  y0 . (7.2)

Pentru un sistem de n ecuaţii diferenţiale problema devine:


să se determine funcţiile y1 (t ), y2 (t ),.....,yn (t ) care verifică sistemul de n ecuaţii
274
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

 y1  f1 (t , y1 , y 2 , ..., y n )
 y   f (t , y , y , ..., y )
 2 2 1 2 n

. (7.3)
.

 y n  f n (t , y1 , y 2 , ..., y n )

împreună cu condiţiile iniţiale

 y1 (t 0 )  y10
 y (t )  y
 2 0 20

 (7.4)


 y n (t 0 )  y n 0

Sistemul (7.3) se poate scrie ca o ecuaţie vectorială (de forma (7.1))

dy
 y (t )  f (t , y ) cu condiţia iniţială y(t0 )  y0 (7.5)
dt

Dacă f nu depinde explicit de timp, adică f (t , y(t ))  f ( y(t )) atunci sistemul


(7.5) este numit sistem autonom.
În cadrul acestui capitol interesul va fi direcţionat numai înspre sisteme de
ecuatii diferenţiale de ordinul 1:
Aceasta nu reprezintă o restrângere a generalităţii deoarece ecuaţiile diferenţiale
de ordin superior pot fi reduse ȋn spaţiul stărilor la sisteme de ecuaţii
diferenţiale de ordinul 1.

7.2 Reprezentarea ecuaţiilor diferenţiale în spaţiul stărilor

Consideram ecuaţia diferenţiala liniară de ordin 2

d2y dy
a2 2  a1  a0 y  u (t ) (7.6)
dt dt

Ecuaţia se poate scrie sub forma:

275
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

d2y a0 a1 dy 1
  y   a 0  u (t ) (7.7)
d t2 a2 a2 dt a2

Introducem variabilele de stare:

 x1  y
 (7.8)
 x2  y 

Cu această schimbare de variabile obţinem, pentru ecuaţia diferenţială de


ordinul doi, reprezentarea ȋn spaţiul stărilor sub forma unui sistem de două
ecuaţii diferenţiale de ordinul unu:

 x1  y   x2

  a0 a1` 1 (7.9)
 x2  y    a y  a y   a u (t )
 2 2 2

sau

 x1  x2

  a0 a1` 1 (7.10)
 x2   a x1  a x2  a u (t )
 2 2 2

Ȋn scriere matriceală sistemul (9.10) devine:

 x1   a
0 1  x
    0 a1   1  0 
  x   1 a u (t )
 (7.11)
 x2   a2 a2   2   2 

Ȋn problemele de dinamică este folosită pentru derivata ȋn raport cu timpul


\notaţia lui Newton

dy
y   y (7.12)
dt

Consideram ecuaţia diferenţiala liniară de ordin n :

dny d n1 y d2y dy


an  a  ..........
..a  a  a0  u (t ) (7.13)
d t n1
1 2 1
d tn d t2 dt
sau
276
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

( n) (n  1)
a y a y  ....  a y  a y  a  u (t ) (7.14)
n n 1 2 1 0

Ecuaţia se poate scrie sub forma:

n1 n1 1
n a a a
d y 0 1
 y y    y  ut  (7.15)
n a a a a
dt n n n n

Introducând variabilele de stare:

 x1  y ,

 x  y ,
 2
 x  y  ,
 3
 (7.16)
.
.

 (n  1)
x
 n  y t 

ecuaţia diferenţială de ordinul n se poate rescrie sub forma următorului sistem


de n ecuaţii diferenţiale de ordinul 1:


x  x
 1 2

 x 2  x 3

. (7.17)
.

 a0 a1 a2 a n 1 1
x
 n    x1  x 2  x 3 
......... xn  u (t )
 a n a n a n a n a n

Ȋn forma matriceala sistemul (7.17) se poate scrie ca:

x(t )  Ax(t ) Bu(t ) (7.18)

unde matricele sunt


277
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

 0 1 0 0 . . . 0 
 0 0 1 0 . . . 0 
 
 0 0 0 1 . . . 0 
 
 0 0 0 0 1 . . 0 
A   . . . . . . . . , (7.19)
 
 0 0 . . . 1 0 0 
 0 0 . . . . 1 0 
 a0 a a a a a n2 a 
  1  2  3  4 .   n 1 
 an an an an an an an 

 x1  0
x  0
 2  
.  . 
   
 . 
x    ,
.
B   .  (7.20)
.  
.  . 
   . 
. 1
x   
 n  an 

7.3 Determinarea soluţiilor analitice folosind calculul simbolic din Matlab

In cursul de matematici speciale s-au analizat metode pentru determinarea pe


cale analitică a soluțiilor problemelor cu condiţii iniţiale pentru ecuaţiile
diferențiale.
In cele ce urmează, vom analiza modul de determinare a soluțiilor analitice
folosind Matlab.

In Matlab dispunem de funcţia dsolve pentru calculul simbolic al soluţiei


analitice.
Informaţii se obţin cu comanda: >>help dsolve

Sintaxa:

dsolve('eq1','eq2',...,'cond1','cond2',...,'v') (7.21)

Descriere:

278
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

rezolvarea simbolică a ecuaţiilor diferenţiale eq1, eq2,... unde v este


variabila independentă (implicit este variabila t, timpul). Aici
cond1,cond2,...sunt conditiile la limita si/sau conditiile initiale.

Condiţiile iniţiale (pentru ecuațiile de ordin doi) se dau sub forma:

x(a) = b ; Dx(a) = c; (7.22)

D - reprezinta operatorul de derivare; x este variabila dependenta iar a, b şi c


sunt constante.
Dacă nu se specifică condiţiile iniţiale, soluţia va conţine constante arbitrare
C1, C2,...
Dacă dsolve nu poate determina o soluţie explicită, ne putem aştepta la o
soluţie implicită. Când dsolve returnează o soluție implicită, aceasta emite un
avertisment. Dacă dsolve nu poate găsi nici o soluție explicită sau nici o
soluție implicită, va emite un avertisment și returnează sym gol.

7. 4 Exemple de soluţii analitice obţinute în Matlab cu funcția dsolve

Exemplul 7.1

Fie ecuaţia diferentială de ordinul unu cu coeficienţi constanţi:

y (t )  ay(t )  b ; y(0)  y0 (7.23)

Soluția generala este suma dintre soluția ecuației omogene, y0 , si o soluție


particulara, y p a ecuatiei neomogene: y  yo  y p .

Soluția ecuatiei omogene:

dy y
y  ay  0   adt  ln  at  yo  c  e at (7.24)
y c
b
O soluție particulară este y p  .
a
Obținem soluția generală:

b
y  c  e at  (7.25)
a
b
Din conditia initiala y(0)  y0 determinam constanta, c  yo  .
a
Astfel, soluţia care satisface ecuația, cu condiția iniţială, este:
279
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

b b
y  ( yo  )e at  (7.26)
a a

Soluţia analitică determinată cu Matlab, folosind dsolve:

>>sol=dsolve('Dy+a*y=b','y(0)=y0');
>>pretty(sol)

Operatorul de derivare este notat cu "D".

Rezultă soluţia analitică:


b - a y0
b - ---------
exp(a t)
b b
y = ------------ = ( yo  )e at 
a a
a

Exemplul 7.2

Oscilatorul liniar amortizat.

Oscilator liniar amortizat este schematic


reprezentat ȋn figura 7.1. Folosind ecuaţia lui
Newton se determină ecuaţia diferenţială de
mişcare:

my  cy  ky  u(t ) (7.27)

Introducând variabilele de stare

x1  y (poziţia) Fig.7.1
x2  y (viteza) (7.28)

ecuaţia (7.27) se transformă ȋn spaţiul stărilor ȋntr-un sistem diferenţial de ordin


1
 x1  x2

 k c 1 (7.29)
 x 2   m x1  m x2  m u (t )

280
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Scris ȋn formă matriceală sistemul devine

 x1   0 1  x   0 
    k c  1    u (t )
 
(7.30)
 x 2   m m  2   
x 1m

Pentru m  1, c  3, k  2 şi funcţia u(t) constantă, u(t) = 1, obţinem ecuaţia

y  3 y  2 y  1 (7.31)

La momentul iniţial alegem condițiile inițiale y(0)  0 ; y (0)  0 .

a) Soluţia analitică: calculăm răspunsul forţat ȋn condiţii iniţiale nule.

Ecuația caracteristica: r 2  3r  2  0 are radacinile r1  2, r2  1 .


Astfel, soluţia ecuației omogene este:

yo  c1e 2t  c2 e t

1
Observăm că o soluție particulară este y p  .
2
Obţinem soluţia generală

1
y  yo  y p  c1e 2t  c2 e t 
2

Determinăm constantele folosind condițiile inițiale y(0)  0 ; y (0)  0 .

1 1
y  e  2t  e  t  .
2 2

b) Soluţia analitică determinată cu Matlab:

% rezolvarea analitica a ecuatiei diferentiale (9.27)


>>sol=dsolve('D2y+3*Dy+2*y=1','y(0)=0,Dy(0)=0');
>>pretty(sol)
>>pretty(simplify(sol))

281
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Rezultă soluția analitică

1 1 1
1 1
y= ---------- - ------ + -  e 2t  e t 
2 2
2 exp(2 t) exp(t) 2

Graficul soluţiei este dat în figura 7.2

>> t=0:0.1:2;
>> y=(1/2)*exp(-2*t)-exp(-t)+1/2;
>> plot(t,y)

0.5

0.45

0.4

0.35

0.3

0.25

0.2

0.15

0.1

0.05

0
0 1 2 3 4 5 6 7

Fig.7.2

c) Soluţia analitică determinată cu Matlab folosind reprezentarea ȋn spaţiul


stărilor; calculăm răspunsul la condiţii iniţiale (sistem omogen, fără termen
liber)

Considerăm u(t) = 0 şi condiţiile iniţiale y(0)  1; y (0)  0


Din (7.30) cu datele numerice m  1, c  3, k  2 obţinem sistemul

 x1   0 1   x1 
    (7.32)
 x 2   2  3  x2 

 x (0)  1
cu condiţiile iniţiale  1 .
 x2 (0)  0
282
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

ex7_2.m

% determinarea solutiei analitice exemplul7.2

[x1,x2] = dsolve('Dx1=0*x1+1*x2','Dx2=-2*x1-3*x2',...
'x1(0)=1','x2(0)=0')
t=0:0.01:2;
sol_analitica = [subs(x1,t) subs(x2,t)];
x1_val=eval(vectorize(x1));
x2_val=eval(vectorize(x2));
plot(t,x1_val,'-',t,x2_val,'r-.')
legend('x1','x2')
title('Exemplul 7.2 Solutia analitica spatiul starilor ')
Obținem soluția:
x1 =
2/exp(t) - 1/exp(2*t)

x2 =
2/exp(2*t) - 2/exp(t)

Graficul soluţiei este în figura 7.3.

Soluia analitica Ex.9.2 reprezentarea in spatiul starilor


1
x1
x2

0.5

-0.5
0 0.5 1 1.5 2

Fig. 7.3

Exemplul 7.3

Model pentru 1/4 suspensia auto, Figura 7.3

283
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Fig. 7.4 Model simplu pentru suspensie

Modelul matematic: ecuația de mișcare este o ecuație diferentială de ordinul


doi neomogena, liniară cu coeficienți constanți

mx  c( x  y )  k ( x  y)  0

mx  cx  kx  cy  ky (7.33)


Condițiile inițiale:
x(0)  x0 ; x (0)  v0 (7.34)

Considerăm perturbaţia datorată profilului drumului (intrarea) de forma:

y  10 cos 2t  12 sin 2t (7.35)

Pentru m  1, c  5, k  6 şi condiţiile iniţiale x(0)  2 ; x (0)  0 obţinem


problema cu condiții inițiale:

x  5x  6 x  10 cos 2t  12 sin 2t (7.36)

x(0)  2 ; x (0)  0 (7.37)

Vom determina soluția analitica folosind calculul simbolic din MATLAB.


Scriem o m-fila, salvata cu numele ex7.3_suspensia.m

% ex7_3_suspensia

ode2='D2x+5*Dx+6*x=12*sin(2*t)+10*cos(2*t)'
condinit='x(0)=2,Dx(0)=0'
ode2sol=dsolve(ode2,condinit);
simplify(ode2sol)
pretty(ode2sol)
t=0:0.1:4*pi;
x_val=eval(vectorize(ode2sol));
plot(t,x_val)

284
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

>> ex7_3_suspensia

ode2 =

D2x+5*Dx+6*x=12*sin(2*t)+10*cos(2*t)

condinit =

x(0)=2,Dx(0)=0
ans =

13/(2*exp(2*t)) - (25*cos(2*t))/26 - 46/(13*exp(3*t)) +


(31*sin(2*t))/26

13 25 cos(2 t) 46 31 sin(2 t)
---------- - ----------- - ----------- + -----------
2 exp(2 t) 26 13 exp(3 t) 26

raspuns exemplul 7.2 model suspensie


2.5

1.5

0.5

-0.5

-1

-1.5

-2
0 2 4 6 8 10 12 14

7. 5 Metode de rezolvare numerică a ecuaţiilor diferenţiale ordinare

7.5.1 Rezolvarea numerică a problemei cu condiţii iniţiale

285
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

În cele ce urmează, vom analiza metode numerice pentru determinarea soluţiilor


ecuaţiilor diferenţiale cu condiţii iniţiale.
Considerăm problema determinării soluţiei unei ecuaţii diferenţiale de ordinul
unu cu condiţie iniţială:

dy (t )
 f (t , y (t )) (7.38)
dt
y(t0 )  y0 (7.39)
Sunt frecvente situatiile in care solutiile analitice sunt greu de obtinut, în special
pentru ecuatiile neliniare.
Metodele numerice constau în determinarea unor seturi de puncte (ti , yi )
Fig.7.5, care sa aproximeze punctele (ti , y(ti )) de pe graficul solutiei

yi  y(ti ) , i  0,1,2,... (7.40)

y(t)

graficul soluţiei
( ti1 , y( ti1 ))
eroarea

( ti , y( ti )) ( ti1 , yi1 )

mărime pas hi

t
ti ti 1

Fig. 7.5 Discretizarea in vederea aproximarii soluţiei ecuației diferenţiale

De la cursul de Analiză Matematică este cunoscută teorema fundamentală de


calcul:
t h
y (t  h)  y (t )   f (t , y (t ))dt (7.41)
t

286
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Trebuie să observăm că, în general, nu putem aproxima integrala din (7.41) prin
cuadratură numerică deoarece funcţia y (u ) nu este cunoscută (ea fiind chiar
soluţia pe care vrem să o determinăm). Excepţie face situaţia în care funcţia
f (t , y) este o funcţie numai de t. În această situaţie simplă soluţia se obţine prin
cuadratură:
tn 1
y n1  y n   f (t )dt (7.42)
tn

Observaţia 7.1 În cele ce urmează vom folosi pentru derivata în raport cu


timpul notaţia lui Newton ( folosită frecvent la cursul de Mecanică)

dy d2y
 y , 2  y (7.43)
dt dt

7.5.2 METODA EULER

După studierea acestui paragraf, trebuie să puteţi:

1. aplica metoda Euler pentru rezolvarea ecuaţiilor diferenţiale ordinare


2. sa determinaţi influenţa pasului asupra acurateţii soluţiei
3. să aproximaţi integralele definite cu metoda Euler.

7.5.2.1 Algoritmul metodei Euler

Metoda Euler este una dintre cele mai simple metode de determinare numerică
a soluţiei problemei cu condiţii iniţiale. Metoda utilizează un pas h constant.
Este cunoscută şi sub denumirea de metoda tangentelor.
Fie ecuatia diferentiala cu conditia initială :

y  f t , y  , yt0  y0 (7.44)

Fie pe axa Ot o diviziune echidistantă de puncte cu pasul constant h. Pe


tangenta dusă în punctul (t0, y0), la curba ce reprezintă soluția ecuației
diferențiale, figura 7.6, se poate găsi un punct (t1 , y1 )  (t0  h, y1 ) care să
aproximeze punctul de coordonate (t1 , y(t1 )) situat pe curba soluției.
Ecuația tangentei dusă în punctul ( t0 , y0 ) și care trece prin punctul (t1 , y1 ) este

287
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

y1  y 0
t 0 h t 0  y'0  y1  y 0 h y '0
 (7.45)

unde
y 0  f t 0 ,y 0 

Obținem o aproximație pentru valoarea adevarată y( t1 ) ȋn punctul t1


y( t1 )  y1  y0  h f t0 , y0  (7.46)

Continuăm procedeul pentru un nou punct t2  t1  h . Vom folosi valoarea y1


pentru a calcula y2 (aproximarea soluţiei ȋn t2 )

y2  y1  h f t1 , y1 

Se construește astfel un proces iterativ pentru metoda Euler:

yi1  yi  h f ti , yi ,
cu (7.47)
y0  yt0  , ti1  ti  h .

y(t)

graficul soluţiei
eroarea ( t1 , y( t1 )
(valoarea exactă)

( t0 , y0 ) ( t1 , y1 )
(valoarea aproximată)

tangenta
mărime pas h

t
t0 t1
Fig.7.6

Algoritmul 7.1 Algoritmul Metoda Euler

Procesul iterativ al metodei Euler, ecuațiile (7.47), se transpune simplu în


Matlab prin codul următor.
288
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

t=t0:tfinal;
y=y0;
while t<=h*tfinal
y=y+h*f(t,y)
t=t+h
end

Algoritmul 7.1 este implementat în M-fila funcție

ecdif_metoda_Euler.m

% metoda Euler pentru ecuatia diferentiale ydot(t) = f(t,y(t))

function [t,y] = ecdif_metoda_Euler(f,tinter,y0,N)


% metoda Euler pentru ecuatia diferentiale
% ydot(t) = f(t,y(t)),
% cu conditia initiala: y0 pentru intervalul tinter = [t0,tf]
% si N pasi de timp

% input (intrare):

% f: functia f (se pote da folosind comanda "inline")


% tinter: intervalul de timp
% y0: conditia initiala
% N: numarul de iteratii

if nargin<4 | N <= 0, N = 100; end


if nargin<3, y0 = 0; end
h = (tinter(2) - tinter(1))/N; % marimea pasului
t = tinter(1)+[0:N]'*h; % vectorul pentru timp
y(1,:) = y0(:)'; %scriem cond.initiala ca un vector linie
for i = 1:N
y(i + 1,:) = y(i,:) +h*feval(f,t(i),y(i,:)); % ec.(9.33)
end

Observația 7.2 Pentru cazul în care funcția f este constantă se obține soluția
exactă (eroarea este zero). Daca nu, de exemplu dacă funcția este liniară,
obținem o aproximare a soluției, eroarea fiind proporțională cu pasul h.
Eroarea metodei este cu atat mai redusă cu cat valoarea pasului h este mai mic.
Metoda Euler nu permite o estimare apriorii a erorii.

Exemplul 7.4

289
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Considerăm un model simplu pentru a descrie dinamica unui autovehicul. Ȋn


model simplificat, prezentat ȋn figura 7.7, forţa f reprezintă forţa generată de
motor prin interfaţa drum / pneuri iar fr este forţa rezistivă, datorată rezistenţei
aerului şi condiţiilor de rulare. Am presupus că această forţă variază liniar cu
viteza fr=cv. Ea se opune mişcării, deci acţionează ȋn direcţia opusă forţei de
tracţiune f. Ȋn acest model simplificat am neglijat dinamica sistemului de
tracţiune, dinamica pneurilor etc.

f fr=cv

v
Fig.7.7

Cu aceste ipoteze simplificatoare, vom deduce ecuaţia de mişcare aplicând legea


a-doua-a lui Newton ma  F . Obţinem ecuaţia de mişcare ca pe o ecuaţie
diferenţială de ordinul unu pentru viteză, pe directia vitezei:

dvt 
m  f  fr  mv  cv  f , v0  v0 (7.48)
dt

Ecuaţia (7.48) se poate aduce la forma ecuației (7.23) din Exemplul 9.1

y (t )  ay(t )  b y(0)  y0 (7.49)


c f
unde a  ;b .
m m

Vom considera următoarele date numerice: a  b  1, y0  0 .


Ecuaţia devine
y (t )  y(t )  1
cu soluţia analitică
y(t )  1  e t (7.50)

Vom exemplifica metoda Euler pe ecuația din Exemplul 7.4.


Funcţia f şi datele de intrare: tinter, y0 şi N se pot da:
(a) fie direct ȋn Command Window
(b) fie ȋntr-o m-filă ȋn care definim funcţia cu comanda" inline".

290
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

(a) scriem direct ȋn spaţiul de lucru:

>> y0 = 0; N = 10;tinter = [0 2];


>> fex7_4 = inline('-y + 1','t','y')
fex7_4 =

Inline function:
fex7_4(t,y) = -y + 1

>> [t1,ye] = ecdif_metoda_Euler(fex7_4,tinter,y0,N);


>> plot(t1,ye,'b:')

(b) scriem o m-filă ȋn care definim funcţia inline:

fex7_4 = inline('-y + 1','t','y') % ecuatia (9.12)


y0 = 0;
N = 10;
tinter = [0 2];
[t1,ye] = ecdif_metoda_Euler(fex_7.4,tinter,y0,N);
plot(t1,ye,'b:')

Eroarea dintre soluția analitică și soluția numerică se poate calcula cu


programul Matlab din M-fila max_eroare_euler.m

max_eroare_euler.m

[teuler,yeuler] = ecdif_metoda_Euler(@ex7_4,[0,2],0,10);
t = 0:.01:3;
y = 1 -exp(-t);
plot(t,y,teuler,yeuler,'.-')
legend('Exact','Euler')
shg
z =1-exp(-teuler);
maxerror = max(abs(z - yeuler))

Prezentăm mai jos rezultatele obţinute pentru un pas h constant. Sunt listate
rezultatele pentru aproximaţiile soluţiei la fiecare pas, eroarea relativă şi
graficele soluţiilor analitice şi numerice.

*************** Datele de intrare **************


f = dy/dt
t0 = t initial
y0 = y initial

291
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

tf = t final
n = numar de pasi

-----------------------------------------------------

f(t,y) = dy/dt = 0*t+1-y


t0 = 0
y0 = 0
tf = 3
n = 10

-------------------------------------------------------
Pasul h este constant
h = (tf - t0 ) / n
= ( 3 - 0 ) / 10
= 0.3

************** Simulare *******************

Pasul 1
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t0 , y0 ) = f( 0 , 0 ) = 1
2) Metoda Euler pentru estimarea y1
y1 = y0 + f( t0, y0 ) * h
= 0 + 1 * 0.3
= 0.3
la t1 = 0.3

Pasul 2
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t1 , y1 ) = f( 0.3 , 0.3 ) = 0.7

2) Metoda Euler pentru estimarea y2

y2 = y1 + f( t1, y1 ) * h
= 0.3 + 0.7 * 0.3
= 0.51
la t2 = 0.6

Pasul 3
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t2 , y2 ) = f( 0.6 , 0.51 ) = 0.49

2) Metoda Euler pentru estimarea y3

292
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

y3 = y2 + f( t2, y2 ) * h
= 0.51 + 0.49 * 0.3
= 0.657
la t3 = 0.9

Pasul 4
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t3 , y3 ) = f( 0.9 , 0.657 ) = 0.343

2) Metoda Euler pentru estimarea y4


y4 = y3 + f( t3, y3 ) * h
= 0.657 + 0.343 * 0.3
= 0.7599
la t4 = 1.2

Pasul 5
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t4 , y4 ) = f( 1.2 , 0.7599 ) = 0.2401

2) Metoda Euler pentru estimarea y5

y5 = y4 + f( t4, y4 ) * h
= 0.7599 + 0.2401 * 0.3
= 0.83193
la t5 = 1.5

Pasul 6
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t5 , y5 ) = f( 1.5 , 0.83193 ) = 0.16807

2) Metoda Euler pentru estimarea y6

y6 = y5 + f( t5, y5 ) * h
= 0.83193 + 0.16807 * 0.3
= 0.882351
la t6 = 1.8

Pasul 7
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t6 , y6 ) = f( 1.8 , 0.882351 ) = 0.117649

2) Metoda Euler pentru estimarea y7

293
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

y7 = y6 + f( t6, y6 ) * h
= 0.882351 + 0.117649 * 0.3
= 0.917646
la t7 = 2.1

Pasul 8
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t7 , y7 ) = f( 2.1 , 0.917646 ) = 0.0823543

2) Metoda Euler pentru estimarea y8


y8 = y7 + f( t7, y7 ) * h
= 0.917646 + 0.0823543 * 0.3
= 0.942352
at t8 = 2.4

Pasul 9
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t8 , y8 ) = f( 2.4 , 0.942352 ) = 0.057648


2) Metoda Euler pentru estimarea y9

y9 = y8 + f( t8, y8 ) * h
= 0.942352 + 0.057648 * 0.3
= 0.959646
la t9 = 2.7

Pasul 10
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.

f( t9 , y9 ) = f( 2.7 , 0.959646 ) = 0.0403536

2) Metoda Euler pentru estimarea y10

y10 = y9 + f( t9, y9 ) * h
= 0.959646 + 0.0403536 * 0.3
= 0.971752
la t10 = 3

*************** Rezultate ******************

In acest caz 'soluţia exactă' se refera la soluţia obtinută


prin funcţia Matlab ode45.

Aproximata = 0.971752
Exacta = 0.950213

294
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

True Error = Exacta - Aproximata


= 0.950213 - 0.971752
= -0.0215397

Eroarea in procente

= | ( Exacta - Aproximata ) / Exacta | * 100


= | -0.0215397 / 0.950213 | * 100
= 2.26683
În figura 7.8 prezentăm graficul vitezei autovehiculului obținută analitic și
numeric prin metoda Euler.
Solutia exacta si aproximata prin metoda Euler h=0.2
1

0.9

0.8

0.7
Exacta
0.6 Aproximata

0.5
y

Aproximata = 0.964816
0.4 Exacta = 0.950213
Eroarea in procente = 1.5368
0.3

0.2

0.1

0
0 0.5 1 1.5 2 2.5 3
t

Fig. 7.8

7.5.2.2 Analiza influenţei pasului

Pentru a analiza influenţa pasului h asupra erorii faţă de soluţia exactă vom
rezolva problema anterioara pentru paşi de marime diferită.
Pentru aceasta executăm următoarea M-fila
%integrare numerica ex7_4_pas - metoda Euler
clear, clf
a = 1; b = 1; y0 = 0; tf = 3;
t = [0:0.01:tf];

295
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

% graficul solutiei analitice (9.15)


yan = 1 - exp(-a*t);
plot(t,yan,'k')
hold on
% diferite marimi ale pasului h = 3/10,3/8,3/4,3/2;
ifine = [10 8 4 2 ]; hfin = tf./ifine;
y(1) = y0;
for iter = 1:4
ifin = ifine(iter)
h = hfin(iter)
y(1)=y0
for i = 1:ifin
y(i + 1) = (1 - a*h)*y(i) +h*b; % Ecuatia(7.47)
plot([i - 1 i]*h,[y(i) y(i+1)],'b', i*h,y(i+1),'r*')
if i < 5, pause;
end
end

Comparaţia dintre soluţia exactă (soluţia analitică) şi soluţiile numerice obţinute


cu metoda Euler pentru diferite mărimi ale pasului h este dată ȋn figura7.9 și
figura 7.10. În Tabelul 7.1 vedem efectul pasului h asupra erorii ȋn metoda
Euler, pentru Exemplul7.4
Tabelul 7.1
Mărime pas h Soluţia exactă Soluţia aproximată Eroarea ȋn procente
h = 0.3 0.950213 0.971752 2.26683
h = 0.42 0.950213 0.980105 3.14589
h = 0.6 0.950213 0.989760 4.16193
h = 0.75 0.950213 0.996094 4.82849
h = 1.5 0.950213 0.75 21.0703

Solutia exacta si aproximata prin metoda Euler h=0.3 Solutia exacta si aproximata prin metoda Euler h=0.42
1 1

0.9 0.9

0.8 0.8
Exacta
0.7 Aproximata 0.7 Exacta
Aproximata
0.6 0.6

0.5 0.5
y

Aproximata = 0.971752 Aproximata = 0.980105


0.4
Exacta = 0.950213 Exacta = 0.950213
0.4
Eroarea in procente = 2.26683 Eroarea in procente = 3.14589
0.3 0.3

0.2 0.2

0.1 0.1

0 0
0 0.5 1 1.5 2 2.5 3 0 0.5 1 1.5 2 2.5 3
t t

296
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Solutia exacta si aproximata prin metoda Euler h=0.6 Solutia exacta si aproximata prin metoda Euler h=1.5
1 1.5
Exacta
0.9 Aproximata

0.8

0.7 Exacta
Aproximata 1
0.6

0.5
y

y
Aproximata = 0.98976
0.4 Exacta = 0.950213
Eroarea in procente = 4.16193
Aproximata = 0.75
0.5
0.3 Exacta = 0.950213
Eroarea in procente = 21.0703
0.2

0.1

0 0
0 0.5 1 1.5 2 2.5 3 0 0.5 1 1.5 2 2.5 3
t t

Fig. 7.9 Comparaţie soluţia numerică şi soluţia analitică (Exemplul 7.4)


pentru diferite valori ale pasului h

1.5

h=1,5

h=0.75
1

h=0.375

0.5
h=0.3

solutia analitica

0
0 0.5 1 1.5 2 2.5 3
t

Fig. 7.10 Comparaţie soluţia numerică şi soluţia analitică( Exemplul 7.4)

Observăm că apropiera de soluţia analitică, adică eroarea, depinde de mărimea


pasului. Cu cât pasul este mai mic cu atât soluţia numerică aproximează mai
bine soluţia analitică.
Pentru pasul h = 0.3 eroarea maximă este maxerror = 0.0402.

Exemplul 7.5

Folosind metoda Euler să se determine soluţia problemei cu condiţie iniţială


pentru ecuaţia diferenţială neliniară

297
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

dy 2
 t  y 2 , y(0)  1
dt

Se construieşte procesul iterativ pentru metoda Euler:

yi1  yi  h f ti , yi  ,

y0  yt0  , ti1  ti  h .

h = 0.1;
t = [0:h:2];
y(1) = 1;
fprintf(' t y \n');
for i=2:length(t),
y(i) = y(i-1) + h*(t(i-1)^2 - y(i-1)^2);
fprintf('%7.4f %7.4f \n',t(i),y(i));
end
plot(t,y)

Obţinem:

t y

0.1000 0.9000
0.2000 0.8200
0.3000 0.7568
0.4000 0.7085
0.5000 0.6743
0.6000 0.6538
0.7000 0.6471
0.8000 0.6542
0.9000 0.6754
1.0000 0.7108
1.1000 0.7603
1.2000 0.8235
1.3000 0.8997
1.4000 0.9877
1.5000 1.0862
1.6000 1.1932
1.7000 1.3068
1.8000 1.4250
1.9000 1.5460
2.0000 1.6680

298
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Solutia ecuatiei dy/dt=t2 - y2 ; y(0)=1 Metoda Euler


2

1.8

1.6

1.4
y

1.2

0.8

0 0.5 1 1.5 2
t

Fig.7.11 Soluția Exemplul 7.5

7.5.2.3 Deducerea metodei Euler din seria Taylor.


Analiza erorii ȋn metoda Euler.

Observăm că erorile ȋn metoda Euler pot fi mari, ordinul de mărime depinzând


de alegerea pasului.
Pentru a vedea dependenţa erorilor de mărimea pasului h vom dezvolta ȋn serie
Taylor aproximata yi 1 . Obţinem :

dy 1 d2y 1 d3y
yi 1  yi  ti1  ti   2
ti1  ti  
2
3
ti1  ti 3  ...
dt ti , yi  2! dt t , y  3! dt t , y 
i i i i

1 1
 yi  f (ti , yi )(ti 1  ti )  f (ti , yi )ti 1  ti   f ' ' (ti , yi )ti 1  ti   ...(7.51)
2 3
2! 3!

Observăm că primii doi termeni ai seriei sunt chiar valoarea aproximată a


soluţiei ecuaţiei diferenţiale, obţinută prin metoda Euler, la pasul i+1 (vezi
(7.47)

yi 1  yi  h f ti , yi 

Astfel, eroarea aproximaţiei yi 1 este data de

299
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

1 d2 y 1 d3 y
eroare  e  ti1  ti  
2
ti1  ti 3  .....
2! dt t ,y 
2
3! dt t ,y 
3
i i i i
(7.52)
1 d2 y 1 d 3
y
 h2  h 3  ...
2! dt t ,y 
2
3! dt t ,y 
3
i i i i

Oprind doar primul termen din sumă, putem aprecia că eroarea este
proporţională cu pătratul pasului h. Altfel , daca pasul se ȋnjumătăţeşte eroarea
ar trebui să se micşoreze la un sfert din valoare. Dar, aşa cum putem observa din
rezultatele prezentate ȋn Talelul 7.1, acestă concluzie nu este verificată. Aceasta
deoarece aproximarea erorii cu pătratul pasului h este la rândul ei o trunchiere
locală care generează erori.

Metoda Euler se poate utiliza pentru cazul mai general al sistemelor de ecuaţii
diferenţiale ordinare

 y1  f1 (t , y1 , y 2 , ..., y n )  y1 (t 0 )  y10


 y   f (t , y , y , ..., y )  y (t )  y
 2 2 1 2 n  2 0 20

.  (7.53)
. 
 
 y n  f n (t , y1 , y 2 , ..., y n )  y n (t 0 )  y n 0

care se poat scrie ca o ecuaţie vectorială (de forma (7.1))

dy
 y (t )  f (t , y ) cu condiţia iniţială y(t 0 )  y0 .
dt

7.5.3 METODA RUNGE-KUTTA

7.5.3.1 Metode Runge-Kutta de ordinul doi (RK2)

Ȋn această secţiune vom analiza o variantă ȋmbunăţită a metodei Euler.


Formula pentru calculul aproximaei yi 1 prin metoda Runge-Kutta de ordinul
doi se poate deduce din dezvoltatea ȋn seria Taylor (7.51) prin includerea şi a
termenului al treilea

300
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

yi 1  yi  f ti , yi h 
1
f ti , yi h 2 (7.54)
2!

Această formulă de calcul este numită formulă de ordinul doi pentru că


utilizează funcţia f ti , yi  şi derivata funcţiei f ti , yi  .
Metoda Euler poate fi privită ca o metodă Runge Kutta de ordinul unu (RK1).
Pentru a ocoli calculul derivatei, formula de calcul (7.54) este rescrisă sub
forma
yi 1  yi  a1k1  a2k2 h (7.55)
unde
k1  f ti , yi  (7.56)

k2  f ti  a3h, yi  a4k1h (7.57)

Identificând ecuaţiile (7.54) şi (7.55) vom obţine următoarele trei ecuaţii

a1  a 2  1
1
a 2 a3  (7.58)
2
1
a2 a4 
2

pentru calculul celor patru necunoscute ai ,i  1,2,3,4 .


Problema este nedeterminată, avem trei ecuaţii cu patru necunoscute. Uzual se
lasă nedeterninată necunoscuta a 2 şi se determină celelalte trei necunoscute ȋn
1 2
funcţie de ea. Valorile uzuale pentru a 2 sunt şi .
2 3
Pentru aceste valori obţinem următoarele două metode.

7.5.4 Metoda Heun

1
Pentru a 2  metoda este cunoscuta ca metoda Heun. Ȋn acest caz obţinem
2
1
constantele a1  , a3  1 şi a4  1 .
2

Algoritmul 7.2 Metoda Heun

Din relaţia (7.55) rezultă

301
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

1 1 
yi 1  yi   k1  k2  h  yi  f ti , yi   f ti  h , yi  k1h h
1
2 2  2

Astfel, obţinem aproximaţia pentru metoda Heun

h
yi 1  yi  f ti , yi   f ti 1 , yi  hf ( ti , yi  (7.59)
2

Implementarea în Matlab a metodei Heun, M-fila funcție ode_Heun.m

ode_Heun.m

function [t,y] = ode_Heun(f,tspan,y0,N)


% metoda Heun pentru y’(t) = f(t,y(t))
% tspan = [t0,tf], conditia initiala value y0 si N time steps
if nargin<4 | N <= 0, N = 100; end
if nargin<3, y0 = 0; end
h = (tspan(2) - tspan(1))/N; % marime pas
t = tspan(1)+[0:N]'*h; % vector timp
y(1,:) = y0(:)'; % transforma conditia initiala in vector
linie
for k = 1:N
fk = feval(f,t(k),y(k,:)); y(k+1,:) = y(k,:)+h*fk;
y(k+1,:) = y(k,:) +h/2*(fk +feval(f,t(k+1),y(k+1,:)));
%Ec.(7.59)
end

7.5.5 Metoda Ralston

3
Pentru a 2  metoda este cunoscută ca metoda Ralston. Ȋn acest caz obţinem
2
1 3 3
constantele a1  , a3  şi a 4  .
3 4 4

Din relaţia (7.55) rezultă

1 2 
yi 1  yi   k1  k2  h (7.60)
3 3 

unde
k1  f x i , yi 

302
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

 3 3 
k2  f  xi  h, yi  k1h  (7.61)
 4 4 

7.5.6 Metoda Runge-Kutta de ordinul patru (RK4)

Metoda Runge-Kutta de ordinul patru (RK4) este cea mai utilizată metoda
pentru rezolvarea ecuaţiilor diferenţiale deoarece are o eroare de trunchiere de
 
ordin O h 4 . Algoritmul metodei se deduce din dezvoltarea Taylor (7.51) ȋn
care se reţin primii cinci termeni

1 d2y 1 d3y
yi 1  yi 
dy
ti1  ti   2
ti1  ti  
2
3
ti1  ti 3
dt ti , yi  2! dt t , y  3! dt t , y 
i i i i
(7.62)
4

1d y
4
ti1  ti 4
4! dt t , y 
i i

Cu
dy
 f x , y  şi x i 1  x i  h
dx

din (7.62) obţinem aproximaţia

yi 1  yi  f xi , yi h  f xi , yi h 2  f '' xi , yi h3  f ''' xi , yi h 4


1 ' 1 1
(7.63)
2! 3! 4!

Pe baza relaţiei (7.63) descriem forma cea mai folosită pentru algoritmul
metodei RK4.

7.5.6.1 Algoritmul metodei Runge-Kutta de ordinul patru (RK4)

Algoritmul 7.3

Algoritmul metodei foloseşte patru evaluări ale funcţiei la fiecare pas:

y i 1  y i 
h
6
 f i1 2 f i 2 2 f i3  f i 4  (7.64)
unde:
f i1  f t i , y i  (7.64a)
303
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

 h h 
f i 2  f  t i  , y i  f i1  (7.64b)
 2 2 

 h h 
f i3  f  t i  , y i 2  f i 2  (7.64c)
 2 2 

f i 4  f  x i h, y i  f i 3 h  (7.64d)

Dacă f (t , y) nu depinde de y, avem f i 2  f i 3 şi metoda Runge - Kutta se


reduce la regula lui Simpson de quadratură.
Metoda Runge-Kutta nu permite o estimare a erorii. Putem obţine o estimare a
erorii aplicând metoda cu un pas h şi apoi cu pasul h/2.

Implementarea în Matlab a Algoritmului 7.3 metode RK4, M-fila ode_RK4.m

ode_RK4.m

function [t,y] = ode_RK4(f,tspan,y0,N,varargin)


% Runge-Kutta y’(t) = f(t,y(t))
% tspan = [t0,tf], conditia initiala value y0 si N time steps
if nargin < 4 | N <= 0, N = 100; end
if nargin < 3, y0 = 0; end
y(1,:) = y0(:)'; % transforma in vector coloana
h = (tspan(2) - tspan(1))/N; t = tspan(1)+[0:N]'*h;
for k = 1:N
f1 = h*feval(f,t(k),y(k,:),varargin{:}); f1 = f1(:)'; %(7.64a)
f2 = h*feval(f,t(k) + h/2,y(k,:) + f1/2,varargin{:}); f2 =
f2(:)';%(7.64b)
f3 = h*feval(f,t(k) + h/2,y(k,:) + f2/2,varargin{:}); f3 =
f3(:)';%(7.64c)
f4 = h*feval(f,t(k) + h,y(k,:) + f3,varargin{:}); f4 = f4(:)';
%(7.64d)
y(k + 1,:) = y(k,:) + (f1 + 2*(f2 + f3) + f4)/6; % Ec.(7.64)
end

Exemplul 7.6

Compararea metodelor Euler şi Runge-Kutta (RK4) cu soluţia analitică

Comparăm soluțiile problemei din Exemplul 7.4, obținute prim metodele


analitică,Euler,Heun și RK4.
Pentru aceasta am scris M-fila nmecdf_H_E_RK.m
nmecdf_H_E_RK.m
304
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

% comoara metodele Heun/Euer/RK4 pentru ode


clear, clf
tspan = [0 2];
t = tspan(1)+[0:100]*(tspan(2) - tspan(1))/100;
a = 1; yt = 1 - exp(-a*t); %Ec.(7.50): solutia analitica
ecdf74 = inline('-y + 1','t','y'); % Ec. (7.49)
y0 = 0; N = 4;
[t1,ye] = ode_Euler(ecdf74,tspan,y0,N);
[t1,yh] = ode_Heun(ecdf74,tspan,y0,N);
[t1,yr] = ode_RK4(ecdf74,tspan,y0,N);
plot(t,yt,'k', t1,ye,'b', t1,yh,'g', t1,yr,'r')
N = 1e3; % calculam timpul pentru N iteratii
tic, [t1,ye] = ode_Euler(ecdf74,tspan,y0,N); time_Euler = toc
tic, [t1,yh] = ode_Heun(ecdf74,tspan,y0,N); time_Heun = toc
tic, [t1,yr] = ode_RK4(ecdf74,tspan,y0,N); time_RK4 = toc

Rzultatul este prezentat în fereastra grafică, figura 7.12.


Exemplul 7.4
1

0.9

0.8

0.7

0.6

0.5 analitic
Euler
Heun
0.4 RK4

0.3

0.2

0.1

0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2

Fig. 7.12 Rezultat Exemplu 7.6

305
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

7.6 File MATLAB (built-in) pentru rezovarea problemelor cu condiții


inițiale pentru ecuații diferențiale ordinare

În MATLAB dispunem de o serie de funcții pentru determinarea soluțiilor


ecuațiilor diferențiale ordinare. Aceste funcții folosesc o varietate de metode
particulare (Matlab help oferă o listă cu aceste opțiuni). Cele mai folosite built-
in funcții sunt funcţiile ode23 şi ode45 pentru determinarea soluţiilor
problemei cu condiţii iniţiale pentru ecuaţiile diferenţiale cu metode Runge –
Kutta. Alegerea uneia dintre funcţii depinde de cât de netedă este funcţia f(t,y).
Cifrele 23 sau 45 ne indică modul în care se estimează eroarea metodei. De
exemplu pentru ode45, eroarea se estimează comparând rezultatul de ordin 4,
funcția este evaluată de patru ori, cu cel de ordin 5.
Apelarea în Matlab a acestor funcţii se face astfel (>>help ode23, >>help
ode45):

[t,y] = ode23(fun,tspan,y0)

[t,y] = ode45(fun,tspan,y0)

Se integrează sistemul de ecuaţii diferenţiale y' = f(t,y) introdus de funcția fun


pentru intervalul de timp tspan = [t0 tfinal] , cu condiţa iniţială y0.
Funţia fun se poate da ca o funcţie ”inline”.
Rezultatul este dat sub forma unei matrice cu două coloane. Pe prima coloană
este vectorul valorilor timpului t0,t1,…,tf iar pe coloana a doua sunt valorile
corespunzătoare ale soluţiei y(t0),…., y(tf).

Exemplul 7.7

Să se detrmine soluția oscilatorului liniar amortizat din Exemplul 7.2 pentru


următoarel date numerice:
m = 300; % masa (N)
c = 200; % constanta amortizare (N / (m/s))
k = 4000; % rigiditatea (N/m)
f = 10; % definim forta pereturbatoare, f(t)

fmck.m

% functia fmck.m trebuie sa se afle in acelasi director


% cu m-fila
% masa_arc_amortizor.m

306
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

function yprime = fmck(t,y)

% definim forta pereturbatoare, f(t),


% y(1) = pozitia (m)
% y(2) = viteaza (m/s)

yprime(1) = y(2);
yprime(2) = f/m - k/m * y(1) - c/m * y(2);
yprime = yprime';

masa_arc_amortizor.m

% conditiile initiale

yo = [0 0]; % yo pozitia si viteza initial


to = 0.0; % to timplu initial
tf = 15.0; % tf timpul final

% definim m k c

m = 300; % masa (N)


c = 200; % constanta amortizare (N / (m/s))
k = 4000; % rigiditatea (N/m)
f=10; % forta pereturbatoare, f(t)
tspan =[to tf];
[t,y] = ode23('fmck',tspan,yo);
figure(1);
plot(t,y(:,1))
xlabel('Timp (seconde)')
ylabel('Pozitia (m)')
grid
figure(2)
plot(t,y(:,2))
xlabel('Timp (secunde)')
ylabel('viteza (m/s)')
grid

Răspunsul grafic pentru poziție și viteză, figura 7.13 respectiv figura 7.14:

307
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

-3
x 10
4.5

3.5

2.5
Pozitia (m)

1.5

0.5

0
0 5 10 15
Timp (seconde)

Fig.7.13 Poziția
-3
x 10
8

2
viteza (m/s)

-2

-4

-6
0 5 10 15
Timp (secunde)

Fig.7.14 Viteza
Exemplul 7.8

Să se determine soluția sistemului diferențial

308
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

 y1  2 y1  3 y 2  y1 (0)  1
 cu condițiile inițiale: 
 y 2  7 y1  y 2  y 2 (0)  0

sys_ode.m

% determinarea solutiei analitice si numerice pentru sisteme %


% de ecuatii diferentiale ordinare
% y1'=2*y1-3*y2; y2'=7*y1+1*y2 cu conditiile initiale
% y1(0) = 1, y2(0) =0.
f = inline('[2 -3;7 1]*y','t','y')
[t,y] = ode45(f,[0 1],[1 0]);
plot(t,y(:,1),t,y(:,2),'--')
legend('y1','y2')
title('Solutia numerica y_1 si y_2')
xlabel('t')
figure
[y1,y2] = dsolve('Dy1=2*y1-3*y2','Dy2=7*y1+1*y2',...
'y1(0)=1','y2(0)=0')
exact = [subs(y1,t) subs(y2,t)];
plot(t,y(:,1)-exact(:,1),'-',t,y(:,2)-exact(:,2),'r-.')
legend('e1','e2')
title('Erorile e_1 = y_1- exact y_1 si e_2 = y_2 - exact
y_2')

Executăm m-fila sys_ode


>> sys_ode

Obținem soluțiile analitice:


>> pretty(y1)
3
/ 1/2 \ -
3 1/2 | 83 t | 2
/ 1/2 \ - 83 sin| ------- | exp(t)
| 83 t | 2 \ 2 /
cos| ------- | exp(t) + ----------------------------
\ 2 / 83

>> pretty(y2)

3
/ 1/2 \ -
1/2 | 83 t | 2
14 83 sin| ------- | exp(t)
\ 2 /
-------------------------------
83

309
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Rezolvarea grafică pentru soluția numerică și eroare: figurile 7.15 respectiv 7.16

Solutia numerica y 1 si y 2
3
y1
y2
2

-1

-2

-3

-4

-5

-6

-7
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
t

Fig.7.15

-4 Erorile e1 = y 1- exact y 1 si e2 = y 2 - exact y 2


x 10
1
e1
e2

0.5

-0.5

-1

-1.5

-2
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

Fig.7.16

Exemplul 7.9

mad_nic.m

% determinarea solutiei analitice si numerice pentru sisteme


de ecuatii
%
% y1'=-30*y1-29*y2; y2'=-29*y1-30*y2

310
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

% y1(0) = 2, y2(0) = 0.

f = inline('-[30 29;29 30]*y','t','y')


[t,y] = ode45(f,[0 1],[2 0]);
plot(t,y(:,1),t,y(:,2),'--')
legend('y1','y2')
title('Soltia numerica y_1 si y_2')
xlabel('t')
pause (5)
figure
[y1,y2] = dsolve('Dy1=-30*y1-29*y2','Dy2=-29*y1-30*y2',...
'y1(0)=2','y2(0)=0')
exact = [subs(y1,t) subs(y2,t)];
plot(t,y(:,1)-exact(:,1),'-',t,y(:,2)-exact(:,2),'--')
legend('e1','e2')
title('Eroare e_1 = y_1- exact y_1 si e_2 = y_2 - exact
y_2')

> mad_nic

f =
Inline function:
f(t,y) = -[30 29;29 30]*y

y1 = 1/exp(t) + 1/exp(59*t)

y2 = 1/exp(59*t) - 1/exp(t)

În figura 7. Graficul soluției numerice și graficul erorii sunt în figurile 7.17


respectiv 7.18.

Soltia numerica y 1 si y 2
2
y1
y2

1.5

0.5

-0.5

-1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
t

Fig.7.17
311
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

-4 Eroare e1 = y 1- exact y 1 si e2 = y 2 - exact y 2


x 10
5
e1
e2
4

-1

-2

-3

-4

-5
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

Fig.7.18

Exemplul 7.10

Răspunsul în spațiul stărilor pentru oscilatorul liniar


a) Raspunsul la condiţii iniţiale

y  3 y  2 y  0 ; y(0)  1; y (0)  1

Vom introduce variabilele de stare x1  y ; x2  y .


Cu acestea scriem ecuatia, in spatiul starilor:

 x1  y  x2  x1  x2
 sau 
 x 2  y  2 x1  3x 2  x2  2 x1  3x2

Pentru a introduce sistemul diferenţial vom scrie o m-filă Matlab de tip funcţie,
salvată ca a1.m, care este apelată de funcția ode 45 .
function xdot=a1(t,x)
xdot=zeros(2,1);
xdot(1)=x(2);
xdot(2)= -2*x(1)-3*x(2);
>> [t,x]=ode45(@a1,[0,20],[1,1]);

Pentru a obţine graficul soluţiei, figura 7.19, executăm comanda:

>> plot(t,x(:,1),'r',t,x(:,2),'b-.')

312
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Solutia a1 sistemul: x1dot=x2; x2dot=-2*x1-3*x2;x1(0)=1; x2(0)=1;


1.2
x1
x2
1

0.8

0.6

0.4

0.2

-0.2

-0.4

-0.6
0 2 4 6 8 10 12 14 16 18 20
timp

Fig.7.19

b) Oscilatorul liniar - raspunsul la o intrare sinusoidală, figura 7.20.

y  3 y  2 y  sin(t ) ; y(0)  0; y (0)  0

function xdot=a2(t,x)
xdot=zeros(2,1);
xdot(1)=x(2);
xdot(2)=-3*x(2)-2*x(1)+sin(t);
>> [t,x]=ode45(@a2,[0 20],[0 0])
>> plot(t,x(:,1),'r',t,x(:,2),'b-.')

x1dot=x2; x2dot=-2*x1-3*x2+sin(t)
0.4

x1
x2
0.3

0.2

0.1

-0.1

-0.2

-0.3

-0.4
0 2 4 6 8 10 12 14 16 18 20
timp

Fig.7.20
313
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Exemplul 7.11

Oscilatorul neliniar Van der Pol

y   (1  y 2 ) y  y  0

unde este constantă,   0 . Dacă   0 se obţine oscilatorul armonic


neamortizat.
Introducem variabilele de stare: x1  y ; x2  y şi obţinem reprezentarea din
spaţiul stărilor:
 x1  x2

 x2   x1   (1  x1 ) x2
2

Vom face rezolvarea numerică pentru   1 .

function xdot=vdp1(t,x)
xdot=zeros(2,1);
xdot(1)=x(2);
xdot(2)=-x(1)+(1-x(1)^2)*x(2);

>> [t,x]=ode45(@vdp1,[0 20],[1 0]);


>> plot(t,x(:,1),'r',t,x(:,2),'b-.')

Ecuatia Van der Pol


3
x1
x2

-1

-2

-3
0 2 4 6 8 10 12 14 16 18 20
timp

Fig. 7.21 x(1) – poziția; x(2) – viteza(linie-punct)

Portretul de fază sau graficul ȋn spaţiul stărilor (x1,x2):

>> plot(x(:,1),x(:,2))

314
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Portret de faza ecuatia Van der Pol


3

x2
0

-1

-2

-3
-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5
x1

Fig. 7.22 Portretul de fază oscilatorul Van der Pol

7.7 Probleme

P7.1 Pentru următoarele ecuații diferențiale cu condiții inițiale

(a) y  2 y  te t , 0  t  1, y(0)  0 , h  0.5


1
(b) y  y  1 , 1  t  2 , y(1)  2 , h  0.25
t
determinați soluția numerică folosind metoda Euler.

P7.2 Pentru următoarele ecuații diferențiale cu condiții inițiale

(a) y  y  0 , 0  t   , y(0)  1, y (0)  0


(b) y  11y  30 y  sin t , 0  t  1, y(0)  1, y (0)  0
(c) y  y  t , 0  t  1, y(0)  0 , y (0)  0

comparați soluțiile numerice cu soluțiile analitice. (lucrați cu reprezentarea


ecuațieiilor în spațiul starilor).

P7.3 Determinați, folosind metoda RK4, soluțiile numerice pentru următoarela


ecuații diferențiale cu condiții inițiale

(a) y  2 y  y  te t  t , 0  t  1, y(0)  0 , y (0)  0 , h  0.1


(b) t 2 y  2ty  2 y  t 3 ln t , 1  t  2 , y(1)  1, y (1)  0 , h  0.1

315
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE

Detreminați soluțiile analitice, folosind calculul simbolic din Matlab, și


comparați grafic soluțiile analitice cu aproximațiile numerice ale soluțiilor.

P7.4 Să se determine soluția sistemului diferențial

 y1  5 y1  3 y 2  y1 (0)  1
 cu condițiile inițiale: 
 y 2  y1  4 y 2  y 2 (0)  0

P7.5 Ecuațiile de mișcare ale unui pendul simplu, figura P7.5, dacă neglijăm
rezistența aerului, sunt

(a) cazul neliniar

d 2 g O1
 sin   0
dt 2 l
θ l

(b) ecuația liniarizată, cazul micilor oscilații m


A τ
  50
s
d 2 g O
  0
G
dt 2 l
Fig. P7.5
Folosind funcția Matlab ode 45,pentru
  0.7 , l  2 , g  9.81 și t  [0, 20] , detrminați soluția ecuațiilor de mișcare.
Reprezentați în aceeași fereastră grafică cele două soluții.

316
Dumitru.D.Nicoară METODE NUMERICE ÎN INGINERIE FOLOSIND MATLAB

BIBLIOGRAFIE

1. Burden, R. L., Fairs, J. D., Numerical Analysis, 7th ed., Brooks/, Cole Thomson, Pacific
Grove, CA, 2001.

2. Canale, R., Chapra, S., Numerical Methods for Engineers: with Software and Programming
Applications, McGraw-Hill, New York, 2002.

3. Chapra, S., Canale, R., Numerical Methods for Engineers, 5th Edition, McGraw-Hill, ISBN:
978-0071244299 , 2008 .

4. Dukkipati, V.R., MATLAB An Introduction with Applications, New Age International


Limiter Publishers, New Delhi, 2010.

5. Faires, J.D.,Burden, R., Numerical Methods, Brooks Cole, 3 edition, 2002

6. Kaw, A., Garapati, S. H., Numerical Methods with Applications,


http://numericalmethods.eng.usf.edu

7. Kiusalaas, J., Numerical Methods in Engineering with MATLAB, Cambridge University


Press, 2005.

8. Mathews, H.,J., Numerical Methods MATLAB Programs, 1995.

9. Mathews, J. H., and Fink, K. D., Numerical Methods Using MATLAB, Prentice-Hall, Upper
Saddle River, NJ, 1999.

10. Otto, S. R., Denier, J. P., An introduction to programming and numerical methods in
MATLAB Springer-Verlag London Limited, 2005

11. Recktenwald, G. W., Numerical Methods with MATLAB, Prentice-Hall, Upper Saddle
River, NJ, 2000.

12. Young T., Mohlenkamp, M., Introduction to Numerical Methode and MATLAB Programing
for Engineers, 2012, www.math.ohiou.edu/courses/math3600/

13. http://www.eng.ed.ac.uk/teaching/courses/matlab/getting-started.shtml

14. http://www.mathworks.com/access/helpdesk/help/helpdesk.html

15. http://mathews.ecs.fullerton.edu/numerical.html

317

You might also like