11.02.2014 Views

Metode Numerice - aspecte teoretice şi practice

Metode Numerice - aspecte teoretice şi practice

Metode Numerice - aspecte teoretice şi practice

SHOW MORE
SHOW LESS

Transform your PDFs into Flipbooks and boost your revenue!

Leverage SEO-optimized Flipbooks, powerful backlinks, and multimedia content to professionally showcase your products and significantly increase your reach.

Mădălina Roxana Buneci<br />

<strong>Metode</strong> <strong>Numerice</strong> - <strong>aspecte</strong> <strong>teoretice</strong> şi <strong>practice</strong><br />

Editura Academica Brâncuşi<br />

Târgu-Jiu, 2009


Mădălina Roxana Buneci<br />

ISBN 978-973-144-289-1<br />

2


<strong>Metode</strong> <strong>Numerice</strong><br />

CUPRINS<br />

Prefaţă........................................................................................................................7<br />

I. Noţiuni introductive...............................................................................................9<br />

I.1. Elemente de teoria erorilor ......................................................................9<br />

I.2. Condiţionarea numerică. Factor de condiţionare....................................11<br />

I.3. Stabilitatea algoritmilor..........................................................................14<br />

I.4. Complexitatea algoritmilor.....................................................................15<br />

II. Aproximarea numerelor reale...............................................................................17<br />

II.1. Reprezentarea numerelor întregi într-o bază.........................................21<br />

II. 2. Reprezentarea numerelor reale într-o bază...........................................29<br />

III. Reprezentarea informaţiei în sistemele de calcul................................................29<br />

III.1. Reprezentarea internă a numerelor întregi...........................................29<br />

III. 1.1. Reprezentarea internă a numerelor întregi fără semn<br />

(pozitive)...........................................................................29<br />

III.1.2. Reprezentarea internă a numerelor întregi (cu semn)...........30<br />

III. 2. Reprezentarea internă a numerelor reale................................35<br />

III.2.1. Forma normalizată................................................................35<br />

III.2.2. Reprezentarea în virgulă mobilă...........................................36<br />

III.2.3. Standardul IEEE-754............................................................39<br />

III.2.4. Aritmetica în virgulă mobilă.................................................45<br />

IV. Rezolvarea sistemelor liniare..............................................................................53<br />

IV.1. Elemente de analiză matriceală...........................................................53<br />

IV. 2. <strong>Metode</strong> directe de rezolvare a sistemelor liniare................................61<br />

IV.2.1. Metoda de eliminare Gauss ..................................................62<br />

IV.2.2. Rezolvarea sistemelor liniare prin metoda de eliminare<br />

Gauss...................................................................................67<br />

3


Mădălina Roxana Buneci<br />

IV.2.3. Calculul determinantului unei matrice..................................70<br />

IV.2.4. Calculul inversei unei matrice..............................................71<br />

IV.3. Factorul de condiţionare al unei matrice..............................................74<br />

IV.4. <strong>Metode</strong> iterative de rezolvare a sistemelor liniare...............................80<br />

IV.4.1. Generalităţi............................................................................80<br />

IV.4.2. Metoda Jacobi.......................................................................83<br />

IV.4.3. Metoda Gauss-Seidel............................................................87<br />

V. Rezolvarea ecuaţiilor şi sistemelor neliniare........................................................91<br />

V. 1. Rezolvarea ecuaţiilor neliniare.............................................................91<br />

V.1.1. Metoda bisecţiei (metoda înjumătăţirii intervalului)..............93<br />

V.1.2. Metoda coardei.......................................................................96<br />

V.1.3. Metoda tangentei.................................................................104<br />

V. 2. Rezolvarea sistemelor neliniare.........................................................114<br />

V.2.1. Metoda punctului fix............................................................116<br />

V.2.2. Metoda Newton – cazul m-dimensional..............................127<br />

VI. Aproximarea funcţiilor.....................................................................................139<br />

VI. 1. Polinoame de interpolare..................................................................139<br />

VI.1.1. Definiţie. Eroarea de interpolare.........................................142<br />

VI.1.2. Eroarea de interpolare în cazul nodurilor echidistante.......142<br />

VI.1.3. Eroarea de interpolare în cazul nodurilor Cebîşev.............143<br />

VI.1.4. Polinomul Lagrange de interpolare....................................144<br />

VI.1.5. Polinomul Newton de interpolare de speţa I (ascendent)...161<br />

VI.1.6. Polinomul Newton de interpolare de speţa a II-a<br />

(descendent).........................................................................166<br />

VI.1.7. Polinomul Newton de interpolare cu diferenţe divizate.....171<br />

VI. 2. Metoda celor mai mici pătrate..........................................................175<br />

VI.2.1. Caracterizarea elementelor de cea mai bună aproximare pe<br />

subspaţii Hilbert..................................................................175<br />

VI.2.2. Aproximarea în medie prin metoda celor mai mici<br />

pătrate................................................................................178<br />

VI.2.3. Limitări ale metodei celor mai mici pătrate........................186<br />

4


<strong>Metode</strong> <strong>Numerice</strong><br />

VII. Derivarea numerică.........................................................................................189<br />

VII.1. Formule de derivare aproximativă folosind dezvoltări în serie<br />

Taylor................................................................................189<br />

VII.2. Extrapolare Richardson...................................................................205<br />

VII.3. <strong>Metode</strong> de derivare numerică folosind interpolarea.........................206<br />

VIII. Integrarea numerică........................................................................................209<br />

VIII.1. Formula generală de cuadratură numerică. Formula de cuadratură<br />

Newton-Cotes..................................................................................209<br />

VIII.2. Formula dreptunghiurilor................................................................212<br />

VIII.3. Formula trapezelor..........................................................................218<br />

VIII.4. Formula lui Simson.........................................................................223<br />

VIII.5. Algoritmul lui Romberg..................................................................224<br />

VIII.6. Cuadratura Gauss............................................................................227<br />

VIII.7. Formule pentru calculul aproximativ al unei integrale duble.........230<br />

Anexa: Iniţiere în Maple.........................................................................................235<br />

A.1. Structura internă. Categorii de comenzi MAPLE...............................235<br />

A.2. Operatori, constante şi funcţii predefinite în MAPLE. Expresii........238<br />

A.3. Numere, şiruri şi identificatori............................................................243<br />

A.4. Comenzi de calcul în MAPLE............................................................248<br />

A.5. Reprezentări grafice în MAPLE..........................................................251<br />

A.6. Structuri de date în MAPLE................................................................256<br />

A.6.1 Expresii şi funcţii..................................................................256<br />

A.6.2. Liste......................................................................................261<br />

A.6.3. Mulţimi.................................................................................262<br />

A.6.4. Tablouri................................................................................264<br />

A.7. Elemente de programare în MAPLE...................................................269<br />

A.7.1 Atribuirea. Decizia. Structuri repetitive................................269<br />

A.7. 2. Proceduri în MAPLE...........................................................274<br />

Bibliografie.............................................................................................................279<br />

Index........................................................................................................................281<br />

5


Mădălina Roxana Buneci<br />

6


<strong>Metode</strong> <strong>Numerice</strong><br />

PREFAŢĂ<br />

Analiza numerică are o istorie lungă şi bogată: Arhimede, Newton sau<br />

Gauss, spre exemplu, având contribuţii semnificative în acest domeniu. Însă<br />

metodele numerice moderne, aşa cum le folosim astăzi, sunt caracterizate de<br />

sinergia dintre calculatoarele electronice programabile, analiza matematică, precum<br />

şi oportunitatea şi necesitatea de a rezolva probleme complexe din diverse domenii<br />

cum ar fi ingineria, medicina, economia sau ştiinţele sociale. Deşi a existat<br />

întotdeauna o strânsă interacţiune între matematică, pe de o parte şi ştiinţe şi<br />

tehnologie, pe de altă parte, această interacţiune s-a intensificat în ultimele decenii.<br />

Creşterea utilizării metodelor numerice a fost cauzată nu numai de creşterea<br />

performanţei calculatoarelor, ci şi de îmbunătăţirea algoritmilor. Cu toate că există<br />

produse software performante pentru rezolvarea multor probleme matematice<br />

întâlnite în practică, cunoaşterea şi înţelegerea metodelor numerice rămân esenţiale<br />

pentru utilizarea inteligentă a produselor software respective.<br />

Această carte reprezintă o introducere în studiul metodelor numerice. În cele<br />

opt capitole ale acestei lucrări sunt prezentate noţiuni şi rezultate fundamentale ce<br />

ţin de aproximarea numerelor reale, reprezentarea informaţiei în sistemele de calcul<br />

şi aritmetica în virgula mobilă, rezolvarea sistemelor liniare (prin metode directe şi<br />

iterative), rezolvarea ecuaţiilor şi sistemelor neliniare, aproximarea funcţiilor (prin<br />

polinoame de interpolare şi metoda celor mai mici pătrate), derivarea şi integrarea<br />

numerică. Sunt descrise cele mai utilizate metode numerice, aduse la o formă<br />

algoritmică. În fiecare caz în parte sunt prezentate proceduri în MAPLE şi se fac<br />

comparaţii între datele de ieşire ale procedurilor respective şi rezultatele afişate de<br />

comenzile MAPLE destinate rezolvării aceloraşi probleme. În multe situaţii, pentru<br />

a evidenţia erorile de rotunjire, se compară rezultatele obţinute utilizând aritmetica<br />

virgulei mobile cu rezultatele obţinute folosind calculul simbolic.<br />

7


Mădălina Roxana Buneci<br />

Cartea de faţă corespunde programei analitice a cursului de <strong>Metode</strong><br />

<strong>Numerice</strong> (de la Ingineria Sistemelor, Ingineria Energetică şi Inginerie Industrială –<br />

licenţă). În afară de destinaţia ei directă de manual pentru studenţii facultăţilor<br />

tehnice, cartea poate servi, pentru cei interesaţi, ca punct de plecare în studiul mai<br />

aprofundat al metodelor numerice.<br />

Numerical Methods - theoretical and practical aspects<br />

Author: Mădălina Roxana Buneci<br />

Abstract. This book is an introduction to the study of numerical methods. In<br />

the eight chapters of this book are presented fundamental concepts and results<br />

related to approximating of real numbers, computing in floating point arithmetic,<br />

solving linear systems (by direct and iterative methods), solving equations and<br />

nonlinear systems, approximating functions (polynomial interpolation and the least<br />

squares method), approximating derivatives and quadrature rules. Theoretical as<br />

well as practical aspects are emphasized. The algorithms are implemented in<br />

MAPLE.<br />

These lecture notes were developed for a fourteen-week course the author<br />

has taught for first year students at System Engineering, Power Engineering and<br />

Industrial Engineering.<br />

8


<strong>Metode</strong> <strong>Numerice</strong><br />

I. Noţiuni introductive<br />

<strong>Metode</strong>le numerice reprezintă tehnici prin care problemele matematice sunt<br />

reformulate astfel încât să fie rezolvate numai prin operaţii aritmetice. Prin trecerea<br />

de la infinit la finit, diferenţial la algebric, neliniar la liniar problemele complicate<br />

sunt înlocuite de probleme mai simple care au aceeaşi sau “aproape” aceeaşi soluţie.<br />

Astfel soluţiile obţinute prin aplicarea metodelor numerice reprezintă doar<br />

aproximaţii ale soluţiilor problemelor originale, şi deci implică erori.<br />

I.1. Elemente de teoria erorilor<br />

Sursele erorilor şi clasificarea lor<br />

Se pot distinge trei tipuri de erori în cazul aplicării de metode numerice<br />

pentru rezolvarea unei probleme:<br />

• Erori provenite din simplificarea modelului fizic, pentru a fi descris întrun<br />

model matematic; erori din măsurătorile iniţiale sau erori din calcule<br />

anterioare. Aceste tipuri de erori se numesc erori inerente.<br />

• Erori datorate metodei utilizate-de exemplu, trunchierea unei serii<br />

infinite (mai precis aproximarea sumei unei serii printr-o sumă parţială),<br />

sau considerarea unui termen cu un rang “suficient” de mare pentru a<br />

aproxima limita unui şir. Aceste erori sunt numite erori de metodă sau<br />

erori de trunchiere.<br />

• Erori datorate reprezentării datelor şi efectuării calculelor într-o<br />

aritmetică cu precizie limitată (de exemplu aritmetica virgulei mobile).<br />

Aceste erori se numesc erori de rotunjire.<br />

9


Mădălina Roxana Buneci<br />

Erorile inerente sunt anterioare aplicării metodei numerice, iar erorile de<br />

trunchiere şi de rotunjire apar în timpul calculului numeric.<br />

Erori absolute şi erori relative<br />

Eroarea absolută = valoare aproximativă - valoare exactă<br />

Eroarea relativă =<br />

eroare absolută<br />

valoare exactă<br />

Din aceste definiţii se obţine:<br />

Valoare aproximativă = (valoare exactă )(1 + eroare relativă)<br />

Eroarea absolută nu ţine seama de ordinul de mărime al valorilor comparate.<br />

De exemplu, o eroare în centimetri este mai importantă dacă lungimea calculată este<br />

de 100 cm, decât dacă este de 100 km. De aceea, eroarea relativă se raportează la<br />

valoarea reală. Adesea eroarea relativă se exprimă în procente:<br />

eroare absolută<br />

. 100 %<br />

valoare exactă<br />

De obicei valoarea exactă nu este cunoscută. De aceea nici eroarea (absolută<br />

sau relativă) nu poate fi calculată, şi doar se estimează valorile limită ale acesteia.<br />

Se utilizează majoranţi pentru modulul erorii (sau norma erorii, dacă se lucrează<br />

într-un spaţiu normat).<br />

Erori ale datelor şi erori de calcul<br />

Considerăm următoarea problemă tipică: calculul valorii unei funcţii f:R→R<br />

pentru un argument dat. Fie:<br />

x<br />

= valoarea de intrare exactă<br />

x* = valoare de intrare aproximativă<br />

f(x) = rezultatul dorit<br />

f* = funcţia aproximativă de calcul<br />

Eroarea totală este dată de:<br />

f*(x*) - f(x) = (f*(x*) - f(x*)) - (f(x*) - f(x))<br />

Deci<br />

10


<strong>Metode</strong> <strong>Numerice</strong><br />

unde,<br />

Eroare totală = eroare de calcul + eroare propagată a datelor,<br />

Eroare de calcul = f*(x*) - f(x*)<br />

Eroare a datelor = x* - x.<br />

Algoritmul nu are nici un efect asupra erorii propagate a datelor.<br />

Erori de trunchiere şi erori de rotunjire<br />

Eroare de trunchiere = diferenţa dintre rezultatul exact (pentru datele de<br />

intrare curente) şi rezultatul furnizat de un algoritm dat utilizând aritmetica exactă.<br />

Eroare de rotunjire = diferenţa dintre rezultatul produs de un algoritm dat<br />

utilizând aritmetica exactă şi rezultatul produs de acelaşi algoritm<br />

aritmetică cu precizie limitată (de exemplu aritmetica virgulei mobile).<br />

utilizând o<br />

Eroarea de calcul este suma dintre eroarea de trunchiere şi eroarea de<br />

rotunjire, dar de obicei una dintre acestea predomină. De exemplu, dacă aproximăm<br />

derivata într-un punct prin<br />

f<br />

f ′( x)<br />

≈ ( x + h ) − f ( x )<br />

h<br />

eroarea de trunchiere este dominată de M , unde M = f ( t)<br />

2<br />

h<br />

sup ′′ pentru t într-o<br />

vecinătate a lui x (acesta rezultă aplicând formula lui Taylor de ordinul doi în x).<br />

Dacă ε domină eroarea cu care se reprezintă valorile lui f, atunci eroarea de<br />

rotunjire în formula de aproximare considerată este mărginită de h<br />

2ε . Deci eroarea<br />

h 2ε<br />

totală este mărginită de E(h) = M + . Studiem variaţia acestei funcţii.<br />

2 h<br />

M 1<br />

Avem E′ ( h)<br />

= -2ε 2 h 2 şi deci ( h)<br />

ε ⎛ ε<br />

E′ = 0 h = 2 . În plus, M ⎟ ⎞<br />

E ′′ ⎜<br />

2 >0,<br />

⎝ M ⎠<br />

deci funcţia are punct de minim în h = 2<br />

M<br />

ε . Ca urmare, eroarea totală este<br />

minimă pentru h ≈ 2<br />

M<br />

ε . Pentru valori mai mici ale lui h eroarea totală creşte din<br />

11


Mădălina Roxana Buneci<br />

cauza creşterii erorii de rotunjire, iar pentru valori mai mari ale lui h eroarea totală<br />

creşte din cauza creşterii erorii de trunchiere.<br />

Erori forward şi erori backward<br />

Să presupunem că dorim să calculăm y = f(x), unde f : R → R, dar obţinem<br />

o valoare aproximativă y*.<br />

Eroare forward absolută = ∆y = y* - y<br />

Eroare forward relativă =<br />

∆ y y * − y = .<br />

y y<br />

Deseori eroarea ∆y este dificil de estimat. Ideea analizei erorilor din punct<br />

de vedere a erorilor backward este următoarea: soluţia aproximativă y* este<br />

considerată soluţia exactă a unei probleme cu datele iniţiale modificate, mai precis<br />

se consideră y* = f(x*), unde x* este o perturbaţie a lui x.<br />

Eroare backward absolută = ∆x = x* - x, unde f(x) = y şi f(x*) = y*.<br />

Eroare backward relativă =<br />

∆ x x * − x = .<br />

x x<br />

Soluţia aproximativă y* se consideră "bună" dacă este soluţie exactă pentru<br />

o problemă cu datele "uşor" perturbate.<br />

este<br />

De exemplu, dacă aproximăm<br />

| ∆y | =| y* - y | = | 2.2 - 2.23606…| ≈ 0.03606<br />

iar eroarea forward relativă este aproximativ 1.6 %.<br />

5 prin y* = 2.2, eroarea forward absolută<br />

Pentru a calcula eroarea backward, observăm că 4 . 84 =2.2. Eroarea backward<br />

absolută este<br />

| ∆x | =| x* - x | = | 4.84 - 5 | ≈ 0.16,<br />

iar eroarea backward relativă este aproximativ 3 %.<br />

12


<strong>Metode</strong> <strong>Numerice</strong><br />

I.2. Condiţionarea numerică. Factor de condiţionare.<br />

Problema se numeşte bine condiţionată dacă variaţiile relative ale soluţiei<br />

au acelaşi ordin de mărime cu variaţiile relative ale datelor de intrare ce le<br />

cauzează.<br />

Problema este rău condiţionată dacă modificările relative care au loc în<br />

soluţie pot fi mult mai mari decât cele ale datelor de intrare.<br />

Factorul de condiţionare (relativ) se defineşte prin:<br />

cond =<br />

variatia relativă a solutiei<br />

variatia relativă a datelor deintrare<br />

Să revenim la calculul y = f(x), unde f : R → R. Să presupunem că se obţine<br />

valoarea aproximativă y*. Fie x* cu proprietatea că f(x*) = y*. Avem<br />

cond =<br />

f ( x *) −f<br />

( x)<br />

f ( x)<br />

=<br />

x * − x<br />

x<br />

∆y<br />

y<br />

.<br />

∆x<br />

x<br />

Problema este rău condiţionată, dacă factorul de condiţionare<br />

cond >> 1.<br />

Factorul de condiţionare acţionează ca un "factor de amplificare" legând<br />

eroarea forward de eroarea backward:<br />

| eroarea relativă forward| = cond × | eroarea relativă backward|<br />

De obicei factorul de condiţionare nu este cunoscut exact şi poate varia în<br />

funcţie de datele de intrare. De aceea se utilizează o estimaţie margine superioară<br />

pentru cond. Deci<br />

| eroarea relativă forward |<br />

< cond × | eroarea relativă backward |.<br />

≈<br />

Considerăm un exemplu de estimare pentru factorul de condiţionare. Să<br />

presupunem că se evaluează funcţia diferenţiabilă f pentru data de intrare x şi se<br />

obţine valoarea aproximativă y* corespunzând valorii<br />

x* = x + ∆x,<br />

(mai precis y* = f(x*)). Eroarea absolută forward este<br />

f(x + ∆x) - f(x) ≈ f ′( x)<br />

∆x<br />

13


Mădălina Roxana Buneci<br />

iar eroarea relativă forward este<br />

Factorul de condiţionare este<br />

cond ≈<br />

f<br />

( x + ∆x) − f ( x)<br />

f ′<br />

≈ ( x ) ∆<br />

f ( x)<br />

f ( x)<br />

f ′<br />

( x)<br />

∆<br />

f ( x)<br />

∆x<br />

x<br />

x<br />

x<br />

x f ′( x)<br />

= .<br />

f ( x)<br />

Factorul de condiţionare absolut se defineşte ca raportul dintre variaţia<br />

soluţiei şi variaţia datelor de intrare. Factorul de condiţionare absolut acţionează ca<br />

un "factor de amplificare" legând eroarea absolută forward de eroarea absolută<br />

backward.<br />

I.3. Stabilitatea algoritmilor<br />

Noţiunea referitoare la algoritmi analoagă condiţionării numerice a<br />

problemelor este stabilitatea. Intuitiv vorbind, stabilitatea numerică a unui<br />

algoritm înseamnă ca acesta este cât mai puţin sensibil la perturbaţiile din timpul<br />

calculului (erorile de rotunjire sau la alte incertitudini numerice care pot apărea în<br />

procesul de calcul). Se spune că un algoritm de rezolvare a unei probleme este<br />

stabil dacă rezultatul produs este soluţia exactă a aceleaşi probleme cu datele "uşor"<br />

perturbate.<br />

În cazul algoritmilor stabili efectul erorii de calcul nu este mai puternic<br />

decât efectul erorii (mici) a datelor de intrare.<br />

Un algoritm instabil poate amplifica mult perturbaţiile date de erorile de<br />

calcul.<br />

Acurateţea metodelor<br />

Acurateţea se referă la apropierea soluţiei calculate de soluţia exactă a<br />

problemei. Stabilitatea algoritmului nu garantează acurateţea. Aceasta depinde în<br />

egală măsură de buna condiţionare a problemei şi de stabilitatea algoritmului.<br />

14


<strong>Metode</strong> <strong>Numerice</strong><br />

Inacurateţea poate rezulta din aplicarea unui algoritm stabil unei probleme rău<br />

condiţionate, ca şi din aplicarea unui algoritm instabil unei probleme bine<br />

condiţionate.<br />

Aplicarea (cu ajutorul calculatorului) unui algoritm stabil unei probleme<br />

bine condiţionată garantează obţinerea soluţiei cu o precizie bună, în sensul că<br />

eroarea relativă a soluţiei calculate faţă de soluţia exactă este de ordinul de mărime<br />

al erorilor de reprezentare a datelor în calculator.<br />

I.4. Complexitatea algoritmilor<br />

În evaluarea complexităţii unui algoritm se ţine cont de două <strong>aspecte</strong><br />

• timpul necesar execuţiei algoritmului (dat de numărul de operaţii elementare)<br />

• spaţiul de memorie necesitat de algoritm<br />

În general nu este posibil să obţinem simultan un timp de execuţie mai scurt precum<br />

şi un necesar de spaţiu de memorare mai mic. Progresele tehnologice din ultima<br />

vreme impun drept criteriu primordial criteriul timp.<br />

Fie n numărul de date de intrare pentru un anumit algoritm (eventual<br />

considerăm n egal cu numărul de locaţii de memorie necesare pentru memorarea<br />

datelor iniţiale). Fie T S (n) timpul cerut de algoritm pentru un anumit set de n date de<br />

intrare S. Vom nota τ(n) timpul cerut de algoritm în cazul cel mai defavorabil, i.e.:<br />

τ(n) = sup {T S (n) : S este un set de date de intrare de dimensiune n }<br />

În general nu este posibil să determinăm o formulă pentru τ(n). În acelaşi timp ne<br />

interesează comportarea lui τ(n) pentru valori mari ale lui n. În acest sens<br />

introducem următoarele notaţii:<br />

• τ(n) = O(f(n)) dacă ∃ C > 0, n 0 ∈ N cu τ(n) ≤ C f(n) ∀ n ≥ n 0<br />

Interpretare: τ are o creştere mai lentă decât f<br />

( )<br />

( )<br />

τ n<br />

• τ(n) = o(f(n)) dacă lim<br />

n→∞<br />

f n<br />

= 0<br />

Interpretare: τ are o creştere strict mai lentă decât f<br />

• τ(n) = θ (f(n)) dacă ∃ C 1 , C 2 > 0, n 0 ∈N cu C 1 f(n) ≤ τ(n) ≤ C 2 f(n) ∀n ≥ n 0<br />

15


Mădălina Roxana Buneci<br />

Interpretare: τ are o creştere la fel de lentă ca f<br />

• τ(n) ~ f(n) dacă<br />

n<br />

( n)<br />

( )<br />

τ<br />

lim = 1<br />

→∞ f n<br />

Interpretare: τ are o creştere la fel de lentă ca f<br />

• τ(n) = Ω(f(n)) dacă f(n) = O(τ(n)<br />

Interpretare: f are o creştere mai lentă decât τ<br />

O şi o se folosesc pentru a stabili marginile superioare ale timpului de<br />

execuţie, iar Ω pentru limita inferioară a timpului de execuţie.<br />

Un algoritm se numeşte algoritm polinomial dacă τ(n) = O(P(n)), unde τ<br />

este timpul cerut de algoritm, iar P este un polinom.<br />

16


<strong>Metode</strong> <strong>Numerice</strong><br />

II. Aproximarea numerelor reale<br />

II. 1. Reprezentarea numerelor întregi într-o bază<br />

Se numeşte bază un număr natural b ∈ N, b ≥ 2. Se numeşte sistem de<br />

numeraţie o mulţime de b simboluri distincte, corespunzătoare mulţimii primelor b<br />

numere naturale: 0, 1,…, b-1. Notăm<br />

S b = {c i : 0 ≤ i ≤ b-1 }<br />

mulţimea acestor simboluri, numite cifre în baza b. De exemplu:<br />

S 2 = {0, 1}<br />

S 16 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}<br />

unde caracterele A, B, C, D, E, F corespund numerelor naturale 10, 11, 12, 13, 14,<br />

15.<br />

În cele ce urmează fixăm o bază b şi notăm<br />

B = {0, 1, …, b-1 }<br />

şi B k = B pentru orice k∈ N. Fie mulţimea A n = ∏ B<br />

n<br />

k=<br />

0<br />

k<br />

înzestrată cu ordinea<br />

lexicografică. Reamintim că această relaţie de ordine se defineşte în felul următor:<br />

(α n , α n-1 , …, α 0 ) < (β n , β n-1 , …, β 0 )<br />

def<br />

există k∈{0, 1, …, n} astfel încât<br />

α k < β k şi α i = β i pentru i = k + 1, n .<br />

Considerăm funcţia f n : A n → {0, 1, …, b n+1 -1 } definită prin<br />

f n (α n , α n-1 , …, α 0 ) = α n b n + α n-1 b n-1 + … + α 2 b 2 + α 1 b + α 0 .<br />

Demonstrăm că funcţia f n este bijectivă. Arătăm pentru început că f n este strict<br />

crescătoare, deci este injectivă. Apoi, ţinând cont că mulţimile {0, 1, …, b n+1 -1} şi<br />

A n sunt mulţimi finite cu acelaşi cardinal (număr de elemente) va rezulta că de fapt<br />

f n este o bijecţie. Fixăm două elemente din A n , α=(α n , α n-1 , …, α 0 ) şi β = (β n , β n-1 ,<br />

17


Mădălina Roxana Buneci<br />

…, β 0 ), cu α < β. Deoarece α < β, rezultă că există k∈{0, 1, …, n} astfel încât α i =<br />

β i pentru i = k + 1, n şi α k < β k (de unde rezultă că α k ≤ β k - 1). Avem<br />

f n (α 0 , α 1 , …, α n ) = α n b n + α n-1 b n-1 + … + α k+1 b k+1 + α k b k +α k-1 b k-1 + … + α 1 b + α 0<br />

= β n b n + β n-1 b n-1 + … + β k+1 b k+1 + α k b k + α k-1 b k-1 + … + α 1 b + α 0<br />

≤ β n b n + β n-1 b n-1 + … + β k+1 b k+1 + (β k -1)b k +(b -1)b k-1 + …+ (b-1)<br />

= β n b n + β n-1 b n-1 + …+ β k+1 b k+1 +(β k -1)b k +(b -1)(b k-1 + … + b +1)<br />

= β n b n + β n-1 b n-1 + … + β k+1 b k+1 + β k b k - b k + (b -1)<br />

b k − 1<br />

b −1<br />

= β n b n + β n-1 b n-1 + … + β k+1 b k+1 + β k b k - 1<br />

< β n b n + β n-1 b n-1 + … + β k+1 b k+1 + β k b k<br />

≤ f n (β)<br />

În consecinţă, α < β implică f n (α) < f n (β), deci f n este strict crescătoare.<br />

Folosind bijectivitatea funcţiei f n demonstrăm următoarea teoremă:<br />

Teorema 2.1. Fie b o bază (adică b ∈ N, b ≥ 2). Orice număr natural nenul x<br />

poate fi scris în mod unic sub forma<br />

x = α n b n + α n-1 b n-1 + … + α 2 b 2 + α 1 b + α 0 , cu α n ≠ 0.<br />

şi α 0 , α 1 , …., α n ∈ {0, 1, …, b-1 }.<br />

Demonstraţie. Conform principiului multiplicativ al lui Arhimede, pentru<br />

număr natural nenul x există un număr natural n ≥ 1 astfel încât:<br />

b n ≤ x < b n+1 .<br />

De aici rezultă că există un singur număr natural n ≥ 1 astfel încât<br />

x ∈ {0, 1, …, b n+1 -1 } - {0, 1, …, b n -1 }.<br />

Deoarece x∈{0, 1, …, b n+1 -1 } şi f n : A n → {0, 1, …, b n+1 -1 } este bijectivă, există<br />

un unic element α = (α n , α n-1 , …, α 0 ) în A n astfel încât x = f n (α) sau echivalent<br />

x = α n b n + α n-1 b n-1 + … + α 2 b 2 + α 1 b + α 0 .<br />

Dacă α n ar fi nul, atunci<br />

x = α n-1 b n-1 + … + α 2 b 2 + α 1 b + α 0<br />

≤ (b -1)b n-1 + … + (b -1)b 2 + (b -1)b + (b -1)<br />

= (b -1) (b n-1 + …b 2 + b + 1)<br />

18


<strong>Metode</strong> <strong>Numerice</strong><br />

= (b -1)<br />

b n −1<br />

b −1<br />

< b n ,<br />

ceea ce contrazice alegerea lui n. Deci α n ≠ 0.<br />

Dacă ar exista două reprezentări<br />

x = α n b n + α n-1 b n-1 + … + α 2 b 2 + α 1 b + α 0 , cu α n ≠ 0.<br />

= β m b m + β m-1 b m-1 + … + β 2 b 2 + β 1 b + β 0 , cu β m ≠ 0.<br />

cu α 0 , α 1 , …., α n , β 0 , β 1 , …., β m ∈ {0, 1, …, b-1 }, atunci<br />

b n ≤ x < b n+1 şi b m ≤ x < b m+1<br />

şi în consecinţă, n = m. Deoarece f n este injectivă şi<br />

f n (α n , α n-1 , …, α 0 ) = f n (β n , β n-1 , …β 0 ),<br />

avem (α n , α n-1 , …, α 0 ) = (β n , β n-1 , …β 0 ), şi ca urmare reprezentarea x lui este<br />

unică.<br />

<br />

Plecând de la observaţia următoare<br />

x = α n b n + α n-1 b n-1 + … + α 2 b 2 + α 1 b + α 0<br />

= ( ( …(α n b + α n-1 )b + … + α 2 )b + α 1 )b + α 0<br />

deducem faptul că reprezentarea sub forma din teorema 1 a unui număr natural<br />

nenul x se poate face prin împărţiri succesive la b şi reţinerea resturilor de la sfârşit<br />

spre început:<br />

x = bq 0 + α 0 , 0 ≤ α 0 < b, q 0 ≠ 0<br />

q 0 = bq 1 + α 1 , 0 ≤ α 1 < b, q 1 ≠ 0<br />

q n-1 = b q n + α n , 0 ≤ α n < b, q n = 0<br />

Scrierea lui x sub forma din teorema 1 se numeşte reprezentarea lui x în baza b.<br />

Trecerea unui număr dintr-o bază în alta se numeşte conversie. Convenim să scriem<br />

bază în care este reprezentat un număr ca indice. De exemplu numărul 47 10 se scrie<br />

în baza 2 astfel:<br />

19


Mădălina Roxana Buneci<br />

47 = 23 ⋅ 2 + 1 47 2<br />

23 = 11 ⋅ 2 + 1 46 23 2<br />

11 = 5 ⋅ 2 + 1 sau 1 22 11 2<br />

5 = 2 ⋅ 2 + 1 1 10 5 2<br />

2 = 1 ⋅ 2 + 0 1 4 2 2<br />

1 = 0 ⋅ 2 + 1 1 2 1<br />

0<br />

Deci 47 10 = 101111 2 .<br />

Conversia de la baza b la baza 10 se face prin însumarea puterilor lui b<br />

înmulţite cu cifrele din baza b corespunzătoare. De exemplu, numărul 127 8 şi 1A8 16<br />

se scriu în baza 10 astfel:<br />

127 8 = 7 × 8 0 + 2 × 8 1 + 1 × 8 2 = 87 10<br />

1A8 16 = 8 × 16 0 + A × 16 1 + 1 × 16 2 = 8 × 16 0 + 10 × 16 1 + 1 × 16 2 = 424 10 .<br />

Conversia unui număr întreg dintr-o bază b 1 într-o bază b 2 se face prin<br />

intermediul bazei 10. În cazul particular, în care baza b 1 care este o putere a lui b 2<br />

sau invers, conversia se poate face şi direct.<br />

Fie b 1 = b k , cu k ≥ 1. Conversia de la baza b 1 = b k la baza b corespunde<br />

dezvoltării fiecărei cifre din reprezentare în echivalentul ei în baza b utilizând k<br />

cifre (adăugând eventual zerouri în faţă). De exemplu,<br />

172 8 = 001111010 2 = 1111010 2 ,<br />

deoarece 8 = 2 3 şi 1 8 = 001 2 , 2 8 = 010 2 , 7 8 = 111 2<br />

4E 16 = 01001110 2 = 1001110 2 ,<br />

deoarece 16 = 2 4 şi 4 16 = 0100 2 , E 16 = 1110 2 .<br />

Conversia de la baza b la baza b 1 = b k se realizează înlocuind de la dreapta<br />

la stânga grupele de k cifre din baza b prin cifra în baza b 1 corespunzătoare. Dacă<br />

numărul de cifre nu este multiplu de k se completează configuraţia la stânga cu<br />

zerouri. De exemplu,<br />

1 011 1102<br />

= 136 8<br />

<br />

1<br />

3<br />

6<br />

1010 01112<br />

= A7 16 .<br />

<br />

A<br />

7<br />

20


<strong>Metode</strong> <strong>Numerice</strong><br />

II. 2. Reprezentarea numerelor reale într-o bază<br />

Pentru scrierea unui număr real şi pozitiv în baza b considerăm mulţimea<br />

C = N* × ∏ B<br />

cu B k = {0, 1, …, b-1 }, şi funcţia F : C → (0, ∞) definită prin<br />

k≥1<br />

k<br />

α<br />

Seria ∑<br />

b<br />

n≥1<br />

n<br />

n<br />

F(α 0 , α 1 , …, α n , …) = α 0 + ∑ ∞<br />

n=<br />

este convergentă, pentru că 0 ≤<br />

1<br />

α<br />

n<br />

n<br />

b .<br />

α<br />

n<br />

n ≤ (b-1)<br />

n<br />

b<br />

1 1 şi ∑ n<br />

b b<br />

n≥1<br />

este<br />

convergentă (fiind o serie geometrică cu raţia b<br />

1 pozitivă şi subunitară). Deci F<br />

este corect definită.<br />

Teorema 2.2. Fie b o bază şi F : C → [0, ∞) funcţia definită mai sus. Atunci<br />

1. F este surjectivă<br />

v<br />

2. Pentru orice număr real x > 0 care nu este de forma<br />

n cu v∈N şi<br />

b<br />

n∈ N * există un unic α ∈ C astfel încât F(α) = x.<br />

v<br />

3. Dacă numărul real x > 0 este de forma<br />

n cu v∈N şi n∈ N * , atunci<br />

b<br />

există două elemente α, β ∈ C cu α ≠ β astfel încât F(α) = F(β) = x.<br />

În plus, dacă γ∈ C are proprietatea că F(γ) = x, atunci γ = α sau γ =<br />

β.<br />

Demonstraţie. În cele ce urmează notăm cu [y] partea întreagă a numărului<br />

real y, adică cel mai mare număr întreg mai mic sau egal cu y.<br />

1. Considerăm x ∈ (0, ∞) şi construim α ∈ C astfel încât F(α) = x. Pentru<br />

orice n ∈ N, notăm q n = [xb n ]. Din definiţia părţii întregi rezultă q n ≤ xb n < q n + 1,<br />

sau echivalent<br />

q<br />

b<br />

n<br />

n<br />

≤ x <<br />

q<br />

b<br />

n<br />

n<br />

+<br />

n<br />

b<br />

1 q<br />

, ceea ce implică 0 ≤ x -<br />

n<br />

n<br />

b<br />

<<br />

n<br />

şi lim<br />

b1<br />

n→∞<br />

x. Pe de altă parte, înmulţind inegalitatea q n ≤ xb n < q n + 1 cu b şi ţinând cont că<br />

[xb n+1 ] = q n+1 , obţinem<br />

q<br />

n<br />

b n<br />

=<br />

21


Mădălina Roxana Buneci<br />

bq n ≤ q n+1 < bq n + b<br />

0 ≤ q n+1 - bq n < b<br />

Luăm α 0 = [x] şi α n = q n - b q n-1 pentru orice n ≥1. Evident α 0 ∈ N şi 0 ≤ α n ≤ b-1.<br />

Demonstrăm că F(α 0 , α 1 , …, α n , …) = x. Pentru aceasta este suficient să<br />

demonstrăm că ∑ ∞ α<br />

n=<br />

0 b<br />

n<br />

n<br />

= x. Considerăm o sumă parţială a acestei serii:<br />

n<br />

s n =∑<br />

k=<br />

0<br />

α<br />

b<br />

k<br />

k<br />

= α n<br />

q<br />

0 + ∑<br />

k=<br />

1<br />

k<br />

− bq<br />

b<br />

k<br />

k−1<br />

n<br />

⎛ q<br />

= α 0 + ∑⎜<br />

k=<br />

1⎝<br />

b<br />

k<br />

k<br />

q<br />

−<br />

b<br />

k − 1<br />

k−1<br />

⎞ q<br />

n<br />

q<br />

⎟ = α 0 +<br />

n -<br />

0<br />

q<br />

0 =<br />

n<br />

⎠ b b b n .<br />

Din<br />

lim<br />

n→∞<br />

q = x, rezultă că lim s n = x.<br />

n→∞<br />

n<br />

n<br />

b<br />

v<br />

2. Fie x > 0 un număr real care nu este de forma<br />

n cu v∈N şi n∈ N * .<br />

b<br />

Presupunem prin absurd că în afara elementului α ∈ C construit anterior mai există<br />

β ∈ C astfel încât F(β)= x, sau echivalent ∑ ∞ β<br />

n=<br />

0 b<br />

n<br />

n<br />

= x. Dacă notăm t n<br />

β<br />

n = ∑<br />

b<br />

k=<br />

0<br />

k<br />

k<br />

suma<br />

parţială de ordin n a acestei serii, atunci t n ≤ x şi x = ∑ ∞<br />

=<br />

n<br />

0<br />

β<br />

b<br />

n<br />

n<br />

n<br />

β<br />

= ∑<br />

b<br />

k=<br />

0<br />

k<br />

k<br />

+<br />

∑ ∞<br />

k=<br />

n+<br />

1<br />

β<br />

b<br />

k<br />

k<br />

≤ n<br />

β<br />

∑<br />

b<br />

k=<br />

0<br />

k<br />

k<br />

+ (b-1) ∑ ∞<br />

k= n+<br />

1 b<br />

1 1 b<br />

k = tn + (b-1)<br />

n+ 1<br />

b b 1<br />

− = t n +<br />

n<br />

1 . Deci<br />

b<br />

t n ≤ x ≤ t n +<br />

1<br />

n .<br />

b<br />

Dar x nu poate fi egal cu t n +<br />

N * . În consecinţă t n ≤ x < t n +<br />

că t n b n ∈ N, rezultă că [xb n ] = t n b n q<br />

. Ca urmare t n =<br />

b<br />

1 v pentru că x nu este de forma<br />

n cu v∈N şi n∈<br />

b<br />

n<br />

b<br />

1<br />

n şi tn b n ≤ xb n < t n b n + 1. Ţinând cont şi de faptul<br />

b<br />

n<br />

n<br />

n<br />

=∑<br />

k=<br />

0<br />

α<br />

b<br />

k<br />

k<br />

suma parţială a<br />

α<br />

seriei ∑<br />

b<br />

n≥0<br />

n<br />

n<br />

. Seriile α<br />

∑<br />

b<br />

n≥0<br />

generali egali şi deci α = β.<br />

n<br />

n<br />

β<br />

şi ∑<br />

b<br />

n≥0<br />

n<br />

n<br />

având sumele parţiale egale au termenii<br />

22


<strong>Metode</strong> <strong>Numerice</strong><br />

v<br />

3. Fie x > 0 un număr real de este de forma<br />

n<br />

b<br />

cu v∈N şi n∈ N * . Fie n 0 cel<br />

mai mic număr natural cu proprietatea că există v 0 natural astfel încât x =<br />

n0<br />

n0<br />

Utilizând relaţiile stabilite la punctul 1, obţinem q<br />

n<br />

= [x b ] = x b<br />

0<br />

q<br />

b<br />

n 0<br />

n 0<br />

=<br />

v<br />

0<br />

n 0<br />

= x. Deci<br />

α = (α 0 , α 1 , …, α<br />

n0<br />

b<br />

, 0,0, …).<br />

v<br />

0<br />

n .<br />

b 0<br />

n 0<br />

α<br />

k<br />

= v 0 şi ∑ k<br />

b =<br />

Demonstrăm că α<br />

n<br />

≠ 0. Presupunând prin absurd că α<br />

0<br />

n<br />

= 0, ar rezulta că x =<br />

0<br />

n0<br />

∑ − 1<br />

α<br />

k<br />

k<br />

k=<br />

0<br />

b = w<br />

0<br />

n 0 − 1<br />

b<br />

ceea ce ar contrazice alegerea lui n 0. Luând<br />

obţinem<br />

β = (α 0 , α 1 , …, α<br />

n0<br />

-1, b -1, b -1, …).<br />

k=<br />

0<br />

∑ ∞<br />

n=<br />

0<br />

β<br />

b<br />

n<br />

n<br />

n = 0<br />

α<br />

∑<br />

b<br />

k=<br />

0<br />

k<br />

k<br />

-<br />

1 + ∑ ∞<br />

k=<br />

n +<br />

b n 0<br />

b −1<br />

k<br />

0 1 b<br />

= x -<br />

b n 0<br />

1 + (b-1) ∑ ∞<br />

k n +<br />

1<br />

k<br />

= 0 1 b<br />

= x -<br />

1 1 + (b-1)<br />

+ 1<br />

b n 0<br />

b n 0<br />

b<br />

b − 1<br />

= x.<br />

Deci F(β) = x şi α ≠ β. În continuare presupunem că există γ∈ C cu proprietatea că<br />

F(γ) = x. Fie n un număr natural cu proprietatea că există m > n astfel încât γ m < b-1.<br />

Atunci avem<br />

∑ ∞<br />

i=<br />

n+<br />

1<br />

γ<br />

i<br />

i<br />

b < (b-1) ∑ ∞ +<br />

i= n 1<br />

Ţinând cont de reprezentarea lui x sub forma x =∑ ∞<br />

=<br />

xb n = b n n<br />

γ<br />

i<br />

∑ i<br />

b + bn ∑ ∞ γ<br />

= + b<br />

i=<br />

0<br />

i n 1<br />

i<br />

i<br />

1<br />

i = n<br />

b<br />

i 0<br />

b<br />

1 .<br />

γ<br />

i<br />

i<br />

b , obţinem<br />

=<br />

n<br />

n<br />

∑<br />

− i<br />

b γ<br />

i<br />

+ b n ∑ ∞ γ<br />

i<br />

i<br />

= + b .<br />

i=<br />

0<br />

i n 1<br />

23


Mădălina Roxana Buneci<br />

n<br />

n<br />

Numărul ∑<br />

− i<br />

b γ<br />

i<br />

este natural, iar b n ∑ ∞ γ<br />

i<br />

i<br />

= + b ∈ [0, 1). Deci n<br />

∑ b<br />

i=<br />

0<br />

raţionament similar, obţinem că ∑ b<br />

k<br />

i=<br />

0<br />

i n 1<br />

k − i<br />

γ<br />

i<br />

aproape se obţine<br />

α 0 = [xb 0 ] = γ 0<br />

α 1 = [xb 1 ] - b[xb 0 ] = γ 0 b + γ 1 - bγ 0 => α 1 = γ 1<br />

i=<br />

0<br />

n − i<br />

γ<br />

i<br />

= [xb n ]. Cu un<br />

= [xb k ] pentru orice k ≤ n. Din aproape în<br />

α n = [xb n ] - b[xb n-1 ] = ∑<br />

Există două cazuri posibile<br />

γ<br />

n N<br />

(i)<br />

< b-1).<br />

n<br />

− n<br />

n i<br />

b γ<br />

i<br />

- b∑ − 1<br />

i=<br />

0<br />

i=<br />

0<br />

b<br />

n − i<br />

γ<br />

i<br />

= γ n => α n = γ n<br />

Există un număr natural N astfel încât γ n = b-1 oricare n ≥ N+1.<br />

(ii) Oricare ar fi N există n N ≥ N+1 astfel încât γ<br />

n N<br />

≠ b-1 (sau echivalent,<br />

Presupunem că are loc cazul (i) şi considerăm N 0 cel mai mic număr natural<br />

cu proprietatea indicată. Din cele demonstrate mai sus rezultă că α i = γ i pentru orice<br />

i ≤ N 0 -1 (deoarece γ<br />

N<br />

< (b-1)). Demonstrăm că γ = β. Avem<br />

0<br />

x = ∑ ∞<br />

=<br />

n<br />

0<br />

γ<br />

b<br />

n<br />

n<br />

N = 0<br />

γ<br />

∑<br />

b<br />

k=<br />

0<br />

k<br />

k<br />

+ ∑ ∞<br />

= +<br />

k N0 1 b<br />

N<br />

b −1<br />

0<br />

γ<br />

=<br />

k ∑<br />

b<br />

k=<br />

0<br />

k<br />

k<br />

+ (b-1) ∑ ∞ +<br />

1<br />

k<br />

k= N0 1 b<br />

N 0<br />

=∑<br />

k=<br />

0<br />

γ<br />

k<br />

k<br />

b + (b-1) 1<br />

1 b<br />

b N 0 +<br />

b − 1<br />

N = 0<br />

γ<br />

k<br />

∑ k<br />

k=<br />

0 b + w<br />

N =<br />

0 N .<br />

0<br />

b1<br />

b<br />

şi deci n 0 ≤ N 0 . Presupunând prin absurd că n 0 < N 0 , se obţine următoarea<br />

contradicţie<br />

n 0<br />

x =∑<br />

k=<br />

0<br />

Utilizând în continuarea egalitatea x = ∑ ∞<br />

=<br />

α<br />

b<br />

k<br />

k<br />

n < 0<br />

α<br />

k<br />

∑ k<br />

k=<br />

0 b + ∑ ∞ γ<br />

k<br />

k<br />

k=<br />

n0 + 1 b = ∑ ∞ γ<br />

n=<br />

0 b<br />

n<br />

0<br />

γ<br />

n<br />

n<br />

b = ∑ ∞<br />

=<br />

n<br />

0<br />

n<br />

n<br />

= x<br />

α<br />

n<br />

n<br />

b , se obţine γ<br />

N<br />

= α<br />

0 N<br />

-1, şi<br />

0<br />

deci α=β.<br />

Dacă are loc cazul (ii), atunci evident α n = γ n pentru orice n, şi deci γ = α.<br />

<br />

24


<strong>Metode</strong> <strong>Numerice</strong><br />

Definiţie 2.3. Reprezentarea x = ∑ ∞<br />

=<br />

n<br />

0<br />

α<br />

b<br />

n<br />

n<br />

în baza b a numărului real x > 0 se<br />

numeşte periodică dacă există un numerele naturale N, p astfel încât<br />

α t = α t+p+1 pentru orice t ≥ N.<br />

În această situaţie se foloseşte următoarea notaţie<br />

x = α 0 , α 1 α 2 …α N-1 (α N α N+1 …α N+p ).<br />

Teoremă 2.4. Fie b o bază (adică b ∈ N, b ≥ 2). Un număr real x > 0 este<br />

raţional dacă şi numai dacă x admite o reprezentare periodică în baza b.<br />

Demonstraţie. Presupunem că x admite reprezentarea periodică<br />

x = α 0 , α 1 α 2 …α N-1 (α N α N+1 …α N+p ).<br />

Atunci<br />

x = ∑ ∞ α<br />

n<br />

n<br />

= b = N<br />

∑ − 1 N<br />

α<br />

n<br />

n<br />

n=<br />

0 b + ∑ +<br />

n=<br />

n<br />

0<br />

N 1<br />

α<br />

n<br />

n<br />

0<br />

= ∑ −<br />

n=<br />

b + ∑ +<br />

n=<br />

N p<br />

α<br />

n<br />

n ∑ ∞<br />

N b n=<br />

0<br />

b<br />

p<br />

α<br />

n<br />

n<br />

N b<br />

1<br />

( p+<br />

1)<br />

n<br />

⎛<br />

⎜<br />

⎝<br />

1 1 1 ⎞<br />

+<br />

( )<br />

+ ... +<br />

( )<br />

+ ...<br />

p + 1 2 p+<br />

1<br />

n p<br />

⎟<br />

b b b ⎠<br />

1 +<br />

+ 1<br />

N 1<br />

α<br />

n<br />

n<br />

0<br />

= ∑ −<br />

n=<br />

b + ∑ +<br />

n=<br />

N p<br />

α<br />

n<br />

n<br />

N<br />

p+<br />

1<br />

b<br />

,<br />

p+<br />

1<br />

b b −1<br />

de unde rezultă că x este un număr raţional.<br />

i<br />

Reciproc să considerăm un număr raţional x = , cu i şi j numere naturale, j<br />

j<br />

≠ 0. Demonstrăm că reprezentarea x = ∑ ∞ α<br />

n=<br />

0 b<br />

n<br />

n<br />

în baza b este periodică. Dacă x este<br />

de forma<br />

v<br />

n cu v∈N ne vom referi la acea reprezentare care are proprietatea că<br />

b<br />

oricare ar fi N există n N ≥ N+1 astfel încât<br />

α<br />

n N<br />

≠ b-1. Atunci avem<br />

α 0 = [x] şi α n = [xb n ] - b[xb n-1 ], n ≥ 1,<br />

şi aşa cum am observat în demonstraţia teoremei 2<br />

Notăm<br />

Se observă că<br />

α 0 = [x] = [x 0 ]<br />

n<br />

∑<br />

i=<br />

0<br />

b = [xb n ] pentru orice n.<br />

n − i<br />

α<br />

i<br />

x 0 = x, x n+1 = b(x n - α n ), n ≥ 0.<br />

25


Mădălina Roxana Buneci<br />

α 1 + α 0 b = [xb] => α 1 = [(x-α 0 )b] = [x 1 ]<br />

α 2 + bα 1 + b 2 α 0 = [xb 2 ] => α 2 = [((x-α 0 )b - α 1 )b] = [(x 1 -α 1 )b] = [x 2 ]<br />

şi folosind un raţionament prin inducţie obţine α n = [x n ] pentru orice n ≥ 0.<br />

Ţinem cont că x = j<br />

i<br />

şi notăm cu u 0 restul împărţirii lui i la j, şi cu u n restul<br />

împărţirii lui bu n-1 la j pentru n ≥ 0. Raţionând prin inducţie obţinem că x n =<br />

bu n−1<br />

j<br />

pentru orice n ≥ 1. Deoarece u n reprezintă restul unei împărţiri la j, u n ∈ {0, 1,…, j-<br />

1} ceea ce arată că există N şi p naturale astfel încât u N = u N+p+1 . De aici rezultă x N<br />

= x N+p+1 şi α N = α N+p+1 . Mai departe avem x N+1 = b(x N - α N ) = b(x N+p+1 - α N+p+1 ) =<br />

x N+p+2 şi deci α N+1 = α N+p+2 . Folosind un raţionament prin inducţie după t, se<br />

demonstrează că α N+t = α N+p+1+t , t ≥ 0. În consecinţă, reprezentarea lui x este<br />

periodică.<br />

Aşa cum am observat în demonstraţia teoremei precedente, pentru scrierea<br />

unui număr real pozitiv x în baza b se procedează în felul următor. Se scrie<br />

x = [x] + {x}, 0 ≤ {x} < 1,<br />

unde prin [x] am notat partea întreagă a lui x, iar prin {x} partea fracţionară a lui x.<br />

Conversia numărului real pozitiv x de la baza 10 la baza b se face separat pentru<br />

partea întreagă (care este un număr întreg) şi partea fracţionară. Conversia părţii<br />

fracţionare se face prin înmulţiri repetate cu b, după cum urmează:<br />

b ⋅{x} = x 1 = [x 1 ] +{x 1 }= α 1 + {x 1 }<br />

b ⋅ {x 1 } = x 2 = [x 2 ] +{x 2 }= α 2 + {x 2 }<br />

<br />

b ⋅ {x n-1 } = x n = [x n ] +{x n }= α n + {x n }<br />

ceea ce înseamnă că {x} se reprezintă : {x} b = 0, α 1 α 2 …α n …<br />

În urma acestor înmulţiri repetate, pot apare trei situaţii:<br />

26


<strong>Metode</strong> <strong>Numerice</strong><br />

1. {x n }= 0, ceea ce determină încheierea algoritmului; în această situaţie {x} se<br />

n<br />

α<br />

poate reprezenta exact prin 0, α 1 α 2 …α n = ∑<br />

b<br />

k=<br />

1<br />

k<br />

k<br />

(această situaţie<br />

corespunde cazului x =<br />

v<br />

n cu v∈N şi n∈ N * ).<br />

b<br />

2. {x n } ≠ 0, dar se observă o periodicitate, adică una sau un grup de cifre care<br />

se repetă ( această situaţie corespunde cazului x raţional dar x ≠<br />

orice v∈N şi m∈ N * ).<br />

v<br />

m<br />

b<br />

pentru<br />

3. {x n } ≠ 0, iar cifrele obţinute se succed fără a respecta vreo regulă ( această<br />

situaţie corespunde cazului x iraţional). În această situaţie 0,α 1 α 2 …α n<br />

n<br />

=∑<br />

k=<br />

1<br />

α<br />

b<br />

k<br />

k<br />

reprezintă doar o aproximaţie pentru {x} în baza b.<br />

Exemplu : Să se reprezinte 5,125 în baza 2.<br />

5,125 = 5 + 0,125<br />

Deci 5 10 = 101 2<br />

5 2<br />

4 2 2<br />

1 2 1<br />

0,125 × 2 = 0,25 = 0 + 0,25<br />

0,25 × 2 = 0,5 = 0 + 0,5<br />

0<br />

0,5 × 2 = 1 = 1 + 0<br />

Deci 0,125 10 = 0,001 2 . În consecinţă 5,125 10 = 101,001 2 .<br />

27


Mădălina Roxana Buneci<br />

28


<strong>Metode</strong> <strong>Numerice</strong><br />

III. Reprezentarea informaţiei în sistemele de calcul<br />

III.1. Reprezentarea internă a numerelor întregi<br />

III. 1.1. Reprezentarea internă a numerelor întregi fără semn (pozitive)<br />

Reprezentarea în memoria unui calculator a numerelor întregi depinde de<br />

lungimea cuvântului utilizat (numărul de biţi). Pentru a reprezenta un număr întreg<br />

pozitiv pe k biţi se face conversia numărului respectiv la baza 2, iar configuraţia<br />

binară obţinută se completează la stânga cu zerouri până se obţin k cifre. Cel mai<br />

mare număr întreg reprezentabil pe k biţi este<br />

11 ...1 2 = 2<br />

<br />

k-1 + 2 k-2 +…+ 2 0 =<br />

k ori<br />

2 k − 1 = 2 k – 1<br />

2 −1<br />

Deci pe k biţi se pot reprezenta numerele întregi cuprinse între 0 şi 2 k – 1, în total 2 k<br />

numere.<br />

Exemple:<br />

k<br />

Domeniul de valori<br />

8 biţi = 1 B (byte) 0…255<br />

16 biţi = 2 B 0….65 535<br />

32 biţi = 4 B 0….2 147 483 647<br />

Reprezentarea numărului 62 10 pe k = 8 biţi se face astfel:<br />

62 = 2 5 + 2 4 + 2 3 + 2 2 +2 = 111110 2 = 00111110 2<br />

29


Mădălina Roxana Buneci<br />

7 0<br />

0 0 1 1 1 1 1 0 → 3E (în hexazecimal)<br />

3 E<br />

În reprezentarea binară a numerelor, ponderile cifrelor binare cresc de la dreapta la<br />

stânga, numerotarea lor corespunzând puterilor crescătoare ale bazei de numeraţie<br />

2. Astfel, prima cifră binară din dreapta reprezintă ponderea 2 0 şi este bitul cel mai<br />

puţin semnificativ. Primul bit din stânga este bitul cel mai semnificativ.<br />

Notăm cu ≺ relaţia de ordine lexicografică pe mulţimea şirurilor formate din 0 şi 1,<br />

de lungime k. Din punct de vedere al ordinii lexicografice, reprezentările numerelor<br />

întregi fără semn satisfac:<br />

0 ≺ 1 ≺ … ≺ 2 k - 1<br />

În consecinţă, relaţia de ordine lexicografică este compatibilă cu relaţia de ordine<br />

numerică naturală.<br />

III.1.2. Reprezentarea internă a numerelor întregi (cu semn)<br />

Vom prezenta trei metode de codificare a numerelor întregi cu semn:<br />

• cod direct (semn şi valoare absolută)<br />

• cod invers (complement faţă de 1)<br />

• cod complementar (complement faţă de 2)<br />

Să presupunem că se rezervă k biţi pentru reprezentarea unui număr întreg. Prin<br />

toate cele metode numerele întregi pozitive se codifică prin conversie în baza 2 pe<br />

k-1 biţi şi completarea primului bit cu zero. Astfel, pentru k = 16 reprezentarea<br />

internă a numărului x = 72 10 = 2 6 + 2 3 = 1001000 2 este :<br />

0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 → 0048 (în hexazecimal)<br />

0 0 4 8<br />

30


<strong>Metode</strong> <strong>Numerice</strong><br />

Mulţimea numerelor întregi nenegative reprezentabile pe k biţi (prin oricare din cele<br />

trei metode) este {0, 1, 2, ..., 2 k-1 -1} (deoarece primul bit este rezervat, iar<br />

reprezentarea se face doar pe restul de k-1 biţi).<br />

Prezentăm mai departe modul în care se face codificarea numerelor întregi<br />

negative prin fiecare din cele trei metode.<br />

Prin metoda semn şi valoare (cod direct) se codifică valoarea absolută a<br />

numărului întreg negativ pe k-1 biţi şi se completează primul bit cu 1. În consecinţă,<br />

mulţimea numerelor întregi negative care se pot reprezenta prin această metodă<br />

este{-2 k-1 + 1, -2 k-1 + 2, ...., 0}. Această metodă de reprezentare prezintă unele<br />

inconveniente:<br />

• zero are două reprezentări distincte (00…0 şi 10…0), ca +0 şi –0<br />

• tabelele de adunare şi înmulţire sunt complicate datorită bitului de semn care<br />

trebuie tratat separat.<br />

Din punct de vedere al ordinii lexicografice avem:<br />

+0 ≺ 1 ≺ … ≺ 2 k-1 -1 ≺ -0 ≺ -1 ≺ … ≺ -(2 k-1 -1)<br />

Deci relaţia de ordine lexicografică nu este compatibilă cu relaţia<br />

naturală.<br />

de ordine<br />

Pentru a obţine codul invers:<br />

1. se obţine reprezentarea valorii absolute a numărului întreg negativ pe<br />

k biţi<br />

2. în reprezentarea obţinută (la pasul 1) se înlocuieşte fiecare bit 0 cu 1<br />

şi 1 cu 0<br />

Mulţimea numerelor întregi cu semn care pot fi reprezentate prin această metodă<br />

este acelaşi ca pentru metoda precedentă : {-2 k-1 + 1, -2 k-1 + 2, ...., 0, 1, ...., 2 k-1 -1}.<br />

Dacă notăm cu x complementul faţă de 1 al numărului x, atunci<br />

x + x = 11....<br />

1 <br />

2 = 2 k - 1<br />

k<br />

31


Mădălina Roxana Buneci<br />

În consecinţă, complementul faţă de 1 poate fi folosit pe post de opus faţă de<br />

operaţia de adunare. Din acest motiv operaţiile aritmetice relativ la această<br />

reprezentare sunt avantajoase, deoarece operaţia de scădere se realizează prin<br />

adunarea complementului faţă de 1. Un dezavantaj al acestei reprezentări este<br />

recunoaşterea a două zerouri (11…1 şi 00..0).<br />

Din punct de vedere al ordinii lexicografice avem:<br />

+0 ≺ 1 ≺ … ≺ 2 k-1 -1 ≺ -(2 k-1 -1) ≺ -(2 k-1 -2) ≺ … ≺ -0<br />

Deci relaţia de ordine lexicografică nu este compatibilă cu relaţia<br />

naturală.<br />

de ordine<br />

Pentru a obţine codul complementar:<br />

1. se obţine codul invers pe k biţi<br />

2. se adună o unitate la valoarea obţinută (la pasul 1)<br />

Zero admite o singură reprezentare prin această metodă: ( 00 ...0 ).Mulţimea<br />

k<br />

numerelor întregi cu semn care pot fi reprezentate prin această metodă este<br />

{-2 k-1 , -2 k-1 + 2, ...., 0, 1, ...., 2 k-1 -1}.<br />

Dacă x este complementul faţă de doi al lui x, atunci<br />

x + x = 11 .... 1 2 + 1 = 2 k - 1 + 1 = 2 k<br />

k<br />

Şi în cazul acestei reprezentări operaţiile aritmetice sunt avantajoase, deoarece<br />

operaţia de scădere se realizează prin adunarea complementului faţă de 2.<br />

Din punct de vedere al ordinii lexicografice avem:<br />

+0 ≺ 1 ≺ … ≺ 2 k-1 -1 ≺ -2 k-1 ≺ -(2 k-1 -1) ≺ -(2 k-1 -2) ≺ … ≺ -1<br />

Deci relaţia de ordine lexicografică nu este compatibilă cu relaţia<br />

naturală.<br />

de ordine<br />

De exemplu, pentru k = 16, reprezentările pentru x = -72 prin cele trei metode se<br />

obţin după cum urmează:<br />

72 10 = 1001000 2 =1001000 2<br />

32


<strong>Metode</strong> <strong>Numerice</strong><br />

Cod direct (semn şi valoare absolută)<br />

1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 → 1048 (în hexazecimal)<br />

1 0 4 8<br />

Cod invers (complement faţă de 1)<br />

1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 → FFB7 (în hexazecimal)<br />

F F B 7<br />

Cod complementar(complement faţă de 2)<br />

1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 → FFB8 (în hexazecimal)<br />

F F B 8<br />

(deoarece 1111111110110111 2 + 1 = 1111111110111000 2 )<br />

Următorul program în C pune în evidenţă reprezentarea în memorie a lui 72<br />

şi -72. Compilatorul folosit este Borland C++ 3.1.<br />

#include <br />

#include <br />

#include <br />

void main(){<br />

unsigned char x=72;<br />

signed char y=-72;<br />

clrscr();<br />

printf("\n%u-->%04X\n%d-->%04X",x,x,y,y);<br />

getch();<br />

}<br />

Programul afisează<br />

33


Mădălina Roxana Buneci<br />

72 --> 0048<br />

-72 --> FFB8<br />

Observaţie: Se poate remarca faptul că primul bit din stânga (bitul cel mai<br />

semnificativ) este întotdeauna 0 pentru numerele pozitive şi 1 pentru numerele<br />

negative şi aceasta pentru fiecare din cele trei reprezentări. Acest bit se mai<br />

numeşte bit de semn.<br />

În tabelul de mai jos sunt reprezentate, prin cele trei metode, pe k = 16 biţi<br />

numere întregi cu semn:<br />

valoare<br />

cod direct (semn şi<br />

cod indirect<br />

cod complementar<br />

zecimală<br />

valoare absolută)<br />

(compl. faţă de 1)<br />

(compl. faţă de 2)<br />

2 16 -1= 32767 0111…111=7FFF 16 0111…111=7FFF 16 0111…111=7FFF 16<br />

32766 0111…110=7FFE 16 0111…110=7FFE 16 0111…110=7FFE 16<br />

… … … …<br />

1 0000…001=0001 16 0000…001=0001 16 0000…001=0001 16<br />

+0 0000…000=0000 16 0000…000=0000 16 0000…000=0000 16<br />

-0 1000…000=8000 16 1111…111=FFFF 16 0000…000=0000 16<br />

-1 1000…001=0001 16 1111…110=FFFE 16 1111…111=FFFF 16<br />

… … … …<br />

-32766 1111…110=FFFE 16 1000…001=8001 16 1000…010=8002 16<br />

-32767 1111…111=FFFF 16 1000…000=8000 16 1000…001=8001 16<br />

-32768= -2 16 1000…000=8000 16<br />

34


<strong>Metode</strong> <strong>Numerice</strong><br />

III. 2. Reprezentarea internă a numerelor reale<br />

III. 2.1. Forma normalizată<br />

Fie N şi b ∈ N, b ≥ 2. Se numeşte forma normalizată în baza b a numărului<br />

real nenul x, o reprezentare<br />

x = m ⋅ b E , unde<br />

b = baza<br />

m = mantisa<br />

E = exponentul<br />

cu 0,1 b ≤ |m| b < 1 b ⇔ 1 ≤ |m| < 1 (ceea ce înseamnă că mantisa este un număr<br />

b<br />

subunitar cu prima cifră după virgulă în reprezentarea în bază b diferită de zero).<br />

Pentru a scrie numărul sub formă normalizată trebuie găsite mantisa şi<br />

exponentul. Considerăm reprezentarea |x| = ∑ ∞ α<br />

n=<br />

0 b<br />

există n N ≥ N+1 astfel încât<br />

n<br />

n<br />

care are proprietatea că ar fi N<br />

α<br />

n<br />

≠ b - 1. Reprezentăm numărul întreg α<br />

N<br />

0 = b n β n +<br />

b n-1 β n-1 + … bβ 1 + β 0 în baza b. Astfel scrierea lui x în baza b este dată de x b =<br />

±β n β n-1 …β 1 β 0 ,α 1 α 2 …α m … Mantisa se obţine deplasând virgula în faţa primei cifre<br />

nenule ce apare în scrierea numărului (în baza b). Exponentul se ia egal cu numărul<br />

de poziţii cu care s-a deplasat virgula precedat de semnul + dacă deplasarea s-a<br />

făcut de la dreapta la stânga, şi de semnul – dacă deplasarea s-a făcut de la stânga la<br />

dreapta. Astfel<br />

• dacă x este reprezentat în baza b sub forma x b = ±β n β n-1 …β 1 β 0 ,α 1 α 2 …α m …,<br />

cu β n ≠ 0, atunci forma normalizată este x b = ±0, β n β n-1 …β 1 β 0 α 1 α 2 …α m … ⋅<br />

b n+1<br />

• dacă x este reprezentat în baza b sub forma x b = ±0, α 1 α 2 …α m …, cu α 1 ≠ 0,<br />

atunci forma normalizată este x b = ±0, α 1 α 2 …α m …⋅ b 0<br />

35


Mădălina Roxana Buneci<br />

• dacă x este reprezentat în baza b sub forma x b = ±0,α 1 α 2 … α i α i+1 …α m …,<br />

cu α 1 = α 2 = … = α i = 0 şi α i+1 ≠ 0, atunci forma normalizată este x b = ±0,<br />

α i+1 …α m …⋅ b -i .<br />

Reprezentarea sub formă normalizată a unui număr real x este unică.<br />

III.2.2. Reprezentarea în virgulă mobilă<br />

Una dintre cele mai răspândite reprezentări internă (în PC-uri) a numerelor<br />

reale este reprezentarea în virgulă mobilă. Reprezentarea în virgulă mobilă<br />

presupune existenţa unei baze b (întotdeauna presupusă pară) şi a unei precizii p.<br />

Un număr în virgulă mobilă este un număr de forma<br />

α<br />

1<br />

α α<br />

±(α 0 + +<br />

2<br />

p−1<br />

b b 2 +…+ )b E , α<br />

p 1<br />

b − k ∈ {0, 1, ...b-1} pentru orice k = 0,<br />

p − 1, E ∈Z.<br />

Mai precis, denumirea de număr în virgulă mobilă va fi utilizată pentru numerele<br />

reale care se reprezintă exact sub forma de mai sus. În această reprezentare α 0 , α 1 ,<br />

…, α p-1 se numesc cifre semnificative. Fiecărei reprezentări în virgulă mobilă i se<br />

asociază două numere întregi, E min şi E max , ce reprezintă valorile limită permise<br />

pentru exponentul E (E min ≤ E ≤ E max ). Tabelul de mai jos exemplifică cei patru<br />

parametri (baza, precizia, valorile limită ale exponentului) ce caracterizează<br />

reprezentarea în virgulă mobilă în diverse sisteme<br />

Sistem baza b precizia p E min E max<br />

IEEE single-precission 2 24 -126 127<br />

IEEE double-precission 2 53 -1022 1023<br />

Cray 2 48 -16383 16384<br />

calculator HP 10 12 -499 499<br />

mainframe IBM 16 6 -64 63<br />

36


<strong>Metode</strong> <strong>Numerice</strong><br />

Reprezentarea în virgulă mobilă se numeşte normalizată dacă se impune condiţia ca<br />

cifra cea mai semnificativă α 0 să fie nenulă. Reprezentarea normalizată are<br />

următoarele avantaje:<br />

• reprezentarea fiecărui număr este unică<br />

• nu de pierd cifre pentru reprezentarea primele zerourilor de la dreapta<br />

virgulei<br />

• în sistemele binare (corespunzătoare bazei b =2) prima cifră poate să nu mai<br />

fie stocată (deoarece este întotdeauna 1).<br />

Restricţia α 0 ≠ 0, face imposibilă reprezentarea lui zero. O reprezentare naturală a<br />

1<br />

lui zero este 1,0⋅ b E − min<br />

.<br />

Numărul de numere în virgulă mobilă normalizată este<br />

2(b-1)b p-1 (E max - E min +1).<br />

Cel mai mic număr pozitiv normalizat se notează UFL (underflow level) şi este<br />

UFL =<br />

E<br />

min<br />

b .<br />

Cel mai mare număr normalizat se notează OFL (overflow level) şi este<br />

OFL = (b-1 +<br />

=<br />

E<br />

max<br />

b<br />

+ 1<br />

b − 1 b − 1 b − 1<br />

+<br />

2 +…+ ) E<br />

b<br />

max<br />

p−1<br />

b b b<br />

1<br />

(1 -<br />

p ).<br />

b<br />

Ca urmare nu toate numerele reale sunt reprezentabile exact. Numerele prea mari<br />

pentru a fi reprezentate corespund unei depăşiri superioare de capacitate (overflow),<br />

iar numerele prea mici unei depăşiri inferioare de capacitate (underflow). Pentru a<br />

fi reprezentat un număr real x este aproximat cu un număr în virgulă mobilă pe care<br />

convenim să-l notăm fl(x). Aproximarea lui x prin fl(x) poartă numele de rotunjire,<br />

iar eroarea introdusă de eroare de rotunjire. Există mai multe modalităţi pentru<br />

rotunjire:<br />

• trunchiere (rotunjire prin tăiere): se reţin primele p cifre din reprezentarea<br />

normalizată a lui x = ± (α 0 +<br />

α<br />

1<br />

α α<br />

+<br />

2<br />

p−1<br />

b b 2 +…+<br />

p 1<br />

b −<br />

α<br />

1<br />

α α<br />

fl(x) = ± (α 0 + +<br />

2<br />

p−1<br />

b b 2 +…+<br />

p 1<br />

b −<br />

+ …)b E ; deci<br />

)b E.<br />

37


Mădălina Roxana Buneci<br />

• rotunjire la cel mai apropiat număr în virgulă mobilă (rotunjire la par):<br />

fl(x) este cel mai apropiat număr în virgulă mobilă de x; în caz de egalitate<br />

(dacă există două numere în virgulă mobilă egal depărtate de x) se consideră<br />

acel număr în virgulă mobilă a cărui ultimă cifră este pară.<br />

Rotunjirea la par determină o acurateţe mai mare a reprezentării. Acurateţea<br />

sistemului în virgulă mobilă este caracterizată de aşa numita precizie a maşinii (sau<br />

epsilon maşină), notată ε mach . Precizia a maşinii este definită ca cel mai mic număr<br />

pozitiv ε cu proprietatea că<br />

fl(1.+ ε) > 1.<br />

Dacă regula de rotunjire este trunchierea atunci<br />

ε mach = b 1 - p ,<br />

iar dacă regula de rotunjire este rotunjirea la par atunci<br />

ε mach = 2<br />

1 b<br />

1- p .<br />

Eroarea relativă maximă cu care fl(x) aproximează x este dată de<br />

fl<br />

( x)<br />

− x<br />

≤ ε mach .<br />

x<br />

Deşi amândouă sunt "mici", precizia maşinii (ε mach ) şi cel mai mic număr pozitiv<br />

normalizat UFL (în reprezentare în virgulă mobilă fixată) nu trebuie confundate. De<br />

obicei E min < -p şi deci între ele există relaţia<br />

Fie x un număr real aproximat de<br />

fl(x) =±(α 0 +<br />

0 < UFL < ε mach < OFL.<br />

α<br />

1<br />

α α<br />

+<br />

2<br />

p 1<br />

b b 2 +…+<br />

p 1<br />

Exponentul E poate lua atât valori pozitive cât şi valori negative. Cel mai adesea<br />

exponentul este “decalat “ şi reprezentat ca un număr întreg pozitiv (fără semn).<br />

Aceasta deoarece ordinea lexicografică (stabilită între şirurile de cifre din<br />

reprezentare) şi ordinea naturală sunt compatibile în cazul numerelor întregi fără<br />

semn. În consecinţă, compararea exponenţilor (şi a numerelor reale<br />

b − −<br />

)b E .<br />

38


<strong>Metode</strong> <strong>Numerice</strong><br />

corespunzătoare) poate fi făcută eficient. Astfel reprezentarea internă a unui număr<br />

α<br />

1<br />

α α<br />

real x aproximat prin fl(x) = ± (α 0 + +<br />

2<br />

p 1<br />

b b 2 +…+ )b E se face sub forma<br />

p 1<br />

b − −<br />

s ed α 0 α 1 …α p-1<br />

unde s este semnul lui x (se completează cu 0 dacă semnul este + şi cu 1 dacă<br />

semnul este -) iar ed este exponentul obţinut prin adunarea unui decalaj D la<br />

exponentul E:<br />

ed = E + D.<br />

III.2.3. Standardul IEEE-754<br />

IEEE este acronim pentru Institute of Electrical and Electronics Engineers,<br />

o organizaţie ce are drept principal scop elaborarea standardelor pentru produsele<br />

hardware şi software. Standardul IEEE-754 se referă la aritmetica în virgulă mobilă<br />

în sistemele binare. Acest standard precizează formatul de reprezentare în memorie<br />

în simplă şi dublă precizie a unui număr real. Reprezentarea se face în virgulă<br />

mobilă normalizată:<br />

α<br />

1<br />

α α<br />

x ≈ fl(x) = ± (1 + +<br />

2<br />

p−1<br />

2 2 2 +…+ )2 E , p = 24, 53.<br />

p 1<br />

2 −<br />

Sunt admise şi aşa numitele numere denormalizate ("denormalized floating-point<br />

numbers"):<br />

± (0 +<br />

α<br />

1<br />

α α<br />

+<br />

2<br />

p−1<br />

2 2 2 +…+<br />

p 1<br />

2 −<br />

)2 E , p = 24, 53,<br />

cu cel puţin una dintre cifrele binare α 1 , α 2 , …, α p-1 nenule.<br />

Standardul IEEE-754 defineşte două valori speciale pentru situaţii excepţionale:<br />

• Inf, pe post de "infinit" ("infinity"), pentru rezultatul împărţirii unui număr<br />

finit la zero.<br />

• NaN, pe post de "non-număr" ("not a number"), pentru rezultatul<br />

următoarelor operaţii<br />

39


Mădălina Roxana Buneci<br />

Adunare : Inf + (-Inf)<br />

Înmulţire: 0⋅Inf<br />

Împărţire: 0/0 sau Inf/Inf<br />

Calculul restul împărţirii unui număr x la 0 sau a lui Inf la x<br />

Calculul rădăcinii pătrate x pentru x < 0.<br />

Scopul acestor valori este acela de a permite continuarea calculului.<br />

Un număr în virgulă mobilă ±(α 0 +<br />

conform IEEE-754 sub forma<br />

α<br />

1<br />

α α<br />

+<br />

2<br />

p 1<br />

2 2 2 +…+<br />

p 1<br />

2 − −<br />

)2 E se reprezintă intern<br />

s ed α 1 …α p-1<br />

unde pentru s se rezervă un bit ce se completează cu 0 dacă numărul este pozitiv şi<br />

cu 1 dacă numărul este negativ, iar pentru exponentul decalat ed se rezervă k biţi<br />

(k=8, 11). Decalajul considerat este D = 2 k-1 - 1, deci<br />

ed = E + 2 k-1 -1,<br />

Pe k biţi se pot reprezenta ca numere întregi fără semn 2 k valori, de la 0 la 2 k<br />

– 1. Valorile 0 şi 2 k – 1 sunt rezervate pentru numerele denormalizate şi pentru<br />

valorile speciale Inf şi Nan. Deci pentru un număr în virgulă mobilă normalizată<br />

trebuie îndeplinită condiţia 1 ≤ ed ≤ 2 k -2. De aici rezultă că -2 k-1 +2 ≤ E ≤ 2 k-1 -1. De<br />

exemplu, pe k = 8 biţi se pot reprezenta numere întregi fără semn de la 0 la 255.<br />

Decalajul considerat este 2 7 - 1 = 127, deci exponentul E ia valori de la – 126 la<br />

127. Numărul de biţi rezervaţi pentru exponent determină intervalul de numere reale<br />

reprezentabile în calculator. Numărul de biţi rezervaţi pentru mantisă determină<br />

precizia de reprezentare (gradul de detaliere) a numerelor. Reprezentarea ±(α 0 +<br />

α<br />

1<br />

α α<br />

+<br />

2<br />

p 1<br />

2 2 2 +…+<br />

p 1<br />

2 − −<br />

)2 E fiind normalizată, există siguranţa că α 0 = 1, ceea ce<br />

permite omiterea sa (bit ascuns) pentru creşterea preciziei de reprezentare, dar<br />

complică prelucrarea informaţiei.<br />

Formatele de reprezentare a numerelor în virgulă mobilă (conform standardului<br />

IEEE 754) sunt:<br />

• simplă precizie (single-precission) pe 32 de biţi:<br />

40


<strong>Metode</strong> <strong>Numerice</strong><br />

• 1 bit pentru semnul mantisei<br />

• 8 biţi pentru exponentul decalat (E min = -126, E max = 127)<br />

• 23 biţi pentru mantisă (p = 24, α 0 = 1 se omite)<br />

• dublă precizie (double-precission) pe 64 de biţi<br />

• 1 bit pentru semnul mantisei<br />

• 11 biţi pentru exponentul decalat (E min = -1022, E max = 1023)<br />

• 52 biţi pentru mantisă (p = 53, α 0 = 1 se omite)<br />

Regula de rotunjire este rotunjirea la par. Deci pentru<br />

• simplă precizie, ε mach = 2 -24 ≈ 10 -7 (7 cifre zecimale semnificative).<br />

• dublă precizie, ε mach = 2 -53 ≈ 10 -16 (16 cifre zecimale semnificative).<br />

Considerăm o reprezentare în memorie, în simplă precizie:<br />

s e 7 e 6 e 5 e 4 e 3 e 2 e 1 e 0 α 1 α 2 α 23<br />

Fie ed = e 0 + e 1 2 + e 2 2 2 + … + e 7 2 7 şi m =<br />

reprezentată se determină după cum urmează:<br />

dacă 0 < ed < 255, atunci v = (-1) s ⋅(1 + m)⋅2 ed - 127 .<br />

α<br />

1<br />

α +<br />

2<br />

α<br />

2 2 2 +…+<br />

23<br />

2 23<br />

. Valoarea v<br />

dacă ed = 0, α k = 0 pentru orice k= 1 , 23 şi s = 0, atunci v = 0.<br />

dacă ed = 0, α k = 0 pentru orice k= 1 , 23 şi s = 1, atunci v = - 0.<br />

dacă ed = 0 şi există α k ≠ 0, atunci v = (-1) s ⋅ m ⋅2 - 126 ; v este o valoare<br />

denormalizată<br />

dacă ed = 255, α k = 0 pentru orice k= 1 , 23 şi s = 0, atunci v = Inf.<br />

dacă ed = 255, α k = 0 pentru orice k= 1 , 23 şi s = 1, atunci v = -Inf.<br />

dacă ed = 255 şi există α k ≠ 0, atunci v = NaN.<br />

Fie reprezentarea în memorie, în dublă precizie:<br />

s e 10 e 9 …e 0 α 1 α 2 α 52<br />

41


Mădălina Roxana Buneci<br />

Fie ed = e 0 + e 1 2 + e 2 2 2 + … + e 10 2 10 şi m =<br />

reprezentată se determină după cum urmează:<br />

α<br />

1<br />

α +<br />

2<br />

α<br />

2 2 2 +…+<br />

52<br />

2 52<br />

dacă 0 < ed < 2047, atunci v = (-1) s ⋅(1 + m)⋅2 ed - 1023 .<br />

. Valoarea v<br />

dacă ed = 0, α k = 0 pentru orice k= 1 , 52 şi s = 0, atunci v = 0.<br />

dacă ed = 0, α k = 0 pentru orice k= 1 , 52 şi s = 1, atunci v = - 0.<br />

<br />

dacă ed = 0 şi există α k ≠ 0, atunci v = (-1) s ⋅ m ⋅2 - 1022 ; v este o valoare<br />

denormalizată<br />

dacă ed = 2047, α k = 0 pentru orice k= 1 , 52 şi s = 0, atunci v = Inf.<br />

dacă ed = 2047, α k = 0 pentru orice k= 1 , 52 şi s = 1, atunci v = -Inf.<br />

<br />

Exemple:<br />

dacă ed = 2047 şi există α k ≠ 0, atunci v = NaN.<br />

Să se reprezinte în simplă precizie numerele: 228,15 - 27, 25 0,1 1,2<br />

x = 228,15<br />

x = 228 + 0,15<br />

228 = 128 + 64 + 32 + 4 = 2 7 + 2 6 +2 5 +2 2 = 11100100 2<br />

0,15 ⋅ 2 = 0,30 = 0 + 0,3<br />

0,3 ⋅ 2 = 0,6 = 0 + 0,6<br />

0,6 ⋅ 2 = 1,2 = 1 + 0,2<br />

0,2 ⋅ 2 = 0,4 = 0 + 0,4<br />

0,4 ⋅ 2 = 0,8 = 0 + 0,8<br />

0,8 ⋅ 2 = 1,6 = 1 + 0,6<br />

x = 11100100,00100110011001…<br />

Forma normalizată:<br />

x = 0,111001000010011001…⋅ 2 8 = 1,11001000010011001…⋅ 2 7<br />

ed = 7 + 2 8-1 - 1 = 135, ed 2 = 10000110 2<br />

m = 11001000010011001100110 [011]<br />

(am omis primul bit =1, iar cei trei biţi din paranteză sunt utilizaţi pentru rotunjire la<br />

par)<br />

42


<strong>Metode</strong> <strong>Numerice</strong><br />

fl(x) = 1, 11001000010011001100110⋅ 2 8<br />

Reprezentare în virgulă mobilă, simplă precizie, (cu bit ascuns) pentru 228,15:<br />

0 100 0011 0 110 0100 0010 0110 0110 0110<br />

4 3 6 4 2 6 6 6<br />

Deci reprezentării cu bit ascuns a lui 228,15 îi corespunde 43642666 în<br />

hexazecimal.<br />

x = - 27, 25<br />

|x| = 27 + 0,25<br />

27 = 16 + 8 + 2 + 1 = 2 4 + 2 3 +2 1 +2 0 = 11011 2<br />

0,25 = 2 -2 = 0,01 2<br />

x = 11011,01<br />

Forma normalizată: x = 0,1101101× 2 5 = 1,101101× 2 4<br />

ed = 4 + 2 8-1 -1 = 131, ed 2 = 10000011 2<br />

Reprezentare în virgulă mobilă, simplă precizie (cu bit ascuns) pentru –27,25:<br />

1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />

C 1 D A 0 0 0 0<br />

Deci reprezentării cu bit ascuns a lui -27,25 îi corespunde C1DA0000 în<br />

hexazecimal.<br />

x = 0,1<br />

0,1 ⋅ 2 = 0,2<br />

0,2 ⋅ 2 = 0,4<br />

0,4 ⋅ 2 = 0,8<br />

0,8 ⋅ 2 = 1,6 = 1 + 0,6<br />

0,6 ⋅ 2 = 1,2 = 1 + 0,2<br />

0,2 ⋅2 = 0,4<br />

0,1 10 = 0, 00011001100110011…<br />

x = 0, 110011001100…⋅2 -3 = 1,10011001100110011001100 110…⋅2 -4<br />

fl(x) =1, 10011001100110011001101 ⋅ 2 -4<br />

(după cei 23 de biţi ai mantisei urmează 110, şi deci rotunjirea se face prin<br />

adăugarea unei unităţi).<br />

43


Mădălina Roxana Buneci<br />

ed = - 4 + 2 8-1 -1 = 123 = 2 6 + 2 5 + 2 4 + 2 3 + 2 + 1 , ed 2 = 1111011 2<br />

Reprezentare în virgulă mobilă, simplă precizie (cu bit ascuns) pentru 0,1:<br />

0 0 1 1 11 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1<br />

3 D C C C C C D<br />

Deci reprezentării cu bit ascuns a lui 0,1 îi corespunde 3DCCCCCD în hexazecimal.<br />

x = 1,2<br />

1,2 = 1 + 0,2<br />

0,2 ⋅ 2 = 0,4<br />

0,4 ⋅ 2 = 0,8<br />

0,8 ⋅ 2 = 1,6 = 1 + 0,6<br />

0,6 ⋅ 2 = 1,2 = 1 + 0,2<br />

0,2 ⋅2 = 0,4<br />

x = 1, 0011001100110011…<br />

x = 1,00110011001100110011001 100…⋅2 0<br />

fl(x) =1,00110011001100110011010 ⋅ 2 0<br />

(după cei 23 de biţi ai mantisei urmează 100, deci rotunjirea se face astfel încât<br />

ultimul bit să aibă valoare pară).<br />

ed = 0 + 2 8-1 -1 = 127 = 2 6 + 2 5 + 2 4 + 2 3 + 2 2 +2 +1 , ed 2 = 1111111 2<br />

Reprezentare în virgulă mobilă, simplă precizie (cu bit ascuns) pentru 1,2:<br />

0 0 1 1 11 1 1 1 0 0 1 1 0 01 1 0 01 1 0 01 1 0 01 1 0 1 0<br />

3 F 9 9 9 9 9 A<br />

Deci reprezentării cu bit ascuns a lui 1,2 îi corespunde 3F99999A în hexazecimal.<br />

Următorul program în C verifică reprezentările de mai sus.<br />

#include <br />

#include <br />

void main(){<br />

long int *i;<br />

float f1=228.15,f2=-27.25, f3=0.1, f4=1.2;<br />

clrscr();<br />

i=(long int*) &f1;<br />

44


<strong>Metode</strong> <strong>Numerice</strong><br />

printf("\nNumar in virgula mobila:%f\n\tFormat intern %08lX<br />

(hexazecimal)",f1,*i);<br />

i=(long int*) &f2;<br />

printf("\nNumar in virgula mobila:%f\n\tFormat intern %08lX<br />

(hexazecimal)",f2,*i);<br />

i=(long int*) &f3;<br />

printf("\nNumar in virgula mobila:%f\n\tFormat intern %08lX<br />

(hexazecimal)",f3,*i);<br />

i=(long int*) &f4;<br />

printf("\nNumar in virgula mobila:%f\n\tFormat intern %08lX<br />

(hexazecimal)",f4,*i);<br />

getch();<br />

}<br />

Programul afişează<br />

Numar in virgula mobila: 228.149994<br />

Format intern 43642666 (hexazecimal)<br />

Numar in virgula mobila: -27.250000<br />

Format intern C1DA0000 (hexazecimal)<br />

Numar in virgula mobila: 0.100000<br />

Format intern 3DCCCCCD (hexazecimal)<br />

Numar in virgula mobila: 1.200000<br />

Format intern 3F99999A (hexazecimal)<br />

III.2.4. Aritmetica în virgulă mobilă<br />

Din secţiunea precedentă rezultă că nu toate numerele reale pot fi<br />

reprezentate exact într-un sistem în virgulă mobilă. De asemenea în urma evaluării<br />

unei expresii ai cărei operanzi sunt reprezentabili rezultatul obţinut nu este neapărat<br />

reprezentabil. În mod ideal<br />

x flop y = fl(x op y)<br />

unde op este un operator binar (+, - , *, /), iar flop desemnează corespondentul<br />

operatorului respectiv în aritmetica în virgulă mobilă. Sistemele ce satisfac<br />

45


Mădălina Roxana Buneci<br />

standardul IEEE-754 ating acest ideal în situaţia în care x op y se găseşte în<br />

intervalul de numere reale reprezentabile [UFL, OFL].<br />

Depăşirea superioară de capacitate (overflow) cauzează de obicei probleme<br />

mai serioase decât depăşirea inferioară de capacitate (underflow), deoarece nu<br />

există nici o aproximaţie bună pentru un număr real oarecare "mare". Un număr<br />

real foarte mic poate fi în mod rezonabil aproximat cu zero. Pe multe sisteme de<br />

calcul depăşirea superioară de capacitate este fatală, în timp ce în caz de depăşire<br />

inferioară de capacitate, numărul respectiv este asociat cu zero.<br />

Anumite legi ale aritmeticii reale nu sunt valabile într-un sistem în virgulă<br />

mobilă. Astfel adunarea şi înmulţirea în virgulă mobilă sunt comutative, dar nu<br />

asociative. De exemplu, dacă ε este un număr pozitiv mai mic decât ε mach , dar mai<br />

mare decât ε mach /2, atunci<br />

(1 + ε) + ε = 1, iar 1 + (ε + ε) > 1.<br />

Rezultatul unei operaţii în virgulă mobilă poate să fie semnificativ diferit<br />

faţă de rezultatul aceleaşi operaţii în aritmetica exactă. Să considerăm numărul real<br />

x =<br />

1 . Se reprezintă în baza 2, prin x = 0,0001100110011…=1,<br />

10<br />

10011001100110011001101…2 -4 . În simplă precizie este aproximat de fl(x) = 1,<br />

10011001100110011001101⋅2 -4 , ceea ce introduce o eroarea de<br />

0.000000000000000000000000011001100 în binar sau aproximativ 0.000000047 în<br />

zecimal. Programul în C de mai jos pune în evidenţă cum se propagă această eroare<br />

prin înmulţire:<br />

#include <br />

#include <br />

void main(){<br />

float f=1./10,z=10;<br />

int i;<br />

clrscr();<br />

for(i=1;i


<strong>Metode</strong> <strong>Numerice</strong><br />

getch();<br />

}<br />

Programul afişează<br />

0.1*10^2 - 10^1 = 0.000000<br />

0.1*10^3 - 10^2 = 0.000001<br />

0.1*10^5 - 10^4 = 0.000149<br />

0.1*10^9 - 10^8 = 1.490116<br />

0.1*10^17 - 10^16 = 149011616.000000<br />

0.1*10^33 - 10^32 = 1490116168828835360000000.000000<br />

1<br />

Membrul drept ar fi trebuit să fie 0, deoarece ⋅10 i+1 - 10 i =0.<br />

10<br />

În cazul scăderii a două numere reale x şi y, poate apărea următorul fenomen<br />

(catastrophic cancellation)<br />

( fl( x) − fl( y)<br />

) − fl( x − y)<br />

fl( x − y)<br />

≻ ε mach ,<br />

dacă fl(x) este egal (sau foarte apropiat de) fl(y). În următorul program (în C)<br />

aproximăm sin(x) printr-o sumă parţială a seriei<br />

∑ ∞<br />

n=<br />

0<br />

n<br />

( −1)<br />

( 2n + )<br />

x<br />

1 !<br />

Seria fiind alternantă şi convergentă, o sumă parţială de ordin n, aproximează suma<br />

2n+<br />

1<br />

seriei (i.e. sin(x)) cu o eroare absolută maximă de<br />

2n+<br />

1<br />

x<br />

. Programul de mai jos<br />

( 2n + 1)!<br />

reprezintă versiunea în C pentru calculul sumei care aproximează sin(x):<br />

#include<br />

#include<br />

#include<br />

void main(){<br />

float x,s,t,eps,x2;<br />

int i,n;<br />

clrscr();<br />

printf("x=");scanf("%f",&x);<br />

printf("Eroarea=");scanf("%f",&eps);<br />

t=x;s=0;i=1; x2=x*x;<br />

47


Mădălina Roxana Buneci<br />

while (fabs(t)>=eps){<br />

s+=t;printf("\n%f",s);<br />

t=-t*(x2/(4*i*i+2*i));<br />

i++;<br />

}<br />

printf("\nsin(%f) = %f",x,s);<br />

printf("\nsin(%f) = %f" ,x,sin(x));<br />

getch();<br />

}<br />

Pentru x=2 şi eroare 10 -7 se obţine aproximaţia 0.909297 corectă a lui sin(2).<br />

Pentru x = 40 şi eroare 10 -7 se obţine aproximaţia 523443136.0 a lui sin(40) !<br />

Valoarea corectă este 0.745113…Acest rezultat se datorează fenomenului de<br />

reducere (catastrophic cancellation). Pentru a evidenţia diferenţele între cazurile în<br />

care se lucrează în aritmetica exactă şi cazurile în care se lucrează în aritmetica în<br />

virgulă mobilă prezentăm implementarea calculul sumei de mai sus (care<br />

aproximează sin(x)) în MAPLE.<br />

> sinus:=proc(x,epsilon)<br />

> local t, x2, i,s;<br />

> s:=0; i:=1;t:=x;x2:=x*x;<br />

> while evalf(abs(t))>=evalf(epsilon) do<br />

> s:=s+t; t:=-t*x2/(4*i*i+2*i);i:=i+1<br />

> od;<br />

> RETURN(s)<br />

> end;<br />

Pentru x=2 şi eroare 10 -5 se obţine aproximaţia 141782<br />

155925<br />

≈ 0.9092961362 corectă a<br />

lui sin(2):<br />

> sinus(2, 10^(-5));<br />

141782<br />

155925<br />

> evalf(sinus(2,10^(-5)));<br />

0.9092961360<br />

48


<strong>Metode</strong> <strong>Numerice</strong><br />

> evalf(sin(2));<br />

0.9092974268<br />

> sinus(2., 10^(-5));<br />

0.9092961362<br />

> sin(2.);<br />

0.9092974268<br />

Atunci când primul parametru al procedurii sinus este întreg (sau raţional)<br />

toate calculele se execută simbolic, iar când parametru este în virgulă mobilă<br />

calculele se execută în virgulă mobilă.<br />

Pentru x = 30 şi eroare 10 -5 se obţine:<br />

> evalf(sinus(30,10^(-5)));<br />

-0.9880298724<br />

> evalf(sin(30));<br />

-0.9880316241<br />

> sinus(30., 10^(-5));<br />

-13.41937809<br />

> sin(30.);<br />

-0.9880316241<br />

Se observă că în cazul în care calculele se execută simbolic (parametru<br />

actual este dat ca număr întreg) şi evaluarea în virgulă mobilă se face doar asupra<br />

rezultatului, aproximaţia obţinută este -0.9880298724 pentru care 4 zecimale (5 cu<br />

rotunjire) coincid cu cea furnizată de funcţia predefinită sin. Însă în situaţia în care<br />

parametru actual este în virgulă mobilă şi ca urmare calculele se execută în virgulă<br />

mobilă aproximaţia furnizată este -13.41937809 !!! Acest rezultat se datorează<br />

fenomenului de reducere (catastrophic cancellation).<br />

Următoarea procedură MAPLE evaluează valoarea unui polinom într-un<br />

punct. Parametru p reprezintă lista coeficienţilor polinomului (p[i] este coeficientul<br />

lui x i ) iar x punctul în care se face evaluarea.<br />

> val:=proc(p,x)<br />

> local n,i,v;<br />

> n:=nops(p);v:=p[n];<br />

49


Mădălina Roxana Buneci<br />

> for i from n-1 by -1 to 1 do v:=x*v+p[i]<br />

> od;<br />

> RETURN(v)<br />

> end;<br />

Astfel<br />

> val([1,2,1], 2);<br />

9<br />

calculează valoarea polinomului 1 + 2X + X 2 în X = 2.<br />

Să considerăm polinomul<br />

(X-1) 8 = 1 – 8X + 28X 2 – 56X 3 + 70X 4 – 56X 5 + 28X 6 - 8X 7 + X 8 ).<br />

Reprezentarea grafică a acestui polinom pe intervalul [ 9999 ,1] este:<br />

10000<br />

> plot((x-1)^8, x=9999/10000..1);<br />

Dacă parametrii procedurii val sunt întregi sau raţionali şi calculele se<br />

execută simbolic cu excepţia evaluării în virgulă mobilă a rezultatului se obţin<br />

următoarele valori ale polinomului pentru x i = 9999<br />

10000 + i<br />

100000 , 1 ≤ i ≤ 10:<br />

> for i from 0 to 10 do evalf(val([1,-8,28,-56,70,-56,28,-8,1],<br />

9999/10000+i/100000)) od;<br />

0.1000000000 10 -31<br />

50


<strong>Metode</strong> <strong>Numerice</strong><br />

0.4304672100 10 -32<br />

0.1677721600 10 -32<br />

0.5764801000 10 -33<br />

0.1679616000 10 -33<br />

0.3906250000 10 -34<br />

0.6553600000 10 -35<br />

0.6561000000 10 -36<br />

0.2560000000 10 -37<br />

0.1000000000 10 -39<br />

0.<br />

Aceeaşi procedură apelată cu aceeaşi parametrii, cu singura excepţie că<br />

punctele în care se calculează valorile sunt reprezentate în virgulă mobilă dă<br />

rezultatele:<br />

> for i from 0 to 10 do evalf(val([1,-8,28,-56,70,-56,28,-8,1],<br />

0.9999+i/100000)) od;<br />

0.<br />

-0.1 10 -8<br />

0.84 10 -8<br />

-0.14 10 -7<br />

-0.8 10 -8<br />

-0.2 10 -8<br />

-0.8 10 -8<br />

-0.14 10 -7<br />

0.84 10 -8<br />

-0.1 10 -8<br />

0.<br />

Erorile mari se datorează execuţiei calculelor în aritmetica virgulei mobile. Şi mai<br />

sugestiv este graficul de mai jos:<br />

> plot(val([1,-8,28,-56,70,-56,28,-8,1], x), x = 0.9999..1.);<br />

51


Mădălina Roxana Buneci<br />

sau cel obţinut utilizând un număr mai mic de puncte:<br />

> plot(val([1,-8,28,-56,70,-56,28,-8,1], x), x = 0.9999..1.,<br />

numpoints=5);<br />

52


<strong>Metode</strong> <strong>Numerice</strong><br />

IV. Rezolvarea sistemelor liniare<br />

IV.1. Elemente de analiză matriceală<br />

Fie V un spaţiu vectorial (liniar) peste corpul K (K=R sau K=C).<br />

Reamintim o serie de definiţii şi teoreme legate de spaţiile normate şi spaţiile<br />

Hilbert. O normă pe V este o funcţie p: V → [0, ∞) care satisface următoarele<br />

condiţii:<br />

1. p(x) = 0 dacă şi numai dacă x = 0.<br />

2. p(x +y) ≤ p(x) + p(y) pentru orice x şi y ∈ V.<br />

3. p(λx) = |λ| p(x) pentru orice λ∈K şi orice x ∈V.<br />

Perechea (V, p) se numeşte spaţiu normat. În cele ce urmează vom nota p(x) = ||x||<br />

pentru orice x∈V şi vom spune că V este un spaţiu normat în loc de (V, ||⋅||), atunci<br />

când norma ||⋅|| se subînţelege. Pe orice spaţiu normat se poate defini o metrică<br />

(distanţă) canonică d prin d(x, y) = ||x - y|| pentru orice x, y ∈V. Prin urmare<br />

oricărui spaţiu normat i se pot asocia în mod canonic o structură metrică şi o<br />

structură topologică. Petru orice x 0 ∈V şi orice r >0 vom nota cu B(x 0 , r) bila din V<br />

centrată în x 0 de rază r:<br />

B(x 0 , r) = {x ∈ V: || x - x 0 || < r}.<br />

Pentru orice spaţiu normat V (înzestrat cu structura metrică şi structura topologică<br />

asociate în mod canonic) sunt adevărate următoarele afirmaţii:<br />

1. Şirul (x n ) n din V converge la x∈V dacă şi numai dacă<br />

lim || x n - x || = 0<br />

n→∞<br />

2. Şirul (x n ) n din V este şir Cauchy (fundamental) dacă şi numai dacă pentru orice<br />

ε>0 există n ε ∈ N astfel încât || x n - x m || < ε pentru orice m,n ≥ n ε .<br />

3. || ⋅ || : V → [0, ∞) este o aplicaţie continuă<br />

53


Mădălina Roxana Buneci<br />

4. Funcţiile (x, y) → x + y [: V × V → V] şi (λ, x) → λx [: K × V → V] sunt<br />

continue (V × V şi K × V sunt înzestrate cu topologia produs).<br />

O normă se numeşte completă dacă metrica asociată ei este completă (i.e. dacă<br />

orice şir Cauchy este convergent). Un spaţiu normat se numeşte spaţiu Banach<br />

dacă norma cu care este înzestrat este completă. Normele p 1 şi p 2 definite pe spaţiul<br />

vectorial V se numesc echivalente dacă topologiile asociate (în mod canonic) lor<br />

coincid. Pentru a desemna faptul că p 1 şi p 2 sunt echivalente vom folosi notaţia p 1 ~<br />

p 2 . Se poate arăta că normele p 1 şi p 2 sunt echivalente dacă şi numai dacă există M,<br />

m >0 astfel încât<br />

m p 1 (x) ≤ p 2 (x) ≤ M p 1 (x) pentru orice x ∈ V.<br />

V se numeşte K algebră normată dacă V este K algebră şi în plus este<br />

înzestrat cu o normă ||⋅|| ce satisface următoarele două proprietăţi:<br />

1. (V, ||⋅||) este spaţiu normat<br />

2. ||xy|| ≤ ||x|| ||y|| pentru orice x, y ∈V,<br />

O algebră normată înzestrată cu o normă completă se numeşte algebră Banach.<br />

Fie V şi W două spaţii vectoriale peste corpul K (K=R sau K=C). O<br />

aplicaţie f : V → W se numeşte liniară dacă şi numai dacă f(λx + µy) = λf(x) +<br />

µf(y) pentru orice λ, µ∈ K şi x, y∈ V. Dacă f : V → W este o aplicaţie liniară, iar<br />

V şi W sunt spaţii normate, atunci următoarele afirmaţii sunt echivalente:<br />

1. f este continuă<br />

2. f este continuă în origine<br />

3. Există M > 0 cu proprietatea că || f(x) || ≤ M||x || pentru orice x∈E.<br />

4. sup ||f(x)||< ∞.<br />

x ≤1<br />

5.<br />

sup ||f(x)||< ∞.<br />

x = 1<br />

Vom nota cu L(V, W) spaţiul aplicaţiilor liniare şi continue f : V → W. Pentru orice<br />

f∈ L(V, W), avem<br />

sup ||f(x)|| = sup ||f(x)||= inf {M > 0 : || f(x) || ≤ M||x || pentru orice x∈V }.<br />

x ≤1<br />

x = 1<br />

54


<strong>Metode</strong> <strong>Numerice</strong><br />

Dacă pentru orice f∈ L(V, W), definim || f || =<br />

sup ||f(x)||, atunci (L(V, W), ||⋅||)<br />

x ≤1<br />

devine un spaţiu normat. Spaţiul L(V, W) este denumit spaţiul operatorilor liniari<br />

şi mărginiţi definiţi pe V cu valori în W, iar elementele din L(V, W) se mai numesc<br />

operatori liniari mărginiţi. Spaţiul operatorilor liniari şi mărginiţi L(V, W) este<br />

spaţiu Banach dacă şi numai dacă W este spaţiu Banach.<br />

Dacă V este un spaţiu normat iar pe spaţiul L(V, V) introducem drept lege<br />

de "înmulţire" compunerea operatorilor, atunci L(V, V) devine o algebră normată.<br />

Dacă V este un spaţiu normat peste corpul K, atunci spaţiul normat L(V, K) se<br />

numeşte dualul lui V şi se notează V'.<br />

Fie H un spaţiu vectorial peste corpul K (K=R sau K=C). Se numeşte<br />

produs scalar pe H o aplicaţie ϕ : H × H → K care are următoarele proprietăţi:<br />

1. ϕ(x+y, z) = ϕ(x, z) + ϕ(y, z) pentru orice x, y, z ∈ H.<br />

2. ϕ(λx, y) = λϕ(x, y) pentru orice λ∈K şi x ∈ H<br />

3. ϕ(x, y) = ( y, x)<br />

ϕ pentru orice x, y ∈ H.<br />

4. ϕ(x,x) > 0 pentru orice x ≠ 0.<br />

Vom nota ϕ(x,y) = pentru orice x, y ∈ H. Se spune că norma spaţiului<br />

normat (H, || ⋅ ||) provine dint-un produs scalar dacă ||x|| =<br />

x , x pentru<br />

orice x din H. Un spaţiu pre-Hilbert este un spaţiu normat în care norma provine<br />

dintr-un produs scalar, iar un spaţiu Hilbert este un spaţiu prehilbert complet (cu<br />

normă completă).<br />

Dacă H un spaţiu prehilbert, atunci:<br />

1. Două elemente x şi y din H se numesc ortogonale dacă =0.<br />

2. Pentru A ⊂ H şi x∈H, x se spune ortogonal pe A şi se notează x⊥A, dacă<br />

=0 pentru orice y∈A.<br />

3. O familie (x i ) i de elemente ale lui H se numeşte sistem ortogonal sau familie<br />

ortogonală dacă =0 pentru orice i ≠ j.<br />

4. Un sistem ortogonal (x i ) i se numeşte ortonormal dacă ||x i || = 1 pentru orice i.<br />

5. Se numeşte bază ortonormală a spaţiului Hilbert H un sistem ortonormal<br />

maximal (în raport cu relaţia de incluziune).<br />

55


Mădălina Roxana Buneci<br />

Dacă H este un spaţiu Hilbert şi (x i ) i este un sistem ortonormal, atunci<br />

următoarele afirmaţii sunt echivalente:<br />

1. (x i ) i bază ortonormală<br />

2. Dacă x∈H şi x⊥x i pentru orice i, atunci x = 0.<br />

3. Dacă x∈H, atunci x = ∑<br />

i<br />

x , x i<br />

x i<br />

.<br />

4. Dacă x, y∈H, atunci = ∑<br />

i<br />

5. Dacă x∈H, atunci ||x|| = ∑<br />

i<br />

x , x x , y .<br />

2<br />

x , x i<br />

.<br />

Orice două baze ortonormale ale unui spaţiu Hilbert au acelaşi cardinal.<br />

Dimensiunea (hilbertiană) a unui spaţiu Hilbert este cardinalul unei baze<br />

ortonormale.<br />

Dacă F este un subspaţiu al spaţiului Hilbert H, atunci se notează cu<br />

F ⊥ = {x, x⊥F}<br />

complementul ortogonal al lui F. Dacă F este un subspaţiu închis, atunci H = F +<br />

F ⊥ (orice element din H poate fi reprezentat în mod unic ca suma dintre un element<br />

din F şi unul din F ⊥ ).<br />

Se numeşte adjunctul operatorului liniar şi mărginit A ∈ L(H 1 , H 2 ) (unde<br />

H 1 , H 2 sunt spaţii Hilbert) operatorul liniar şi mărginit A*∈ L(H 2 , H 1 )care satisface<br />

condiţia:<br />

= pentru orice x∈H 1 , y∈H 2 .<br />

Orice operator liniar şi mărginit admite un unic adjunct.<br />

Dacă H este un spaţiu Hilbert şi A∈L(H, H), atunci<br />

1. A se numeşte autoadjunct (sau hermitian) dacă A = A*.<br />

2. A se numeşte unitar dacă AA* = A*A =I.<br />

3. A se numeşte pozitiv dacă A este autodjunct şi ≥ 0 pentru<br />

orice x ∈H.<br />

Considerăm spaţiul vectorial V = K n (K=R sau K=C), n∈N*. Pe acest spaţiu<br />

Banach orice două norme sunt echivalente. Vom nota cu ||⋅|| ∞ , ||⋅|| 1 , ||⋅|| 2 următoarele<br />

norme uzuale pe K n :<br />

i<br />

i<br />

56


<strong>Metode</strong> <strong>Numerice</strong><br />

||x|| ∞ =<br />

max |x j |<br />

1≤<br />

j≤n<br />

||x|| 1 = ∑<br />

n<br />

x<br />

j<br />

j=<br />

1<br />

⎛<br />

n<br />

||x|| 2 =<br />

⎜ ∑<br />

⎝ j=<br />

1<br />

x<br />

j<br />

2<br />

⎟ ⎞<br />

⎠<br />

1/ 2<br />

pentru orice x = (x 1 , x 2 , …, x n ) ∈ K n .<br />

Norma ||⋅|| 2 se numeşte normă euclidiană şi provine din produsul scalar canonic<br />

n<br />

= ∑ x<br />

j<br />

y j<br />

pentru x = (x 1 , x 2 , …, x n ) şi y = (y 1 , y 2 , …, y n )<br />

j=<br />

1<br />

(dacă K = R, atunci = ∑ x jy j<br />

).<br />

n<br />

j=<br />

1<br />

Vom nota cu M m,n (K) mulţimea matricelor cu m linii şi n coloane. M m,n (K)<br />

are o structură de spaţiu vectorial relativ la operaţiile:<br />

adunare: A = (a ij ) i,j ,B=(b ij ) i,j ,C=(c ij ) i,j ∈ M m,n (K),<br />

C = A+B dacă şi numai dacă c ij = a ij + b ij pentru orice 1≤i≤m şi 1≤j≤n.<br />

înmulţire cu scalari: A = (a ij ) i,j , C=(c ij ) i,j ∈ M m,n (K), λ∈K.<br />

C = λA dacă şi numai dacă c ij = λa ij pentru orice 1≤i≤m şi 1≤j≤n.<br />

Produsul AB a două matrice A = (a ij ) i,j ∈ M m,n (K) şi B=(b ij ) i,j ∈ M n,p (K) este o<br />

matrice C=(c ij ) i,j ∈ M m,p (K) pentru care<br />

n<br />

c ij = ∑ a<br />

k=<br />

1<br />

ik b kj<br />

pentru orice 1≤i≤m şi 1≤j≤p.<br />

Transpusa unei matrice A=(a ij ) i,j , este o matrice notată A t = ( a<br />

t<br />

i, j<br />

) i,j , ale cărei<br />

elemente sunt:<br />

a<br />

t<br />

i, j<br />

= a j,i pentru orice 1≤i≤n, 1≤j≤m.<br />

Conjugata unei matrice A=(a ij ) i,j , este o matrice notată A * = ( a<br />

*<br />

i, j<br />

) i,j , ale cărei<br />

elemente sunt:<br />

*<br />

a<br />

i, j<br />

=<br />

j, i<br />

a pentru orice 1≤i≤n, 1≤j≤m. Conjugata este caracterizată<br />

prin :<br />

= pentru orice x∈K n şi orice y∈K m .<br />

O matrice pentru care m=n se numeşte pătratică. Elementul neutru la înmulţire în<br />

M n,n (K) este matricea unitate I n :<br />

57


Mădălina Roxana Buneci<br />

1 0 0 … 0<br />

0 1 0 … 0<br />

0 0 0 … 1<br />

O matrice A∈ M n,n (K) este inversabilă dacă există B∈ M n,n (K) astfel încât<br />

AB=BA=I n . Inversa unei matrice A se notează A -1 . Matricea A este inversabilă dacă<br />

şi numai dacă det(A) ≠ 0 - în acest caz se zice nesingulară.<br />

Matricele pentru care A=A t se numesc matrice simetrice, iar cele pentru care A=A *<br />

se numesc matrice hermitiene (evident, pentru matrice cu coeficienţi reali cele două<br />

noţiuni coincid). O matrice A se zice ortogonală dacă A -1 =A t şi unitară dacă A -1<br />

=A * . Matricea A este<br />

diagonală dacă a ij =0 pentru orice i≠j<br />

a 1 0 … 0<br />

A = 0 a 2 … 0 = diag(a 1 , a 2 ,…, a n )<br />

0 0 … a n<br />

tridiagonală dacă a ij =0 pentru orice i,j cu |i-j|>1<br />

a 1 b 1 0 … 0 0<br />

A = c 2 a 2 b 2 … 0 0<br />

0 0 0 … c n a n<br />

superior triunghiulară dacă a i,j = 0 pentru orice i > j.<br />

inferior triunghiulară dacă a i,j = 0 pentru orice i < j.<br />

superior Hessenberg dacă a i,j = 0 pentru orice i > j+1.<br />

inferior Hessenberg dacă a i,j = 0 pentru orice i < j-1.<br />

O matrice A ∈ M m,n (K) poate fi tratată ca un vector din K nm :<br />

(a 11 , a 12 ,…, a 1n , a 21 , a 22 , …, a 2n ,…, a m1 , a m2 , …, a mn ).<br />

Datorită acestui fapt norma unei matrice poate fi introdusă în mod similar cu norma<br />

unui vector din K nm . Pe de altă parte, se ştie că există un izomorfism de spaţii<br />

58


<strong>Metode</strong> <strong>Numerice</strong><br />

liniare între M m,n (K) şi L(K n , K m ). Fiecărei matrice A = (a i,j ) i,j i se asociază<br />

operatorul liniar S(A) definit prin<br />

n<br />

S(A)(x) = Ax = (∑ a<br />

ijx j<br />

) 1≤i≤m pentru orice x = (x 1 , x 2 , …, x n ) t ∈K n .<br />

j=<br />

1<br />

În cele ce urmează vom identifica A cu S(A). Cele mai des utilizate norme de<br />

matrice sunt normele operatoriale: astfel pentru o matrice A∈ M m,n (K), dacă pe K m<br />

se consideră norma ||⋅|| α , iar pe K n se consideră norma ||⋅|| β , atunci se notează cu<br />

||A|| αβ norma de aplicaţie liniară:<br />

sup ||Ax|| α = sup ||Ax|| α .<br />

x<br />

β<br />

≤1<br />

x<br />

β<br />

= 1<br />

În cazul în care α=β se utilizează notaţia ||A|| α = ||A|| αα şi se spune că ||A|| α este<br />

norma operatorială a lui A subordonată normei vectoriale ||⋅|| α .<br />

Fie A∈ M n,n (C). Scalarul λ din C se numeşte valoare proprie pentru A dacă<br />

există vectorul nenul x ∈ C n astfel încât:<br />

Ax= λx<br />

Vectorul x se numeşte vector propriu asociat valorii proprii λ. Mulţimea valorilor<br />

proprii ale lui A formează spectrul lui A şi se notează cu σ(A). Raza spectrală a lui<br />

A se defineşte prin:<br />

ρ(A) =<br />

max<br />

λ<br />

∈σ( A) Normele operatoriale pentru o matrice A ∈ M n,n (C) subordonată normelor<br />

vectoriale ||⋅|| ∞ , ||⋅|| 1 , ||⋅|| 2 sunt respectiv:<br />

||A|| ∞ = max<br />

1 ≤ i ≤ ∞<br />

||A|| 1 = max<br />

1 ≤ j ≤ ∞<br />

||A|| 2 = ρ ( A * A)<br />

.<br />

n<br />

∑ a ij<br />

j=<br />

1<br />

n<br />

∑ a ij<br />

i=<br />

1<br />

Pentru orice matrice A∈ M n,n (C) şi orice norma operatorială ||A|| subordonată unei<br />

normei vectoriale avem ρ(A) ≤ ||A||. Deşi norma ||A|| 2 este importantă din punct de<br />

vedere teoretic (corespunde distanţei euclidiene), în general, în aplicaţiile numerice<br />

λ<br />

59


Mădălina Roxana Buneci<br />

||A|| 2 nu este convenabilă (fiind dificil de calculat). În locul ei se foloseşte norma<br />

vectorială:<br />

||A|| F =<br />

n<br />

∑<br />

i, j=<br />

1<br />

a<br />

ij<br />

2<br />

care nu este normă operatorială subordonată normei vectoriale deoarece ||I n || =<br />

n ≠1. Între cele două norme există relaţia:<br />

||A|| 2 ≤ ||A|| F .<br />

Dacă ||⋅|| este o normă operatorială pe M n,n (C), atunci<br />

numai dacă ρ(A) < 1.<br />

lim A<br />

k→∞<br />

k<br />

=0 dacă şi<br />

Fie produsul scalar canonic pe K n (K = R sau C). O matrice A∈<br />

M n,n (K), K = R (respectiv, K = C) se numeşte<br />

• pozitiv definită dacă este simetrică (respectiv, hermitiană) şi dacă<br />

> 0 pentru orice x≠0 din K n .<br />

• negativ definită dacă este simetrică (respectiv, hermitiană)şi dacă<br />

< 0 pentru orice x≠0 din K n .<br />

• pozitiv semidefinită dacă este simetrică (respectiv, hermitiană)şi<br />

dacă<br />

≥ 0 pentru orice x ∈ K n .<br />

• negativ semidefinită dacă este simetrică (respectiv, hermitiană)şi<br />

dacă<br />

≤ 0 pentru orice x ∈ K n .<br />

În cele ce urmează ne vom concentra asupra matricelor A ∈ M n,n (R) simetrice.<br />

Pentru o astfel de matrice notăm determinanţii situaţi pe diagonala principală cu<br />

a 11 a 12 … a 1k<br />

∆ k = a 12 a 22 … a 2k<br />

a 1k a 2k … a kk<br />

(k =1,2,…n) şi îi numim minori principali.<br />

60


<strong>Metode</strong> <strong>Numerice</strong><br />

• O matrice A∈ M n,n (R) este pozitiv definită dacă şi numai dacă este<br />

simetrică şi minorii principali ∆ k (k∈{1,2,…n}) sunt toţi pozitivi.<br />

• O matrice A∈ M n,n (R) este negativ definită dacă şi numai dacăeste<br />

simetrică şi minorii principali ∆ k (k∈{1,2,…n}) respectă următoarea<br />

alternanţă a semnelor:<br />

∆ 1 < 0, ∆ 2 >0, ∆ 3 0, ..., (-1) n ∆ n >0.<br />

IV. 2. <strong>Metode</strong> directe de rezolvare a sistemelor liniare<br />

<strong>Metode</strong>le de rezolvare a sistemelor liniare sunt clasificate în<br />

1. <strong>Metode</strong> directe<br />

2. <strong>Metode</strong> iterative<br />

<strong>Metode</strong>le directe presupun obţinerea soluţiilor exacte a sistemelor liniare după<br />

un număr finit de operaţii elementare. O metodă directă este cu atât mai bună cu cît<br />

numărul de operaţii elementare (adunare, înmulţire, împărţire şi rădăcină pătrată)<br />

necesare este mai mic (numărul de operaţii executate influenţează atât timpul de<br />

execuţie cât şi eroarea de rotunjire).<br />

Considerăm sistemul cu n ecuaţii şi n necunoscute.<br />

Ax = b, A∈M n,n (R) nesingulară.<br />

Deoarece A este nesingulară sistemul admite soluţie unică, ce poate fi determinată<br />

cu regula lui Cramer: x i =<br />

∆xi<br />

∆<br />

, 1 ≤ i ≤ n. Arătăm că aplicarea acestei metode este<br />

nepractică (pentru n mare). Într-adevăr, aplicarea ei conduce la calculul a n+1<br />

determinanţi de ordinul n. Dar calculul unui determinat de ordinul n pentru o<br />

matrice C = (c ij ) 1≤i,j≤n , ţinând cont de definiţie:<br />

∑<br />

det(C) = ( 1) ( ) c1σ( 1) c 2σ( 2) ...cnσ( n)<br />

σ∈S<br />

n<br />

−<br />

ε σ<br />

revine la a calcula o sumă de n! termeni (grupul S n al permutărilor de ordinul n<br />

conţine n! elemente), fiecare termen fiind produsul a n factori. Deci pentru a aplica<br />

regula lui Cramer trebuie efectuate cel puţin N op (n) = (n+1) n!n =(n+1)!n operaţii.<br />

61


Mădălina Roxana Buneci<br />

Deoarece n!><br />

n<br />

n<br />

n<br />

e (pentru n ≥1), rezultă că N op(n) > n ( )n +<br />

n + 1<br />

1<br />

n+<br />

1<br />

e<br />

. De exemplu, dacă<br />

se utilizează un sistem de calcul ce execută 10 9 operaţii pe secundă, atunci pentru<br />

rezolvarea unui sistem cu n ecuaţii şi n necunoscute timpii de execuţie sunt<br />

prezentaţi în tabelul de mai jos<br />

n<br />

Timp de execuţie<br />

n=5 0.5782433079 ⋅ 10 -6 s<br />

n=10 0.04765190154 s<br />

n = 15<br />

n = 20<br />

n = 25<br />

31138.61350 s = 8.649614862 ore<br />

> 2809 ani<br />

>10 11 ani<br />

n= 30 >10 18 ani<br />

<strong>Metode</strong>le directe urmăresc transformarea sistemului de rezolvat într-un<br />

sistem echivalent a cărui matrice este inferior triunghiulară sau superior<br />

triunghiulară, sistem ce se rezolvă foarte uşor. Prezentăm în continuare algoritmul<br />

lui Gauss de transformarea matricei A într-o matrice superior triunghiulară.<br />

IV. 2.1. Metoda de eliminare Gauss<br />

Se consideră o matrice A∈M n,m (R). Eliminarea gaussiană urmăreşte<br />

transformarea matricei A într-o matrice superior triunghiulară S (o matrice cu<br />

proprietatea că b ij = 0 pentru orice i


<strong>Metode</strong> <strong>Numerice</strong><br />

pivot de la pasul k elementul maxim în modul din coloana k subdiagonală a lui A, şi<br />

se permută<br />

linia k cu linia pe care se găseşte pivotul. Această strategie de<br />

permutare se numeşte pivotare parţială. Performanţe de stabilitate numerică relativ<br />

mai bune se obţin dacă se alege drept pivotul la pasul k elementul maxim în modul<br />

din submatricea delimitată de ultimele n-k linii, şi se permută coloana k cu coloana<br />

pivotului şi linia k cu linia pivotului. Această strategie de pivotare se numeşte<br />

pivotare completă. Prezentăm în continuare algoritmul de eliminare Gauss cu<br />

pivotare parţială. Trecerea de la matricea A la matricea superior triunghiulară se<br />

realizează în nmin paşi, unde nmin = min{n,m}:<br />

A (0) → A (1) →… →A (nmin) ,<br />

unde A (nmin) are formă superior triunghiulară, iar A (0) =A. Pentru a se trece de la<br />

A (k) →A (k+1) :<br />

• Se determină pivotul de la pasul k; acesta este primul element<br />

de pe coloana k cu proprietatea<br />

( k<br />

a<br />

)<br />

k,i<br />

( k)<br />

( k)<br />

| a<br />

k,i<br />

|=max{| a<br />

k,j<br />

|, k≤j≤n}<br />

• Se permută liniile i cu k;<br />

( k)<br />

• Se aplică regula dreptunghiului (pivotului) cu pivotul a<br />

elementele de pe linia pivotului se împart la pivot:<br />

a<br />

(k+<br />

1)<br />

k,i<br />

=<br />

( k)<br />

ak,i<br />

, i=k,k+1,…m<br />

( k)<br />

a<br />

k,k<br />

k,k<br />

. Astfel:<br />

elementele subdiagonale de pe coloana pivotului se înlocuiesc<br />

cu 0.<br />

( k 1)<br />

a +<br />

ik<br />

=0, i= k+1, k+2,…n<br />

elementele din submatricea delimitată de ultimele n-k linii şi de<br />

ultimele n-k coloane se transformă cu regula dreptunghiului:<br />

63


Mădălina Roxana Buneci<br />

k<br />

j<br />

k<br />

i<br />

(k)<br />

a k,k<br />

(k)<br />

a i,k<br />

(k)<br />

a k,j<br />

(k)<br />

a i,j<br />

( k 1<br />

a + )<br />

=<br />

i,j<br />

(k) (k) (k) (k)<br />

i,j k,k<br />

−<br />

k,j i,k<br />

(k)<br />

a k,k<br />

a a a a<br />

, k+1≤ i ≤ n, k+1≤ j ≤ m.<br />

triunghiulară:<br />

În urma aplicării acestui algoritm se ajunge la următoarea matrice superior<br />

1 a 1)<br />

1 ( , 2 a ( 1<br />

, 3<br />

)<br />

1<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ a ( 1<br />

, n<br />

)<br />

A (nmin) = 0 1⋅ ( )<br />

a2 2 , 3<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ a<br />

( 2)<br />

, n<br />

1 a ( 1<br />

,n<br />

)<br />

1<br />

( )<br />

2 ,n<br />

1 +<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ a 1<br />

1<br />

,<br />

)<br />

a 2 1<br />

( m<br />

a 2 m<br />

2 +<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ( )<br />

2 ,<br />

⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅<br />

0 0 0 ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅1<br />

( )<br />

an n ,n+ 1<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ( )<br />

n ,<br />

(dacă m ≤ n).<br />

Exemplu<br />

Prin aplicarea procedurii de eliminare gaussiană cu pivotare parţială asupra matricei<br />

A de mai jos obţinem:<br />

a n m<br />

1 2 0 L 1 ↔ L 2 2 1 1<br />

A = 2 1 1 → 1 2 0 →<br />

1 -3 2 1 -3 2<br />

1 1/2 1/2 L 2 ↔ L 3 1 1/2 1/2<br />

0 3/2 -1/2 → 0 -7/2 3/2<br />

0 -7/2 3/2 0 3/2 -1/2<br />

64


<strong>Metode</strong> <strong>Numerice</strong><br />

1 1/2 1/2 1 1/2 1/2<br />

→ 0 1 -3/7 → 0 1 -3/7<br />

0 0 1/7 0 0 1<br />

Următoarea procedură MAPLE are drept parametru o matrice A, şi întoarce<br />

matricea superior triunghiulară obţinută prin aplicarea algoritmului de eliminare<br />

Gauss cu pivotare parţială asupra matricei A. Matricea a (locala procedurii) se<br />

iniţializează cu A, şi fiecare din matricele intermediare A (k) sunt afişate.<br />

> elimpp:=proc(A)<br />

> local a,n,m,nmin,i,j,k,aux;<br />

> m:=rowdim(A);n:=coldim(A);<br />

> if n a:=matrix(m,n);<br />

> for i to m do for j to n do a[i,j]:=A[i,j] od od;<br />

> for k to nmin do print(a);<br />

> i:=k;aux:=abs(a[k,k]);<br />

> for j from k+1 to m do<br />

> if abs(a[j,k])>aux then aux:=abs(a[j,k]);i:=j fi od;<br />

> if i>k then for j from k to n do<br />

> aux:=a[k,j];a[k,j]:=a[i,j];a[i,j]:=aux od; print(a) fi;<br />

> if a[k,k]0 then<br />

> for j from k+1 to n do a[k,j]:=a[k,j]/a[k,k] od;<br />

> a[k,k]:=1;<br />

> for i from k+1 to m do<br />

> for j from k+1 to n do a[i,j]:=a[i,j]-a[k,j]*a[i,k] od od;<br />

> for j from k+1 to m do a[j,k]:=0 od<br />

> fi od;<br />

> RETURN(evalm(a))<br />

> end;<br />

Exemple de utilizare a procedurii<br />

> A:=matrix(3,3,[1,2,0,2,1,1,1,-3,2]);<br />

65


elimpp(A);<br />

> A1:=matrix(3,2,[3,2,-1,5,2,0]);<br />

> elimpp(A1);<br />

Mădălina Roxana Buneci<br />

⎡1 2 0⎤<br />

A :=<br />

2 1 1<br />

⎢ ⎥<br />

⎣1 -3 2⎦<br />

⎡1 2 0⎤<br />

2 1 1<br />

⎢ ⎥<br />

⎣1 -3 2⎦<br />

⎡2 1 1⎤<br />

1 2 0<br />

⎢ ⎥<br />

⎣1 -3 2⎦<br />

⎡ 1 1<br />

1<br />

⎤<br />

2 2<br />

3 -1<br />

0<br />

2 2<br />

-7 3<br />

⎢ 0<br />

⎥<br />

⎣ 2 2 ⎦<br />

⎡ 1 1<br />

1<br />

⎤<br />

2 2<br />

-7 3<br />

0<br />

2 2<br />

3 -1<br />

⎢ 0<br />

⎥<br />

⎣ 2 2 ⎦<br />

⎡ 1 1<br />

1<br />

⎤<br />

2 2<br />

-3<br />

0 1<br />

7<br />

1<br />

⎢ 0 0 ⎥<br />

⎣<br />

7 ⎦<br />

⎡ 1 1<br />

1<br />

⎤<br />

2 2<br />

-3<br />

0 1<br />

⎢<br />

7 ⎥<br />

⎢<br />

⎥<br />

⎣ 0 0 1 ⎦<br />

⎡ 3 2⎤<br />

A1 :=<br />

-1 5<br />

⎢ ⎥<br />

⎣ 2 0⎦<br />

66


<strong>Metode</strong> <strong>Numerice</strong><br />

⎡<br />

⎢<br />

⎣<br />

⎡<br />

⎢<br />

⎣<br />

⎡ 3 2⎤<br />

-1 5<br />

⎢ ⎥<br />

⎣ 2 0⎦<br />

2<br />

1<br />

3<br />

17<br />

0<br />

3<br />

-4<br />

0<br />

3<br />

> A2:=matrix(2,3,[1,-1,2,3,4,-2]);<br />

> elimpp(A2);<br />

1<br />

2<br />

3<br />

0 1<br />

0 0<br />

⎤<br />

⎥<br />

⎦<br />

⎤<br />

⎥<br />

⎦<br />

A2 :=<br />

⎡1 -1 2⎤<br />

⎢ ⎥<br />

⎣3 4 -2⎦<br />

⎡<br />

⎢<br />

⎣<br />

⎡<br />

⎢<br />

⎣<br />

⎡1 -1 2⎤<br />

⎢ ⎥<br />

⎣3 4 -2⎦<br />

⎡3 4 -2⎤<br />

⎢ ⎥<br />

⎣1 -1 2⎦<br />

4 -2<br />

1<br />

⎤<br />

3 3<br />

-7 8<br />

0<br />

3 3 ⎥<br />

⎦<br />

4 -2<br />

1<br />

⎤<br />

3 3<br />

-8<br />

0 1<br />

7 ⎥<br />

⎦<br />

IV.2.2. Rezolvarea sistemelor liniare prin metoda de eliminare Gauss<br />

Considerăm sistemul cu n ecuaţii şi n necunoscute:<br />

Ax = b, A∈M n,n (R) nesingulară<br />

67


Mădălina Roxana Buneci<br />

Pentru rezolvarea acestui sistem vom aplica algoritmul de eliminare Gauss<br />

cu pivotarea parţială asupra matricei extinse A = ( A | b)<br />

. Vom nota elementele<br />

matricei A tot cu a i,j . Astfel a i,n+1 = b i pentru orice i=1,2,..n.<br />

La primul pas algoritmul presupune eliminarea necunoscutei x 1 din ultimele<br />

n-1 ecuaţii. La al doilea pas se elimină necunoscuta x 2 din ultimele n-2 ecuaţii,<br />

ş.a.m.d. În cazul acestui algoritm pentru fiecare k se efectuează n+1-k + (n+1-k)(nk)<br />

= (n+1-k) 2 operaţii elementare (prin operaţie elementară înţelegând aici o<br />

operaţie în virgulă mobilă de forma ax + b, sau o împărţire) . Deci algoritmul<br />

necesită<br />

n−1<br />

n<br />

2 2<br />

∑ = j<br />

k=<br />

1<br />

j=<br />

2<br />

N op (n) = ( n + 1−<br />

k)<br />

∑ =<br />

( + )( + )<br />

n n 1 2n 1<br />

6<br />

- 1<br />

n 3<br />

operaţii elementare. Deci N op (n) ~ (sau N op (n) ∈ O(n 3 ) ).<br />

3<br />

Ca urmare a aplicării algoritmului se obţine sistemul echivalent:<br />

x 1 + a 1 ( 1<br />

, 2<br />

) x 2 + a 1 ( 1<br />

, 3<br />

) x 3 +⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ a 1 ( 1<br />

, n<br />

) x n = a 1<br />

,n<br />

)<br />

1 ( + 1<br />

x 2 +<br />

( )<br />

a2 2 , 3<br />

x 3 ⋅+ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ a ( 2 2<br />

, n<br />

) x n = ( )<br />

,n<br />

a2 2 + 1<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅<br />

x n = ( )<br />

an n ,n+<br />

1<br />

Rezolvarea acestui sistem se poate face foarte uşor de la sfârşit spre început:<br />

x n = ( )<br />

x<br />

an n ,n+<br />

1<br />

n<br />

i = i,n+ 1<br />

− ∑ i, j<br />

j=<br />

i+<br />

1<br />

( i) ( i<br />

a a<br />

)<br />

x<br />

j<br />

Procedura rezsist de mai jos întoarce soluţia unui sistem liniar cu n ecuaţii şi<br />

n necunoscute. Parametri procedurii sunt matricea sistemului şi vectorul termenilor<br />

liberi<br />

> with(linalg):<br />

> rezlin:=proc(A,b)<br />

> local a,x,n,i,j,k,aux;<br />

68


<strong>Metode</strong> <strong>Numerice</strong><br />

> n:=rowdim(A);<br />

> a:=matrix(n,n+1);<br />

> for i to n do<br />

> for j to n do a[i,j]:=A[i,j] od;<br />

> a[i,n+1]:=b[i] od;<br />

> for k to n do i:=k;aux:=abs(a[k,k]);<br />

> for j from k+1 to n do<br />

> if abs(a[j,k])>aux then aux:=abs(a[j,k]);i:=j fi od;<br />

> if i>k then for j from k to n+1 do<br />

> aux:=a[k,j];a[k,j]:=a[i,j];a[i,j]:=aux od fi;<br />

> if a[k,k]=0 then print(`matrice singulara`);RETURN(NULL) fi;<br />

> for j from k+1 to n+1 do a[k,j]:=a[k,j]/a[k,k] od;<br />

> for i from k+1 to n do<br />

> for j from k+1 to n+1 do a[i,j]:=a[i,j]-a[k,j]*a[i,k] > od od;<br />

> od;<br />

> x:=vector(n);x[n]:=a[n,n+1];<br />

> for i from n-1 by -1 to 1 do x[i]:=a[i,n+1];<br />

> for j from i+1 to n do x[i]:=x[i]-a[i,j]*x[j] od od;<br />

> RETURN(evalm(x))<br />

> end;<br />

Utilizăm procedura se mai sus pentru rezolvarea sistemului<br />

x 1 + x 2 + x 3 = 3<br />

x 1 - x 2 + 2x 3 = 2<br />

-x 1 - x 2 + 3x 3 = 1<br />

> a1:=matrix(3,3,[1,1,1,1,-1,2,-1,-1,3]);<br />

⎡ 1 1 1⎤<br />

a1 :=<br />

1 -1 2<br />

⎢ ⎥<br />

⎣-1 -1 3⎦<br />

> b1:=vector(3,[3,2,1]);<br />

> rezlin(a1,b1);<br />

> linsolve(a1,b1);<br />

b1 := [ 3, 2,<br />

1 ]<br />

[ 1, 1,<br />

1 ]<br />

[ 1, 1,<br />

1 ]<br />

69


Mădălina Roxana Buneci<br />

Comanda MAPLE linsolve(A,b) din pachetul linalg întoarce soluţia sistemului Ax<br />

= b.<br />

IV.2.3. Calculul determinantului unei matrice<br />

Pentru calculul determinantului unei matrice A∈M n,n (R) se poate folosi<br />

metoda de eliminare Gauss, ţinându-se seama că determinantul unei matrice nu se<br />

modifică dacă asupra matricei se efectuează transformări elementare. Determinantul<br />

este produsul elementelor<br />

( k)<br />

a<br />

k,k<br />

(înainte de împărţire). Dacă se foloseşte pivotare,<br />

trebuie avut în vedere faptul că prin permutarea a două linii semnul determinantului<br />

se schimbă. Procedura determinant de mai jos are drept parametru matricea şi<br />

întoarce determinantul. Pentru transformarea matricei A într-o matrice superior<br />

triunghiulară se foloseşte algoritmul de eliminare Gauss cu pivotare parţială.<br />

>determinant:=proc(A)<br />

>local a,n,i,j,k,d,aux;<br />

>n:=rowdim(A);<br />

>a:=matrix(n,n);<br />

>for i to n do<br />

>for j to n do a[i,j]:=A[i,j] od od;<br />

>d:=1;<br />

>for k to n do i:=k;aux:=abs(a[k,k]);<br />

>for j from k+1 to n do<br />

>if abs(a[j,k])>aux then aux:=abs(a[j,k]);i:=j fi od;<br />

>if i>k then d:=-d; for j from k to n do<br />

>aux:=a[k,j];a[k,j]:=a[i,j];a[i,j]:=aux od fi;<br />

>if a[k,k]=0 then d:=0;RETURN(d) fi; d:=d*a[k,k];<br />

>for j from k+1 to n do a[k,j]:=a[k,j]/a[k,k] od;<br />

>for i from k+1 to n do<br />

>for j from k+1 to n do a[i,j]:=a[i,j]-a[k,j]*a[i,k] od od;<br />

>od;<br />

>RETURN(d)<br />

>end;<br />

Exemplificăm utilizarea procedurii de mai sus<br />

> a2:=matrix(3,3,[1,1,1,1,8,3,12,1,2]);<br />

70


<strong>Metode</strong> <strong>Numerice</strong><br />

⎡ 1 1 1⎤<br />

a2 :=<br />

1 8 3<br />

⎢ ⎥<br />

⎣12 1 2⎦<br />

> determinant(a2);<br />

-48<br />

> det(a2);<br />

-48<br />

Comanda det(A) din pachetul linalg calculează determinantul matricei<br />

indicate drept parametru.<br />

IV.2.4. Calculul inversei unei matrice<br />

Fie A∈M n,n (R). Matricea A este inversabilă dacă şi numai dacă există o<br />

matrice B∈ M n,n (R) astfel încât A⋅B=B⋅A=I n , unde<br />

1 0 0 ---------- 0<br />

I n = 0 1 0 ---------- 0<br />

---------------------------------------<br />

0 0 0 ---------- 1<br />

Se ştie că A este inversabilă dacă şi numai dacă are determinantul nenul. Notăm:<br />

e k = (0,…,0,1,0…0) t<br />

vectorul k al bazei canonice din R n .<br />

Pentru fiecare k (k=1,2,…,n) considerăm sistemul Ax=e k . Soluţia acestui<br />

sistem reprezintă chiar coloana k a matricei A -1 . Astfel pentru aflarea lui A -1 este<br />

necesar să rezolvăm n sisteme de ecuaţii liniare Ax=e k , k=1,2,…,n. Aceste sisteme<br />

pot fi rezolvate utilizând algoritmul de eliminare al lui Gauss. Pentru a micşora<br />

volumul de calcul vom aplica algoritmul asupra matricei obţinute prin concatenarea<br />

la matricea A a coloanelor bazei canonice din R n . Coeficienţii matricei<br />

sunt<br />

A = (A|e 1 |e 2 |------|e n )<br />

71


Mădălina Roxana Buneci<br />

a ij , dacă 1 ≤ i, j ≤ n<br />

unde<br />

a i,n+k = δ ik , dacă 1 ≤ i, k≤ n<br />

1, i=k<br />

δ ik = 0, i≠k.<br />

Prin aplicarea algoritmului de eliminare Gauss cu pivotare parţială asupra<br />

lui A se obţine un şir de matrice<br />

A (0) → A (1) → ---- →A (n) ,<br />

unde A (0) = ⎺A, iar A (n) are următoarea formă superior triunghiulară:<br />

1 a 1)<br />

1 ( , 2 a ( 1<br />

, 3<br />

)<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 1 a ( 1<br />

, n<br />

)<br />

A (n) = 0 1⋅ ( )<br />

a2 2 , 3 ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ a ( 2,<br />

2<br />

n<br />

)<br />

1 a ( 1<br />

,n<br />

)<br />

1<br />

1 +<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ a<br />

(1)<br />

1<br />

a 2 ,n 1<br />

,2n<br />

( )<br />

2 +<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅<br />

( )<br />

2 ,2<br />

a 2 n<br />

⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅<br />

0 0 0 ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅1 ( )<br />

an n ,n+ 1<br />

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ( )<br />

n ,2<br />

a n n<br />

Dacă B = A -1 , atunci coeficienţii lui B pot fi determinaţi cu formulele:<br />

b n,k = a ( n)<br />

n ,n+ k , 1 ≤ k ≤ n<br />

b i,k = a ( i)<br />

(i)<br />

i ,n+ k - ai,<br />

j b<br />

n<br />

∑<br />

j=<br />

i+<br />

1<br />

i, j<br />

, 1 ≤ i ≤ n-1, 1 ≤ k ≤ n<br />

Procedura inversa de mai jos întoarce inversa matricei indicată drept parametru.<br />

> inversa := proc(A)<br />

> local n,a, b, i, j, k,aux;<br />

> n:=rowdim(A);<br />

> b := matrix(n, n); a := matrix(n, 2*n);<br />

> for i to n do for j to n do a[i, j] := A[i, j] od od;<br />

> for i to n do for j to n do a[i, j + n] := 0 od od;<br />

> for i to n do a[i, i + n] := 1 od;<br />

72


<strong>Metode</strong> <strong>Numerice</strong><br />

> for k to n do<br />

> aux := abs(a[k, k]);i := k;<br />

> for j from k + 1 to n do<br />

> if aux < abs(a[j, k]) then aux := abs(a[j, k]); i := j fi<br />

> od;<br />

> for j from k to 2*n do<br />

> aux := a[k, j]; a[k, j] := a[i, j]; a[i, j] := aux od;<br />

> if a[k, k] = 0 then print(`Matrice singulara`);<br />

> RETURN(NULL) fi;<br />

> for j from k + 1 to 2*n do a[k, j] := a[k, j]/a[k, k] od;<br />

> for i from k + 1 to n do<br />

> for j from k + 1 to 2*n do<br />

> a[i, j] := a[i, j] - a[k, j]*a[i, k] od od;<br />

> od;<br />

> for i to n do b[n, i] := a[n, i + n] od;<br />

> for k to n do<br />

> for i from n - 1 by -1 to 1 do<br />

> b[i, k] := a[i, n + k];<br />

> for j from i + 1 to n do<br />

> b[i, k] := b[i, k] - a[i, j]*b[j, k] od<br />

> od<br />

> od;<br />

> RETURN(evalm(b))<br />

> end;<br />

Calculul inversei matricei<br />

1 1 1<br />

1 2 3<br />

2 1 2<br />

se realizează cu ajutorul comenzilor<br />

> a3:=matrix(3,3,[1,1,1,1,2,3,2,1,2]);<br />

⎡1 1 1⎤<br />

a3 :=<br />

1 2 3<br />

⎢ ⎥<br />

⎣2 1 2⎦<br />

> inversa(a3);<br />

73


Mădălina Roxana Buneci<br />

⎡<br />

⎢<br />

⎢<br />

⎣<br />

1 -1 1 ⎤<br />

2 2 2<br />

2 0 -1<br />

-3 1 1<br />

⎥<br />

2 2 2 ⎥<br />

⎦<br />

Comanda inverse din pachetul linalg calculează de asemenea inversa unei matrice.<br />

În exemplul următor presupunem că o aplicăm asupra aceleaşi matrice a3.<br />

> inverse(a3);<br />

⎡<br />

⎢<br />

⎢<br />

⎣<br />

1 -1 1 ⎤<br />

2 2 2<br />

2 0 -1<br />

-3 1 1<br />

⎥<br />

2 2 2 ⎥<br />

⎦<br />

IV.3. Factorul de condiţionare al unei matrice<br />

Definiţie 1. Factorul de condiţionare al unei matrice pătrate A∈M n,n (R) se<br />

defineşte prin<br />

cond(A) = ||A|| ⋅ ||A -1 ||<br />

unde ||⋅|| este o norma operatorială a matricei A (de exemplu, ||⋅|| 1 sau ||⋅|| ∞ ). Prin<br />

convenţie cond(A) = ∞ dacă A este singulară.<br />

Se poate observa că<br />

⎛ Ax ⎞⎛ Ax ⎞<br />

cond(A) =<br />

⎜<br />

max<br />

min<br />

x≠0<br />

x ⎟⎜ x≠0<br />

x ⎟<br />

⎝ ⎠⎝ ⎠<br />

Factor de condiţionare cond(A) mare înseamnă A „aproape singulară”.<br />

Factorul de condiţionare cond(A) are următoarele proprietăţi<br />

• cond(A) ≥ 1<br />

• cond(I n ) = 1 pentru orice n ≥ 1<br />

• cond(αA) = cond(A) pentru orice scalar α ≠0<br />

−1<br />

.<br />

74


<strong>Metode</strong> <strong>Numerice</strong><br />

• cond(D) =<br />

⎛<br />

max<br />

⎞⎛<br />

i min<br />

⎞<br />

⎜ α ⎟⎜<br />

αi<br />

⎟ pentru orice matrice diagonală<br />

⎝ 1≤i≤n<br />

⎠⎝ 1≤i≤n<br />

⎠<br />

D=diag(α 1 , α 2 , ..., α n ).<br />

Calcul valorii exacte a factorului de condiţionare al unei matrice A<br />

presupune calculul ||A -1 ||. Cum numărul de operaţii necesare pentru calculul normei<br />

inversei lui A (||A -1 ||) este mai mare decât cel pentru rezolvarea unui sistem liniar<br />

Ax = b, de obicei în practică se foloseşte un estimator pentru ||A -1 ||. Determinarea<br />

unei estimaţii pentru ||A -1 || pleacă de la observaţia că, dacă Ax = y, atunci<br />

şi mărginea superioară a mulţimii<br />

−1<br />

x<br />

y ≤ ||A-1 ||,<br />

⎧⎪<br />

x ⎫⎪<br />

⎨ , Ax = y ⎬<br />

⎪⎩<br />

y ⎪⎭<br />

este ||A -1 || şi se atinge pentru o anumită valoare y.<br />

Comanda MAPLE cond(A) din pachetul linalg calculează factorul de<br />

condiţionare matricei A.<br />

Considerăm sistemul<br />

şi notăm cu x* soluţia exactă.<br />

Ax = b, cu A nesingulară<br />

Să presupunem că în locul matricei A este furnizată matricea A + E şi ca<br />

urmare se rezolvă sistemul<br />

a cărui soluţie o notăm cu ˆx . Atunci<br />

Atunci<br />

de unde<br />

(A+E) ˆx = Ax*<br />

E ˆx = A(x*- ˆx ).<br />

A -1 E ˆx =x*- ˆx<br />

(A+E) x = b,<br />

||x*- ˆx || = || A -1 E ˆx || ≤ || A -1 || ⋅|| E|| ⋅|| ˆx || ,<br />

75


Mădălina Roxana Buneci<br />

ˆx − x *<br />

ˆx<br />

≤ cond(A)<br />

E<br />

A .<br />

Deci factor de condiţionare „mic” şi variaţii relative mici ale coeficienţilor<br />

matricei implică variaţii relative mici ale soluţiei. Dacă factorul de condiţionare<br />

cond(A) este mare, atunci rezolvarea sistemului Ax = b este o problemă rău<br />

condiţionată.<br />

Să presupunem acum că în locul vectorului termenilor liberi b este dat<br />

vectorul ˆb şi ca urmare se rezolvă sistemul<br />

A x = ˆb ,<br />

a cărui soluţie o notăm cu ˆx . Atunci<br />

A ˆx = ˆb - b + b<br />

A ˆx = ˆb - b + Ax*<br />

A(x*- ˆx ) = b- ˆb<br />

x*- ˆx = A -1 (b- ˆb )<br />

Atunci<br />

||x*- ˆx || = || A -1 (b- ˆb )|| ≤ || A -1 || ⋅|| (b- ˆb )|| =|| A -1 || ⋅|| (b- ˆb )||<br />

Ax *<br />

b<br />

≤<br />

≤ || A -1 ||<br />

b − bˆ<br />

b<br />

||A|| ||x*||,<br />

de unde<br />

ˆx − x *<br />

x *<br />

≤ cond(A)<br />

b − bˆ<br />

b<br />

.<br />

Deci factor de condiţionare „mic” şi variaţii relative mici ale termenilor<br />

liberi implică variaţii relative mici ale soluţiei.<br />

Dacă gradul de acurateţe a datelor de intrare este compatibil cu precizia<br />

maşinii ε mach , atunci<br />

ˆx − x *<br />

x *<br />

≤ cond(A)ε mach .<br />

76


<strong>Metode</strong> <strong>Numerice</strong><br />

În urma calculului soluţiei sistemului Ax = b se pot pierde până la log 10 (cond(A))<br />

cifre zecimale semnificative relativ la acurateţea datelor de intrare.<br />

Interpretare geometrică: n = 2: Ecuaţii unui sistem liniar a cărui matrice A<br />

∈ M 2,2 (R) pot fi interpretate ca ecuaţiile a două drepte în plan, iar soluţia sistemului<br />

drept coordonatele punctului de intersecţie a celor două drepte. Factor de<br />

condiţionare mare al matricei A înseamnă că dreptele sunt „aproape” paralele.<br />

problemă bine condiţionată<br />

problemă rău condiţionată<br />

Exemplu<br />

Considerăm sistemul Ax = b, unde<br />

A = 888.445 887.112<br />

887.112 885.781<br />

şi<br />

b = 1<br />

0<br />

Considerăm următoarele comenzi MAPLE:<br />

> with(linalg):<br />

> A:=matrix(2,2,[888.445,887.112,887.112,885.781]);<br />

A :=<br />

⎡888.445 887.112⎤<br />

⎢<br />

⎥<br />

⎣887.112 885.781⎦<br />

> A1:=matrix(2,2,[888445/1000,887112/1000,887112/1000,<br />

885781/1000]);<br />

⎡177689<br />

110889⎤<br />

A1 :=<br />

200 125<br />

110889 885781<br />

⎢<br />

⎥<br />

⎣ 125 1000 ⎦<br />

> cond(A1);<br />

3152602660249<br />

77


Mădălina Roxana Buneci<br />

> b:=vector([1,0]);<br />

> Digits:=6;<br />

> linsolve(A,b);<br />

> Digits:=15;<br />

> linsolve(A,b);<br />

> Digits:=10;<br />

> linsolve(A,b);<br />

> linsolve(A1,b);<br />

b := [ 1,<br />

0 ]<br />

Digits := 6<br />

[ -499.248,<br />

500.000 ]<br />

Digits := 15<br />

[ 0.887555222890557 10 9 , -0.888888888888889 10 9 ]<br />

Digits := 10<br />

[ 0.2496249066 10 7 , -0.2500000000 10 7 ]<br />

[ 885781000,<br />

-887112000 ]<br />

Deşi matricele A şi A1 sunt egale - diferenţa este dată doar de reprezentarea<br />

coeficienţilor: simbolic (ca numere raţionale) în cazul lui A1 şi în virgulă mobilă în<br />

cazul lui A – comenzile linsolve(A,b) şi linsolve(A1,b) întorc rezultate diferite.<br />

Soluţia corectă a sistemului este cea obţinută în varianta în care s-a lucrat simbolic:<br />

x 1 = 885781000<br />

x 2 = -887112000<br />

Rezultatul eronat furnizat de comanda linsolve(A,b) se datorează relei condiţionări<br />

a matricei A. Se observă că factorul de condiţionare este:<br />

Revenim la sistemul<br />

0.315260266024900 10 13<br />

Ax = b, cu A nesingulară<br />

notăm cu x* soluţia exactă şi cu ˆx soluţia aproximativă. Vectorul<br />

se numeşte reziduu. Avem<br />

r = b - A ˆx<br />

||x*- ˆx || = 0 ⇔ ||r|| = 0,<br />

dar ||x*- ˆx || şi ||r|| nu sunt mici simultan. Avem<br />

r = b - A ˆx = Ax* - A ˆx = A(x*- ˆx )<br />

78


<strong>Metode</strong> <strong>Numerice</strong><br />

A -1 r = x* - ˆx<br />

|| x* - ˆx || = ||A -1 r|| ≤ ||A -1 || ||r|| =cond(A)<br />

= cond(A)<br />

1<br />

|| A || ||r|| =<br />

|| x*||<br />

|| A |||| x*|| ||r|| ≤ cond(A) || x*||<br />

|| Ax*|| ||r|| =<br />

= cond(A)<br />

|| x*||<br />

||r||.<br />

|| b ||<br />

de unde rezultă<br />

x * −xˆ<br />

x *<br />

≤ cond(A)<br />

r<br />

b<br />

Ca urmare factor de condiţionare „mic” (problemă bine condiţionată) şi reziduu mic<br />

implică variaţii relative mici ale soluţiei.<br />

Exemplu<br />

Considerăm sistemul Ax = b, unde<br />

A = 1 1.001<br />

1 1<br />

şi<br />

b = 2.001<br />

2<br />

Evident soluţia corectă a sistemului este<br />

x 1 = 1<br />

x 2 = 1<br />

Dacă se consideră vectorul y<br />

y 1 2<br />

y 2 = 0<br />

se observă că<br />

b - Ay = 0.001<br />

0<br />

79


Mădălina Roxana Buneci<br />

Deci y aparent verifică sistemul, deşi este diferit de x. Aceasta se datorează valorii<br />

factorului de condiţionare al lui A pe care-l putem determina folosind următoarele<br />

comenzi MAPLE:<br />

> with(linalg):<br />

> A:=matrix(2,2,[1,1.001,1,1]);<br />

> cond(A);<br />

A :=<br />

⎡1 1.001⎤<br />

⎢ ⎥<br />

⎣1 1 ⎦<br />

4004.001000<br />

Arătăm în continuare că dacă reziduu este mare atunci variaţia relativă a<br />

coeficienţilor matricei de intrare A este mare. Să presupunem că ˆx este soluţia<br />

sistemului (A+E) x = b. Atunci<br />

de unde<br />

şi ca urmare<br />

(A+E) ˆx = b<br />

E ˆx = b -A ˆx<br />

E ˆx = r<br />

||r|| = ||E ˆx || ≤ ||E|| || ˆx ||,<br />

|| r || || E ||<br />

≤<br />

|| A |||| x ˆ || || A || .<br />

În consecinţă dacă a reziduu este mare atunci variaţia relativă a coeficienţilor<br />

matricei de intrare A este mare. Deci dacă algoritmul de rezolvare a sistemului este<br />

stabil atunci reziduul relativ este mic indiferent dacă problema este bine<br />

condiţionată sau nu.<br />

IV.4. <strong>Metode</strong> iterative de rezolvare a sistemelor liniare<br />

IV.4.1. Generalităţi<br />

<strong>Metode</strong>le iterative constau în construcţia unui şir (x k ) k convergent către<br />

soluţia exactă a sistemului. Oprirea procesului iterativ are loc la un indice m<br />

80


<strong>Metode</strong> <strong>Numerice</strong><br />

determinat pe parcursul calculului în funcţie de precizia impusă astfel încât<br />

termenul x m să constituie o aproximaţie satisfăcătoare a soluţiei căutate.<br />

Se consideră sistemul liniar<br />

şi desfacerea matricei A definită prin<br />

Ax = b, A∈M n,n (R) nesingulară<br />

A = N-P.<br />

cu N o matrice inversabilă. Fie x 0 un vector arbitrar din R n . Construim şirul (x k ) k<br />

folosind relaţia de recurenţă:<br />

Nx k+1 = P x k + b, k ≥ 0.<br />

Notăm e k = x* – x k eroarea absolută cu care x k aproximează x*, soluţia exactă a<br />

sistemului Ax = b.<br />

Teoremă 4.1. Fie sistemul liniar Ax = b cu A∈M n,n (R) nesingulară şi fie A<br />

= N-P o desfacere a matricei A (N ∈M n,n (R) matrice nesingukară). Şirul (x k ) k<br />

definit prin<br />

Nx k+1 = P x k + b, k ≥ 0, x 0 dat<br />

converge la soluţia exactă a sistemului Ax = b oricare ar fi x 0 dacă şi numai dacă<br />

ρ(N -1 P) < 1 (ρ(N -1 P) reprezintă raza spectrală a lui N -1 P, i.e. maximum modulelor<br />

valorilor proprii ale lui N -1 P).<br />

Demonstraţie. Notăm G = N -1 P. Atunci<br />

e k+1 = x* – x k+1 = x* - N -1 (P x k + b)<br />

= x* - N -1 P x k - N -1 b<br />

= x* - N -1 P x k - N -1 Ax*<br />

= x* - N -1 P x k - N -1 (N-P) x*<br />

= x* - N -1 P x k - x* + N -1 P x*<br />

= N -1 P (x* - x k )<br />

= Ge k .<br />

Ca urmare e k+1 = G e k = G G e k-1 = ...= G k+1 e 0 , pentru orice k ≥ 0. În consecinţă,<br />

lim x k<br />

= x* pentru orice termen iniţial x 0 dacă şi numai dacă<br />

k→∞<br />

lim G k e 0<br />

=0 pentru<br />

k→∞<br />

81


Mădălina Roxana Buneci<br />

orice e 0 , sau echivalent<br />

dacă ρ(G) < 1.<br />

lim G k<br />

k→∞<br />

=0. Este cunoscut că<br />

lim G k<br />

k→∞<br />

=0 dacă şi numai<br />

Din demonstraţia teoremei anterioare a rezultat că dacă G= N -1 P şi e k = x* –<br />

x k , atunci e k = Ge k-1 = G k e 0 pentru orice k ≥ 0.<br />

N se alege astfel încât sistemul<br />

Nx k+1 = P x k + b, k ≥ 0.<br />

a cărui soluţie este x k+1 să se rezolve uşor – de exemplu se alene N diagonală sau<br />

triunghiulară<br />

În cazul metodelor concrete descrise în continuare se consideră<br />

desfacerea standard a matricei A = (a i,j ) 1≤i,j≤n definită prin:<br />

unde<br />

A = L + D + R<br />

a 1,1 0 0 …… 0 0<br />

D = diag(a 1,1 ,a 2,2 ,…. a n,n ) = 0 a 2,2 0 ……0 0<br />

……………………..<br />

0 0 0 ……0 a n,n<br />

■<br />

0 0 0 …… 0 0<br />

L = a 2,1 0 0 …… 0 0<br />

………………………..<br />

a n,1 a n,2 a n,3 …… a n,n-1 0<br />

0 a 1,2 a 1,3 …… a 1,n-1 a 1,n<br />

R = 0 0 a 2,3 …… a 2,n-1 a 2,n<br />

………………………..<br />

0 0 0 …… 0 0<br />

82


<strong>Metode</strong> <strong>Numerice</strong><br />

IV.4.2. Metoda Jacobi<br />

Metoda Jacobi se caracterizează prin desfacerea<br />

N = D, P = - (L+R)<br />

1<br />

a11<br />

0 0 …… 0 0<br />

N -1 = 0<br />

1<br />

a22<br />

0 ……0 0<br />

……………………..<br />

0 0 0 ……0<br />

1<br />

a<br />

nn<br />

N -1 P =<br />

1<br />

0 0 …… 0 0<br />

a11<br />

1<br />

0<br />

0 ……0<br />

a22<br />

……………………..<br />

0 -a 1,2 -a 1,3 …… -a 1,n-1 -a 1,n<br />

-a 2,1 0 -a 2,3 …… -a 2,n-1 -a 2,n<br />

:......................................................<br />

0 0 0 ……0<br />

1<br />

a<br />

nn<br />

-a n,1 -a n,2 -a n,3 …… -a n,n-1 0<br />

Dacă G = N -1 P, atunci coeficienţii matricei G = (g ij ) 1≤i,j≤n sunt:<br />

g i,j =<br />

0, i = j<br />

a<br />

i, j<br />

− , i ≠ j.<br />

a<br />

i,i<br />

Şirul (x k ) k definit prin<br />

Nx k+1 = P x k + b, k ≥ 0, x 0 dat<br />

converge la soluţia exactă a sistemului Ax = b oricare ar fi x 0 dacă şi numai dacă<br />

ρ(G) < 1. Deoarece ρ(G) ≤ ||G||, pentru orice normă operatorială ||⋅|| a lui G, avem<br />

83


Mădălina Roxana Buneci<br />

ρ(G) ≤ min(<br />

G ,<br />

1<br />

G<br />

∞<br />

), şi ca urmare pentru a asigura convergenţa şirului (x k ) k este<br />

suficient ca min(<br />

G ,<br />

1<br />

G )


<strong>Metode</strong> <strong>Numerice</strong><br />

ceea ce este echivalent cu<br />

k ≥<br />

⎡ ln<br />

⎢<br />

⎣ln<br />

( ε)<br />

( n )<br />

1, ∞<br />

⎤<br />

⎥ + 1.<br />

⎦<br />

Şirul (x k ) k construit prin metoda Jacobi este definit prin<br />

Nx k+1 = P x k + b, k ≥ 0, x 0 dat<br />

x k+1 = N -1 P x k + N -1 b, k ≥ 0,<br />

x k+1 = G x k + N -1 b, k ≥ 0,<br />

Deci pentru orice i, 1 ≤ i ≤n,<br />

n<br />

k 1<br />

x i<br />

+ k b<br />

= ∑ gi,jx<br />

j +<br />

i<br />

a<br />

j=<br />

1<br />

i,i<br />

=<br />

n<br />

k b<br />

∑gi,jx<br />

j -<br />

i<br />

j=<br />

1<br />

ai,i<br />

j≠i<br />

=<br />

n ai,j<br />

k b<br />

∑ − x j +<br />

i<br />

j=<br />

1<br />

ai,i<br />

ai,i<br />

j≠i<br />

.<br />

În consecinţă, şirul (x k ) k construit prin metoda Jacobi este:<br />

x 0 dat<br />

k 1<br />

x i<br />

+ =<br />

1<br />

a<br />

i,i<br />

(b i -<br />

n<br />

∑<br />

j=<br />

1<br />

j≠i<br />

a<br />

i,j<br />

x<br />

k<br />

j<br />

), i =1,2,…,n, k≥0.<br />

Următoarea procedură Maple are drept parametri matricea sistemului,<br />

vectorul termenilor liberi, aproximaţia iniţială x 0<br />

a soluţiei, şi eroarea epsilon.<br />

Procedura întoarce aproximaţia x k (dată de metoda Jacobi) a soluţiei cu<br />

> with(linalg):<br />

k =<br />

> mjacobi:=proc(a,b,x0,epsilon)<br />

⎡ ln<br />

⎢<br />

⎢⎣<br />

ln<br />

( eps)<br />

( n )<br />

> local n,n1,ni,x1,x2,k,i,j,p,suma;<br />

> n:=vectdim(x0);<br />

> ni:=0;<br />

> for i to n do<br />

> suma:=0;<br />

> for j to i-1 do<br />

> suma:=suma+abs(a[i,j]) od;<br />

> for j from i+1 to n do<br />

> suma:=suma+abs(a[i,j]) od;<br />

1, ∞<br />

⎤<br />

⎥ + 1.<br />

⎥⎦<br />

> if a[i,i]=0 then print(`Metoda nu se aplica`);<br />

> RETURN(NULL) fi;<br />

85


Mădălina Roxana Buneci<br />

> suma:=suma/abs(a[i,i]);<br />

> if ni od;<br />

> n1:=0;<br />

> for j to n do<br />

> suma:=0;<br />

> for i to j-1 do suma:=suma+abs(a[i,j]/a[i,i]) od;<br />

> for i from j+1 to n do suma:=suma+abs(a[i,j]/a[i,i]) od;<br />

> if n1 od;<br />

> if ni>n1 then ni:=n1 fi;<br />

> if ni>=1 then print (`Metoda nu se aplica`); RETURN fi;<br />

> k:=floor(ln(epsilon)/ln(ni))+1;<br />

> x1:=vector(n); x2:=vector(n);<br />

> for i to n do x1[i]:=x0[i] od;<br />

> for p to k do<br />

> for i to n do<br />

> x2[i]:=b[i];<br />

> for j to i-1 do<br />

> x2[i]:=x2[i]-a[i,j]*x1[j] od;<br />

> for j from i+1 to n do<br />

> x2[i]:=x2[i]-a[i,j]*x1[j] od;<br />

> x2[i]:=x2[i]/a[i,i]; od;<br />

> for i to n do x1[i]:=x2[i] od<br />

> od;<br />

> RETURN(evalm(x2))<br />

> end;<br />

Utilizăm această procedură pentru rezolvarea sistemului:<br />

3 x 1 + x 2 + x 3 = 4<br />

x 1 + 5x 2 + x 3 = -2<br />

-x 1 + x 2 + 8x 3 = 14<br />

> a:=matrix(3,3,[3,1,1,1,5,1,-1,1,8]);<br />

⎡ 3 1 1⎤<br />

a :=<br />

1 5 1<br />

⎢ ⎥<br />

⎣-1 1 8⎦<br />

86


<strong>Metode</strong> <strong>Numerice</strong><br />

> b:=vector([4,-2,14]);<br />

> linsolve(a,b);<br />

> x0:=vector(3,[0,0,0.1]);<br />

> mjacobi (a,b,x0,0.001);<br />

> x1:=vector(3,[0,1,2345]);<br />

> mjacobi (a,b,x1,10^(-3));<br />

b := [ 4, -2,<br />

14 ]<br />

[ 1, -1,<br />

2 ]<br />

x0 := [ 0, 0,<br />

0.1 ]<br />

[ 1.000000094, -0.9999998188,<br />

1.999999921 ]<br />

x1 := [ 0, 1,<br />

2345 ]<br />

⎡ 1919531 -8001171 51199997 ⎤<br />

⎢ , , ⎥<br />

⎣ 1920000 8000000 25600000 ⎦<br />

> map(evalf,mjacobi (a,b,x1,10^(-3)));<br />

[ 0.9997557292, -1.000146375,<br />

1.999999883 ]<br />

IV.4.3. Metoda Gauss-Seidel<br />

Metoda Gauss-Seidel corespunde desfacerii<br />

N = L + D, P = -R.<br />

Şirul (x k ) k construit prin metoda Gauss-Seidel este definit prin<br />

Nx k+1 = P x k + b, k ≥ 0, x 0 dat<br />

k 1<br />

a 1,1 0 0 … 0 0<br />

x 1<br />

+<br />

a 2,1 a 2,2 0 … 0 0<br />

k 1<br />

x 2<br />

+<br />

:..................................................<br />

a n,1 a n,2 a n,3 …… a n,n-1 a nn<br />

k 1<br />

x n<br />

+<br />

= Px k + b<br />

Deci<br />

k 1<br />

x 1<br />

+ =<br />

1<br />

a<br />

1,1<br />

((Px k ) 1 + b 1 ) =<br />

1<br />

a<br />

1,1<br />

n<br />

k<br />

( ∑ P1,j x j + b 1 ) =<br />

j=<br />

1<br />

1<br />

a<br />

1,1<br />

n<br />

k<br />

( ∑ P1,j x j + b 1 ) =<br />

j=<br />

2<br />

87


Mădălina Roxana Buneci<br />

=<br />

1<br />

a<br />

1,1<br />

n<br />

k<br />

( ∑ −a1,jx<br />

j + b 1 ) =<br />

j=<br />

2<br />

1<br />

a<br />

1,1<br />

(b 1 -<br />

n<br />

k<br />

∑ a1,jx<br />

j )<br />

j=<br />

2<br />

şi pentru orice i , 2 ≤ i ≤n, avem<br />

k 1<br />

x i<br />

+ =<br />

=<br />

=<br />

=<br />

1<br />

a<br />

1<br />

a<br />

i,i<br />

1<br />

a<br />

i,i<br />

i,i<br />

1<br />

a<br />

i,i<br />

i−1<br />

((Px k k+<br />

1<br />

) i + b i - ∑ ai,jx<br />

j ) =<br />

(<br />

j=<br />

1<br />

1<br />

a<br />

n<br />

i−1<br />

k<br />

k+<br />

1<br />

∑ Pi,jx<br />

j + b i - ∑ ai,jx<br />

j )<br />

j= i+<br />

1<br />

j=<br />

1<br />

n<br />

i−1<br />

k<br />

k+<br />

1<br />

∑ −ai,jx<br />

j + b i - ∑ ai,jx<br />

j )<br />

j= i+<br />

1<br />

j=<br />

1<br />

(<br />

( b i -<br />

n<br />

i−1<br />

k<br />

k+<br />

1<br />

∑ ai,jx<br />

j - ∑ ai,jx<br />

j )<br />

j= i+<br />

1 j=<br />

1<br />

i,i<br />

n<br />

k<br />

( ∑ Pi,j<br />

x j + b i -<br />

j=<br />

1<br />

i−1<br />

k+<br />

1<br />

∑ ai,jx<br />

j )<br />

j=<br />

1<br />

În consecinţă, şirul (x k ) k construit prin metoda Gauss-Seidel este:<br />

x 0 dat<br />

pentru k≥0,<br />

k 1<br />

x 1<br />

+ =<br />

1<br />

a<br />

1,1<br />

(b 1 -<br />

n<br />

k<br />

∑ a1,jx<br />

j )<br />

j=<br />

2<br />

k 1<br />

x i<br />

+ =<br />

1<br />

a<br />

i,i<br />

( b i -<br />

n<br />

k<br />

∑ ai,jx<br />

j -<br />

j= i+<br />

1<br />

i−1<br />

∑<br />

j=<br />

1<br />

a<br />

i,j<br />

x<br />

k+<br />

1<br />

j<br />

), i =2,3,…,n<br />

Ca şi în cazul metodei Jacobi dacă A este diagonal dominantă atunci şirul obţinut<br />

prin metoda Gauss-Seidel converge la soluţia exactă a sistemului Ax=b. De<br />

asemenea dacă A este o matrice simetrică şi are elementele de pe diagonala<br />

principală pozitive, atunci metoda Gauss-Seidel converge dacă şi numai dacă<br />

matricea A este pozitiv definită.<br />

Procedura Maple de mai jos are drept parametri, matricea sistemului<br />

presupusă diagonal dominantă, vectorul termenilor liberi, aproximaţia iniţială x 0 a<br />

soluţiei, şi eroarea epsilon. Procedura întoarce aproximaţia x k (dată de metoda<br />

Gauss Seidel) a soluţiei cu<br />

k =<br />

⎡<br />

ln<br />

⎢<br />

⎢ln<br />

⎣<br />

( epsilon)<br />

−1<br />

( N P )<br />

∞<br />

⎤<br />

⎥ + 1.<br />

⎥<br />

⎦<br />

88


<strong>Metode</strong> <strong>Numerice</strong><br />

> with(linalg):<br />

> mgaussseidel := proc(a, b,x0, epsilon)<br />

> local n, ni, x1, k, i, j, p, suma;<br />

> n:=rowdim(a);<br />

> ni := 0;<br />

> for i to n do<br />

> suma := 0;<br />

> for j to i - 1 do suma := suma + abs(a[i, j])od;<br />

> for j from i + 1 to n do suma := suma + abs(a[i, j])<br />

> od;<br />

> if a[i, i] = 0 then<br />

> print(`Metoda nu se aplica`); RETURN(NULL) fi;<br />

> suma := suma/abs(a[i, i]);<br />

> if ni < suma then ni := suma fi<br />

> od;<br />

> if 1 print(`Matricea nu este diagonal dominanta`);<br />

> RETURN (NULL) fi;<br />

> k := floor(ln(epsilon)/ln(ni)) + 1;<br />

> x1 := vector(n);<br />

> for i to n do x1[i]:=x0[i] od;<br />

> for p to k do x1[1] := b[1];<br />

> for j from 2 to n do<br />

> x1[1] := x1[1] - a[1, j]*x1[j] od;<br />

> x1[1] := x[1]/a[1, 1];<br />

> for i from 2 to n do<br />

> x1[i] := b[i];<br />

> for j from i + 1 to n do<br />

> x1[i] := x1[i] - a[i, j]*x1[j] od;<br />

> for j to i - 1 do x1[i] := x1[i] - a[i, j]*x1[j] od;<br />

> x1[i] := x1[i]/a[i, i]<br />

> od;<br />

> od;<br />

> RETURN(evalm(x1))<br />

> end;<br />

Utilizăm această procedură pentru rezolvarea sistemului:<br />

89


Mădălina Roxana Buneci<br />

3 x 1 + x 2 + x 3 = 4<br />

x 1 + 5x 2 + x 3 = -2<br />

-x 1 + x 2 + 8x 3 = 14<br />

> a:=matrix(3,3,[3,1,1,1,5,1,-1,1,8]);<br />

> linsolve(a,b);<br />

> x0:=vector(3,[0,0,0.1]);<br />

> mgaussseidel(a,b,x0,10^(-3));<br />

> x1:=vector(3,[0,1,2345]);<br />

⎡ 3 1 1⎤<br />

a :=<br />

1 5 1<br />

⎢ ⎥<br />

⎣-1 1 8⎦<br />

[ 1, -1,<br />

2 ]<br />

x0 := [ 0, 0,<br />

0.1 ]<br />

[ 1.000000000, -1.000000000,<br />

2.000000000 ]<br />

> mgaussseidel (a,b,x1,10^(-3));<br />

x1 := [ 0, 1,<br />

2345 ]<br />

⎡ 1703893329976716088550034332273 -170389332997668792871267240303<br />

⎢<br />

, ,<br />

⎣ 1703893329976655609856000000000 170389332997665560985600000000<br />

9087431093208860851748902245101 ⎤<br />

4543715546604414959616000000000 ⎥<br />

⎦<br />

> map(evalf,mgaussseidel(a,b,x1,10^(-3)));<br />

[ 1.000000000, -1.000000000,<br />

2.000000000 ]<br />

Metoda Gauss-Seidel care implică modificarea unei necunoscute la fiecare<br />

moment de timp este preferabilă metodei Jacobi care implică modificarea tuturor<br />

necunoscutelor în acelaşi timp dacă se dispune de un calculator serie obişnuit.<br />

Metoda Jacobi este preferabilă metodei Gauss Seidel c-se dispune de un calculator<br />

paralel.<br />

90


<strong>Metode</strong> <strong>Numerice</strong><br />

V. Rezolvarea ecuaţiilor şi sistemelor neliniare<br />

V.1 Rezolvarea ecuaţiilor neliniare<br />

Presupunem date a, b∈R, f: [a,b] → R. Problema pe care o studiem este<br />

determinarea numerelor reale x∈[a,b] cu proprietatea că f(x) = 0. Numim un număr<br />

real x*∈[a,b] cu proprietatea că f(x*) = 0, soluţie (sau rădăcină) a ecuaţiei f(x) = 0<br />

sau zerou al funcţiei f pe intervalul [a,b].<br />

Dacă f : [a,b] → R, este o funcţie continuă cu proprietatea că<br />

f(a)f(b) < 0.<br />

Atunci există cel puţin o rădăcină x * ∈(a,b) a ecuaţiei f(x) = 0. Rădăcina ecuaţiei<br />

f(x) = 0 nu este neapărat unică.<br />

Presupunem că f : [a,b] → R este o funcţie derivabilă, x*∈(a,b) o rădăcină a<br />

ecuaţiei f(x) = 0 şi ˆx = x* + h o aproximaţie a lui x*. Aplicând formula lui Taylor<br />

rezultă că<br />

unde<br />

şi<br />

h → 0<br />

( )<br />

o h<br />

lim h<br />

=0. Ca urmare,<br />

f( ˆx ) = f(x*) + f ′ (x*)h + o(h),<br />

f( ˆx ) - f(x*) - o(h) = f ′ (x*)( ˆx -x*)<br />

ˆx -x*<br />

≈<br />

≤<br />

1<br />

(f( ˆx ) - f(x*)).<br />

f ′(x*)<br />

Deci factorul de condiţionare absolut al problemei f(x) = 0 este<br />

ˆx este un număr real cu proprietatea că |f( ˆx )| ≤ ε atunci<br />

1<br />

. Dacă ε > 0 şi<br />

f ′(x)<br />

91


Mădălina Roxana Buneci<br />

| ˆx - x*| ≤ ε<br />

1<br />

.<br />

f ′(x*)<br />

(unde x* este o rădăcină a ecuaţiei f(x) = 0). În general, | ˆx -x*| şi |f( ˆx )| nu sunt<br />

simultan mici (| ˆx -x*| este eroarea absolută cu care ˆx aproximează x*, iar |f( ˆx )|<br />

1<br />

indică reziduu corespunzător lui ˆx ). Dacă problema este bine condiţionată (<br />

f ′(x*)<br />

mic), atunci reziduu mic implică eroare absolută | ˆx -x*| mică.<br />

problemă bine condiţionată<br />

problemă rău condiţionată<br />

<strong>Metode</strong>le iterative de rezolvare a unei ecuaţii f(x)=0 presupun construcţia unui<br />

şir (x k ) k convergent către o rădăcină x * a ecuaţiei. Eroarea absolută cu care x k<br />

aproximează x * este e k = x* - x k . Se spune că şirul (x k ) k converge cu rata r dacă<br />

există o constantă C ∈ (0, ∞) astfel încât<br />

e<br />

lim +<br />

k→∞<br />

e<br />

k 1<br />

r<br />

k<br />

= C.<br />

Dacă<br />

• r = 1 şi 0 < C 1), rata convergenţei se spune superliniară<br />

• r = 2, rata convergenţei se spune pătratică<br />

92


<strong>Metode</strong> <strong>Numerice</strong><br />

V.1. 1. Metoda bisecţiei (metoda înjumătăţirii intervalului)<br />

Fie f : [a,b] → R, o funcţie continuă cu proprietatea că<br />

Atunci există cel puţin o rădăcină x *<br />

f(a)f(b) < 0.<br />

∈(a,b) a ecuaţiei f(x)=0. Pentru găsirea<br />

rădăcinii se micşorează la fiecare pas intervalul în care funcţia îşi schimbă semnul.<br />

Metoda bisecţiei presupune înjumătăţirea la fiecare pas a acestui interval. Astfel<br />

• se determină mijlocul c =<br />

a + b<br />

2<br />

al intervalului (a,b).<br />

• dacă f(c)f(a) ln b a<br />

ln 2<br />

f continuă, a, b cu f(a)f(b)


( ε)<br />

( )<br />

⎡ln b − a<br />

nmax:= ⎢<br />

⎢⎣<br />

ln 2<br />

⎤<br />

⎥ +1;<br />

⎥⎦<br />

pentru j = 0, 1, ...., nmax execută<br />

a + b<br />

c: = ; 2<br />

Mădălina Roxana Buneci<br />

dacă f(c) = 0 atunci j : = nmax +1<br />

altfel dacă f(c)f(a) bisectie:=proc(f,A,B,epsilon)<br />

> local c,a,b,nmax,j;<br />

> a:=A; b:=B;<br />

> nmax:=floor(ln(abs(b-a)/epsilon)/ln(2))+1;<br />

> for j from 0 to nmax do<br />

> c:=(a+b)/2;<br />

> if f(c)=0 then a:=c;b:=c;else<br />

> if evalf(f(c)*f(a)) od;<br />

> c:=(a+b)/2;<br />

> RETURN(c)<br />

> end;<br />

Utilizăm această procedură pentru determinarea rădăcinilor reale ecuaţiei:<br />

x 8 –3x-3 = 0.<br />

Reprezentăm grafic funcţia<br />

x->x 8 –3x-3<br />

pentru a localiza rădăcinile.<br />

> with(plots):<br />

> plot(x^8-3*x-3,x,color=black);<br />

94


<strong>Metode</strong> <strong>Numerice</strong><br />

> plot(x^8-3*x-3,x=-5..5,color=black);<br />

> plot(x^8-3*x-3,x=-2..2,color=black);<br />

> plot(x^8-3*x-3,x=-1.5..1.5,color=black);<br />

95


Mădălina Roxana Buneci<br />

Se observă că ecuaţia are două rădăcini reale. Una în intervalul (-1.5, -0.5) şi alta în<br />

intervalul (1,1.5).<br />

> f:=(x-> x^8-3*x-3);<br />

> bisectie(f,1,3/2,10^(-3));<br />

f := x → x 8 − 3 x − 3<br />

5207<br />

4096<br />

> evalf(bisectie(f,1,3/2,10^(-3)));<br />

> bisectie(f,1,1.5,10^(-3));<br />

> bisectie(f,-1.5,0,10^(-3));<br />

> fsolve(f(x),x);<br />

1.271240234<br />

1.271240234<br />

-0.8801879883<br />

-0.8800582880,<br />

1.271068437<br />

> evalf(bisectie(f,1,3/2,10^(-10)));<br />

1.271068437<br />

> evalf(bisectie(f,1,-3/2,10^(-10)));<br />

-0.8800582880<br />

Comanda MAPLE fsolve(f(x), x) întoarce rădăcinile ecuaţiei f(x) = 0.<br />

V.1.2. Metoda coardei<br />

Fie f : [a,b] → R, o funcţie continuă cu proprietatea că<br />

f(a)f(b) < 0.<br />

Rădăcina ecuaţiei f(x)=0 se caută ca şi în cazul metodei bisecţiei prin micşorarea la<br />

fiecare pas a intervalului în care funcţia îşi schimbă semnul. Metoda coardei<br />

presupune următoarele:<br />

• se determină punctul c în care coarda AB intersectează axa Ox, unde<br />

A(a,f(a)) şi B(b,f(b)).<br />

• dacă f(c)f(a)


<strong>Metode</strong> <strong>Numerice</strong><br />

• dacă f(c) =0 s-a determinat o rădăcină a ecuaţiei f(x) = 0.<br />

a<br />

c 1 c 2<br />

b<br />

Să determinăm coordonatele punctului C de intersecţie a dreptei AB cu axa Ox,<br />

unde A(a,f(a)) şi B(b,f(b)) .<br />

Ox: y = 0<br />

AB:<br />

x − a<br />

=<br />

b − a f<br />

y − f ( a)<br />

( b) − f ( a)<br />

Dacă C(c,0) =AB ∩ Ox, atunci<br />

c = a -<br />

f<br />

b − a<br />

f(a)<br />

( b) − f ( a)<br />

Teoremă 5.1. Fie f : [a, b] → R o funcţie de două ori derivabilă cu<br />

proprietăţile: f’(x) ≠ 0, f”(x) ≠ 0, oricare ar fi x ∈ [a, b] şi f(a)f(b) < 0. Atunci unica<br />

soluţie a ecuaţiei f(x) = 0 poate fi obţinută ca limită a şirului strict monoton din [a,<br />

b] definit prin:<br />

x 0 = a, x n = x n-1 -<br />

f<br />

şi<br />

x 0 = b, x n = x n-1 -<br />

f<br />

f ( x<br />

n −1<br />

)<br />

( x ) − f ( b)<br />

n−1<br />

f ( x<br />

n−1<br />

)<br />

( x ) − f ( a)<br />

n−1<br />

(x n-1 -b), dacă f(a)f”(a) 0 sunt astfel încât m 1 ≤ |f’(x)| ≤ M 1 şi dacă x* este unica soluţie<br />

a ecuaţiei f(x) = 0, atunci eroarea absolută cu care termenul x n aproximează x*<br />

satisface inegalităţile:<br />

97


Mădălina Roxana Buneci<br />

|x*-x n | ≤<br />

f<br />

( x )<br />

m<br />

n<br />

1<br />

M1<br />

− m1<br />

|x*-x n | ≤ x n − x n−1<br />

m<br />

1<br />

Demonstraţie. Deoarece f ′ (x) ≠ 0 pentru orice x ∈[a, b], rezultă că f ′ este<br />

fie strict pozitivă, fie strict negativă, deci f este strict monotonă. Ţinând cont şi de<br />

faptul că f(a)f(b) < 0, rezultă că ecuaţia f(x) = 0 are o unică soluţie x*. Presupunem<br />

că f(a)f”(a)< 0 şi că f(a)< 0 (înlocuind eventual f cu –f). Deoarece f”(x) ≠ 0 pentru<br />

orice x ∈[a, b] şi f”(a)>0, rezultă că f” este strict pozitivă. Din faptul că f este strict<br />

monotonă şi f(a) < 0 < f(b), rezultă că f ′ este strict pozitivă. Dacă B este punctul<br />

de coordonate (b,f(b)) şi C n-1 punctul de coordonate (x n-1 , f(x n-1 )), atunci x n este<br />

abscisa punctului de intersecţie a coardei BC n-1 cu axa Ox. Ca urmare f(x n-1 ) < 0.<br />

Deoarece f este o funcţie Rolle pe intervalul [x n-1 , b], conform teoremei lui<br />

Lagrange există d n-1 ∈( x n-1 , b) astfel încât f(x n-1 ) – f(b) = f ′ (d n-1 )(x n-1 – b). Avem<br />

x n = x n-1 -<br />

f<br />

f ( x<br />

n −1<br />

)<br />

( x ) − f ( b)<br />

n−1<br />

(x n-1 -b) = x n-1 -<br />

( n−1<br />

)<br />

( d )<br />

f x<br />

f ′<br />

n−1<br />

> x n-1 .<br />

Deci şirul (x n ) n este crescător şi mărginit (termenii şirului aparţin intervalului<br />

(a,x*)). Fie x̃ limita şirului (x n ) n . Trecând la limită în<br />

x n = x n-1 -<br />

f<br />

obţinem<br />

x̃ = x̃ -<br />

f ( x n−<br />

1 )<br />

(x<br />

( x ) − f ( b)<br />

n-1 -b)<br />

n−1<br />

f ( x̃<br />

)<br />

( ̃ ) − f ( b)<br />

f x<br />

( x̃ -b),<br />

de unde rezultă f( x̃ ) = 0. Deoarece x* este unica rădăcină a ecuaţiei f(x) = 0 din<br />

intervalul (a, b) rezultă că x* = x̃ . Analog se arată că dacă f(b)f”(b)


<strong>Metode</strong> <strong>Numerice</strong><br />

Conform teoremei lui Lagrange pentru orice x∈[a, b] există d x între x şi x*<br />

astfel încât f(x*) – f(x) = (x* - x) f ′ (d x ). Ca urmare,<br />

| f(x n )| = | f(x*) – f(x n )| = |x* - x n | | f ′ (d n )|,<br />

de unde rezultă că<br />

f ( xn<br />

)<br />

|x* - x n | =<br />

f ′( d )<br />

Dacă presupunem că f(a)f”(a)


Mădălina Roxana Buneci<br />

de unde | x* - x n | =<br />

( ζn<br />

) − ( ηn<br />

)<br />

|f ′( η ) |<br />

|f ′ f ′ |<br />

n<br />

M<br />

| x n – x n-1 | ≤<br />

1 − m1<br />

| x n – x n-1 |, deoarece<br />

m<br />

1<br />

f ′ >0. Similar se tratează cazul f(b)f”(b)


<strong>Metode</strong> <strong>Numerice</strong><br />

x 0 = a x 1 x 2 b<br />

1.2. f” < 0, f(a) > 0<br />

Cazul 2. f(b)f”(b) < 0 (sau echivalent f(a)f”(a) > 0) : pentru orice n ≥1, x n<br />

reprezintă abscisa punctului de intersecţie a axei Ox cu coarda AC n-1 unde A(a,f(a))<br />

şi C n-1 (x n-1 , f(x n-1 )). Aşadar avem subcazurile<br />

2.1. f ′ > 0 (f strict descrescătoare)<br />

2.2. f ′ < 0 (f strict crescătoare)<br />

2.3.<br />

a x 2 x 1 x 0 = b<br />

2.1. f” > 0, f(b) < 0<br />

101


Mădălina Roxana Buneci<br />

a x 2 x 1 x 0 = b<br />

2.2 f” < 0, f(b) > 0<br />

Algoritm<br />

Date de intrare:<br />

• f de două ori derivabilă pe [a,b], cu f ′ (x) ≠0, f”(x) ≠0 pentru orice x şi<br />

f(a)f(b)


<strong>Metode</strong> <strong>Numerice</strong><br />

dacă f(a) f”(a) < 0 execută<br />

x1: = b ; x2: = a;<br />

cât timp | x1-x2 | ≥ ε execută<br />

x1: = x2;<br />

x2 : = x 1 -<br />

f x1<br />

altfel<br />

f ( x1)<br />

( ) − f ( b)<br />

(x1-b),<br />

x1: = a ; x2: = b;<br />

cât timp | x1-x2 | ≥ ε execută<br />

x1: = x2;<br />

x2 : = x 1 -<br />

f ( x1)<br />

( ) − f ( a)<br />

f x1<br />

(x1-a),<br />

x2 reprezintă x N unde N este cel mai mic număr natural cu proprietatea că<br />

|x N –x N-1 | < ε.<br />

Procedură MAPLE<br />

> mcoarda:= proc(f,a,b,epsilon)<br />

> local x1, x2;<br />

> if evalf(f(a)*(D@@2)(f)(a)) x1:=b; x2:=a;<br />

> while evalf(abs(x1-x2))>=epsilon do<br />

> x1:=x2;<br />

> x2:= x1-f(x1)*(x1-b)/(f(x1)-f(b))<br />

> od;<br />

> else<br />

> x1:=a; x2:=b;<br />

> while evalf(abs(x1-x2))>=epsilon do<br />

> x1:=x2;<br />

> x2:= x1-f(x1)*(x1-a)/(f(x1)-f(a))<br />

> od;<br />

> fi;<br />

> RETURN(x2)<br />

> end;<br />

103


Mădălina Roxana Buneci<br />

Aplicăm această procedură pentru determinarea rădăcinilor reale ale ecuaţiei:<br />

x 8 –3x-3 = 0.<br />

În secţiunea precedentă rădăcinile au fost localizate în intervalele (-1.5, -0.5) şi<br />

(1,1.5).<br />

> f:=(x-> x^8-3*x-3);<br />

> mcoarda(f,1,1.5,10^(-3));<br />

> mcoarda(f,-1.5,0,10^(-3));<br />

> fsolve(f(x),x);<br />

> mcoarda(f,1,1.5,10^(-10));<br />

> mcoarda(f,-1.5,0,10^(-10));<br />

f := x → x 8 − 3 x − 3<br />

1.270281421<br />

-0.8741520730<br />

-0.8800582880,<br />

1.271068437<br />

1.271068437<br />

V.1.3. Metoda tangentei<br />

Metoda tangentei este utilizată pentru determinarea unei rădăcini a ecuaţiei<br />

f(x) = 0. Presupunem că f este derivabilă şi că derivata nu se anulează. Rădăcina<br />

ecuaţiei este determinată ca limita unui şir. Se pleacă de la un punct x 0 dat.<br />

Presupunând că s-a construit termenul x n-1 , termenul x n se determină ca fiind<br />

abscisa intersecţiei dintre tangenta la graficul funcţiei în x n-1 şi axa Ox.<br />

x n x n-1<br />

104


<strong>Metode</strong> <strong>Numerice</strong><br />

Ecuaţia tangentei în x n-1 este:<br />

y – f(x n-1 ) = f ′ (x n-1 )(x – x n-1 )<br />

Deci intersecţia cu axa Ox se află rezolvând sistemul<br />

În consecinţă ,<br />

( )<br />

⎧⎪ y- f(x ) = f ′(x ) x-x<br />

⎨<br />

⎪⎩ y = 0<br />

n-1 n-1 n-1<br />

x n = x n-1 -<br />

( n−1<br />

)<br />

( x )<br />

f x<br />

f ′<br />

n−1<br />

.<br />

Convergenţa şirului este determinată de termenul iniţial x 0 . Următoarea<br />

teoremă stabileşte condiţii suficiente pentru convergenţa metodei tangentei.<br />

Teoremă 5.2. (Metoda tangentei). Fie f : [a, b] → R o aplicaţie de două ori<br />

derivabilă cu următoarele proprietăţi: f’(x)≠0, f”(x) ≠ 0 oricare ar fi x∈[a, b] şi<br />

f(a)f(b) 0. În plus, oricare ar fi n ≥ 1<br />

eroarea absolută cu care termenul x n aproximează x* verifică următoarele<br />

inegalităţi:<br />

|x* - x n | ≤<br />

f<br />

( x )<br />

m<br />

M<br />

2m<br />

2<br />

|x* - x n | ≤ ( x − x ) 2<br />

1<br />

n<br />

1<br />

n<br />

n−1<br />

unde m 1 = inf f ′( x)<br />

şi M 2 = sup f ( x)<br />

x ∈[a,b]<br />

x ∈[a,b]<br />

′′ .<br />

Demonstraţie. Putem presupune f(a) < 0, eventual înlocuind f cu – f.<br />

Deoarece f ′ (x) ≠ 0 pentru orice x ∈[a, b], rezultă că f ′ este fie strict pozitivă, fie<br />

105


Mădălina Roxana Buneci<br />

strict negativă, deci f este strict monotonă. Ţinând cont şi de faptul că f(a) < 0 şi f(b)<br />

> 0, rezultă că f este strict crescătoare şi că f ′ este strict pozitivă. Deoarece<br />

f(a)f(b)0. Atunci<br />

f(x 0 ) > 0 şi deci x 0 > x*. Arătăm prin inducţie după n că x n > x* pentru orice n ≥0.<br />

Presupunem că x n > x* şi demonstrăm că x n+1 > x*. Aplicând formula lui Taylor<br />

rezultă că există ζ n între x n şi x* astfel încât<br />

x * −x<br />

0 = f(x*) = f(x n ) +<br />

n<br />

f ′ (x n ) + ( x * −x n )2<br />

1!<br />

2!<br />

Din faptul că f”(ζ n ) > 0, rezultă că<br />

x * −x<br />

0 > f(x n ) +<br />

n<br />

f ′ (x n )<br />

1!<br />

de unde<br />

x n+1 = x n -<br />

( n )<br />

( x )<br />

f x<br />

f ′<br />

n<br />

> x n + x* - x n = x*.<br />

f”(ζ n )<br />

Ca urmare x n > x* pentru orice n ≥0. Deoarece f este strict crescătoare,<br />

f(x n ) > f(x*) = 0,<br />

şi în consecinţă,<br />

x n+1 = x n -<br />

( n )<br />

( x )<br />

f x<br />

f ′<br />

n<br />

< x n pentru orice n ≥ 0.<br />

Aşadar şirul (x n ) n este strict descrescător şi mărginit inferior, deci este convergent.<br />

Fie x̃ limita şirului (x n ) n . Avem x 0 > x̃ ≥ x*. Trecând la limită în<br />

f x<br />

x n = x n-1 -<br />

f ′ x<br />

obţinem<br />

f x̃<br />

x̃ = x̃ -<br />

f ′ x̃<br />

( n−1<br />

)<br />

( )<br />

n−1<br />

( )<br />

( )<br />

de unde rezultă f( x̃ ) = 0. Deoarece x* este unica rădăcină a ecuaţiei f(x) = 0 din<br />

intervalul [a, b] rezultă că x* = x̃ . Similar se tratează cazul f” < 0.<br />

,<br />

106


<strong>Metode</strong> <strong>Numerice</strong><br />

Conform teoremei lui Lagrange pentru orice x∈[a,b] există d x între x şi x*<br />

astfel încât f(x*) – f(x) = (x* - x) f ′ (d x ). Ca urmare,<br />

| f(x n )| = | f(x*) – f(x n )| = |x* - x n | | f ′ (d n )|,<br />

de unde rezultă că<br />

f ( xn<br />

)<br />

|x* - x n | =<br />

f ′( d )<br />

n<br />

≤<br />

f<br />

( x n )<br />

.<br />

Aplicând formula lui Taylor rezultă că există η n între x n şi x n-1 astfel încât<br />

x<br />

f(x n ) = f(x n-1 ) +<br />

n − xn−1<br />

f ′ (x n-1 ) + ( xn − xn−1<br />

)2<br />

f”(η n )<br />

1!<br />

2!<br />

Ţinând cont şi de faptul că x n = x n-1 -<br />

( n−1<br />

)<br />

( x )<br />

f x<br />

f ′<br />

n−1<br />

f x<br />

x n - x n-1 = -<br />

f ′<br />

obţinem<br />

f(x n ) = f(x n-1 ) -<br />

( n−1<br />

)<br />

( x )<br />

f x<br />

f ′<br />

n−1<br />

= ( xn − xn−1<br />

)2<br />

f”(η n ).<br />

2!<br />

Ca urmare<br />

|x* - x n | ≤<br />

f<br />

( x n )<br />

=<br />

m<br />

1<br />

1<br />

m<br />

1<br />

( x − x ) 2<br />

n n−1<br />

2!<br />

m<br />

1<br />

sau echivalent<br />

( n−1<br />

)<br />

( x )<br />

n−1<br />

,<br />

f ′ (x n-1 ) + ( xn − xn−1<br />

)2<br />

f”(η n )<br />

2!<br />

M<br />

|f”(η n )| ≤<br />

2<br />

2m (x n – x n-1 ) 2 .<br />

■<br />

Observaţie 5.3. Rata convergenţei pentru metoda tangentei este pătratică.<br />

Într-adevăr, să presupunem că f : [a, b] → R o aplicaţie de două ori derivabilă cu<br />

f’(x)≠0, f”(x) ≠ 0 oricare ar fi x∈[a, b], f(a)f(b) 0. Din teorema anterioară rezultă<br />

că (x n ) n converge la x* unica soluţie a ecuaţiei f(x) = 0. Aplicând formula lui<br />

Taylor rezultă că există ζ n între x n şi x* astfel încât<br />

1<br />

107


Mădălina Roxana Buneci<br />

de unde<br />

sau echivalent<br />

Aşadar<br />

x * −x<br />

0 = f(x*) = f(x n ) +<br />

n<br />

1!<br />

x* - x n = -<br />

x* - x n +<br />

şi trecând la limită obţinem<br />

( n )<br />

( x )<br />

f x<br />

f ′<br />

n<br />

( n )<br />

( x )<br />

f x<br />

f ′<br />

n<br />

x* - x n+1 = -<br />

n→∞<br />

-<br />

= -<br />

f ′ (x n ) + ( x * −x n )2<br />

2!<br />

( n )<br />

( x )<br />

f ′′ ζ<br />

f ′<br />

n<br />

( n )<br />

( x )<br />

f ′′ ζ<br />

f ′<br />

( n )<br />

( x )<br />

f ′′ ζ<br />

f ′<br />

n+<br />

1<br />

2<br />

n<br />

n<br />

n<br />

1<br />

2 (x*-x n) 2 ,<br />

1<br />

2 (x*-x n) 2 .<br />

1<br />

2 (x*-x n) 2 ,<br />

( )<br />

′( )<br />

| x * −x | | f ′′ x * |<br />

lim =<br />

| x * − x | 2 | f x * |<br />

unde m 1 = inf f ′( x)<br />

şi M 2 = sup f ( x)<br />

x ∈[a,b]<br />

x ∈[a,b]<br />

′′ .<br />

M<br />

2m<br />

≤<br />

2<br />

1<br />

f”(ζ n ),<br />

Semnificaţie geometrică. Fie f : [a, b] → R o aplicaţie de două ori<br />

derivabilă cu f’(x)≠0, f”(x) ≠ 0 oricare ar fi x∈[a, b], f(a)f(b) 0. Atunci şirul (x n ) n converge la x*<br />

unica soluţie a ecuaţiei f(x) = 0. Pentru orice n ≥1, x n reprezintă abscisa punctului<br />

de intersecţie a axei Ox cu tangenta la graficul lui f în punctul de coordonate (x n-1 ,<br />

f(x n-1 )). Deoarece f’ şi f” nu se anulează pe [a, b], rezultă că sunt fie strict pozitive<br />

fie strict negative. Aşadar avem<br />

Cazul 1. f” > 0 (f strict convexă)<br />

1.1. f ′ > 0 (f strict crescătoare)<br />

1.2. f ′ < 0 (f strict descrescătoare)<br />

108


<strong>Metode</strong> <strong>Numerice</strong><br />

x 2 x 1 x 0<br />

1.1. f’ > 0, f” > 0<br />

x 0 x 1 x 2<br />

1.2. f’ < 0, f” > 0<br />

Cazul 2. f” < 0 (f strict concavă)<br />

2.1. f ′ > 0 (f strict crescătoare)<br />

2.2. f ′ < 0 (f strict descrescătoare)<br />

109


Mădălina Roxana Buneci<br />

x 0 x 1 x 2<br />

2.1. f’ > 0, f” < 0<br />

x 2 x 1 x 0<br />

2.2. f’ < 0, f” < 0<br />

Deci pentru aplicarea metodei tangentei în rezolvarea ecuaţiei f(x) = 0 trebuie<br />

stabilite intervalele de monotonie şi intervalele de convexitate/concavitate pentru<br />

funcţia f. Dacă a şi b sunt capetele unui astfel de interval şi dacă f(a)f(b)0. Şirul construit rin<br />

110


<strong>Metode</strong> <strong>Numerice</strong><br />

metoda tangentei, având termenul iniţial x 0 converge la unica rădăcină a ecuaţiei<br />

f(x) = 0, situată în intervalul [a, b].<br />

Algoritm<br />

Date de intrare:<br />

f - în condiţiile 1.1,1.2,2.1 sau 2.2<br />

x 0 - f(x 0 )f”(x 0 )>0<br />

ε >0 (precizia –determină condiţia de oprire a iteraţiilor)<br />

Date de ieşire: x N cu proprietatea că N este cel mai mic număr natural pentru care<br />

|x N – x N-1 | 2 < ε.<br />

unde (x n ) n este şirul corespunzător metodei tangentei (x N este considerat o<br />

aproximaţie satisfăcătoare a unicei soluţii a ecuaţiei f(x)=0)<br />

x1 := x0;<br />

f<br />

x2 : = x1 -<br />

f<br />

( x1)<br />

′( x1)<br />

cât timp | x 2 – x 1 | 2 ≥ ε execută<br />

x1 := x2;<br />

x2 : = x1 -<br />

;<br />

f<br />

f<br />

( x1)<br />

′( x1)<br />

;<br />

Prezentăm în continuare o variantă a acestui algoritm pentru cazul în care f nu<br />

verifică neapărat condiţiile suficiente de convergenţă. Introducem ca dată<br />

suplimentară de intrare numărul maxim de termeni din şir ce urmează a fi calculaţi<br />

(Nmax). Condiţia de oprire se transformă<br />

| x n - x n-1 | 2 < ε sau n > Nmax<br />

x1 := x0;<br />

x2 : = x1 -<br />

n : = 1;<br />

f<br />

f<br />

( x1)<br />

′( x1)<br />

;<br />

111


Mădălina Roxana Buneci<br />

cât timp (| x 2 – x 1 | 2 ≥ ε ) şi (n ≤ Nmax) execută<br />

x1 := x2;<br />

x2 : = x1 -<br />

n : = n + 1;<br />

f<br />

f<br />

( x1)<br />

′( x1)<br />

;<br />

Trebuie verificat la ieşirea din ciclu dacă f(x2) ≅ 0. Dacă problema este bine<br />

condiţionată, aceasta condiţie va asigura acurateţea aproximaţiei.<br />

Proceduri MAPLE<br />

> mtangenta:=proc(f,x0,epsilon)<br />

> local x1,x2,df;<br />

> df:=D(f);x1:=x0;x2:=x1-f(x1)/df(x1);<br />

> while evalf((x2-x1)^2)>=epsilon do<br />

> x1:=x2;x2:=x1-f(x1)/df(x1)<br />

> od;<br />

> RETURN(x2)<br />

> end;<br />

> mtangentaN:=proc(f,x0,epsilon,Nmax)<br />

> local x1,x2,n,df;<br />

> df:=D(f);x1:=x0;x2:=x1-f(x1)/df(x1);n:=1;<br />

> while (evalf((x2-x1)^2)>=epsilon)and (n x1:=x2;x2:=x1-f(x1)/df(x1) ;n:=n+1; print(evalf(x2))<br />

> od;<br />

> print(`Numar de termeni calculati`, n-1);<br />

> RETURN(x2)<br />

> end;<br />

Exemple de utilizare a procedurilor<br />

> with(plots):<br />

> plot(exp(x)+2*x+1,x,color=black);<br />

112


<strong>Metode</strong> <strong>Numerice</strong><br />

> plot(exp(x)+2*x+1,x=-2..2,color=black);<br />

> f1:=(x->exp(x)+2*x+1);<br />

> mtangenta(f1,0.1,10^(-5));<br />

f1 := x → e x + 2 x + 1<br />

-0.7388349460<br />

> fsolve(f1(x),x);<br />

-0.7388350311<br />

> plot(sin(x)+x-1,x,color=black);<br />

> f2:=(x->sin(x)+x-1);<br />

> mtangenta(f2,1.1,10^(-8));<br />

f2 := x → sin( x ) + x − 1<br />

113


Mădălina Roxana Buneci<br />

> fsolve(f2(x),x);<br />

> mtangentaN(f2,1.1,10^(-8),10);<br />

0.5109734294<br />

0.5109734294<br />

0.5099954153<br />

0.5109733047<br />

0.5109734294<br />

Numar de termeni calculati , 3<br />

0.5109734294<br />

> xN:=mtangentaN(f2,-10.1,10^(-8),10);<br />

19.33165959<br />

9.366076806<br />

-4881.864603<br />

-2422.713182<br />

14288.93783<br />

5139.034940<br />

2315.137476<br />

-96996.81022<br />

0.1024903391 10 8<br />

-0.5376704605 10 8<br />

Numar de termeni calculati , 10<br />

xN := -0.5376704605 10 8<br />

> f2(xN);<br />

-0.5376704787 10 8<br />

V.2. Rezolvarea sistemelor neliniare<br />

Presupunem date o mulţime G ⊂ R n şi o funcţie f = (f 1 , f 2 , ..., f n ): G → R n .<br />

Problema pe care o studiem este determinarea vectorilor n-dimensionali<br />

x = (x 1 , x 2 , ..., x n ) t ∈G<br />

114


<strong>Metode</strong> <strong>Numerice</strong><br />

cu proprietatea că f(x) = 0 sau echivalent<br />

f 1 (x 1 , x 2 , ..., x n ) = 0<br />

f 2 (x 1 , x 2 , ..., x n ) = 0<br />

...............................<br />

f n (x 1 , x 2 , ..., x n ) = 0<br />

Numim soluţie a sistemului (de n ecuaţii cu n necunoscute) f(x) = 0 pe G un vector<br />

x*∈G ⊂ R n cu proprietatea că f(x*) = 0,.<br />

Presupunem că G ⊂ R n este o mulţime deschisă, ||⋅|| o normă pe R n care<br />

induce o normă pe L(R n , R n ) ) ≅ M n,n (R) notată tot ||⋅||, f = (f 1 , f 2 , ..., f n ) : G → R n<br />

este o funcţie diferenţiabilă şi x*∈G o soluţie a sistemului f(x) = 0. De asemenea fie<br />

ˆx = x* + δh ∈G (h∈R n cu ||h||=1, δ∈R) o aproximaţie a lui x*. Notăm cu Jf(x)<br />

jacobianul funcţiei f în punctul x, adică matricea<br />

⎛ ∂f<br />

⎜<br />

⎝<br />

∂x<br />

i<br />

j<br />

( x)<br />

⎞<br />

⎟<br />

⎠<br />

1≤i,j≤<br />

n<br />

Aplicând formula lui Taylor rezultă că<br />

f( ˆx ) = f(x*) + δJf(x*)h + o(δ),<br />

unde<br />

şi<br />

δ→0<br />

( δ)<br />

|| o ||<br />

lim =0. Ca urmare,<br />

δ<br />

f( ˆx ) - f(x*) - o(δ) = Jf(x*)( ˆx -x*)<br />

Jf(x*) -1 (f( ˆx ) - f(x*) - o(δ)) =( ˆx -x*)<br />

|| ˆx -x*|| ≤ || Jf(x*) -1 || f( ˆx ) - f(x*)||.<br />

≈<br />

Deci factorul de condiţionare absolut al problemei f(x) = 0 este|| Jf(x) -1 ||. Dacă ε ><br />

0 şi ˆx este un număr real cu proprietatea că |f( ˆx )| ≤ ε atunci<br />

| ˆx - x*| ≤ ε|| Jf(x*) -1 ||<br />

≈<br />

(unde x* este o soluţie a sistemului f(x) = 0). În general, || ˆx -x*|| şi ||f( ˆx )|| nu sunt<br />

simultan mici (|| ˆx -x*|| este eroarea absolută cu care ˆx aproximează x*, iar ||f( ˆx )||<br />

indică reziduu corespunzător lui ˆx ). Dacă problema este bine condiţionată (adică<br />

.<br />

115


Mădălina Roxana Buneci<br />

dacă norma || Jf(x*) -1 || este mică), atunci reziduu mic implică faptul că eroarea<br />

absolută cu care ˆx aproximează x*, || ˆx -x*||, este mică.<br />

<strong>Metode</strong>le iterative de rezolvare a unui sistem de ecuaţii f(x)=0 presupun<br />

construcţia unui şir (x k ) k convergent către o rădăcină x * a ecuaţiei. Eroare absolută<br />

cu care x k aproximează x * este e k = x* - x k . Se spune că şirul (x k ) k converge cu rata<br />

r dacă există o constantă C ∈ (0, ∞) astfel încât<br />

k+<br />

1<br />

|| e ||<br />

lim<br />

k→∞<br />

|| e<br />

k ||<br />

r<br />

= C.<br />

Dacă<br />

• r = 1 şi C 1), rata convergenţei se spune superliniară<br />

• r = 2, rata convergenţei se spune pătratică<br />

V.2.1. Metoda punctului fix<br />

Definiţie 5.4. Fie (X,d) un spaţiu metric şi fie f: X → X. Funcţia f se<br />

numeşte contracţie dacă şi numai dacă există q∈ (0,1) astfel încât<br />

d(f(x), f(y) ≤ q d(x,y)<br />

pentru orice x,y ∈X<br />

Definiţie 5.5 Fie f: X → X. Punctul α ∈X se numeşte punct fix pentru f<br />

dacă f(α) = α.<br />

Teoremă 5.6. (metoda punctului fix). Fie (X,d) un spaţiu metric complet<br />

şi fie f : X → X o contracţie. Atunci există şi este unic x* punct fix pentru f. Punctul<br />

x* este limita unui şir construit după cum urmează:<br />

x 0 ∈ X dat<br />

x n = f(x n-1 ), n ≥ 1.<br />

Mai mult, dacă numărul q ∈ (0,1) este astfel încât d(f(x), f(y)) ≤ qd(x,y)<br />

pentru orice x,y ∈ X, atunci pentru orice n≥1 avem<br />

116


<strong>Metode</strong> <strong>Numerice</strong><br />

1. d(x*, x n ) ≤<br />

2. d(x*, x n ) ≤<br />

q<br />

1− q<br />

d(x n, x n-1 )<br />

n<br />

q<br />

1− q<br />

d(x 1, x 0 )<br />

3. d(x*, x n ) ≤ qd(x*, x n-1 )<br />

Demonstraţie. Deoarece f este contracţie, rezultă că există q ∈(0,1) astfel<br />

încât d(f(x), f(y)) ≤ qd(x,y) pentru orice x,y ∈ X. Arătăm unicitatea punctului fix.<br />

Presupunem prin absurd că x* şi y* sunt puncte fixe ale lui f şi că x* ≠ y*. Atunci<br />

f(x*) = x* şi f(y*) = y* şi avem<br />

d(x*, y*) = d(f(x*), f(y*)) ≤ q d(x*, y*) < d(x*, y*),<br />

ceea ce este o contradicţie. În consecinţă, punctul fix (dacă există) este unic. Arătăm<br />

că şirul (x n ) n este convergent şi limita lui este punct fix pentru f. Pentru orice k≥0 şi<br />

orice n ≥ 0, avem<br />

d(x n+k , x n+k-1 ) = d(f(x n+k-1 ), f(x n+k-2 )) ≤ q d(x n+k-1 , x n+k-2 ) ≤ ...≤ q k-1 d(x n+1 , x n ).<br />

şi ţinând cont de aceasta<br />

d(x n+k , x n ) ≤ d(x n+k , x n-k-1 ) + d(x n+k-1 , x n+k-2 ) +....+ d(x n+1 , x n ) ≤<br />

≤ q k-1 d(x n+1 , x n ) + q k-2 d(x n+1 , x n ) + ...+ d(x n+1 , x n )<br />

= (q k-1 + q k-2 + ... + 1) d(x n+1 , x n )<br />

k<br />

1−<br />

q<br />

=<br />

1−<br />

q<br />

d(x n+1 , x n ).<br />

Deci<br />

d(x n+k , x n ) ≤<br />

k<br />

1−<br />

q<br />

1−<br />

q<br />

d(x n+1 , x n ) (1).<br />

Din faptul că d(x n+1 , x n ) = d(f(x n ), f(x n-1 )) ≤ q d(x n , x n-1 ) ≤ ... ≤ q n d(x 1 , x 0 ) şi din<br />

relaţia (1) rezultă<br />

d(x n+k , x n ) ≤<br />

k<br />

1−<br />

q<br />

1−<br />

q<br />

d(x n+1 , x n ) ≤<br />

k<br />

1−<br />

q<br />

1−<br />

q<br />

q n d(x 1 , x 0 ) ≤ 1<br />

1− q<br />

qn d(x 1 , x 0 ).<br />

Ca urmare<br />

d(x n+k , x n ) ≤<br />

1<br />

1− q<br />

qn d(x 1 , x 0 ) (2).<br />

117


Mădălina Roxana Buneci<br />

Fie ε>0. Deoarece q ∈ (0,1),<br />

lim q n<br />

n→∞<br />

încât q n 1−<br />

q<br />

< ε . Ţinând cont de relaţia (2) obţinem<br />

d(x , x )<br />

1 0<br />

= 0, şi de aici rezultă că există n ε ∈N astfel<br />

d(x n+k , x n ) < ε<br />

pentru orice n ≥ n ε şi orice k≥0. Deci (x n ) n este şir Cauchy şi deoarece X este spaţiu<br />

complet rezultă că (x n ) n este convergent. Notăm x* =<br />

lim x n . Arătăm că x* este<br />

n→∞<br />

punct fix pentru f. Funcţia f fiind contracţie este funcţie continuă. Trecând la limită<br />

cu n → ∞ în<br />

obţinem<br />

lim x n<br />

n→∞<br />

de unde ţinând cont că x* =<br />

adică x* este punct fix pentru f.<br />

Din relaţia (1) rezultă<br />

x n = f(x n-1 )<br />

= lim f (x n−1)<br />

= n−1<br />

n→∞<br />

n→∞<br />

lim x n<br />

n→∞<br />

= lim x n−1<br />

n→∞<br />

x* = f(x*),<br />

f ( lim x ) ,<br />

rezultă<br />

d(x n+k , x n ) ≤<br />

k<br />

1−<br />

q<br />

1−<br />

q<br />

k<br />

1−<br />

q<br />

d(x n+1 , x n ) ≤.<br />

1−<br />

q<br />

q d(x n , x n-1 )<br />

şi trecând la limită cu k → ∞, se obţine<br />

d(x*, x n ) ≤<br />

q<br />

1− q<br />

d(x n, x n-1 ).<br />

În continuare folosind şi faptul că d(x n , x n-1 ) ≤ q n-1 d(x 1 , x 0 ) se obţine<br />

d(x*, x n ) ≤<br />

n<br />

q<br />

1− q<br />

d(x 1, x 0 ).<br />

Pentru a arăta ultima afirmaţia din teoremă ţinem seama de<br />

d(x*, x n ) = d(f(x*), f(x n-1 )) ≤ q d(x*, x n-1 ).<br />

■<br />

Corolar 5.7. Fie (E, ||⋅||) un spaţiu Banach (în particular, E = R m ) şi S o<br />

submulţime închisă a lui E. Fie f : S → S o funcţie cu proprietatea că există un<br />

118


<strong>Metode</strong> <strong>Numerice</strong><br />

număr q ∈ (0,1) este astfel încât ||f(x) - f(y)|| ≤ q||x -y|| pentru orice x,y ∈ S Atunci<br />

există şi este unic x* punct fix pentru f şi pentru orice x 0 ∈E, şirul definit recursiv<br />

prin<br />

converge la x*.<br />

Mai mult, pentru orice n≥1 avem<br />

1. ||x*- x n || ≤<br />

2. ||x*- x n || ≤<br />

q<br />

1− q<br />

||xn - x n-1 ||<br />

n<br />

q<br />

1− q<br />

||x1 - x 0 ||<br />

3. ||x*- x n || ≤ q ||x*- x n-1 ||<br />

x n = f(x n-1 ), n ≥ 1<br />

Demonstraţie. Dacă (E, ||⋅||) un spaţiu Banach şi S o submulţime închisă a lui<br />

E atunci (S,d) (unde d(x,y) = || x-y||) este spaţiu metric complet. În consecinţă,<br />

afirmaţiile rezultă aplicând direct teorema precedentă.<br />

este liniară.<br />

Algoritm:<br />

Observaţie 5.8. În general, rata convergenţei pentru metoda punctului fix<br />

Date de intrare:<br />

f (contracţie)<br />

Date de ieşire:<br />

x0 (termenul iniţial al şirului)<br />

ε (precizia ce determină condiţia de oprire: se calculează termenii şirului<br />

până la x N cu proprietatea ||x N -x N-1 || < ε).<br />

x N (aproximaţie satisfăcătore (determinată de ε) pentru punctul fix).<br />

x1:=x0;<br />

x2:=f(x1);<br />

cât timp x2<br />

− x1<br />

≥ε execută<br />

x1:=x2;<br />

x2:=f(x1);<br />

■<br />

119


Mădălina Roxana Buneci<br />

La ieşire x2 este aproximaţie pentru x*, punctul fix al lui f. Faptul că f este<br />

contracţie asigură terminarea programului într-un număr finit de paşi. Pentru a evita<br />

ciclarea în situaţia în care s-ar încerca folosirea algoritmului pentru o funcţie care<br />

nu este contracţie, se poate stabili de la început un număr maxim de paşi ce urmează<br />

a fi executaţi. De asemenea se poate afişa la fiecare pas diferenţa dintre termenii<br />

consecutivi curenţi. (pentru a observa că şirul nu converge dacă f nu e contracţie).<br />

Astfel se poate folosi următoarea variantă a algoritmului:<br />

Date de intrare:<br />

f (contracţie)<br />

x0 (termenul iniţial al şirului)<br />

ε (precizia)<br />

Nmax (număr maxim de termeni ai şirului ce urmează a fi calculaţi)<br />

Condiţia de oprire: se calculează termenii şirului până la x N cu proprietatea<br />

||x N -x N-1 || < ε sau N ≥ Nmax).<br />

Date de ieşire:<br />

x N (dacă f este contracţie, x N este aproximaţie satisfăcătore - determinată de<br />

ε şi Nmax - pentru punctul fix al lui f).<br />

x1:=x0;<br />

x2:=f(x1);<br />

n:=1;<br />

cât timp ( x2<br />

− x1<br />

≥ε) sau (n


<strong>Metode</strong> <strong>Numerice</strong><br />

Interpretare geometrică: f: I → I contracţie, I ⊂ R interval închis<br />

y = f(x)<br />

y = x<br />

x 0 x 2 x 4 x 3 x 1<br />

Propoziţie 5.9. Fie a, b două numere reale cu a < b şi fie f: [a, b] → [a,b] ⊂<br />

R o funcţie derivabilă cu proprietatea că<br />

sup | f ′(x) | < 1. Atunci f este contracţie.<br />

x ∈(a,b)<br />

Demonstraţie. Notăm q =<br />

sup | f ′(x) | . Avem q ∈ (0,1). Fie x, y ∈ [a, b].<br />

x ∈(a,b)<br />

Aplicând teorema lui Lagrange, rezultă că există ζ între x şi y astfel încât<br />

de unde obţinem<br />

f(x) – f(y) = f ′ (ζ) (x – y),<br />

|f(x) – f(y)| = | f ′ (ζ) | |x – y| ≤ q|x – y|.<br />

■<br />

Exemple.<br />

1) Să se rezolve (în mulţimea numerelor reale) ecuaţia următoare aplicând<br />

metoda punctului fix<br />

x 3 – x -1 = 0.<br />

Se poate arăta că ecuaţia x 3 – x -1 = 0 are o singură rădăcină reală, şi că această<br />

rădăcină este în intervalul (1,2). Ecuaţia se poate scrie:<br />

x 3 = x+1<br />

x = 3 x + 1<br />

121


Mădălina Roxana Buneci<br />

Fie f: [1,2] → [1,2], definită prin f(x) = 3 x + 1 . Avem f ′ (x) = 1 1<br />

3 3 2<br />

(x + 1)<br />

şi deci<br />

sup | f ′(x) | = 1 3<br />

14 3 < 1<br />

x ∈(1,2)<br />

Ca urmare f este contracţie pe intervalul [1,2]. Deci soluţia ecuaţiei poate fi aflată ca<br />

limita şirului (x n ) n , cu<br />

x n = f(x n-1 ) = 3 xn− 1 + 1 , x 0∈[1,2].<br />

2) Să se rezolve (în mulţimea numerelor reale) ecuaţia următoare aplicând<br />

metoda punctului fix<br />

x – cos(x) = 0<br />

Notăm g(x) = x – cos(x). Cum cos(x) ∈ [-1, 1], soluţiile ecuaţiei x – cos(x) =<br />

0 se găsesc în intervalul [-1, 1]. Deoarece g′ (x) = 1 + sin(x) > 0 pentru x din<br />

intervalul [-1, 1], rezultă că g este strict crescătore pe [-1, 1] şi deci ecuaţia<br />

x – cos(x) = 0<br />

are cel mult o rădăcină. Cum g(0)g( 2<br />

π )


<strong>Metode</strong> <strong>Numerice</strong><br />

> punctfix:=proc(f,x0, epsilon)<br />

> local x1,x2;<br />

> x1:=x0;<br />

> x2:=f(x1);<br />

> while evalf(abs(x2-x1))>=epsilon do<br />

> x1:=x2;<br />

> x2:=f(x1)<br />

> od;<br />

> RETURN(x2);<br />

> end;<br />

Exemplificăm aplicarea procedurii pentru contracţiile<br />

f 1 : [1,2] → [1,2], definită prin f 1 (x) = 3 x + 1 .<br />

f 2 : [0, 2<br />

π ] → [0, 2<br />

π ], f2 (x) = 1 2 ( x +cos(x))<br />

comparative cu aplicarea comenzii fsolve.<br />

> f1:=x->(x+1)^(1/3);<br />

> punctfix(f1,1.5,10^(-5));<br />

> fsolve(f1(x)=x,x);<br />

> f2:=x->1/2*(x+cos(x));<br />

> punctfix(f2,1.,10^(-5));<br />

> fsolve(f2(x)=x,x);<br />

f1 := x → ( x + 1 )<br />

( 1/<br />

3 )<br />

1.324719474<br />

1.324717957<br />

1<br />

f2 := x → +<br />

2 x 1<br />

cos( x )<br />

2<br />

0.7390856959<br />

0.7390851332<br />

Procedura de mai jos implementează metoda punctului fix pentru o contracţie pe<br />

R m .<br />

> punctfixM:=proc(f,x0,epsilon,Nmax)<br />

> local m,x1, x2,n, norma,i;<br />

> m:=nops(x0);<br />

123


Mădălina Roxana Buneci<br />

> x1:=x0;<br />

> x2:=[seq(f[i](op(x1)), i=1..m)];<br />

> n:=1;<br />

> norma:=0;<br />

> for i from 1 to m do norma:=norma + abs(x2[i]-x1[i]) od;<br />

> while (evalf(norma) >= epsilon) and (n < Nmax) do<br />

> x1:=x2;<br />

> x2:=[seq(f[i](op(x1)), i=1..m)];<br />

> n:=n+1;<br />

> norma:=0;<br />

> for i from 1 to m do norma:=norma + abs(x2[i]-x1[i]) od;<br />

> od;<br />

> RETURN(x2)<br />

> end;<br />

Propoziţie 5.10. Fie a, b două numere reale cu a < b şi fie f: [a, b] → R o<br />

funcţie de clasă C 1 (derivabilă cu derivata continuă) care admite un punct fix x*.<br />

Dacă | f ′ (x*)| < 1, atunci există un interval închis I ⊂ [a, b] astfel încât x*∈I şi f| I<br />

este contracţie. Ca urmare şirul definit prin x n = f(x n-1 ), n≥1 converge la x* pentru<br />

orice termen iniţial x 0 ∈I.<br />

Demonstraţie. Deoarece | f ′ (x*)| < 1 şi |f′| este continuă, rezultă că există<br />

ε>0 astfel încât | f ′ (x)| < 1 pentru orice x cu proprietatea că |x-x*| < ε. Luăm<br />

ε ε<br />

I = [x* - , x* + ]. 2 2<br />

Deoarece |f ′ | este continuă, există ζ ∈ I astfel încât sup | f ′(x) | = | f ′ (ζ)|


<strong>Metode</strong> <strong>Numerice</strong><br />

Observaţie 5.11. Fie J ⊂ R un interval deschis şi f: J → R o funcţie de clasă C 2<br />

care admite o rădăcină x* ∈ J cu proprietatea că f ′ (x*) ≠ 0. Deoarece | f ′ | este<br />

continuă şi | f ′ (x*)| > 0, rezultă că există un interval J 0 ⊂ J astfel încât x* ∈ J 0 şi<br />

pentru orice x ∈ J 0 avem | f ′ (x)| > 0 (sau echivalent f ′ (x) ≠ 0). Considerăm funcţia<br />

g:J 0 →R, definită prin g(x) = x –<br />

deci x* punct fix pentru g. Cum<br />

1<br />

f(x). Avem<br />

f ′(x)<br />

g(x*) = x* -<br />

1<br />

f ′(x*)<br />

f(x*) = x*,<br />

rezultă că<br />

g′ (x) = 1 -<br />

| g′ (x*)| =<br />

2<br />

f ′(x)<br />

− f (x)f ′′(x)<br />

f (x)f ′′(x)<br />

= ,<br />

2<br />

f ′<br />

2<br />

(x) f ′(x)<br />

f<br />

( x *) f ′′( x *)<br />

f ′( x *) 2<br />

=0 < 1.<br />

Din propoziţia precedentă rezultă că există un interval închis I ⊂ J 0 ⊂ J<br />

astfel încât x*∈I şi g| I : I → I este contracţie. Ca urmare şirul definit prin recurenţă<br />

x n = g(x n-1 ), n≥1 converge la x* pentru orice termen iniţial x 0 ∈I. Din definiţia lui g<br />

rezultă că<br />

x n = x n-1 –<br />

1<br />

f(x n-1 ), n ≥ 1,<br />

f ′(x )<br />

n−1<br />

adică şirul corespunzător metodei tangentei pentru ecuaţia f(x) = 0.<br />

Propoziţie 5.12. Fie ||⋅|| o normă pe R m , care induce o normă pe<br />

L(R m , R m ) ≅ M m,m (R)<br />

notată tot ||⋅||. Fie a ∈ R m , r>0, S = ⎺ B( a,r ) = {x ∈ R m , ||x-a|| ≤ r}, şi f : S → S o<br />

funcţie diferenţiabilă pe S cu proprietatea că<br />

jacobianul funcţiei f în punctul x, adică matricea<br />

sup || Jf (x) || < 1, unde Jf(x) este<br />

x∈S<br />

125


Mădălina Roxana Buneci<br />

Atunci f este contracţie.<br />

Demonstraţie. Notăm q =<br />

⎛ ∂f<br />

⎜<br />

⎝<br />

∂x<br />

i<br />

j<br />

( x)<br />

Aplicând teorema creşterilor finite , rezultă că<br />

||f(x) – f(y)|| ≤<br />

θ∈[0,1]<br />

⎞<br />

⎟<br />

⎠<br />

1≤i,j≤<br />

m<br />

.<br />

sup || Jf (x) || . Avem q ∈ (0,1). Fie x, y ∈S.<br />

x∈S<br />

sup || Jf (x + θ(y − x)) || ||x – y|| ≤sup || Jf (x) || ||x – y|| ≤<br />

≤ q||x – y||.<br />

x∈S<br />

Propoziţie 5.13. Fie ||⋅|| o normă pe R m , care induce o normă pe<br />

L(R m , R m ) ≅ M m,m (R)<br />

notată tot ||⋅||. Fie G ⊂ R m o mulţime deschisă şi fie f: G → R m o funcţie de clasă C 1<br />

care admite un punct fix x*. Dacă ||Jf (x*)|| < 1, atunci există r > 0 astfel încât dacă<br />

notăm<br />

S =⎺ B( x*,r ) = {x ∈ R m , ||x-x*|| ≤ r}<br />

avem S ⊂ G şi f| S : S → S este contracţie. Ca urmare şirul definit prin x n =f(x n-1 ),<br />

n≥1 converge la x* pentru orice termen iniţial x 0 ∈S.<br />

Demonstraţie. Deoarece G este deschisă, ||Jf (x*)|| < 1 şi ||Jf|| este continuă,<br />

rezultă că există ε>0 astfel încât pentru orice x cu proprietatea că ||x-x*|| < ε avem<br />

x∈ G şi ||Jf(x)|| < 1. Luăm r = 2<br />

ε .<br />

Deoarece ||Jf|| este continuă şi S compactă, există ζ ∈ S astfel încât<br />

sup || Jf (x) || = ||Jf (ζ)||


<strong>Metode</strong> <strong>Numerice</strong><br />

f(x) - x* = Jf(ζ x )(x-x*)<br />

||f(x) – x*|| = ||fζ x )(x-x*)|| ≤||Jfζ x )|| || x-x*||< || x-x*||≤r<br />

de unde rezultă că f(x) ∈ B( x*,r ) = S<br />

■<br />

V.2.2. Metoda Newton – cazul m-dimensional<br />

Metoda Newton (varianta m - dimensională, m>1) este o generalizare a<br />

metodei tangentei. Este o metodă iterativă de rezolvare a unor sisteme de m ecuaţii<br />

şi m necunoscute:<br />

f(x) = 0,<br />

unde f : G → R m , G ⊂ R m .<br />

La fel ca în secţiunile precedente convenim să notăm cu x 1 , x 2 ,…, x n ,… un<br />

şir de elemente din R m . Rezervăm indicii inferiori pentru a desemna componentele<br />

unui element x = (x 1 , x 2 ,…,x m ) din R m . Dacă G este o mulţime deschisă şi f : G →<br />

R m este o funcţie diferenţiabilă pe G, identificăm diferenţiala de ordinul I a lui f în<br />

x, df(x), cu jacobianul lui f în x, notat Jf(x):<br />

⎛ ∂f<br />

⎜<br />

⎝<br />

∂x<br />

Jf(x) = ⎜ i<br />

( x)<br />

j<br />

⎞<br />

⎟<br />

⎟<br />

⎠<br />

1≤i,<br />

j≤m<br />

În cele ce urmează presupunem că matricea Jf(x) este inversabilă pentru x ∈G.<br />

Metoda Newton constă în aproximarea soluţiei ecuaţiei considerate cu x n ,<br />

unde<br />

x n = x n-1 – Jf(x n-1 ) -1 f(x n-1 ) (*)<br />

iar aproximaţia iniţială x 0 ∈G este suficient de apropiată de soluţia sistemului.<br />

Observaţii. 1) Presupunem că f este de clasă C 2 şi sistemul f(x) = 0 admite o<br />

soluţie x* ∈ G cu proprietatea că Jf(x*) este matrice inversabilă (sau echivalent<br />

det(Jf(x*)) ≠0). Atunci există o vecinătate deschisă V ⊂ G a lui x* astfel încât<br />

pentru orice x ∈ V să avem Jf(x) este inversabilă. Considerăm funcţia<br />

127


Mădălina Roxana Buneci<br />

Avem<br />

deci x* punct fix pentru g. Cum<br />

g: V → R m , definită prin g(x) = x – Jf(x) -1 f(x).<br />

g(x*) = x* - Jf(x*) -1<br />

||Jg (x*)|| = 0 < 1,<br />

f(x*) = x*,<br />

aplicând propoziţia precedentă rezultă că există r > 0 astfel încât astfel dacă notăm<br />

S =⎺ B ( x*,r)<br />

= {x ∈ R m , ||x-x*|| ≤ r}<br />

avem S ⊂ V şi g| S : S → S este contracţie. Ca urmare şirul definit prin x n = g(x n-1 ),<br />

n≥1 converge la x* pentru orice termen iniţial x 0 ∈S. Din definiţia lui g rezultă că<br />

x n = x n-1 – Jf(x n-1 ) -1 f(x n-1 ), n ≥ 1,<br />

adică şirul dat de relaţia (*) (corespunzător metodei lui Newton pentru f(x) = 0 cu<br />

termenul iniţial x 0 ∈S).<br />

sau echivalent<br />

2) Amplificând relaţia (*) cu Jf(x n-1 ) rezultă<br />

j=<br />

1<br />

Jf(x n-1 )(x n - x n-1 ) = –f(x n-1 ) (**)<br />

n−1<br />

( x ) (<br />

−<br />

x j x j ) fi<br />

(<br />

−<br />

− = − x )<br />

m ∂fi n n 1 n 1<br />

∑ , i = 1,2,…, m<br />

∂x<br />

j<br />

Dacă se foloseşte relaţia (*) pentru determinarea lui x n este necesar să se calculeze<br />

inversa matricei Jf(x n-1 ). Dacă se foloseşte relaţia (**), este necesar să se rezolve un<br />

sistem liniar cu m ecuaţii, şi necunoscutele<br />

n−1 n n−1<br />

k k k<br />

∆ x = x − x , k = 1, …, m.<br />

Rezolvarea acestui sistem necesită un număr mai mic de operaţii decât inversarea<br />

matricei Jf(x n-1 ). Folosim relaţia (**) se înlocuieşte rezolvarea sistemului neliniar<br />

prin rezolvarea succesivă a unor sisteme liniare.<br />

3) Una din dificultăţile metodei este necesitatea determinării derivatelor<br />

∂f<br />

i<br />

parţiale ( x)<br />

∂x<br />

j<br />

, componentele matricei Jf(x) (dacă se utilizează un mediu de<br />

programare simbolică cum este MAPLE aceasta nu e o dificultate majoră). O<br />

128


<strong>Metode</strong> <strong>Numerice</strong><br />

posibilitate de eliminare a acestei dificultăţi este aproximarea derivatelor parţiale<br />

prin diferenţe finite<br />

∂f<br />

i<br />

∂x<br />

j<br />

1<br />

j<br />

( x) ≈ ( f ( x + h e ) − f ( x)<br />

) = ∆ ( x)<br />

unde h ij sunt parametri specifici discretizării considerate, iar<br />

h<br />

ij<br />

i<br />

e j =(0,..,0,1,0…0) t<br />

sunt vectorii bazei canonice. În acest fel Jf(x) se înlocuieşte prin<br />

J(x) = (∆ ij (x)) 1≤i,j≤m<br />

Metoda obţinută în acest caz se numeşte metoda iterativă discretă a lui Newton:<br />

x n = x n-1 – J(x n-1 ) -1 f(x n-1 ), n ≥ 1.<br />

Metoda Newton este o metodă frecvent folosită deoarece este foarte rapid<br />

convergentă (rata convergenţei este pătratică). Dar ca şi în cazul metodei tangentei<br />

convergenţa metodei depinde de alegerea aproximaţiei iniţiale. Aproximaţia iniţială<br />

trebuie luată cât mai aproape de soluţia problemei, eventual utilizând o altă metodă<br />

de găsire a soluţiei. În următoarele teoreme se presupune că s-a fixat o normă pe<br />

R m , notată<br />

ij<br />

, iar pe spaţiile de operatori liniari L(R m , R m ), L(R m , L(R m , R m )) se<br />

consideră normele operatoriale induse. Pentru x ∈ R m şi r > 0, se notează B(x,r)<br />

mulţimea:<br />

{ y ∈ R<br />

m , y − x < r }<br />

şi cu B( x, r ) închiderea acestei mulţimi, adică<br />

{ y ∈ R<br />

m , y − x ≤ r }<br />

Teoremă 5.14. (Metoda Newton). Fie G ⊂ R m o mulţime deschisă, f : G →<br />

R m o funcţie de clasă C 2 2<br />

, cu proprietatea că există M > 0 astfel ca d f ( x ) ≤ M<br />

pentru orice x ∈G. Presupunem că ecuaţia f(x) = 0 admite o soluţie x* astfel încât<br />

Jf(x*) să fie inversabil. Atunci pentru orice q ∈ (0, 1) există r, µ > 0 astfel încât<br />

Jf(x) este inversabil pentru orice x ∈ B(x*,r), şirul (x n ) n , definit prin<br />

x n = x n-1 – Jf(x n-1 ) -1 f(x n-1 ), n ≥ 1<br />

i<br />

ij<br />

129


Mădălina Roxana Buneci<br />

rămâne în B(x*,r) oricare ar fi x 0 ∈ B(x*,r) şi converge la x*. În plus, au loc<br />

următoarele relaţii<br />

2µ<br />

x − x * ≤ q<br />

M<br />

n 2<br />

n<br />

( )<br />

1 M<br />

x − x * ≤ f x ≤ x − x<br />

µ 2µ<br />

n n n n−1<br />

2<br />

.<br />

Parametrii procedurii mnewton (de mai jos) sunt<br />

funcţia f (se presupune că se rezolvă sistemul f(x) = 0)<br />

x0 = termenul iniţial din şirul definit de (**)<br />

epsilon = precizia<br />

Nmax = numărul maxim de termeni din şir ce vor fi calculaţi<br />

Se calculează n termeni, cu n verificând<br />

2<br />

n n 1<br />

( x − x − < epsilon) sau (n≥Nmax).<br />

∞<br />

Comanda<br />

>subs(expr1,expr2);<br />

substituie subexpresia expr1 în expresia expr2. Comanda<br />

>jacobian(f(x,y,...), [x, y, ...]);<br />

calculează jacobianul lui f. Este o comnadă ce apaţine pachetului linalg. Comanda<br />

>norm(a, t);<br />

calculează norma t, unde t =1, 2, infinity a vectorului (sau matricei) a. Este de<br />

asemenea o comanda ce aparţine pachetului linalg.<br />

Procedură MAPLE<br />

> mnewton := proc(f, x0, epsilon, Nmax)<br />

> local m,x1, x2, dx, b, fx, fx1, n, i, j, ex, r;<br />

> m:=vectdim(x0);x1 := vector(m);x2:=vector(m);<br />

> for i to m do x1[i] := x0[i] od;<br />

> dx := vector(m);<br />

> b := vector(m);<br />

> fx := jacobian(f(seq(x[i],i=1..m)), [seq(x[i],i=1..m)]);<br />

> fx1 := matrix(m, m);<br />

> ex := seq(x[i] = x1[i], i = 1 .. m);<br />

> for i to m do<br />

130


<strong>Metode</strong> <strong>Numerice</strong><br />

> for j to m do fx1[i, j] := evalf(subs(ex, fx[i, j])) od<br />

> od;<br />

> b := map(-evalf,f(seq(x1[i],i=1..m)));<br />

> dx := linsolve(fx1, b, 'r');<br />

> if r m then print(`Metoda nu se aplica`); RETURN(NULL) fi;<br />

> for i to m do x2[i] := x1[i] + dx[i] od;<br />

> n := 1;<br />

> print(x2);<br />

> while epsilon for i to m do x1[i] := x2[i] od;<br />

> ex := seq(x[i] = x1[i], i = 1 .. m);<br />

> for i to m do<br />

> for j to m do fx1[i, j] := evalf(subs(ex, fx[i, j]))<br />

> od<br />

> od;<br />

> b := map(-evalf, f(seq(x1[i],i=1..m)));<br />

> dx := linsolve(fx1, b, 'r');<br />

> if r m then print(`Metoda nu se aplica`); RETURN fi;<br />

> for i to m do x2[i] := x1[i] + dx[i] od;<br />

> n := n + 1;<br />

> print(x2)<br />

> od;<br />

> print(`Numar de pasi`, n);<br />

> b := vector(map(evalf, f(seq(x1[i],i=1..m))));<br />

> print(`Valoarea functiei`, b);<br />

> RETURN(evalm(x2))<br />

> end;<br />

Exemple de utilizare a procedurii mnewton<br />

> with(linalg):<br />

> f:=(x,y)->[x^2-y,x^3-5*y];<br />

f := ( x,<br />

y ) → [ x 2 − y , x 3 − 5 y ]<br />

> mnewton(f,vector([10,0.1]),10^(-5),9);<br />

[ 7.500000001,<br />

50.00000002 ]<br />

[ 6.000000002,<br />

33.75000004 ]<br />

[ 5.250000001,<br />

27.00000001 ]<br />

[ 5.021739128,<br />

25.16576084 ]<br />

131


Mădălina Roxana Buneci<br />

[ 5.000186603,<br />

25.00140155 ]<br />

[ 5.000000017,<br />

25.00000013 ]<br />

Numar de pasi,<br />

6<br />

Valoarea functiei , [ 0.00046451,<br />

0.0069879 ]<br />

[ 5.000000017,<br />

25.00000013 ]<br />

> fsolve({f(x,y)[1],f(x,y)[2]},{x=10,y=0.1});<br />

> f1:=(x,y)->[x^2+y^2-1,x^3-y];<br />

{ x = 5.000000000 , y = 25.00000000 }<br />

f1 := ( x,<br />

y ) → [ x 2 + y 2 − 1 , x 3 − y ]<br />

> mnewton(f1,vector([0.9,0.5]),10^(-5),9);<br />

[ 0.8316784870,<br />

0.5629787234 ]<br />

[ 0.8260617824,<br />

0.5636079087 ]<br />

[ 0.8260313586,<br />

0.5636241619 ]<br />

Numar de pasi,<br />

3<br />

Valoarea functiei , [ 0.000031943,<br />

0.0000785347 ]<br />

[ 0.8260313586,<br />

0.5636241619 ]<br />

> fsolve({f1(x,y)[1],f1(x,y)[2]},{x=0.9,y=0.5});<br />

{ x = 0.8260313577 , y = 0.5636241622 }<br />

> mnewton(f1,vector([1,1]),10^(-5),9);<br />

[ 0.8750000000,<br />

0.6250000000 ]<br />

[ 0.8290363483,<br />

0.5643491124 ]<br />

[ 0.8260401080,<br />

0.5636197732 ]<br />

Numar de pasi,<br />

3<br />

Valoarea functiei , [ 0.005791188,<br />

0.0054486200 ]<br />

[ 0.8260401080,<br />

0.5636197732 ]<br />

> fsolve({f1(x,y)[1],f1(x,y)[2]},{x=1,y=1});<br />

{ x = 0.8260313577 , y = 0.5636241622 }<br />

> mnewton(f1,vector([-1,1]),10^(-5),20);<br />

[ -0.2500000001,<br />

1.250000000 ]<br />

[ -81.50000065,<br />

-15.25000014 ]<br />

[ -54.33007595,<br />

64.91769907 ]<br />

[ -36.21723980,<br />

24.89070061 ]<br />

[ -24.14389039,<br />

3.68381152 ]<br />

[ -16.10992954,<br />

-24.48752262 ]<br />

132


<strong>Metode</strong> <strong>Numerice</strong><br />

[ -10.75342471,<br />

-10.48890844 ]<br />

[ -7.178878965,<br />

-3.444508772 ]<br />

[ -4.781922755,<br />

0.617903126 ]<br />

[ -3.270919075,<br />

-5.691810662 ]<br />

[ -2.260819460,<br />

-2.574374564 ]<br />

[ -1.578178423,<br />

-1.088178100 ]<br />

[ -1.121843867,<br />

-0.5209805009 ]<br />

[ -0.8857962879,<br />

-0.5206567978 ]<br />

[ -0.8296024170,<br />

-0.5627517822 ]<br />

[ -0.8260437059,<br />

-0.5636179649 ]<br />

[ -0.8260313579,<br />

-0.5636241623 ]<br />

Numar de pasi,<br />

17<br />

Valoarea functiei , [ 0.000013414,<br />

-0.0000314743 ]<br />

[ -0.8260313579,<br />

-0.5636241623 ]<br />

> fsolve({f1(x,y)[1],f1(x,y)[2]},{x=-1,y=1});<br />

{ x = -0.8260313577,<br />

y = -0.5636241622 }<br />

> f2:=(x,y,z)->[x+x^2-2*y*z-0.1,y-y^2+3*x*z+0.2, z+z^2+2*x*y-0.3];<br />

f2 := ( x, y,<br />

z ) → [ x + x 2 − 2 y z − 0.1 , y − y 2 + 3 x z + 0.2 , z + z 2 + 2 x y − 0.3 ]<br />

> mnewton(f2,vector([0,0,0]),10^(-5),10);<br />

[ 0.1, -0.2,<br />

0.3 ]<br />

[ 0.02245322250, -0.1743243244,<br />

0.2461538462 ]<br />

[ 0.01287849239, -0.1778109522,<br />

0.2447473526 ]<br />

[ 0.01282415092, -0.1778006638,<br />

0.2446880471 ]<br />

Numar de pasi,<br />

4<br />

Valoarea functiei , [ 0.0000818676, 0.0000282439,<br />

0.0000687452 ]<br />

[ 0.01282415092, -0.1778006638,<br />

0.2446880471 ]<br />

> fsolve({f2(x,y,z)[1],f2(x,y,z)[2], f2(x,y,z)[3]},{x=0,y=0,z=0});<br />

{ x = 0.01282414583 , y = -0.1778006680,<br />

z = 0.2446880443 }<br />

Printre dezavantajele metodei Newton prezentate mai înainte se află<br />

necesitatea calculării la fiecare pas a inversei unei matrice, Jf(x n ), sau eventual a<br />

rezolvării unui sistem de ecuaţii liniare (aşa cum remarcam mai înainte). Un alt<br />

dezavantaj este localizarea teoretică a procesului iterativ într-o vecinătate a soluţiei<br />

133


Mădălina Roxana Buneci<br />

căutate. Metoda Newton simplificată înlătură primul inconvenient. Această variantă<br />

a metodei constă în aproximarea soluţiei cu x n , unde x 0 , c ∈ G, şi<br />

metode.<br />

x n = x n-1 – Jf(c) -1 f(x n-1 ), n ≥ 1 (***)<br />

Următoarea teoremă stabileşte condiţii suficiente de convergenţă a acestei<br />

Teoremă 5.15 (Metoda Newton simplificată). Fie G ⊂ R m o mulţime<br />

deschisă, f : G → R m o funcţie de clasă C 2 , cu proprietatea că există M > 0 astfel ca<br />

2<br />

( )<br />

d f x ≤M pentru orice x ∈G. Presupunem că ecuaţia f(x) = 0 admite o soluţie x*<br />

astfel încât Jf(x*) să fie inversabil. Atunci pentru orice q ∈ (0, 1) există r, µ, L > 0<br />

astfel încât Jf(x) este inversabil pentru orice c∈ B(x*,r), şirul (x n ) n , definit prin<br />

x n = x n-1 – Jf(c) -1 f(x n-1 ), n ≥ 1<br />

rămâne în B(x*,r) oricare ar fi x 0 ∈ B(x*,r) şi converge la x*. În plus, au loc<br />

următoarele relaţii<br />

n n 0<br />

x − x * ≤q x − x *<br />

( )<br />

1 L<br />

x − x * ≤ f x ≤ x − x<br />

µ µ<br />

n n n+<br />

1 n<br />

2<br />

.<br />

Parametrii procedurii mnewtonsimplif (de mai jos) sunt<br />

funcţia f (se presupune că se rezolvă sistemul f(x) = 0)<br />

x0 = termenul iniţial din şirul definit de (***)<br />

c = punctul în care se evaluează inversa matricei jacobiene<br />

epsilon = precizia<br />

Nmax = numărul maxim de termeni din şir ce vor fi calculaţi<br />

Se calculează n termeni, cu n verificând<br />

(<br />

2<br />

n n 1<br />

x − x − < epsilon) sau (n≥Nmax).<br />

∞<br />

Procedură MAPLE<br />

> mnewtonsimplif := proc(f, x0,c,epsilon, Nmax)<br />

> local m,x1, x2, dx, b, fx, fx1, n, i, j, ex, r;<br />

134


<strong>Metode</strong> <strong>Numerice</strong><br />

> m:=vectdim(x0);x1 := vector(m);x2:=vector(m);<br />

> for i to m do x1[i] := x0[i] od;<br />

> dx := vector(m);<br />

> b := vector(m);<br />

> fx := jacobian(f(seq(x[i],i=1..m)), [seq(x[i],i=1..m)]);<br />

> fx1 := matrix(m, m);<br />

> ex := seq(x[i] = c[i], i = 1 .. m);<br />

> for i to m do<br />

> for j to m do fx1[i, j] := evalf(subs(ex, fx[i, j])) od<br />

> od;<br />

> if det(fx1)=0 then print(`Metoda nu se aplica`); RETURN(NULL) fi;<br />

> fx1:=inverse(fx1); b := map(evalf,f(seq(x1[i],i=1..m)));<br />

> dx := evalm(fx1&*b);<br />

> for i to m do x2[i] := x1[i] - dx[i] od;<br />

> n := 1;<br />

> print(x2);<br />

> while epsilon for i to m do x1[i] := x2[i] od;<br />

> b := map(evalf, f(seq(x1[i],i=1..m)));<br />

> dx := evalm(fx1&*b);<br />

> for i to m do x2[i] := x1[i] - dx[i] od;<br />

> n := n + 1;<br />

> print(x2)<br />

> od;<br />

> print(`Numar de pasi`, n);<br />

> ex := seq(x[i] = x2[i], i = 1 .. m);<br />

> b := vector(map(evalf, f(seq(x1[i],i=1..m))));<br />

> print(`Valoarea functiei`, b);<br />

> RETURN(evalm(x2))<br />

> end;<br />

Exemple de utilizare a procedurii mnewtonsimplif<br />

> with(linalg):<br />

> f:=(x,y)->[x^2-y,x^3-5*y];<br />

f := ( x,<br />

y ) → [ x 2 − y , x 3 − 5 y ]<br />

> mnewtonsimplif(f,vector([6,0.1]),vector([6,0.1]),10^(-5),20);<br />

[ 5.250000002,<br />

27.00000000 ]<br />

135


Mădălina Roxana Buneci<br />

[ 5.106445312,<br />

25.83984374 ]<br />

[ 5.048619375,<br />

25.38187247 ]<br />

[ 5.022801923,<br />

25.17874816 ]<br />

[ 5.010817356,<br />

25.08472436 ]<br />

[ 5.005158912,<br />

25.04038926 ]<br />

[ 5.002466430,<br />

25.01930594 ]<br />

[ 5.001180563,<br />

25.00923998 ]<br />

[ 5.000565396,<br />

25.00442502 ]<br />

[ 5.000270852,<br />

25.00211976 ]<br />

Numar de pasi,<br />

10<br />

Valoarea functiei , [ 0.00122926,<br />

0.0202844 ]<br />

[ 5.000270852,<br />

25.00211976 ]<br />

> fsolve({f(x,y)[1],f(x,y)[2]},{x=10,y=0.1});<br />

> f1:=(x,y)->[x^2+y^2-1,x^3-y];<br />

{ x = 5.000000000 , y = 25.00000000 }<br />

f1 := ( x,<br />

y ) → [ x 2 + y 2 − 1 , x 3 − y ]<br />

> mnewtonsimplif(f1,vector([0.9,0.5]),vector([0.9,0.5]),10^(-5),9);<br />

[ 0.8316784870,<br />

0.5629787234 ]<br />

[ 0.8267332448,<br />

0.5632460104 ]<br />

[ 0.8261303960,<br />

0.5635972122 ]<br />

Numar de pasi,<br />

3<br />

Valoarea functiei , [ 0.000733926,<br />

0.0018161243 ]<br />

[ 0.8261303960,<br />

0.5635972122 ]<br />

> fsolve({f1(x,y)[1],f1(x,y)[2]},{x=0.9,y=0.5});<br />

{ x = 0.8260313577 , y = 0.5636241622 }<br />

> mnewtonsimplif(f1,vector([1,1]),vector([1,1]),10^(-5),9);<br />

[ 0.8750000000,<br />

0.6250000000 ]<br />

[ 0.8442382812,<br />

0.5776367188 ]<br />

[ 0.8324169200,<br />

0.5662568530 ]<br />

[ 0.8280863872,<br />

0.5638050098 ]<br />

[ 0.8266269335,<br />

0.5634628865 ]<br />

Numar de pasi,<br />

5<br />

Valoarea functiei , [ 0.003603154,<br />

0.0040362378 ]<br />

136


<strong>Metode</strong> <strong>Numerice</strong><br />

[ 0.8266269335,<br />

0.5634628865 ]<br />

> fsolve({f1(x,y)[1],f1(x,y)[2]},{x=1,y=1});<br />

{ x = 0.8260313577 , y = 0.5636241622 }<br />

> mnewtonsimplif(f1,vector([-1,1]),vector([-1,1]),10^(-5),20);<br />

[ -0.2500000000,<br />

1.250000000 ]<br />

[ 0.2265625000,<br />

1.414062500 ]<br />

[ 0.6650531295,<br />

1.327101470 ]<br />

[ 0.8806553123,<br />

0.9409566642 ]<br />

[ 0.8443975609,<br />

0.5742223014 ]<br />

[ 0.8197933010,<br />

0.5282487956 ]<br />

[ 0.8206651612,<br />

0.5535667326 ]<br />

[ 0.8261112430,<br />

0.5690490973 ]<br />

[ 0.8271727754,<br />

0.5669722992 ]<br />

Numar de pasi,<br />

9<br />

Valoarea functiei , [ 0.006276661,<br />

-0.0052613953 ]<br />

[ 0.8271727754,<br />

0.5669722992 ]<br />

> fsolve({f1(x,y)[1],f1(x,y)[2]},{x=-1,y=1});<br />

{ y = -0.5636241622,<br />

x = -0.8260313577 }<br />

> f2:=(x,y,z)->[x+x^2-2*y*z-0.1,y-y^2+3*x*z+0.2, z+z^2+2*x*y-0.3];<br />

f2 := ( x, y,<br />

z ) → [ x + x 2 − 2 y z − 0.1 , y − y 2 + 3 x z + 0.2 , z + z 2 + 2 x y − 0.3 ]<br />

> mnewtonsimplif(f2,vector([0,0,0]),vector([0,0,0]),10^(-5),20);<br />

[ 0.1000000000, -0.2000000000,<br />

0.3000000000 ]<br />

[ -0.0300000000, -0.2500000000,<br />

0.2500000000 ]<br />

[ -0.02590000000, -0.1150000000,<br />

0.2225000000 ]<br />

[ 0.04815419000, -0.1694867500,<br />

0.2445367500 ]<br />

[ 0.01478969600, -0.2066006490,<br />

0.2565247722 ]<br />

[ -0.00621510390, -0.1686979420,<br />

0.2403061628 ]<br />

[ 0.01888306226, -0.1670604211,<br />

0.2401559976 ]<br />

[ 0.01940230578, -0.1856954577,<br />

0.2486343215 ]<br />

[ 0.00728302228, -0.1799894344,<br />

0.2453868143 ]<br />

[ 0.01161288975, -0.1729652764,<br />

0.2424070455 ]<br />

[ 0.01600913753, -0.1785281521,<br />

0.2452560777 ]<br />

[ 0.01217347883, -0.1799067137,<br />

0.2455656198 ]<br />

137


Mădălina Roxana Buneci<br />

[ 0.01149399913, -0.1766017380,<br />

0.2440777075 ]<br />

[ 0.01365879328, -0.1772281130,<br />

0.2444857931 ]<br />

Numar de pasi,<br />

14<br />

Valoarea functiei , [ -0.00216479415, 0.0006263750,<br />

-0.0004080856 ]<br />

[ 0.01365879328, -0.1772281130,<br />

0.2444857931 ]<br />

> fsolve({f2(x,y,z)[1],f2(x,y,z)[2], f2(x,y,z)[3]},{x=0,y=0,z=0});<br />

{ z = 0.2446880443 , x = 0.01282414583 , y = -0.1778006680 }<br />

Metoda Newton – Kantorovici nu localizează procesul iterativ într-o<br />

vecinătate a soluţiei problemei. Metoda Newton – Kantorovici constă în<br />

aproximarea rădăcinii ecuaţiei considerate cu x n , unde<br />

x n = x n-1 – Jf(x n-1 ) -1 f(x n-1 ), n ≥ 1, (****)<br />

iar aproximaţia iniţială x 0 ∈G satisface condiţiile din teorema următoare.<br />

Teoremă 5.16. (Metoda Newton-Kantorovici). Fie G ⊂ R m o mulţime<br />

deschisă, f : G → R m o funcţie de clasă C 2 , cu proprietatea că există M > 0 astfel ca<br />

2<br />

( )<br />

d f x<br />

≤M pentru orice x ∈G. Presupunem că există x 0 ∈ G şi există a, b >0 astfel<br />

încât:<br />

Jf(x 0 ) este inversabilă şi ||Jf(x 0 ) -1 || ≤ a, ||Jf(x 0 ) -1 f(x 0 )|| ≤ b,<br />

abM < 2<br />

1<br />

definit prin<br />

( x , r)<br />

B 0 ⊂ G, unde r =<br />

1 (1 1 2abM)<br />

aM − − .<br />

Atunci f(x) = 0 are o unică soluţie x* în ( x , r)<br />

x n = x n-1 – Jf(x n-1 ) -1 f(x n-1 ), n ≥ 1,<br />

B 0 , şirul (x n ) n , este corect<br />

rămâne în B(x 0 , r) şi converge la x*. În plus, are loc următoarea relaţie<br />

n b<br />

x − x * ≤ , n ≥ 1.<br />

n 1<br />

2 −<br />

138


<strong>Metode</strong> <strong>Numerice</strong><br />

VI. Aproximarea funcţiilor<br />

Fie f : [a, b] → R o funcţie. Se pune problema determinării unei funcţii F<br />

care să aproximeze funcţia f. O astfel de aproximaţie este necesară în următoarele<br />

situaţii:<br />

1. Când nu se cunoaşte expresia analitică a lui f, ci doar valorile sale într-un<br />

număr finit de puncte x 0 , x 1 , …, x n din intervalul [a, b].<br />

2. Când expresia analitică a lui f este prea complicată şi calculele efectuate cu<br />

ajutorul acesteia ar fi prea dificile.<br />

F trebuie să fie o funcţie simplă, uşor de evaluat, de diferenţiat şi de integrat.<br />

VI.1. Polinoame de interpolare<br />

În cele ce urmează aproximarea funcţiei f : [a, b] → R se face cu un polinom.<br />

VI.1.1. Definiţie. Eroarea de interpolare.<br />

Definiţie. Fie x 0 , x 1 , …, x n n+1 puncte distincte două câte două din<br />

intervalul [a, b] (numite noduri), şi fie y i = f(x i ) pentru orice i = 0,1,…n. Se<br />

numeşte polinom de interpolare asociat nodurilor x 0 , x 1 , …, x n şi valorilor y 0 =f(x 0 ),<br />

y 1 = f(x 1 ), …, y n =f(x n ) un polinom P n care îndeplineşte următoarele condiţii<br />

grad(P n ) ≤ n<br />

P n (x i ) = y i , i = 0, 1, …, n .<br />

Polinomul determinat de condiţiile anterioare există şi este unic. Într-adevăr,<br />

deoarece grad(P n ) ≤ n, există a n , a n-1 , ...a 0 ∈R astfel încât<br />

P n (X) = a n X n + a n-1 X n-1 + … + a 1 X + a 0<br />

Relaţiile P n (x i ) = y i , i = 0, 1, …, n conduc la sistemul:<br />

139


Mădălina Roxana Buneci<br />

2 n<br />

a 0 + a 1 x 0 + a 2 x 0 + … + a n x 0 = y 0<br />

2 n<br />

a 0 + a 1 x 1 + a 2 x 1 + … + a n x 1 = y 1<br />

(*)<br />

a 0 + a 1 x n + a 2 x + … + a n x = y n<br />

2<br />

n<br />

n<br />

n<br />

Determinatul acestui sistem este<br />

2 n<br />

1 x 0 x 0 … x 0<br />

2 n<br />

∆ = 1 x 1 x 1 … 1<br />

x = ∏ ( x i − x j )<br />

0≤<br />

j<<br />

i≤n<br />

2<br />

1 x n x n …<br />

n<br />

x n<br />

(fiind un determinant Vandermonde). Deci ∆ ≠0, şi în consecinţă sistemul (*) este<br />

compatibil determinat, adică polinomul de interpolare P n este unic determinat.<br />

Coeficienţii polinomului de interpolare pot fi determinaţi rezolvând sistemul (*),<br />

dar dacă n este mare, atunci volumul de calcul este mare. De aceea se utilizează<br />

diferite forme comode ale polinoamelor care conduc la polinoame de interpolare<br />

Lagrange, Newton, etc.<br />

Teorema următoare stabileşte eroarea maximă cu care polinomul P n<br />

aproximează funcţia f:<br />

Teoremă 6.1. (eroarea de interpolare). Fie f : [a, b] → R o funcţie de<br />

clasă C n+1 . Fie x 0 , x 1 , …, x n n+1 puncte distincte două câte două din intervalul [a,<br />

b], şi y i = f(x i ) pentru orice i=0,1,…n. Fie P n polinomul de interpolare asociat<br />

nodurilor x 0 , x 1 , …, x n şi valorilor y 0 =f(x 0 ), y 1 = f(x 1 ), …, y n =f(x n ). Atunci oricare ar<br />

fi x∈[a,b], există ζ x ∈(a,b) astfel încât<br />

f(x) – P n (x) =<br />

(n+<br />

1)<br />

f ( ζx<br />

)<br />

n 1 !<br />

( + )<br />

(x – x 0 ) (x – x 1 ) … (x – x n ).<br />

În consecinţă, oricare ar fi x ∈ [a, b], avem:<br />

140


<strong>Metode</strong> <strong>Numerice</strong><br />

( n+<br />

1<br />

sup f<br />

) ( t)<br />

t∈<br />

| f(x) – P n (x) | ≤ [ a,b ] ( n + 1 ) !<br />

|(x – x 0 ) (x – x 1 ) … (x – x n )|.<br />

Demonstraţie. Fie x ∈[a, b]. Dacă x ∈{ x 0 , x 1 , …, x n }, atunci<br />

şi<br />

ca urmare<br />

f( x ) = P n ( x )<br />

( x – x 0 ) ( x – x 1 ) … ( x – x n ) = 0,<br />

(n+<br />

1)<br />

f ( ζ)<br />

n 1 !<br />

f( x ) - P n ( x ) = 0 =<br />

( + )<br />

( x – x 0 ) ( x – x 1 ) … ( x – x n )<br />

pentru orice ζ ∈(a,b). Presupunem că x ∉ { x 0 , x 1 , …, x n } şi considerăm funcţia<br />

g:[a, b] → R, definită prin<br />

g(x) = f(x) – P n (x) - c (x – x 0 ) (x – x 1 ) … (x – x n ),<br />

unde constanta c va fi determinata astfel încât g( x ) = 0 sau echivalent<br />

0 = g( x ) = f( x ) – P n ( x ) - c( x – x 0 ) ( x – x 1 ) … ( x – x n )<br />

c =<br />

f (x) − P n (x)<br />

.<br />

(x − x )(x − x )...(x − x )<br />

0 1 n<br />

Deci g( x ) = 0 şi g(x i ) = 0 pentru orice i =0, 1, ..., n. Aşadar g se anulează în n+2<br />

puncte distincte. Deoarece g este o funcţie Rolle, rezultă că derivata g′ se anulează<br />

în n+1 puncte distincte din intervalul (a,b). Repetând raţionamentul cu g′ , rezultă<br />

că g′′ se anulează în n puncte distincte din (a, b). Raţionând similar g (3) se anulează<br />

în n-1 puncte distincte din (a, b), g (4) se anulează în n-2 puncte distincte din (a, b), şi<br />

aşa mai departe. Se obţine că există<br />

ζ ∈ (a, b) astfel încât<br />

x<br />

g (n+1) (<br />

ζ ) = 0.<br />

x<br />

Pe de altă parte deoarece gradul lui P n este cel mult n, rezultă că<br />

P<br />

(n+<br />

1)<br />

n<br />

(x) = 0<br />

pentru orice x ∈ [a, b] şi deoarece x → (x – x 0 ) (x – x 1 ) … (x – x n ) este o funcţie<br />

polinomială de grad n+1 cu coeficientul termenului de grad maxim 1, rezultă că a<br />

n+1 derivată a sa este (n+1)!. În consecinţă, pentru orice x∈[a, b], avem<br />

141


Mădălina Roxana Buneci<br />

g (n+1) (x) = f (n+1) (x) -<br />

P<br />

(n+<br />

1)<br />

n<br />

În particular, pentru x = ζ x<br />

se obţine<br />

(x)<br />

- c(n+1)! = f (n+1) (x) - c(n+1)!.<br />

de unde<br />

0 = g (n+1) (<br />

ζ ) = f (n+1) (<br />

x<br />

ζ ) - c(n+1)!,<br />

x<br />

Cum pe de altă parte avem<br />

c =<br />

(n+<br />

1)<br />

f ( ζ )<br />

x<br />

.<br />

n 1 !<br />

( + )<br />

Rezultă că<br />

c =<br />

f (x) − P n (x)<br />

.<br />

(x − x )(x − x )...(x − x )<br />

0 1 n<br />

sau echivalent,<br />

f (x) − P (x)<br />

(x − x )(x − x )...(x − x )<br />

n<br />

0 1 n<br />

=<br />

(n+<br />

1)<br />

f ( ζ )<br />

x<br />

,<br />

n 1 !<br />

( + )<br />

În plus,<br />

f( x ) – P n ( x ) =<br />

(n+<br />

1)<br />

f ( ζ )<br />

( + )<br />

x<br />

n 1 !<br />

(x – x 0 ) (x – x 1 ) … (x – x n ).<br />

|f( x ) – P n ( x )| ≤<br />

( n+<br />

1 ) ( t)<br />

sup f<br />

[ a,b]<br />

n + 1 !<br />

t∈<br />

( )<br />

|(x – x 0 ) (x – x 1 ) … (x – x n )|.<br />

■<br />

VI.1.2. Eroarea de interpolare în cazul nodurilor echidistante<br />

Fie f : [a, b] → R o funcţie şi fie x 0 , x 1 , …, x n n+1 noduri echidistante din<br />

intervalul [a, b]:<br />

x i = a + ih, i = 0, 1, ...n, h = b − a<br />

n<br />

Fie P n polinomul de asociat nodurilor x 0 , x 1 , …, x n şi valorilor y 0 =f(x 0 ), y 1 = f(x 1 ),<br />

…, y n =f(x n ). Atunci oricare ar fi x ∈ [a, b], avem:<br />

142


<strong>Metode</strong> <strong>Numerice</strong><br />

( n+<br />

1<br />

sup f<br />

) ( t)<br />

t∈<br />

| f(x) – P n (x) | ≤ [ a,b ] ( n + 1 ) !<br />

|(x – x 0 ) (x – x 1 ) … (x – x n )|.<br />

Pentru orice x ∈[a, b] există i astfel încât x ∈ [x i , x i+1 ] şi ca urmare<br />

|(x – x i ) (x – x i+1 )| ≤ h 2<br />

h<br />

2 2 = h<br />

4 .<br />

De asemenea se poate arăta că<br />

|(x – x j )| ≤ (j – i + 1) h pentru i < j<br />

|(x – x j )| ≤ (i – j ) h pentru j+1 < i<br />

şi ţinând seama că (j+1)!(n-j)! ≤ n! se obţine<br />

|(x – x 0 ) (x – x 1 ) … (x – x n )| ≤<br />

şi deci eroarea de interpolare satisface:<br />

n+<br />

1<br />

h<br />

4<br />

n!,<br />

| f(x) – P n (x) | ≤<br />

n+<br />

1<br />

h<br />

sup f<br />

4(n + 1) t∈[ a,b]<br />

( n+<br />

1 ) ( t)<br />

.<br />

VI.1.3. Eroarea de interpolare în cazul nodurilor Cebîşev<br />

Pentru n ∈ N dat, se numesc noduri Cebîşev (rădăcini ale polinomului<br />

Cebîşev de grad n+1) numerele reale:<br />

⎛ 2i + 1 ⎞<br />

x i = cos⎜<br />

π⎟<br />

⎝ 2n + 2 ⎠ , 0 ≤ i ≤ n.<br />

Polinoamele Cebîşev de prima speţă pot fi definite recursiv prin : T 0 (x) = 1, T 1 (x) =<br />

x, T n+2 (x) = 2xT n+1 (x) – T n (x), n ≥ 0, sau pot fi definite prin T n (x) = cos(n<br />

arccos(x)). Nodurile Cebîşev sunt proiecţiile pe axa OX a unor puncte egal<br />

distanţate situate pe un semicerc:<br />

143


Mădălina Roxana Buneci<br />

Nodurile Cebîşev au proprietatea că<br />

|(x – x 0 ) (x – x 1 ) … (x – x n )| ≤<br />

pentru orice x∈ [-1, 1]. Se poate arăta că pentru oricare alte noduri c i , i=0, ...,n.<br />

1<br />

n<br />

2<br />

1<br />

sup |(x – c 0 ) (x – c 1 ) … (x – c n )| ≥ n<br />

x ∈[ −1,1]<br />

2 .<br />

Nodurile Cebîşev pot fi scalate şi translatate pentru a putea fi folosite pe un interval<br />

oarecare [a, b]:<br />

x i = b − a ⎛ 2i + 1 ⎞<br />

cos⎜<br />

π⎟<br />

2 ⎝ 2n + 2 ⎠ + b + a , 0 ≤ i ≤ n.<br />

2<br />

Astfel în cazul nodurilor Cebîşev eroarea de interpolare este<br />

| f(x) – P n (x) | ≤<br />

n+<br />

1<br />

(b − a)<br />

sup f<br />

2n+<br />

1<br />

2 (n + 1)! t∈[ a,b]<br />

( n+<br />

1 ) ( t)<br />

.<br />

VI.1.2. Polinomul Lagrange de interpolare<br />

Fie f : [a, b] → R o funcţie, fie x 0 , x 1 , …, x n n+1 puncte distincte din intervalul [a,<br />

b], şi y i = f(x i ) pentru orice i = 0,1,…n. Se numesc polinoame Lagrange cele n+1<br />

polinoame l i , i =0, 1, ...n cu proprietăţile<br />

grad (l i ) = n<br />

l i (x j ) = δ ij = 1, dacă i = j<br />

0, dacă i≠ j<br />

Pentru orice i = 0, 1, ...n, deoarece l i are gradul n şi admite drept rădăcini pe x 0 , x 1 ,<br />

..., x i-1 , x i+1 , ..., x n , rezultă că<br />

l i (X) = A i (X – x 0 ) (X – x 1 ) …(X – x i-1 ) (X – x i+1 ) ... (X – x n ).<br />

144


<strong>Metode</strong> <strong>Numerice</strong><br />

Cum l i (x i ) = 1, rezultă<br />

şi ca urmare<br />

l i (x) =<br />

A i =<br />

( x − x )( x − x ) .... ( x − x )( x − x ) ... ( x − x )<br />

1<br />

i 0 i 1 i i− 1 i i+<br />

1 i n<br />

( x − x0 )( x − x 1) ....( x − xi− 1)( x − x i+<br />

1) ...( x − xn<br />

)<br />

( x − x )( x − x )....( x − x )( x − x )...( x − x )<br />

i 0 i 1 i i− 1 i i+<br />

1 i n<br />

Forma Lagrange a polinomului de interpolare este:<br />

L n (x) = y 0 l 0 (x) + y 1 l 1 (x) + … + y n l n (x)<br />

Se observă uşor că<br />

L n (x i ) = y 0 l 0 (x i ) + y 1 l 1 (x i ) + … + y n l n (x i ) = y i l i (x i ) = y i<br />

pentru orice i = 0, 1, …, n şi că grad(L n ) ≤ n. Aşadar L n este polinomul de<br />

interpolare asociat nodurilor x 0 , x 1 , …, x n şi valorilor y 0 , y 1 , …, y n .<br />

În consecinţă, polinomul de interpolare asociat nodurilor x 0 , x 1 , …, x n şi<br />

valorilor y 0 , y 1 , …, y n poate fi scris sub forma<br />

L n (x) =<br />

numită formă Lagrange.<br />

( x − x0 )( x − x 1) ....( x − xi− 1)( x − x i+<br />

1) ...( x − xn<br />

)<br />

( − )( − ) ( − )( − ) ( − )<br />

n<br />

∑ yi<br />

i=<br />

0 x i x 0 x i x 1 .... x i x i− 1 x i x i+<br />

1 ... x i x n<br />

,<br />

Algoritm pentru determinarea polinomului Lagrange<br />

Date de intrare:<br />

Date de ieşire:<br />

x – listă ce conţine cele n+1 puncte distincte din intervalul [a, b]<br />

x 0 x 1 … x n<br />

y – lista ce conţine valorile funcţiei în punctele x 0 , x 1 , ...., x n<br />

y 0 y 1 … y n<br />

y i = f(x i ), i = 0,1,…, n<br />

a – punctul în care se evaluaeză polinomul.<br />

v - valoarea polinomului în x<br />

v : =0;<br />

145


Mădălina Roxana Buneci<br />

pentru i = 0,n,1 executa<br />

t : =y i ;<br />

pentru j = 0,i - 1,1 executa<br />

t: = t * (a – x j )/ (x i – x j )<br />

pentru j = i + 1,n,1 executa<br />

t: = t * (a– x j )/ (x i – x j )<br />

v : = v + t;<br />

Procedură MAPLE pentru calculul valorii polinomului Lagrange<br />

> PLagrange:=proc(x,y,a)<br />

> local n,v,t,i,j;<br />

> n:=nops(x);v:=0;<br />

> for i from 0 to n-1 do<br />

> t:=y[i+1];<br />

> for j from 0 to i-1 do<br />

> t:=t*(a-x[j+1])/(x[i+1]-x[j+1]) od;<br />

> for j from i+1 to n-1 do<br />

> t:=t*(a-x[j+1])/(x[i+1]-x[j+1]) od;<br />

> v:=v+t;<br />

> od;<br />

> RETURN(v)<br />

> end;<br />

Exemple<br />

> PLagrange([1,-1,3],[2,-5,-1],2);<br />

> PLagrange([1,-1,3],[2,-5,-1],-1);<br />

> expand(PLagrange([1,-1,3],[2,-5,-1],X));<br />

7<br />

4<br />

-5<br />

5 7<br />

− + −<br />

4 X2 2 X 1 4<br />

146


<strong>Metode</strong> <strong>Numerice</strong><br />

Considerăm funcţia f 1 : R → R definită prin f 1 (x) = xcos(x) şi nodurile x 0 =0,<br />

x 1 = 2 π , x2 = 4 π şi x3 = 2π. Vom aplica procedura PLagrange pentru a determina<br />

3 3<br />

polinomul de interpolare P 3 asociat nodurilor x 0 =0, x 1 = 2 π , x2 = 4 π şi x3 = 2π şi<br />

3 3<br />

valorilor y 0 = f 1 (x 0 ), y 1 = f 1 (x 1 ), y 2 = f 1 (x 2 ), y 3 = f 1 (x 3 ). De asemenea vom reprezenta<br />

grafic funcţia f 1 şi polinomul asociat pe intervalul [0, 2π], şi apoi pe intervalul<br />

[-π,3π].<br />

> f1:=x->x*cos(x);<br />

> x1:=[seq(2*Pi/3*i,i=0..3)];<br />

> y1:=[seq(f1(2*Pi/3*i),i=0..3)];<br />

> expand(PLagrange(x1,y1,X));<br />

> with(plots):<br />

f1 := x → x cos( x )<br />

x1 :=<br />

⎡<br />

⎢0, 2 π 4 π<br />

, , 2 π<br />

⎤<br />

⎥<br />

⎣ 3 3 ⎦<br />

y1 :=<br />

⎡<br />

⎢0, − π , ,<br />

⎤<br />

⎥<br />

⎣ 3 − 2 π 2 π<br />

3 ⎦<br />

27 X 3 27 X 2<br />

− + X<br />

16 π 2 8 π<br />

> plot([f1(a),PLagrange(x1,y1,a)],a=0..2*Pi);<br />

> plot([f1(a),PLagrange(x1,y1,a)],a=-Pi..3*Pi);<br />

147


Mădălina Roxana Buneci<br />

Considerăm funcţia f 2 : R → R definită prin f 2 (x) = cos(x) + sin(x). Se poate<br />

observa uşor că |f (k) (x)| ≤ 2 pentru orice x∈R şi orice k∈N. Vom considera<br />

intervalul [0,2π] şi nodurile echidistante corespunzătoare lui n = 3. Eroarea de<br />

interpolare este dominată de<br />

> f2:=x->sin(x)+cos(x);<br />

> x2:=[seq(2*Pi/3*i,i=0..3)];<br />

4<br />

h<br />

16 2, unde h = 2 π<br />

3<br />

> y2:=[seq(f2(2*Pi/3*i),i=0..3)];<br />

> expand(PLagrange(x2,y2,X));<br />

f2 := x → sin( x ) + cos( x )<br />

x2 :=<br />

⎡<br />

⎢0, 2 π 4 π<br />

, , 2 π<br />

⎤<br />

⎥<br />

⎣ 3 3 ⎦<br />

⎡ 3 1<br />

⎤<br />

y2 :=<br />

⎢1 , − , ,<br />

⎥<br />

⎣ 2 2 − 3<br />

− 1<br />

2 2 1<br />

⎦<br />

27 X 2 27 X 27 X 3 3 81 X 2 3 27 X 3<br />

− + 1 + − +<br />

16 π 2 8 π 16 π 3 16 π 2 8 π<br />

> plot({f2(a),PLagrange(x2,y2,a)},a=0..2*Pi);<br />

148


<strong>Metode</strong> <strong>Numerice</strong><br />

Considerăm funcţia f 3 : R → R definită prin f 3 (x) =<br />

1<br />

1+<br />

x<br />

2<br />

. Vom reprezenta grafic<br />

funcţia şi polinoamele de interpolare corespunzătoare nodurilor echidistante,<br />

respectiv nodurilor Cebîşev pentru n = 3 pe intervalul [-1, 1]:<br />

> f3:=x->1/(1+x^2);<br />

> x4:=[seq(-1+2*i/3,i=0..3)];<br />

f3 := x →<br />

1<br />

1 + x 2<br />

x4 :=<br />

⎡<br />

⎢-1, -1 1<br />

, ,<br />

⎤<br />

⎥<br />

⎣ 3 3 1<br />

⎦<br />

> y4:=[seq(evalf(f3(-1+2*i/3)),i=0..3)];<br />

y4 := [ 0.5000000000, 0.9000000000, 0.9000000000,<br />

0.5000000000 ]<br />

> plot([f3(a),PLagrange(x4,y4,a)],a=-1..1);<br />

> x5:=[seq(evalf(cos((2*i+1)/(2*3+2)*Pi)),i=0..3)];<br />

149


Mădălina Roxana Buneci<br />

x5 := [ 0.9238795325, 0.3826834325, -0.3826834325,<br />

-0.9238795325 ]<br />

> y5:=[seq(evalf(f3(cos((2*i+1)/(2*3+2)*Pi))),i=0..3)];<br />

y5 := [ 0.5395042867, 0.8722604187, 0.8722604187,<br />

0.5395042867 ]<br />

> plot([f3(a),PLagrange(x5,y5,a)],a=-1..1);<br />

> plot([f3(a),PLagrange(x4,y4,a),PLagrange(x5,y5,a)],a=-1..1);<br />

Reprezentăm grafic funcţia şi polinoamele de interpolare corespunzătoare nodurilor<br />

echidistante, pentru n = 3, 6, 9 pe intervalul [-5, 5]:<br />

> x_3:=[seq([seq(-5+10*i/(3*j),i=0..3*j)],j=1..3)];<br />

x_3 :=<br />

⎡⎡<br />

⎤<br />

⎢⎢-5, -5 5<br />

, ,<br />

⎤<br />

⎥, ,<br />

⎥<br />

⎣⎣<br />

3 3 5 ⎡<br />

⎢-5, -10 -5<br />

, , , , ,<br />

⎤<br />

⎥<br />

⎦ ⎣ 3 3 0 5 10<br />

3 3 5 ⎡<br />

⎢-5, -35 -25 -5 -5 5 5 25 35<br />

, , , , , , , ,<br />

⎤<br />

⎥<br />

⎦ ⎣ 9 9 3 9 9 3 9 9 5<br />

⎦⎦<br />

> y_3:=[seq([seq(evalf(f3(-5+10*i/(3*j))),i=0..3*j)],j=1..3)];<br />

150


<strong>Metode</strong> <strong>Numerice</strong><br />

y_3 := [ [ 0.03846153846, 0.2647058824, 0.2647058824,<br />

0.03846153846 ],<br />

[<br />

0.03846153846, 0.08256880734, 0.2647058824, 1. , 0.2647058824, 0.08256880734,<br />

0.03846153846 ],<br />

[ 0.03846153846, 0.06202143951, 0.1147308782, 0.2647058824,<br />

0.7641509434, 0.7641509434, 0.2647058824, 0.1147308782, 0.06202143951,<br />

0.03846153846 ] ]<br />

> plot([f3(a),seq(PLagrange(x_3[j],y_3[j],a), j=1..3)],a=-5..5);<br />

Reprezentăm grafic funcţia şi polinoamele de interpolare corespunzătoare nodurilor<br />

Cebîşev pentru n = 3, 6, 9 pe intervalul [-5, 5]:<br />

> x_c3:=<br />

[seq([seq(evalf(5*cos((2*i+1)/(6*j+2)*Pi)),i=0..3*j)],j=1..3)];<br />

x_c3 := [ [ 4.619397662, 1.913417162, -1.913417162,<br />

-4.619397662 ],<br />

[ 4.874639561,<br />

3.909157412, 2.169418697, 0. , -2.169418697, -3.909157412, -4.874639561 ],<br />

[<br />

4.938441703, 4.455032621, 3.535533905, 2.269952498, 0.7821723260,<br />

-0.7821723260, -2.269952498, -3.535533905, -4.455032621, -4.938441703 ] ]<br />

> y_c3:=<br />

[seq([seq(evalf(f3(5*cos((2*i+1)/(6*j+2)*Pi))),i=0..3*j)],j=1..3)];<br />

y_c3 := [ [ 0.04476509230, 0.2145386291, 0.2145386291,<br />

0.04476509230 ],<br />

[<br />

0.04038427927, 0.06141935837, 0.1752425253, 1. , 0.1752425253, 0.06141935837,<br />

0.04038427927 ],<br />

[ 0.03938836726, 0.04796780633, 0.07407407407, 0.1625306849,<br />

0.6204268538, 0.6204268538, 0.1625306849, 0.07407407407, 0.04796780633,<br />

0.03938836726 ] ]<br />

> plot([f3(a),seq(PLagrange(x_c3[j],y_c3[j],a), j=1..3)],a=-5..5);<br />

151


Mădălina Roxana Buneci<br />

Reprezentăm grafic funcţia şi polinoamele de interpolare corespunzătoare nodurilor<br />

echidistante, respectiv nodurilor Cebîşev pentru n = 9 pe intervalul [-5, 5]:<br />

> plot([f3(a),PLagrange(x_3[3],y_3[3],a), PLagrange(x_c3[3],y_c3[3]<br />

,a)],a=-5..5);<br />

Reprezentăm grafic funcţia şi polinoamele de interpolare corespunzătoare nodurilor<br />

echidistante, pentru n = 5, 10, 15 pe intervalul [-5, 5]:<br />

> x_5:=[seq([seq(-5+10*i/(5*j),i=0..5*j)],j=1..3)];<br />

152


<strong>Metode</strong> <strong>Numerice</strong><br />

x_5 := ⎡ ⎢ [ -5, -3, -1, 1, 3,<br />

5 ], [ -5, -4, -3, -2, -1, 0, 1, 2, 3, 4,<br />

5 ],<br />

⎣<br />

⎡<br />

⎢-5, -13 -11<br />

, , , , , , , , , , , , , ,<br />

⎤<br />

⎥<br />

⎣ 3 3 -3 -7 -5<br />

3 3 -1 -1 1<br />

3 3 1 5 7<br />

3 3 3 11 13<br />

3 3 5 ⎤ ⎦⎦ ⎥<br />

> y_5:=[seq([seq(evalf(f3(-5+10*i/(5*j))),i=0..5*j)],j=1..3)];<br />

y_5 := [ [ 0.03846153846, 0.1000000000, 0.5000000000, 0.5000000000, 0.1000000000,<br />

0.03846153846 ],<br />

[ 0.03846153846, 0.05882352941, 0.1000000000, 0.2000000000,<br />

0.5000000000, 1. , 0.5000000000, 0.2000000000, 0.1000000000, 0.05882352941,<br />

0.03846153846 ],<br />

[ 0.03846153846, 0.05056179775, 0.06923076923, 0.1000000000,<br />

0.1551724138, 0.2647058824, 0.5000000000, 0.9000000000, 0.9000000000,<br />

0.5000000000, 0.2647058824, 0.1551724138, 0.1000000000, 0.06923076923,<br />

0.05056179775, 0.03846153846 ] ]<br />

> plot([f3(a),seq(PLagrange(x_5[j],y_5[j],a), j=1..3)],a=-5..5);<br />

Reprezentăm grafic funcţia şi polinoamele de interpolare corespunzătoare nodurilor<br />

Cebîşev pentru n = 5, 10, 15 pe intervalul [-5, 5]:<br />

> x_c5:= [seq([seq(evalf(5*cos((2*i+1)/(10*j+2)*Pi)),i=0..5*j)],<br />

j=1..3)];<br />

153


Mădălina Roxana Buneci<br />

x_c5 := [ [ 4.829629132, 3.535533905, 1.294095226, -1.294095226, -3.535533905,<br />

-4.829629132 ],<br />

[ 4.949107210, 4.548159976, 3.778747872, 2.703204086,<br />

1.408662782, 0. , -1.408662782, -2.703204086, -3.778747872, -4.548159976,<br />

-4.949107210 ],<br />

[ 4.975923634, 4.784701678, 4.409606322, 3.865052266,<br />

3.171966420, 2.356983682, 1.451423384, 0.4900856985, -0.4900856985,<br />

-1.451423384, -2.356983682, -3.171966420, -3.865052266, -4.409606322,<br />

-4.784701678, -4.975923634 ] ]<br />

>y_c5:= [seq([seq(evalf(f3(5*cos((2*i+1)/(10*j+2)*Pi))),i=0..5*j)],<br />

j=1..3)];<br />

y_c5 := [ [ 0.04110943251, 0.07407407407, 0.3738761582, 0.3738761582,<br />

0.07407407407, 0.04110943251 ],<br />

[ 0.03922543546, 0.04611321154,<br />

0.06544958589, 0.1203758761, 0.3350834928, 1. , 0.3350834928, 0.1203758761,<br />

0.06544958589, 0.04611321154, 0.03922543546 ],<br />

[ 0.03882015305,<br />

0.04185261408, 0.04891260454, 0.06274065346, 0.09040470686, 0.1525466423,<br />

0.3218922278, 0.8063319688, 0.8063319688, 0.3218922278, 0.1525466423,<br />

0.09040470686, 0.06274065346, 0.04891260454, 0.04185261408, 0.03882015305 ]<br />

]<br />

> plot([f3(a),seq(PLagrange(x_c5[j],y_c5[j],a), j=1..3)],a=-5..5);<br />

Reprezentăm grafic funcţia şi polinoamele de interpolare corespunzătoare nodurilor<br />

echidistante, respectiv nodurilor Cebîşev pentru n = 15 pe intervalul [-5, 5]:<br />

>plot([f3(a),PLagrange(x_5[3],y_5[3],a), PLagrange(x_c5[3],y_c5[3],<br />

a)], a=-5..5);<br />

154


<strong>Metode</strong> <strong>Numerice</strong><br />

( n)<br />

( n)<br />

Fie f : [a, b] → R şi un şir de diviziuni ∆ n = ( x , x , …,<br />

0<br />

1<br />

( n<br />

x<br />

)<br />

n ) ale<br />

intervalului [a, b], n ≥ 0. Pentru fiecare n se construieşte polinomul de interpolare P n<br />

( n)<br />

( n)<br />

asociat nodurilor x<br />

0<br />

, x<br />

1<br />

, …,<br />

( n)<br />

( n)<br />

( n)<br />

x n şi valorilor f ( x ) 0 , f ( x ) 1 , …,<br />

( n<br />

f<br />

)<br />

( x ) n .<br />

Se pune problema convergenţei punctuale sau uniforme a lui P n la f. În general, P n<br />

nu converge la f, însă dacă f este o funcţie întreagă reală şirul de polinoame P n<br />

converge uniform la f.<br />

În cele ce urmează vom considera trei funcţii f 1 , f 3 : R → R, definite mai sus<br />

precum şi f 4 : R → R respectiv f 4 (x) = |x|.<br />

> f4:=x->abs(x);<br />

f4 := abs<br />

Vom vizualiza comportarea polinoamelor de interpolare (sub forma Lagrange) L 0 ,<br />

L 1 ,...,L n asociate unor noduri<br />

( n)<br />

( n)<br />

x , x , …,<br />

( n<br />

f<br />

)<br />

( x ) n (cu exemplificări pentru f ∈ {f 1 , f 2 , f 3 }).<br />

0<br />

1<br />

( n<br />

x<br />

)<br />

( n)<br />

( n)<br />

şi valorilor f x , f x<br />

n<br />

( ) 0<br />

( ) 1<br />

, …,<br />

155


Mădălina Roxana Buneci<br />

Procedura grafic_polinoame de mai jos reprezintă grafic n + 1 polinoamele de<br />

interpolare L 0 , L 1 , ..., L n . Parametrul tip al procedurii determină ce fel de noduri se<br />

vor folosi (n + 1 noduri echidistante dacă tip = 1 şi n + 1 noduri Cebîşev altfel).<br />

Ceilalţi parametri ai procedurii sunt funcţia f (care se aproximează prin polinoame<br />

de interpolare), capetele intervalului [a, b] şi n care indică numărul de noduri (n+1).<br />

> grafic_polinoame:=proc(f,a,b,tip,n)<br />

> local xn,yn,titlu,legenda;<br />

> if tip=1 then xn:=[seq(noduri_echidistante(a,b,j),j=0..n)]<br />

> else xn:=[seq(noduri_Cebisev(a,b,j),j=0..n)] fi;<br />

> yn:=[seq(map(f,xn[j]),j=1..n+1)];<br />

> titlu:=cat(f,`:=x->`,convert(f(x),string) ,`; x0, x1, ..., x`,<br />

> convert(n,string),` noduri `);<br />

> if tip=1 then titlu:=cat(titlu, `echidistante `)<br />

> else titlu:=cat(titlu, `Cebisev `) fi;<br />

> titlu:=cat(titlu, `in intervalul [`, convert(a,string), `,<br />

`,convert(b,string),`]`);titlu:=cat(titlu,`\ny0=`,f,`(x0), y1=`,<br />

f,`(x1), ... , y`,convert(n,string),`=`,f,`(x`,convert(n,string),<br />

`)`);<br />

> titlu:=cat(titlu, `\nL i = polinomul de interpolare asociat<br />

nodurilor x0, x1, ...,x `,convert(i,string),` si valorilor y0,<br />

y1, ...,y`,convert(i,string), `, i =0..`,convert(n,string));<br />

> legenda:=f,seq(cat(`L `,convert(j,string)),j=0..n);<br />

> plot([f(t),seq(polinom_Lagrange(xn[j],yn[j],t),j=1..n+1)],<br />

> t=a..b,labels=[X,Y],color=[COLOR(RGB,1,0,0),seq(COLOR(RGB,(1-<br />

> floor(log[5](j))/(floor(log[5](n))+1))*irem(irem(j,7)+1,2),(1-<br />

> floor(log[5](j))/(floor(log[5](n))+1))*irem(iquo(irem(j,7)+1,2),<br />

2),(1-floor(log[5](j))/(floor(log[5](n))+1))*irem(iquo(irem(j,7)+1,<br />

4),2)),j=1..n+1)],thickness=[2,seq(1,j=0..n)],legend=[legenda],<br />

title=titlu,xtickmarks=map(evalf,xn[n]),ytickmarks=map(evalf,yn[n])<br />

);<br />

> end;<br />

Aplicăm procedura pentru funcţia f 1 pe intervalele [0, 2π], [-π, 3π] , funcţia f 3 pe<br />

intervalul [-3, 3] şi funcţia f 4 pe intervalul [-1, 1]. În toate cazurile n = 10 şi se<br />

consideră două variante: noduri echidistante şi noduri Cebîşev.<br />

> grafic_polinoame(f1,0,2*Pi,1,10);<br />

156


<strong>Metode</strong> <strong>Numerice</strong><br />

> grafic_polinoame(f1,0,2*Pi,2,10);<br />

> grafic_polinoame(f1,-Pi,3*Pi,1,10);<br />

157


Mădălina Roxana Buneci<br />

> grafic_polinoame(f1,-Pi,3*Pi,2,10);<br />

> grafic_polinoame(f3,-3,3,1,10);<br />

158


<strong>Metode</strong> <strong>Numerice</strong><br />

> grafic_polinoame(f3,-3,3,2,10);<br />

> grafic_polinoame(f4,-1,1,1,10);<br />

159


Mădălina Roxana Buneci<br />

> grafic_polinoame(f4,-1,1,2,10);<br />

160


<strong>Metode</strong> <strong>Numerice</strong><br />

VI. 1.5. Polinomul Newton de interpolare de speţa I (ascendent)<br />

Fie f : [a, b] → R o funcţie, fie x 0 , x 1 , …, x n n+1 puncte distincte din<br />

intervalul [a, b], şi y i = f(x i ) pentru orice i = 0,1,…n. Punctele x 0 , x 1 , …, x n se<br />

presupun echidistante, adică<br />

x i = x 0 + ih, i = 0,1, …, n<br />

h ≠0 fiind pasul reţelei. Se construiesc iterativ polinoamele P i , i= 0, 1, ..., n astfel<br />

încât pentru fiecare i, P i să fie polinomul de interpolare asociat nodurilor x 0 , x 1 , …,<br />

x i şi valorilor y 0 , y 1 , …, y i . Construcţia se face după cum urmează<br />

P 0 (x) = y 0<br />

P i+1 (x) = P i (x) + c i+1 (x-x 0 )(x-x 1 )...(x-x i ), i =0, 1,..., n-1,<br />

unde c i+1 se determină din condiţia P i+1 (x i+1 ) = y i+1 .<br />

Ca urmare polinomul de interpolare asociat nodurilor x 0 , x 1 , …, x n şi valorilor y 0 ,y 1 ,<br />

…, y n poate fi scris sub forma<br />

P n (x) = c 0 + c 1 (x-x 0 ) + c 2 (x-x 0 )(x-x 1 ) + .... + c n (x-x 0 )(x-x 1 )...(x-x n-1 )<br />

Pentru exprimarea coeficienţilor c 0 , c 1 , …, c n este necesară cunoaşterea<br />

noţiunilor de putere generalizată şi diferenţă finită.<br />

Fie f : [a, b] → R o funcţie, şi fie reţeaua cu nodurile echidistante x 0 , x 1 , …,<br />

x n , având pasul h > 0. Produsul<br />

x [n] = x(x-h)…(x-(n-1)h)<br />

se numeşte putere generalizată a lui x. Dacă h ar fi 0, atunci puterea generalizată ar<br />

coincide cu puterea obişnuită. Expresia<br />

∆f(x) = f(x+h) - f(x)<br />

se numeşte diferenţă finită (la dreapta) de ordinul întâi. Diferenţele finite de<br />

ordin superior se definesc cu ajutorul relaţiei:<br />

∆ n f(x) = ∆(∆ n-1 f(x))<br />

Se verifică cu uşurinţă relaţiile<br />

∆(f+g) = ∆(f) +∆(g)<br />

∆(cf) = c∆(f)<br />

∆ (m+n) (f) = ∆ m (∆ n f).<br />

161


Mădălina Roxana Buneci<br />

Pentru aplicaţii, calculul diferenţelor finite este comod dacă se construieşte tabelul<br />

triunghiular următor:<br />

f(x 0 ) f(x 1 ) f(x 2 ) f(x 3 ) f(x n-3 ) f(x n-2 ) f(x n-1 ) f(x n )<br />

∆f(x 0 ) ∆f(x 1 ) ∆f(x 2 ) ∆f(x n-3 ) ∆f(x n-2 ) ∆f(x n-1 )<br />

∆ 2 f(x 0 ) ∆ 2 f(x 1 ) ∆ 2 f(x n-3 ) ∆ 2 f(x n-2 )<br />

∆ 3 f(x 0 ) ∆ 3 f(x n-3 )<br />

∆ n f(x 0 )<br />

Astfel<br />

∆ f (x 0) = f (x 1) − f (x 0)<br />

2<br />

∆ f (x ) = ∆f (x ) − ∆f (x )<br />

0 1 0<br />

= f (x ) − f (x ) − (f (x ) − f (x ))<br />

2 1 1 0<br />

= f (x ) − 2f (x ) + f (x )<br />

2 1 0<br />

3 2 2<br />

0 1 0<br />

∆ f (x ) = ∆ f (x ) − ∆ f (x )<br />

= f (x ) − 3f (x ) + 3f (x ) + f (x )<br />

3 2 1 0<br />

Se poate demonstra uşor prin inducţie că<br />

n<br />

n<br />

i<br />

( ) ( ) ( ( ) )<br />

∑<br />

∆ f x = − 1 C f x + n − i h<br />

i=<br />

0<br />

dar în aplicaţii se va folosi tabelul diagonal de mai sus.<br />

Pentru determinarea unui coeficientul c i al polinomului de interpolare P n se<br />

utilizează diferenţa finită de ordinul i a lui P n în x 0 . Ţinând cont de<br />

se obţine<br />

P i+1 (x) = P i (x) + c i+1 (x-x 0 )(x-x 1 )...(x-x i ), i =0, 1,..., n-1,<br />

şi se poate arătă inductiv că<br />

y<br />

c i+1 =<br />

i+ 1 − P i(x i+<br />

1)<br />

.<br />

i+<br />

1<br />

(i + 1)!h<br />

i<br />

n<br />

c i+1 =<br />

i+<br />

1<br />

∆ f (x 0)<br />

, i = 0, 1, ..., n-1.<br />

i+<br />

1<br />

(i + 1)!h<br />

162


<strong>Metode</strong> <strong>Numerice</strong><br />

Aşadar<br />

∆f (x 0) ∆ f (x 0) ∆ f (x 0)<br />

P n (x) = f (x 0) + x − x0 + x − x0 + x − x 0 + .... +<br />

1!h 2!h 3!h<br />

n<br />

( ) [ n ]<br />

( ) [ ] 2<br />

( ) [ ] 3<br />

1 2<br />

2 3<br />

( ) [ 3 ]<br />

∆ f (x 0)<br />

+ ... + x − x<br />

n 0<br />

n!h<br />

Expresia polinomului de interpolare de mai sus poartă denumirea de polinom<br />

Newton de speţa I (sau ascendent ). Expresia polinomului Newton se poate pune<br />

sub o formă mai comodă pentru aplicaţii, dacă se face schimbarea de variabilă<br />

x − x<br />

t = 0<br />

h<br />

şi se ţine seama că<br />

i<br />

0 0 0 0 0<br />

=<br />

....<br />

i<br />

( x − x ) [ ] ( x − x ) ( x − x − h) ( x − x − 2h) ( x − x − (i −1)h<br />

)<br />

h<br />

h h h h<br />

( )( ) ( )<br />

= t t −1 t − 2 .... t − i + 1<br />

pentru orice i = 1,2,…,n. Se obţine<br />

P (x) = P (x + th)<br />

n n 0<br />

n<br />

2 3<br />

0 0 0<br />

∆f (x ) ∆ f (x ) ∆ f (x )<br />

= f (x 0) + t + t(t − 1) + t(t −1)(t − 2) +<br />

1! 2! 3!<br />

∆ f (x 0)<br />

+ .... + t(t −1)...(t − n + 1)<br />

n!<br />

Dacă se efectuează calculele în aritmetica virgulei mobile, aproximarea<br />

funcţiei f prin polinomul Newton ascendent este avantajoasă pentru valorile x din<br />

vecinătatea lui x 0 , eroarea fiind mică pentru t în modul mic.<br />

Algoritm pentru determinarea polinomului Newton ascendent<br />

Date de intrare:<br />

x0- primul punct din reţea<br />

h – pasul reţelei<br />

y – lista ce conţine valorile funcţiei în punctele reţelei.<br />

y 0 y 1 … y n<br />

y i = f(x i ) =f(x0 + ih), i = 0,1,…, n<br />

x – punctul în care se evaluează polinomul.<br />

163


Mădălina Roxana Buneci<br />

Date de ieşire: px - valoarea polinomului în x<br />

px : =y 0 ; t : = (x-x0)/h; u: = 1;<br />

pentru i = 1,n,1 executa<br />

pentru j =0,n-i,1 executa<br />

y j := y j+1 –y j ;<br />

u :=u*(t-i+1)/i;<br />

px:=px+u*y 0 ;<br />

Procedură MAPLE pentru calculul valorii polinomului Newton de speţa I<br />

(ascendent)<br />

> PNewton1 := proc(x0, h, y, x)<br />

> local t, u, yl, i, j,n, px;<br />

> n:=nops(y);<br />

> yl := [seq(y[i],i=1..n)];<br />

> px := yl[1];<br />

> t := (x - x0)/h;<br />

> u := 1;<br />

> for i from 1 to n-1 do<br />

> for j from 0 to n-1-i do<br />

> yl[j + 1] := yl[j + 2] - yl[j+1]<br />

> od;<br />

> u := u*(t – i + 1)/i;<br />

> px := px + u*yl[1] od;<br />

> RETURN(px)<br />

> end;<br />

> f1:=x->x*cos(x);<br />

> x1:=[seq(2*Pi/3*i,i=0..3)];<br />

f1 := x → x cos( x )<br />

x1 :=<br />

⎡<br />

⎢ 0, 2 π 4 π<br />

, , 2 π<br />

⎤<br />

⎥<br />

⎣ 3 3 ⎦<br />

> y1:=[seq(f1(2*Pi/3*i),i=0..3)];<br />

y1 :=<br />

⎡<br />

⎢ 0, − π , ,<br />

⎤<br />

⎥<br />

⎣ 3 − 2 π 2 π<br />

3 ⎦<br />

164


<strong>Metode</strong> <strong>Numerice</strong><br />

> PNewton1(0,2*Pi/3,y1,X);<br />

X<br />

− +<br />

2<br />

3 X ⎛ ⎝ ⎜<br />

3 X<br />

2 π<br />

− 1<br />

⎞<br />

⎟<br />

⎛ ⎠ ⎝ ⎜<br />

4<br />

> sort(expand(PNewton1(0,2*Pi/3,y1,X)));<br />

3 X<br />

2 π<br />

− 2<br />

⎞<br />

⎟<br />

⎠<br />

> with(plots):<br />

27 X 3 27 X 2<br />

− + X<br />

16 π 2 8 π<br />

> plot([f1(a),PNewton1(0,2*Pi/3,y1,a)],a=0..2*Pi);<br />

> plot([f1(a),PNewton1(0,2*Pi/3,y1,a)],a=-Pi..3*Pi);<br />

165


Mădălina Roxana Buneci<br />

VI.1.6. Polinomul Newton de interpolare de speţa II (descendent)<br />

Fie f : [a, b] → R o funcţie, fie x 0 , x 1 , …, x n n+1 puncte distincte din<br />

intervalul [a, b], şi y i = f(x i ) pentru orice i = 0,1,…n. Punctele x 0 , x 1 , …, x n se<br />

presupun echidistante, adică<br />

x i = x 0 + ih, i = 0,1, …, n<br />

h fiind pasul reţelei. Se construiesc iterativ polinoamele P i , i= 0, 1, ..., n astfel încât<br />

pentru fiecare i, P i să fie polinomul de interpolare asociat nodurilor x n , x n-1 , …, x n-<br />

i+1 şi valorilor y n , y n-1 , …, y n-i+1 . Construcţia se face după cum urmează<br />

P 0 (x) = y n<br />

P i+1 (x) = P i (x) + c i+1 (x-x n )(x-x n-1 )...(x-x n-i+1 ), i =0, 1,..., n-1,<br />

unde c i+1 se determină din condiţia P i+1 (x n-i ) = y n-i .<br />

Ca urmare polinomul de interpolare asociat nodurilor x 0 , x 1 , …, x n şi valorilor y 0 ,y 1 ,<br />

…, y n poate fi scris sub forma<br />

P n (x) = c 0 + c 1 (x-x n ) + c 2 (x-x n )(x-x n-1 ) + .... + c n (x-x n )(x-x n-1 )...(x-x 1 )<br />

166


<strong>Metode</strong> <strong>Numerice</strong><br />

Pentru exprimarea coeficienţilor c 0 , c 1 , …, c n este necesară cunoaşterea<br />

noţiunii de diferenţă finită la stânga. Expresia<br />

∇f(x) = f(x) - f(x-h)<br />

se numeşte diferenţă finită (la stânga) de ordinul întâi. Diferenţele finite la<br />

stânga de ordin superior se definesc cu ajutorul relaţiei:<br />

∇ n f(x) = ∇(∇ n-1 f(x))<br />

Se observă că<br />

∇f(x) = ∆f(x-h).<br />

În aplicaţii, pentru calculul diferenţelor finite la stânga se utilizează tabelul<br />

triunghiular următor:<br />

f(x 0 ) f(x 1 ) f(x 2 ) f(x 3 ) f(x n-3 ) f(x n-2 ) f(x n-1 ) f(x n )<br />

∇f(x 1 ) ∇f(x 2 ) ∇f(x 3 ) ∇f(x n-2 ) ∇f(x n-1 ) ∇f(x n )<br />

∇ 2 f(x 2 ) ∇ 2 f(x 3 ) ∇ 2 f(x n-2 ) ∇ 2 f(x n )<br />

∇ 3 f(x 3 ) ∇ 3 f(x n )<br />

∇ n f(x n )<br />

Pentru determinarea unui coeficient c i al polinomului de interpolare P n se utilizează<br />

diferenţa finită de ordinul i a lui P n în x n . Se obţine:<br />

∇f (x 0) ∇ f (x n ) ∇ f (x n )<br />

P n (x) = f (x n ) + x − xn + x − xn 1 + x − xn 2 +<br />

1!h 2!h 3!h<br />

n<br />

∇ f (x n )<br />

+ .... + x − x<br />

n<br />

n!h<br />

( ) [ ] 2<br />

( ) [ ] 3<br />

1 2<br />

( ) [ 3 ]<br />

2 −<br />

3 −<br />

( ) [ n ]<br />

1<br />

Expresia polinomului de interpolare de mai sus poartă denumirea de polinom<br />

Newton de speţa II (sau descendent ). Expresia polinomului Newton descendent se<br />

poate pune sub o formă mai comodă pentru aplicaţii, dacă se face schimbarea de<br />

variabilă<br />

x − x<br />

t = n<br />

h<br />

Se obţine<br />

167


Mădălina Roxana Buneci<br />

P (x) = P (x + th)<br />

n n n<br />

n<br />

2 3<br />

n n n<br />

∇f (x ) ∇ f (x ) ∇ f (x )<br />

= f (x n ) + t + t(t + 1) + t(t + 1)(t + 2) +<br />

1! 2! 3!<br />

∇ f (x n )<br />

+ .... + t(t + 1)...(t + n −1)<br />

n!<br />

Dacă se efectuează calculele în aritmetica virgulei mobile, aproximarea<br />

funcţiei f prin polinomul Newton descendent este avantajoasă pentru valorile x din<br />

vecinătatea lui x n , eroarea fiind mică pentru t în modul mic.<br />

Algoritm pentru determinarea polinomului Newton descendent<br />

Date de intrare:<br />

xn- ultimul punct din reţea<br />

h – pasul reţelei<br />

y – lista ce conţine valorile funcţiei în punctele reţelei.<br />

y 0 y 1 … y n<br />

y i = f(x i ) =f(x0 + ih), i = 0,1,…, n<br />

x – punctul în care se evaluează polinomul.<br />

Date de ieşire: px - valoarea polinomului în x<br />

px : =y n ; t : = (x-xn)/h; u: = 1;<br />

pentru i = 1,n,1 executa<br />

pentru j =n,i,1 executa<br />

y j := y j –y j-1 ;<br />

u :=u*(t+i-1)/i;<br />

px:=px+u*y n ;<br />

Procedură MAPLE pentru calculul valorii polinomului Newton de speţa I<br />

(ascendent)<br />

> PNewton2 := proc(xn, h, y, x)<br />

> local t, u, yl, i, j,n, px;<br />

> n:=nops(y);<br />

> yl := [seq(y[i],i=1..n)];<br />

> px := yl[n];<br />

> t := (x - xn)/h;<br />

168


<strong>Metode</strong> <strong>Numerice</strong><br />

> u := 1;<br />

> for i from 1 to n-1 do<br />

> for j from n-1 by -1 to i do<br />

> yl[j+1] := yl[j+1] - yl[j]<br />

> od;<br />

> u := u*(t + i - 1)/i;<br />

> px := px + u*yl[n] od;<br />

> RETURN(px)<br />

> end;<br />

Exemple<br />

> f1:=x->x*cos(x);<br />

> x1:=[seq(2*Pi/3*i,i=0..3)];<br />

f1 := x → x cos( x )<br />

x1 :=<br />

⎡<br />

⎢ 0, 2 π 4 π<br />

, , 2 π<br />

⎤<br />

⎥<br />

⎣ 3 3 ⎦<br />

> y1:=[seq(f1(2*Pi/3*i),i=0..3)];<br />

y1 :=<br />

⎡<br />

⎢ 0, − π , ,<br />

⎤<br />

⎥<br />

⎣ 3 − 2 π 2 π<br />

3 ⎦<br />

> PNewton2(2*Pi,2*Pi/3,y1,X);<br />

9 ( X − 2 π)<br />

⎛ 3 ( X − 2 π )<br />

6 π 4 X<br />

⎝ ⎜<br />

+ 1<br />

⎞<br />

2 π ⎟<br />

− + +<br />

⎠<br />

4<br />

3 ( X − 2 π )<br />

⎛ 3 ( X − 2 π )<br />

⎝ ⎜<br />

+ 1<br />

⎞<br />

2 π ⎟<br />

⎛ 3 ( X − 2 π )<br />

⎠ ⎝ ⎜ 2 π<br />

+<br />

4<br />

> sort(expand(PNewton2(2*Pi,2*Pi/3,y1,X)));<br />

+ 2<br />

⎞<br />

⎟<br />

⎠<br />

> with(plots):<br />

27 X 3 27 X 2<br />

− + X<br />

16 π 2 8 π<br />

> plot([f1(a),pnewton2(2*Pi,2*Pi/3,y1,a)],a=0..2*Pi);<br />

169


Mădălina Roxana Buneci<br />

> plot([f1(a),PNewton2(2*Pi,2*Pi/3,y1,a)],a=-Pi..3*Pi);<br />

170


<strong>Metode</strong> <strong>Numerice</strong><br />

VI.1.7. Polinomul Newton cu diferenţe divizate<br />

Fie f : [a, b] → R o funcţie, fie x 0 , x 1 , …, x n n+1 puncte distincte (nu<br />

neapărat echidistante) din intervalul [a, b], şi y i = f(x i ) pentru orice i = 0,1,…n. Se<br />

construiesc iterativ polinoamele P i , i= 0, 1, ..., n astfel încât pentru fiecare i, P i să<br />

fie polinomul de interpolare asociat nodurilor x 0 , x 1 , …, x i şi valorilor y 0 , y 1 , …, y i .<br />

Construcţia se face după cum urmează<br />

P 0 (x) = y 0<br />

P i+1 (x) = P i (x) + c i+1 (x-x 0 )(x-x 1 )...(x-x i ), i =0, 1,..., n-1,<br />

unde c i+1 se determină din condiţia P i+1 (x i+1 ) = y i+1 .<br />

Ca urmare polinomul de interpolare asociat nodurilor x 0 , x 1 , …, x n şi valorilor y 0 ,y 1 ,<br />

…, y n poate fi scris sub forma<br />

P n (x) = c 0 + c 1 (x-x 0 ) + c 2 (x-x 0 )(x-x 1 ) + .... + c n (x-x 0 )(x-x 1 )...(x-x n-1 )<br />

Pentru exprimarea coeficienţilor c 0 , c 1 , …, c n este necesară cunoaşterea noţiunii de<br />

diferenţă divizată.<br />

Expresia<br />

f (x j) − f (x i)<br />

f (x i, x j) = , i ≠ j<br />

x − x<br />

se numeşte diferenţă divizată de ordinul întâi. Diferenţele divizate de ordin 2 se<br />

definesc cu ajutorul diferenţelor divizate de ordinul întâi:<br />

f (x j, x k ) − f (x i, x j)<br />

f (x i, x j, x k ) =<br />

x − x<br />

Cunoscând diferenţele divizate de ordinul m, diferenţele divizate de ordinul m+1 se<br />

definesc prin:<br />

f (x i, x i 1,..., x i m ) f (x i 1, x i,..., x i m 1)<br />

f (x i 1, x i, x i 1,..., x i m )<br />

+ + − − + −<br />

− + + =<br />

x − x<br />

j<br />

k<br />

i<br />

i<br />

i+ m i−1<br />

În consecinţă, polinomul de interpolare asociat nodurilor x 0 , x 1 , …, x n şi valorilor<br />

y 0 ,y 1 , …, y n poate fi scris sub forma<br />

P (x) = f (x ) + f (x , x )(x − x ) + f (x , x , x )(x − x )(x − x ) +<br />

n 0 0 1 0 0 1 2 0 1<br />

+ .... + f (x , x ,..., x )(x − x )(x − x )...(x − x )<br />

0 1 n 0 1 n−1<br />

171


Mădălina Roxana Buneci<br />

Pentru aplicaţii, calculul diferenţelor divizate este comod dacă se construieşte<br />

tabelul triunghiular următor:<br />

f(x 0 ) f(x 1 ) f(x 2 ) f(x 3 ) f(x n-2 ) f(x n-1 ) f(x n )<br />

f(x 0 ,x 1 ) f(x 1 ,x 2 ) f(x 2 ,x 3 ) f(x n-2 ,x n-1 ) f(x n-1 ,x n )<br />

f(x 0 ,x 1 ,x 2 ) f(x 1 , x 2 ,x 3 ) f(x n-2 ,x n-1 ,x n )<br />

f(x 0 ,x 1 ,....,x n )<br />

Algoritm pentru determinarea polinomului Newton cu diferenţe divizate<br />

Date de intrare:<br />

x – listă ce conţine cele n+1 puncte distincte din intervalul [a, b]<br />

x 0 x 1 … x n<br />

y – lista ce conţine valorile funcţiei în punctele x 0 , x 1 , ...., x n<br />

y 0 y 1 … y n<br />

y i = f(x i ), i = 0,1,…, n<br />

a – punctul în care se evaluaeză polinomul.<br />

Date de ieşire:<br />

v - valoarea polinomului în a<br />

v : =y 0 ; u:= 1;<br />

pentru i = 0,n-1,1 executa<br />

pentru j = 0,n-i-1,1 executa<br />

y j := (y j+1 –y j )/(x j+i+1 –x j );<br />

u :=u*(a-x i );<br />

v:=v+u*y 0 ;<br />

Procedură MAPLE pentru calculul valorii polinomului Lagrange<br />

> PNewtond := proc(x, y, a)<br />

> local t, u, y1,i, j,n, v;<br />

> n:=nops(y);<br />

172


<strong>Metode</strong> <strong>Numerice</strong><br />

> y1 := [seq(y[i],i=1..n)];<br />

> v := y1[1];<br />

> u := 1;<br />

> for i from 0 to n-2 do<br />

> for j from 0 to n-2-i do<br />

> y1[j+1]:=(y1[j+2]-y1[j+1])/(x[j+i+2]-x[j+1]) ;<br />

> od;<br />

> u := u*(a-x[i+1]); v := v + u*y1[1];<br />

> od;<br />

> RETURN(v)<br />

> end;<br />

Exemple<br />

> f1:=x->x*cos(x);<br />

> x1:=[seq(2*Pi/3*i,i=0..3)];<br />

f1 := x → x cos( x )<br />

x1 :=<br />

⎡<br />

⎢ 0, 2 π 4 π<br />

, , 2 π<br />

⎤<br />

⎥<br />

⎣ 3 3 ⎦<br />

> y1:=[seq(f1(2*Pi/3*i),i=0..3)];<br />

> PNewtond(x1,y1,X);<br />

X<br />

− +<br />

2<br />

y1 :=<br />

⎡<br />

⎢ 0, − π , ,<br />

⎤<br />

⎥<br />

⎣ 3 − 2 π 2 π<br />

3 ⎦<br />

27 X ⎛ ⎝ ⎜ X −<br />

> sort(expand(PNewtond(x1,y1,X)));<br />

2 π ⎞ ⎛<br />

3 ⎟ ⎜ X −<br />

⎠ ⎝<br />

16 π 2<br />

4 π<br />

3<br />

⎞<br />

⎟<br />

⎠<br />

> with(plots):<br />

27 X 3 27 X 2<br />

− + X<br />

16 π 2 8 π<br />

> plot([f1(a),PNewtond(x1,y1,a)],a=0..2*Pi);<br />

173


Mădălina Roxana Buneci<br />

> plot([f1(a),PNewtond(x1,y1,a)],a=-Pi..3*Pi);<br />

174


<strong>Metode</strong> <strong>Numerice</strong><br />

VI.2. Metoda celor mai mici pătrate<br />

Fie f : [a, b] → R o funcţie şi fie x 0 , x 1 , …, x n n+1 puncte distincte din<br />

intervalul [a, b] pentru care se cunosc valorile funcţiei y i = f(x i ) pentru orice i =<br />

0,1,…n. Aproximarea funcţiei f printr-un polinom de interpolare nu este indicată în<br />

următoarele situaţii:<br />

• când n este un număr foarte mare, ceea ce determină un volum mare de<br />

calcul pentru determinarea coeficienţilor de interpolare<br />

• când valorile y i = f(x i ) nu sunt exacte.<br />

În aceste situaţii se poate folosi aproximarea funcţiei prin metoda celor mai mici<br />

pătrate.<br />

VI.2.1. Caracterizarea elementelor de cea mai bună aproximare pe<br />

subspaţii Hilbert.<br />

Definiţie. Fie (S, d) un spaţiu metric şi X o submulţime a sa. Fie x 0 un<br />

element al lui S. Se numeşte element de cea mai bună aproximare a lui x 0 pe X un<br />

element p 0 ∈X astfel încât<br />

d(p 0 , x 0 ) =<br />

inf d(x, x 0 )<br />

x∈X<br />

Reamintim că orice spaţiu pre-Hilbert H (spaţiu vectorial real sau complex<br />

înzestrat cu un produs scalar < ⋅, ⋅ >) este în particular un spaţiu metric (distanţa d<br />

este definită prin d(x,y) = || x – y || = x − y, x − y pentru orice x, y∈H). În acest<br />

caz dacă X o submulţime a lui H şi x 0 ∈H, atunci un element p 0 ∈X este element de<br />

cea mai bună aproximare pentru x 0 pe X dacă<br />

p<br />

0 0<br />

0<br />

− x = inf x − x = inf x − x , x − x<br />

x∈X<br />

x∈X<br />

0 0<br />

175


Mădălina Roxana Buneci<br />

Teoremă 6.2. Fie H un spaţiu pre-Hilbert (real sau complex), H 0 un<br />

subspaţiu vectorial al său şi x 0 ∈ H. Dacă există un element de cea mai bună<br />

aproximare a lui x 0 pe H 0 , atunci acesta este unic.<br />

Demonstraţie. Presupunem prin absurd că există p 1 ≠ p 2 elemente de cea mai<br />

bună aproximare a lui x 0 pe H 0 . Deoarece H 0 este subspaţiu vectorial al lui H,<br />

1<br />

rezultă că p = p 1 1<br />

+ p 2 ∈ H 0 . Avem<br />

2 2<br />

||p-x 0 || 2 = || 2<br />

1 p 1 + 2<br />

1 p 2 -x 0 || 2 = 4<br />

1 || p 1 – x 0 + p 2 – x 0 || 2 <<br />

< 4<br />

1 || p 1 – x 0 + p 2 – x 0 || 2 + 4<br />

1 || p 1 – x 0 – (p 2 – x 0 )|| 2<br />

1<br />

= (|| p 1 – x 0 || 2 + || p 2 – x 0 || 2 )<br />

2<br />

≤|| p 1 – x 0 || 2 .<br />

Deci p ∈ H 0 şi ||p-x 0 || < || p 1 – x 0 ||, contradicţie cu faptul că p 1 este element de cea<br />

mai bună aproximare a lui x 0 pe H 0 . Rezultă că presupunerea este falsă, şi în<br />

consecinţă elementul de cea mai bună aproximare este unic.<br />

■<br />

Teoremă 6.3. Fie H un spaţiu pre-Hilbert, H 0 un subspaţiu liniar al lui H şi<br />

x 0 ∈ H. Un element p 0 ∈ H 0 este element de cea mai bună aproximare a lui x 0 pe H 0<br />

dacă şi numai dacă<br />

p 0 -x 0 ⊥H 0 (sau echivalent, < p 0 -x 0 , x> = 0 pentru orice x∈H 0 ).<br />

Demonstraţie. Presupunem că p 0 -x 0 ⊥H 0 şi demonstrăm că p 0 ∈ H 0 este<br />

element de cea mai bună aproximare a lui x 0 pe H 0 . Dacă p 0 = x 0 , atunci este evident<br />

că p 0 este element de cea mai bună aproximare a lui x 0 pe H 0 . Presupunem că p 0 ≠<br />

x 0 . Deoarece < p 0 -x 0 , x> = 0 pentru orice x∈H 0 , atunci în particular, = 0<br />

şi ca urmare < p 0 -x 0 , p 0 - x> = 0 pentru orice x∈H 0 . Pentru un x∈H 0 oarecare, avem<br />

||p 0 -x 0 || 2 = < p 0 -x 0 , p 0 -x 0 > = < p 0 -x 0 , p 0 - x + x - x 0 ><br />

= < p 0 -x 0 , p 0 - x> + < p 0 -x 0 , x- x 0 ><br />

= < p 0 -x 0 , x- x 0 > = |< p 0 -x 0 , x- x 0 >| ≤ || p 0 -x 0 || || x- x 0 ||.<br />

Deci ||p 0 -x 0 || 2 ≤ || p 0 -x 0 || || x- x 0 || pentru orice x∈H 0 . Împărţind inegalitatea cu<br />

176


<strong>Metode</strong> <strong>Numerice</strong><br />

|| p 0 -x 0 || > 0,<br />

obţinem<br />

||p 0 -x 0 || ≤ || x- x 0 || pentru orice x∈H 0 ,<br />

adică p 0 ∈ X este element de cea mai bună aproximare a lui x 0 pe H 0 .<br />

Presupunem că p 0 ∈ H 0 este element de cea mai bună aproximare a lui x 0 pe<br />

H 0 şi demonstrăm că = 0 pentru orice x∈H 0 . Presupunem prin absurd că<br />

există y 0 ∈H 0 astfel încât<br />

≠ 0.<br />

Scriind = r (cosθ + isinθ)= re iθ cu r>0 şi θ∈[0, 2π], rezultă că înlocuind<br />

y 0 cu e iθ y 0 ∈ H 0 , putem presupune că există y 0 ∈H 0 astfel încât<br />

> 0.<br />

Pentru orice λ > 0, avem p 0 - λy 0 ∈ H 0 , deoarece H 0 este subspaţiu vectorial. În<br />

plus avem<br />

||p 0 - λy 0 – x 0 || 2 = < p 0 - λy 0 – x 0 , p 0 - λy 0 – x 0 ><br />

= < (p 0 – x 0 ) - λy 0 , (p 0 – x 0 ) - λy 0 ><br />

= || p 0 – x 0 || 2 - λ -λ< p 0 -x 0 , y 0 > + λ 2 || y 0 || 2<br />

=|| p 0 – x 0 || 2 + λ(λ|| y 0 || 2 – 2 < p 0 -x 0 , y 0 >)<br />

În consecinţă pentru orice scalar λ cu proprietatea că<br />

0 < λ <<br />

2<br />

p<br />

0 0 0<br />

− x , y<br />

y<br />

0<br />

2<br />

avem ||p 0 - λy 0 – x 0 || 2 < || p 0 – x 0 || 2 şi p 0 - λy 0 ∈ H 0 . Am obţinut astfel o contradicţie<br />

cu faptul că p 0 este element de cea mai bună aproximare a lui x 0 pe H 0 . În<br />

consecinţă, presupunerea este falsă şi deci<br />

= 0<br />

pentru orice x∈H 0 .<br />

■<br />

177


Mădălina Roxana Buneci<br />

VI. 2.2. Aproximarea în medie prin metoda celor mai mici pătrate<br />

Considerăm mulţimea funcţiilor definite pe intervalul [a, b],<br />

F : = {f : [a, b] → R }<br />

şi n+1 puncte distincte x 0 , x 1 , …, x n din intervalul [a, b]. Spunem că funcţiile f şi g<br />

din această mulţime sunt egale aproape peste tot (şi vor fi identificate) dacă f(x i ) =<br />

g(x i ) pentru orice i = 0,1,…, n. Mai precis,<br />

f ~ g ⇔ f(x i ) = g(x i ) pentru orice i = 0,1,…, n,<br />

defineşte o relaţie de echivalenţă pe F. Notăm<br />

[f] = {g: f ~ g} = { g : [a, b] → R, f(x i ) = g(x i ) pentru orice i = 0,1,…, n}<br />

clasa de echivalenţă a lui f. Notăm cu cu H mulţimea claselor de echivalenţă relativ<br />

la relaţia de echivalenţă de mai sus. H poate fi înzestrat cu o operaţie de grup<br />

abelian după cum urmează:<br />

[f] + [g] : = [h], unde h : [a, b] → R, h(x) = f(x) + g(x) pentru orice x∈[a, b].<br />

Arătăm că definiţia nu depinde de reprezentanţi. Fie f 1 ~ f 2 , g 1 ~ g 2 şi pentru i=1,2<br />

fie h i :[a,b]→R, h i (x) = f i (x) + g i (x) pentru orice x∈[a, b]. Avem<br />

h 1 (x j ) = f 1 (x j ) + g 1 (x j ) = f 2 (x j ) + g 2 (x j ) = h 2 (x j )<br />

pentru orice j = 0,1,…, n. Ca urmare h 1 ~ h 2 , adică [h 1 ] = [h 2 ]. Evident operaţia<br />

definită mai sus este asociativă şi comutativă. Dacă notăm<br />

o: [a, b] → R, o(x) = 0 pentru orice x∈[a, b],<br />

atunci [o] este element neutru. Pentru orice [h], [-h] este simetricul faţă de +, unde<br />

-h: [a, b] → R, (-h)(x) = -h(x) pentru orice x∈[a, b].<br />

De asemenea H poate fi înzestrat cu o operaţie externă de înmulţire cu scalari reali<br />

după cum urmează:<br />

α[f]: = [h], unde h : [a, b] → R, h(x) = αf(x) pentru orice x∈[a, b].<br />

Este uşor de observat că definiţia nu depinde de reprezentanţi. H înzestrat cu cele<br />

două operaţii definite mai sus devine spaţiu vectorial.<br />

Fie p o funcţie cu următoarele proprietăţi:<br />

• p(x i ) > 0<br />

n<br />

∑<br />

• p ( ) =1.<br />

i=<br />

0<br />

x i<br />

178


<strong>Metode</strong> <strong>Numerice</strong><br />

Dacă f 1 ~ f 2 şi g 1 ~ g 2 atunci<br />

n<br />

∑ p( xi ) f1 ( xi ) g1 ( xi<br />

) = ∑ p( xi ) f2 ( xi ) g2 ( xi<br />

) .<br />

i=<br />

0<br />

Introducem următorul produs scalar pe H<br />

n<br />

∑ p<br />

n<br />

i=<br />

0<br />

= ( x ) f ( x ) g( x )<br />

Funcţia p(x) este o funcţie pondere introdusă în ipoteza că aproximările f(x i ) sunt<br />

diferite ca ordin de mărime. Relativ la produsul scalar introdus, norma lui [f] este<br />

definită prin<br />

2<br />

n<br />

∑<br />

i=<br />

0<br />

2<br />

[f ] = ( x ) f ( x )<br />

i=<br />

0<br />

p .<br />

În cele ce urmează convenim să desemnăm o clasă de echivalenţă [f] printrun<br />

reprezentant al ei f.<br />

Fie ϕ 0 , ϕ 1 , …ϕ m un sistem de m+1 funcţii liniar independente definite pe<br />

[a,b], cu m ≤ n. Convenim să numim spaţiul generat de ele spaţiul polinoamelor<br />

generalizate şi să-l notăm H m . Deci un polinom generalizat F ∈ H m este de forma<br />

m<br />

∑<br />

F(x) = ϕ ( x)<br />

i=<br />

0<br />

i<br />

i<br />

i<br />

i<br />

c .<br />

Aproximarea în medie prin metoda celor mai mici pătrate a unui element f∈H<br />

presupune determinarea elementului de cea mai bună aproximare F 0 a lui f pe H m .<br />

Conform definiţiei elementul F 0 de cea mai bună aproximare a lui f pe H m trebuie să<br />

satisfacă condiţia<br />

n<br />

∑<br />

i=<br />

0<br />

2<br />

p ( x )( f ( x ) − F ( x ))<br />

= inf p( x i )( f ( x i ) − F( x i ))<br />

i<br />

i<br />

0<br />

i<br />

n<br />

∑<br />

F∈H<br />

m i=<br />

0<br />

Determinarea coeficienţilor c j ai polinomului generalizat F 0 cu ajutorul acestei<br />

relaţii este dificilă. Se foloseşte caraterizarea elementului de cea mai bună<br />

aproximare dată în secţiunea precedentă. Mai precis F 0 ∈H m este element de cea mai<br />

bună aproximare a lui f pe H m dacă şi numai dacă = 0 pentru orice<br />

ϕ∈H m . Deoarece {ϕ 0 , ϕ 1 , ..., ϕ m } este o bază a lui H m , pentru ca F 0 ∈H m să fie<br />

element de cea mai bună aproximare a lui f pe H m este suficient ca<br />

= 0 pentru orice j = 0, 1, 2…m,<br />

i<br />

i<br />

i<br />

2<br />

179


Mădălina Roxana Buneci<br />

ceea ce revine la<br />

= c 0 + c 1 + … + c m , j = 0, 1,…,m.<br />

Notăm<br />

n<br />

∑<br />

a ij = = p( x ) ϕ ( x ) ϕ ( x )<br />

k=<br />

0<br />

b j = = ( x ) f ( x ) ( x )<br />

k<br />

n<br />

∑ p k k ϕ j<br />

k=<br />

0<br />

Pentru determinarea coeficienţilor c j ai polinomului generalizat F 0 se rezolvă<br />

sistemul<br />

c 0 a 00 + c 1 a 10 + … + c m a m0 = b 0<br />

c 0 a 01 + c 1 a 11 + … + c m a m1 = b 1<br />

i<br />

k<br />

j<br />

k<br />

k<br />

c 0 a 0m + c 1 a 1m + … + c m a mm = b m<br />

Determinantul acestui sistem fiind un determinant Gramm (elementele sale sunt<br />

produse scalare) este diferit de zero, deoarece sistemul de funcţii ϕ 0 , ϕ 1 , …ϕ m este<br />

un sistem liniar independent.<br />

Dacă ϕ j (x) = x j 1<br />

, j =0, 1,…, m, m ≤ n, şi p≡<br />

n + 1<br />

, atunci<br />

iar sistemul anterior devine<br />

F 0 (x) =<br />

m<br />

i<br />

∑ cix<br />

.<br />

i=<br />

0<br />

m<br />

m<br />

c 0 (n+1) + c 1 ∑ x i + … + c m ∑ x i = ∑ f ( x i )<br />

m<br />

i=<br />

0<br />

m<br />

i=<br />

0<br />

m<br />

i=<br />

0<br />

2<br />

m+<br />

1<br />

c 0 ∑ x i + c 1 ∑ x i + … + c m ∑ x i = ∑ x if<br />

( x i )<br />

i=<br />

0<br />

m<br />

i=<br />

0<br />

m<br />

i=<br />

0<br />

m<br />

i=<br />

0<br />

m<br />

c 0∑<br />

m<br />

x i + c 1∑<br />

m+<br />

1<br />

x i + … + c m∑<br />

i=<br />

0<br />

m<br />

i=<br />

0<br />

m<br />

i=<br />

0<br />

m<br />

x = x f ( x )<br />

2m<br />

i<br />

m<br />

∑<br />

i=<br />

0<br />

i<br />

i<br />

Acest sistem este numit sistemul normal al lui Gauss.<br />

180


<strong>Metode</strong> <strong>Numerice</strong><br />

Parametrii procedurii patrate_mici de mai jos sunt:<br />

x - lista celor n +1 puncte: x 0 , x 1 , …, x n<br />

y - lista ce conţine valorile funcţiei f în ce n +1 puncte: x 0 , x 1 , …, x n (y 0 =<br />

f(x 0 ), y 1 =f(x 1 ), ….,y n =f(x n ))<br />

ϕ – lista funcţiilor liniar independente ϕ 0 , ϕ 1 , …ϕ m<br />

p – ponderea (lista)<br />

Procedura întoarce o lista ce conţine coeficienţii polinomului generalizat ce<br />

aproximează f.<br />

> patrate_mici:=proc(x,y,p,phi)<br />

> local n,m,i,k,j,a,b,c,ep,ei;<br />

> n:=nops(x)-1;<br />

> m:=nops(phi)-1;<br />

> b:=vector(m+1);<br />

> a:=matrix(m+1,m+1);<br />

> for i from 0 to m do<br />

> b[i+1]:=0;for k from 0 to n do<br />

> b[i+1]:=b[i+1]+y[k+1]*phi[i+1](x[k+1])*p[k+1]<br />

> od<br />

> od;<br />

> for i from 0 to m do<br />

> for j from i to m do<br />

> a[i+1,j+1]:=0;<br />

> for k from 0 to n do<br />

> a[i+1,j+1]:=a[i+1,j+1]+p[k+1]*phi[i+1](x[k+1])*phi[j+1](x[k+1])<br />

> od;<br />

> a[j+1,i+1]:=a[i+1,j+1]<br />

> od;<br />

> od;<br />

> c:=vector(m+1);<br />

> c:=linsolve(a,b,'r');<br />

> if r print(`Factorul de conditionare`,evalf(cond(a)));<br />

> ep:=0;<br />

> for i from 0 to n do ei:=y[i+1];<br />

> for j from 0 to m do<br />

181


Mădălina Roxana Buneci<br />

> ei:=ei-phi[j+1](x[i+1])*c[j+1]<br />

> od;<br />

> ei:=ei^2*p[i+1]; ep:=ep+ei<br />

> od;<br />

> print(`Suma patratelor erorilor (ponderate)`,evalf(ep));<br />

> RETURN([seq(c[i],i=1..m+1)])<br />

> end;<br />

În exemplele ce urmează vom folosi şi procedurile desen_puncte, baza_normal,<br />

evalueaza şi desen. Procedura desen_puncte reprezintă grafic cele n+1 puncte date<br />

iniţial: (x 0 , y 0 ), (x 1 , y 1 ), ..., (x n , y n ). Procedura baza_normal primeşte drept<br />

paramentru un număr natural m şi construieşte lista funcţiilor ϕ 0 , ϕ 1 , …ϕ m unde<br />

ϕ j (x) = x j pentru orice x şi orice j=0..m. Procedura evalueaza primeşte drept<br />

parametri lista funcţiilor liniar independente ϕ 0 , ϕ 1 , …ϕ m , lista coeficienţilor<br />

polinomului generalizat ce aproximează f şi un punct a. Procedura returnează<br />

valoarea polinomului generalizat în a. Procedura desen reprezintă grafic în acelaşi<br />

sistem de axe de coordonate polinomul generalizat ce aproximează funcţia şi cele<br />

n+1 puncte date iniţial. Punctele sunt reprezentate prin elipse. Parametrii procedurii<br />

sunt funcţia determinată de polinomul generalizat, lista x ce conţine punctele x 0 , x 1 ,<br />

…, x n , şi şi lista y ce conţine valorile funcţiei. Înainte de a folosi aceste proceduri<br />

trebuie încărcate pachetele linalg, plots şi plottools.<br />

> desen_puncte:=proc(xn,yn)<br />

> local n, d;<br />

> n:=nops(xn);<br />

> d:=pointplot([seq([xn[i],yn[i]],i=1..n)],symbol=CIRCLE,<br />

labels=[X,Y],color=COLOR(RGB,0,0,0),thickness=15);display(d)<br />

> end;<br />

> baza_normal:=proc(n,t)<br />

> RETURN([unapply(1,t),seq(unapply(t^j,t),j=1..n)])<br />

> end;<br />

> evalueaza:=proc(phi,c,a)<br />

> local i,m,fx;<br />

> m:=nops(phi);fx:=0;<br />

> for i from 1 to m do<br />

182


<strong>Metode</strong> <strong>Numerice</strong><br />

> fx:=fx+phi[i](a)*c[i] od;<br />

> RETURN(fx)<br />

> end;<br />

> desen:=proc(f,x,y)<br />

> local n,i,d1,d2,d3,x1,x2;<br />

> n:=nops(x);<br />

> x1:=min(seq(x[i],i=1..n));x2:=max(seq(x[i],i=1..n));<br />

> d1:=pointplot([seq([x[i],y[i]],i=1..n)],symbol=CIRCLE,<br />

color=black,thickness=15);<br />

> d2:=plot(f(t),t=x1..x2,labels=[X,Y],xtickmarks=map(evalf,x),<br />

ytickmarks=map(evalf,y));<br />

> d3:=d1,d2;<br />

> display(d3);<br />

> end;<br />

Exemple<br />

> x1:=[1,2,3,4,5,6];<br />

x1 := [ 1, 2, 3, 4, 5,<br />

6 ]<br />

> y1:=[0.9,0.98,1.02,1.04,1.10,1.12];<br />

y1 := [ 0.9, 0.98, 1.02, 1.04, 1.10,<br />

1.12 ]<br />

> p1:=[seq(1/6,i=1..6)];<br />

p1 :=<br />

⎡1<br />

1 1 1 1 1 ⎤<br />

⎢ , , , , , ⎥<br />

⎣6<br />

6 6 6 6 6 ⎦<br />

> desen_puncte(x1,y1);<br />

183


Mădălina Roxana Buneci<br />

> phi1:=baza_normal(1,x);<br />

φ1 := [ 1 , x → x ]<br />

> c1:=patrate_mici(x1,y1,p1,phi1);<br />

Factorul de conditionare,<br />

119.4666666<br />

Suma patratelor erorilor (ponderate) , 0.0002069841270<br />

> evalueaza(phi1,c1,x);<br />

c1 := [ 0.8786666680,<br />

0.0422857140 ]<br />

0.8786666680 + 0.0422857140 x<br />

> desen((t->evalueaza(phi1,c1,t)),x1,y);<br />

> phi2:=baza_normal(2,x);<br />

φ2 := [ 1 , x → x , x → x 2 ]<br />

> c2:=patrate_mici(x1,y1,p1,phi2);<br />

184


<strong>Metode</strong> <strong>Numerice</strong><br />

Factorul de conditionare,<br />

15157.80004<br />

Suma patratelor erorilor (ponderate) , 0.0001109523809<br />

c2 := [ 0.8419999980, 0.0697857165,<br />

-0.00392857178 ]<br />

> evalueaza(phi2,c2,x);<br />

0.8419999980 + 0.0697857165 x − 0.00392857178 x 2<br />

> desen((t->evalueaza(phi2,c2,t)),x1,y1);<br />

> phi3:=baza_normal(3,x);<br />

φ3 := [ 1 , x → x , x → x 2 , x → x 3 ]<br />

> c3:=patrate_mici(x1,y1,p1,phi3);<br />

Factorul de conditionare,<br />

0.3034682363 10 7<br />

Suma patratelor erorilor (ponderate) , 0.00008095238089<br />

c3 := [ 0.8000000130, 0.1226190347, -0.0214285678,<br />

0.001666666359 ]<br />

> evalueaza(phi3,c3,x);<br />

0.8000000130 + 0.1226190347 x − 0.0214285678 x 2 + 0.001666666359 x 3<br />

> desen((t->evalueaza(phi3,c3,t)),x1,y1);<br />

185


Mădălina Roxana Buneci<br />

VI. 2.3. Limitări ale metodei celor mai mici pătrate<br />

Pentru determinarea coeficienţilor c j ai polinomului generalizat F 0 se rezolvă<br />

sistemul Ax = b, cu A = X t X iar b = X t Y, unde<br />

p(x 0) ϕ 0 (x 0 ) p(x 0) ϕ 1 (x 0 ) ... p(x 0) ϕ m (x n )<br />

X =<br />

p(x 1) ϕ 0 (x 1 ) p(x 1) ϕ 1 (x 1 ) ... p(x 1) ϕ m (x 1 )<br />

p(x n ) ϕ 0 (x n )<br />

p(x n ) ϕ 1 (x n ) ... p(x n ) ϕ m (x n )<br />

Iar<br />

186


<strong>Metode</strong> <strong>Numerice</strong><br />

p(x 0) f(x 0 )<br />

Y =<br />

p(x 1) f(x 1 )<br />

p(x n ) f(x n )<br />

Dacă funcţiile ϕ 0 , ϕ 1 , …ϕ m sunt liniar independente, atunci rang(X) = m+1<br />

şi matricea A este pozitiv definită. Ca urmare există şi este unică o matrice inferior<br />

triunghiulară L cu elementele de pe diagonala principală pozitive astfel încât A =<br />

LL t (matricea L se numeşte factor Cholesky). Rezolvarea sistemului Ax=b revine la<br />

rezolvarea a două sisteme cu matrice triunghiulare: Lz =b, L t x=z. O variantă mai<br />

lentă (volum de calcul mai mare), dar numeric mai stabilă, de rezolvare a sistemului<br />

Ax = b este dată de descompunerea QR a matricei A, adică de reprezentarea<br />

matricei A sub forma A = QR unde Q este o matrice ortogonală (Q t Q = I m+1 ) iar R o<br />

matrice superior triunghiulară. Atunci rezolvarea sistemului Ax=b este echivalentă<br />

cu rezolvarea sistemului Rx =Q t b.<br />

Dacă A=X t X nu este bine condiţionată, atunci gradul de acurateţe al soluţiei<br />

furnizate de metoda celor mai mici pătrate poate fi foarte scăzut.<br />

187


Mădălina Roxana Buneci<br />

188


<strong>Metode</strong> <strong>Numerice</strong><br />

VII. Derivarea numerică<br />

Se recurge la aproximarea derivatei unei funcţii f sau a derivatelor ei de<br />

ordin superior atunci când expresia lui f este prea complicată sau când nu se<br />

cunoaşte expresia analitică a funcţiei f (f este dată prin intermediul unui tabel de<br />

valori).<br />

VII. 1. Formule de derivare aproximativă folosind dezvoltări<br />

în serie Taylor<br />

Fie f : [a, b] → R, derivabilă. Presupunem că se dau n+1 puncte distincte în<br />

intervalul [a, b], x 0 , x 1 , …., x n , în care se cunosc valorile funcţiei f.<br />

Prezentăm o tehnică de găsire a unor formule de aproximare pentru valorile<br />

derivatelor de orice ordin ale funcţiei f. Această tehnică are la bază formula lui<br />

Taylor. Reamintim această formulă.<br />

Fie I un interval de numere reale, a ∈ I şi f : I → R o funcţie de n ori<br />

derivabilă în a. Polinomul Taylor de ordin n ataşat lui f în punctul a este funcţia<br />

polinomială T a,n : I → R, definită prin:<br />

T a,n (x) = f(a) +<br />

f ' ( a)<br />

(x-a) +<br />

1!<br />

f" ( a)<br />

2!<br />

(x-a) 2 f<br />

+ ( n ) ( a)<br />

(x-a) n .<br />

n!<br />

Restul formulei Taylor de ordin n ataşat funcţiei f în punctul a este funcţia<br />

R a,n : I → R definită prin R a,n (x) = f(x) - T a,n (x). Egalitatea<br />

f(x) = T a,n (x) + R a,n (x)<br />

valabilă pentru orice x ∈ I se numeşte formulă Taylor de ordin n ataşată funcţiei f<br />

în punctul a. Se demonstrează că<br />

lim<br />

x→a<br />

R<br />

a,x<br />

= 0. Dacă f este de clasă C n+1 , atunci<br />

( x − a) n<br />

189


Mădălina Roxana Buneci<br />

există u strict cuprins între a şi x (sau echivalent există θ ∈ (0, 1) astfel încât u = a+<br />

θ(x – a)) cu proprietatea că<br />

R a,n (x) =<br />

( n+<br />

1 ) ( u)<br />

(x - a) n+1 .<br />

f<br />

( n + 1)!<br />

Ne propunem să aproximăm valorile derivatelor de ordinul întâi şi doi ale<br />

funcţiei f în punctul x i ∈ [a, b] când sunt cunoscute valorile funcţiei în punctele<br />

x i-1 , x i , x i+1<br />

care nu sunt neapărat echidistante, adică:<br />

x i-1 = x i –h, x i+1 = x i + αh.<br />

dar că α variază într-un interval fixat.<br />

Presupunem că f este de 3 ori derivabilă şi scriem formula lui Taylor de<br />

ordinul 2 pentru f în x i :<br />

f ′(x i) f ′′(x i) 2 f ′′′ (w x ) 3<br />

f (x) = f (x i) + (x − x i) + (x − x i) + (x − x i)<br />

.<br />

1! 2! 3!<br />

cu w x stric cuprins între x şi x i . Înlocuim în această formulă x = x i-1 , respectiv x =<br />

x i+1 şi obţinem relaţiile:<br />

f ′(x i) f ′′(x i)h f ′′′ (u) 3<br />

f (x i−1) = f (x i) + ( − h) + + ( − h) (7.1)<br />

1! 2! 3!<br />

f ′(x i) f ′′(x i) 2 2 f ′′′ (v) 3 3<br />

f (x i+<br />

1) = f (x i) + α h + h α + α h (7.2)<br />

1! 2! 3!<br />

cu u strict cuprins între x i-1 şi x i şi v strict cuprins între x i şi x i+1 . Scăzând din a doua<br />

relaţie prima relaţie înmulţită cu α 2 obţinem:<br />

f ′′′ (v) f ′′′ (u)<br />

f (x ) f x 1 f (x ) h h<br />

f ′(x 3! 3!<br />

i)<br />

=<br />

hα α + 1<br />

( )( )<br />

2 2 3 3 3 2<br />

i+ 1 + i α − − α i−1<br />

+ α + α<br />

( )<br />

Putem aproxima valoarea derivatei funcţiei f în x i prin:<br />

cu eroarea:<br />

( )( )<br />

2 2<br />

i+ 1 + i α − − α i−1<br />

f (x ) f x 1 f (x )<br />

f ′(x i)<br />

≈<br />

hα α + 1<br />

( )<br />

⎛ 2<br />

α f ′′′ (v) α f ′′′ (u) ⎞<br />

ε = +<br />

h<br />

⎜<br />

α + 1 3! α + 1 3! ⎟<br />

⎝<br />

⎠<br />

2<br />

2<br />

190


<strong>Metode</strong> <strong>Numerice</strong><br />

care este de ordinul lui h 2 (O(h 2 )).<br />

Adunând la a doua relaţie prima înmulţită cu α obţinem:<br />

⎛<br />

f ′′′ (v) f ′′′ (u)<br />

2⎜<br />

f (x i+ 1) + ( 1+ α ) f (x i) + α f (x i−1) + α h − αh<br />

3! 3!<br />

f ′′(x i)<br />

=<br />

⎝<br />

2<br />

h α α + 1<br />

( )<br />

3 3 3<br />

Putem astfel aproxima valoarea derivatei de ordinul doi al lui f în x i prin<br />

cu eroarea<br />

ε =<br />

de ordinul lui h: O(h).<br />

( i+ 1 − ( + α ) i + α i−1<br />

)<br />

h α( α + 1)<br />

2 f (x ) 1 f (x ) f (x )<br />

f ′′(x ) ≈<br />

i 2<br />

h ⎛ f ′′′ (v) 2 f ′′′ (u) ⎞<br />

⎜ α − ⎟<br />

α + 1 ⎝ 3 3 ⎠<br />

( )<br />

Dacă nodurile sunt echidistante (adică dacă α = 1) se obţin următoarele<br />

formule de aproximare:<br />

f (x i 1) f (x i 1)<br />

f (x i)<br />

+ −<br />

′ ≈<br />

−<br />

2h<br />

f (x i 1) 2f (x i) f (x i 1)<br />

f (x i)<br />

+ − +<br />

′′ ≈<br />

−<br />

.<br />

2<br />

h<br />

În cazul nodurilor echidistante vom arătă că eroare de aproximare a derivatei de<br />

ordinul doi prin formula de mai sus este de ordinul O(h 2 ). Folosind formula lui<br />

Taylor de ordinul 3 pentru f în x i , obţinem:<br />

2<br />

( 4<br />

f ′(x )<br />

i ) f ′′(x i )h f ′′′ (x i ) 3 f (u) 4<br />

f (x i−1<br />

) = f (x i ) + ( − h) + + ( − h) + h (7.3)<br />

1! 2! 3! 4!<br />

( 4<br />

f ′(x )<br />

i ) f ′′(x i ) 2 f ′′′ (x i ) 3 f (v) 4<br />

f (x i+<br />

1) = f (x i ) + h + h + h + h<br />

(7.4)<br />

1! 2! 3! 4!<br />

cu u strict cuprins între x i-1 şi x i şi v strict cuprins între x i şi x i+1 . Adunând cele două<br />

relaţii rezultă:<br />

( 4) ( 4<br />

f (v) f<br />

)<br />

(u)<br />

f (x i+ 1) + 2f (x i ) + f (x i−1<br />

) + h + h<br />

f ′′ (x<br />

4! 4!<br />

i ) =<br />

2<br />

h<br />

4 4<br />

astfel aproxima valoarea derivatei de ordinul doi al lui f în x i prin<br />

⎞<br />

⎟<br />

⎠<br />

.<br />

191


Mădălina Roxana Buneci<br />

f (x i 1) 2f (x i) f (x i 1)<br />

f (x i)<br />

+ − +<br />

′′ ≈<br />

−<br />

2<br />

h<br />

cu eroarea<br />

⎛ ( 4) ( 4<br />

f (v) f<br />

)<br />

(u) ⎞<br />

ε = +<br />

h<br />

⎜ 4! 4! ⎟<br />

⎝<br />

⎠<br />

de ordinul lui h 2 : O(h 2 ).<br />

Ne propunem acum să aproximăm valorile derivatelor de ordinul întâi şi doi<br />

ale funcţiei f în punctul x i ∈ [a, b] când sunt cunoscute valorile funcţiei în punctele<br />

x i , x i+1 , x i+2<br />

care nu sunt neapărat echidistante, adică:<br />

x i = x i+1 –h, x i+2 = x i+1 + αh.<br />

cu α<br />

Presupunem că f este de 3 ori derivabilă şi scriem formula lui Taylor de ordinul 2<br />

ataşată lui f în x i :<br />

f ′(x i) f ′′(x i) 2 f ′′′ (w x ) 3<br />

f (x) = f (x i) + (x − x i) + (x − x i) + (x − x i)<br />

.<br />

1! 2! 3!<br />

cu w x stric cuprins între x şi x i . Înlocuim în această formulă x = x i+1 , respectiv x =<br />

x i+2 şi obţinem relaţiile:<br />

2<br />

f ′(x i) f ′′ (x i)h f ′′′ (u) 3<br />

f (x i+<br />

1) = f (x i) + h + + h<br />

(7.5)<br />

1! 2! 3!<br />

f ′(x i) f ′′ (x i) 2 2 f ′′′ (v) 3 3<br />

f (x i+<br />

2) = f (x i) + ( α + 1)h + h ( α + 1) + ( α + 1) h (7.6)<br />

1! 2! 3!<br />

cu u strict cuprins între x i şi x i+1 şi v strict cuprins între x i şi x i+2 . Scăzând din relaţia<br />

(7.5) relaţia (7.6) înmulţită cu (1+α) 2 obţinem:<br />

( )( )<br />

2 2<br />

i+ 2 + i α + α − + α i+<br />

1<br />

f (x ) f x 2 (1 ) f (x )<br />

f ′(x i ) = +<br />

−hα α + 1<br />

( )<br />

f ′′′ (v)<br />

f ′′′ (u)<br />

− ( α + 1) h + h (1 + α)<br />

+<br />

3! 3!<br />

−hα α + 1<br />

2<br />

3 3 3 2<br />

( )<br />

Putem aproxima valoarea derivatei funcţiei f în x i prin:<br />

192


<strong>Metode</strong> <strong>Numerice</strong><br />

( )<br />

( ) ( )<br />

2 2<br />

i+ 2 i+<br />

1 i<br />

−f (x ) − (1 + α) f (x ) − α + 2α<br />

f x<br />

f ′(x i ) ≈<br />

hα α + 1<br />

cu eroarea:<br />

⎛<br />

2<br />

f ′′′ (v) ( α + 1) f ′′′ (u) ( α + 1) ⎞<br />

ε =<br />

−<br />

h<br />

⎜<br />

3! α 3! α ⎟<br />

⎝<br />

⎠<br />

Adunând la relaţia (7.6) relaţia (7.5) înmulţită cu -(1+α) obţinem:<br />

f (x i+ 2 ) + αf (x i ) − ( α + 1)f (x i 1)<br />

f ′′<br />

+<br />

(x i ) = 2<br />

2<br />

h 1 α<br />

( α + )<br />

f ′′′ (v)<br />

f ′′′ (u)<br />

− ( α + 1) h + ( α + 1)h<br />

+ 2<br />

3! 3!<br />

2<br />

h 1 α<br />

3 3 3<br />

( α + )<br />

Putem astfel aproxima valoarea derivatei de ordinul doi al lui f în x i prin<br />

f (x i+ 2 ) − ( α + 1)f (x i+<br />

1) + αf (x i )<br />

f ′′ (x i ) ≈ 2<br />

2<br />

h α α + 1<br />

( )<br />

2<br />

.<br />

cu eroarea<br />

⎛<br />

2<br />

f ′′′ (v) ( α + 1) f ′′′ (u) 1 ⎞<br />

ε = − + h<br />

⎜<br />

3! α 3! α ⎟<br />

⎝<br />

⎠<br />

Dacă nodurile sunt echidistante (adică dacă α = 1) se obţin următoarele<br />

formule de aproximare:<br />

( )<br />

− f (x i+ 2 ) + 4f xi+<br />

1 − 3f (x i )<br />

f ′(x i ) ≈<br />

2h<br />

cu eroare de ordinul O(h 2 )<br />

f (x i+ 2 ) − 2f (x i+<br />

1) + f (x i )<br />

f ′′ (x i ) ≈ .<br />

2<br />

h<br />

cu eroare de ordinul O(h).<br />

Similar ne propunem să aproximăm valorile derivatelor de ordinul întâi şi<br />

doi ale funcţiei f în punctul x i ∈ [a, b] când sunt cunoscute valorile funcţiei în<br />

punctele<br />

193


Mădălina Roxana Buneci<br />

x i-2 , x i-1 , x i<br />

care nu sunt neapărat echidistante, adică:<br />

x i = x i-1 + h, x i-2 = x i-1 –αh<br />

Presupunem că f este de 3 ori derivabilă şi scriem formula lui Taylor de ordinul 2<br />

pentru f în x i :<br />

2<br />

f ′(x i) f ′′(x i)h f ′′′ (u) 3<br />

f (x i−1) = f (x i) − h + − h<br />

(7.7)<br />

1! 2! 3!<br />

f ′(x i) f ′′(x i) 2 2 f ′′′ (v) 3 3<br />

f (x i−2) = f (x i) − ( α + 1)h + h ( α + 1) − ( α + 1) h (7.8)<br />

1! 2! 3!<br />

cu u strict cuprins între x i şi x i+1 şi v strict cuprins între x i şi x i+2 . Scăzând din relaţia<br />

(7.8) relaţia (7.7) înmulţită cu (1+α) 2 obţinem:<br />

( )( )<br />

2 2<br />

i−2 + i α + α − + α i−1<br />

f (x ) f x 2 (1 ) f (x )<br />

f ′(x i ) = +<br />

hα α + 1<br />

( )<br />

f ′′′ (u)<br />

f ′′′ (v)<br />

− h (1 + α ) + ( α + 1) h<br />

+<br />

3! 3!<br />

hα α + 1<br />

3 2 3 3<br />

( )<br />

Putem aproxima valoarea derivatei funcţiei f în x i prin:<br />

f ′(x ) ≈<br />

i<br />

( ) ( )<br />

2 2<br />

i i−1 i−2<br />

α + 2α f x − (1 + α ) f (x ) + f (x )<br />

( )<br />

hα α + 1<br />

cu eroarea:<br />

⎛ f ′′′ (u) ( α + 1) f ′′′ (v) ( α + 1)<br />

ε = − +<br />

⎜<br />

⎝<br />

3! α 3! α<br />

2<br />

⎞<br />

h<br />

⎟<br />

⎠<br />

Adunând la relaţia (7.8) relaţia (7.7) înmulţită cu -(1+α) obţinem:<br />

f (x i−2 ) + αf (x i ) − ( α + 1)f (x i 1)<br />

f ′′<br />

−<br />

(x i ) = 2<br />

2<br />

h 1 α<br />

( α + )<br />

f ′′′ (v)<br />

f ′′′ (u)<br />

− ( α + 1) h + ( α + 1)h<br />

+ 2<br />

3! 3!<br />

2<br />

h 1 α<br />

3 3 3<br />

( α + )<br />

Putem astfel aproxima valoarea derivatei de ordinul doi al lui f în x i prin<br />

2<br />

.<br />

194


<strong>Metode</strong> <strong>Numerice</strong><br />

−αf (x i) − ( α + 1)f (x i 1) f (x i 2)<br />

f (x i) 2<br />

− +<br />

′′ ≈<br />

−<br />

2<br />

h α α + 1<br />

( )<br />

cu eroarea<br />

⎛ f ′′′ (u) 1 f ′′′ (v) ( α + 1)<br />

ε =<br />

−<br />

⎜<br />

⎝<br />

3! α 3! α<br />

Dacă nodurile sunt echidistante (adică dacă α = 1) se obţin următoarele<br />

formule de aproximare:<br />

cu eroare de ordinul O(h 2 ), şi<br />

3f (x ) − 4f (x ) + f x<br />

f ′(x i ) ≈<br />

2h<br />

2<br />

⎞<br />

h<br />

⎟<br />

⎠<br />

( )<br />

i i−1 i−2<br />

f (x i−2 ) − 2f (x i−1 ) + f (x i )<br />

f ′′ (x i ) ≈ .<br />

2<br />

h<br />

cu eroare de ordinul O(h).<br />

Folosind acest tip de tehnici, se poate obţine o mare varietate de formule<br />

aproximative pentru valorile derivatelor de orice ordin în x i . Prezentăm mai jos<br />

câteva astfel de formule pentru cazul nodurilor echidistante.<br />

Formulă de aproximare a derivatei prin diferenţe finite centrale<br />

Eroare<br />

f (x i 1) f (x i 1)<br />

f (x i)<br />

+ − −<br />

O(h 2 )<br />

′ ≈<br />

2h<br />

− f (x i+ 1) + 8f (x i+ 1) − 8f (x i−1) + f (x i−2<br />

)<br />

O(h 4 )<br />

f ′(x i ) ≈<br />

12h<br />

f (x i 1) 2f (x i) f (x i 1)<br />

f (x i)<br />

+ − + −<br />

O(h 2 )<br />

′′ ≈<br />

2<br />

h<br />

− f (x i+ 2 ) + 16f (x i+ 1) − 30f (x i ) + 16f (x i−1) − f (x i−2<br />

)<br />

O(h 4 )<br />

f ′′(x i ) ≈<br />

2<br />

12h<br />

f (x i+ 2 ) − 2f (x i+ 1) + 2f (x i−1) − f (x i−2<br />

)<br />

O(h 2 )<br />

f ′′′ (x i ) ≈<br />

3<br />

2h<br />

− f (x i+ 3) + 8f (x i+ 2 ) − 13f (x i+ 1) + 13f (x i−1 ) − 8f (x i−2 ) + f (x i−3)<br />

O(h 4 )<br />

f ′′′ (x i ) ≈<br />

3<br />

8h<br />

195


Mădălina Roxana Buneci<br />

Formulă de aproximare a derivatei prin diferenţe finite progresive<br />

f (x i+ 1) − f (x i )<br />

f ′(x i ) ≈<br />

h<br />

( )<br />

− f (x i+ 2 ) + 4f xi+<br />

1 − 3f (x i )<br />

f ′(x i ) ≈<br />

2h<br />

f (x i+ 2 ) − 2f (x i+<br />

1) + f (x i )<br />

f ′′ (x i ) ≈<br />

2<br />

h<br />

− f (x i+ 3) + 4f (x i+ 2 ) − 5f (x i+<br />

1) + 2f (x i )<br />

f ′′ (x i ) ≈<br />

2<br />

h<br />

f (x i+ 3) − 3f (x i+ 2 ) + 3f (x i+<br />

1) − f (x i )<br />

f ′′′ (x i ) ≈<br />

3<br />

h<br />

− 3f (x i+ 4 ) + 14f (x i+ 3) − 24f (x i+ 2 ) + 18f (x i+<br />

1) − 5f (x i )<br />

f ′′′ (x i ) ≈<br />

3<br />

2h<br />

Eroare<br />

O(h)<br />

O(h 2 )<br />

O(h)<br />

O(h 2 )<br />

O(h)<br />

O(h 2 )<br />

Formulă de aproximare a derivatei prin diferenţe finite regresive<br />

f (x i ) − f (x i 1)<br />

f ′<br />

−<br />

(x i ) ≈<br />

h<br />

3f (x ) − 4f (x ) + f x<br />

f ′(x i ) ≈<br />

2h<br />

( )<br />

i i−1 i−2<br />

f (x i ) − 2f (x i−1) + f (x i 2 )<br />

f ′′<br />

−<br />

(x i ) ≈<br />

2<br />

h<br />

2f (x i ) − 5f (x i−1) + 4f (x i−2 ) − f (x i 3)<br />

f ′′<br />

−<br />

(x i ) ≈<br />

2<br />

h<br />

f (x i ) − 3f (x i−1 ) + 3f (x i−2 ) − f (x i 3)<br />

f ′′′<br />

−<br />

(x i ) ≈<br />

3<br />

h<br />

5f (x i ) − 18f (x i−1 ) + 24f (x i−2 ) − 14f (x i−3) + 3f (x i 4 )<br />

f ′′′<br />

−<br />

(x i ) ≈<br />

3<br />

2h<br />

Eroare<br />

O(h)<br />

O(h 2 )<br />

O(h)<br />

O(h 2 )<br />

O(h)<br />

O(h 2 )<br />

196


<strong>Metode</strong> <strong>Numerice</strong><br />

Procedură MAPLE pentru determinarea valorilor aproximative ale<br />

derivatei de ordinul 1<br />

Procedura d1 admite drept parametri lista x ce conţine punctele x 1 , x 2 , …., x n şi<br />

lista y ce conţine valorile y 1 = f(x 1 ), y 2 = f(x 2 ), …., y n = f(x n ). Procedura întoarce<br />

lista aproximaţiilor derivatei de ordinul I a lui f în punctele x 2 , x 3 , ..., x n-1 .<br />

> d1:=proc(x,y)<br />

> local df,h,alpha,i,n;<br />

> n:=nops(x);df:=[seq(1,i=1..n-2)];<br />

> for i from 2 to n-1 do<br />

> h:=x[i]-x[i-1];<br />

> alpha:=(x[i+1]-x[i])/h;<br />

> df[i-1]:=(y[i+1]+y[i]*(alpha^2-1)-alpha^2*y[i-1])/<br />

(h*alpha*(alpha+1))<br />

> od;<br />

> RETURN(df);<br />

> end;<br />

Procedură MAPLE pentru determinarea valorilor aproximative ale<br />

derivatei de ordinul 2<br />

Procedura d2 admite drept parametri lista x ce conţine punctele x 1 , x 2 , …., x n şi<br />

lista y ce conţine valorile y 1 = f(x 1 ), y 2 = f(x 2 ), …., y n = f(x n ). Procedura întoarce<br />

lista aproximaţiilor derivatei de ordinul al II-lea a lui f în punctele x 2 , x 3 , ..., x n-1 .<br />

> d2:=proc(x,y)<br />

> local d2f,h,alpha,i,n;<br />

> n:=nops(x);d2f:=[seq(1,i=1..n-2)];<br />

> for i from 2 to n-1 do h:=x[i]-x[i-1];<br />

> alpha:=(x[i+1]-x[i])/h;<br />

> d2f[i-1]:=2*(y[i+1]-(alpha+1)*y[i]+alpha*y[i-<br />

1])/(h^2*alpha*(alpha+1))<br />

> od;<br />

> RETURN(d2f);<br />

> end;<br />

Exemple<br />

> x1:=[seq(-1+2*i/5,i=0..5)];<br />

197


f1:=t->ln(1+t^2);<br />

Mădălina Roxana Buneci<br />

x1 :=<br />

⎡<br />

⎤<br />

⎣<br />

⎢-1, -3 -1 1 3<br />

, , , ,<br />

5 5 5 5 1<br />

⎦<br />

⎥<br />

f1 := t → ln ( 1 + t 2 )<br />

> y1:=[seq(evalf(f1(-1+2*i/5)),i=0..5)];<br />

y1 := [ 0.6931471806, 0.3074846997, 0.03922071315, 0.03922071315, 0.3074846997,<br />

0.6931471806 ]<br />

> d1(x1,y1);<br />

> d2(x1,y1);<br />

[ -0.8174080840, -0.3353299832, 0.3353299832,<br />

0.8174080840 ]<br />

[ 0.7337405900, 1.676649916, 1.676649916,<br />

0.7337405900 ]<br />

> z1:=[seq(D(f1)(-1+2*i/5),i=1..4)];<br />

z1 :=<br />

⎡-15<br />

-5 5 15 ⎤<br />

⎢ , , , ⎥<br />

⎣ 17 13 13 17 ⎦<br />

> z2:=[seq((D@@2)(f1)(-1+2*i/5),i=1..4)];<br />

> map(evalf,d1(x1,y1));<br />

z2 :=<br />

⎡200<br />

300 300 200 ⎤<br />

⎣<br />

⎢ , , ,<br />

289 169 169 289 ⎦<br />

⎥<br />

[ -0.8174080840, -0.3353299832, 0.3353299832,<br />

0.8174080840 ]<br />

> map(evalf,z1);-.8174080840<br />

[ -0.8823529412, -0.3846153846, 0.3846153846,<br />

0.8823529412 ]<br />

> map(evalf,d2(x1,y1));<br />

> map(evalf,z2);<br />

[ 0.7337405900, 1.676649916, 1.676649916,<br />

0.7337405900 ]<br />

[ 0.6920415225, 1.775147929, 1.775147929,<br />

0.6920415225 ]<br />

Cazul nodurilor echidistante:<br />

Procedură MAPLE pentru determinarea valorilor aproximative ale<br />

derivatei de ordinul 1 utilizând o formula de aproximare prin diferenţe finite<br />

centrale<br />

Procedura de1 admite drept parametri pasul h al discretizării şi lista y ce conţine<br />

valorile y 1 = f(x 1 ), y 1 = f(x 1 ), …., y n = f(x n ) (x i = x i + (i-1)h). Procedura returnează<br />

lista aproximaţiilor derivatei de ordinul I a lui f în punctele x 2 , x 3 , ..., x n-1 .<br />

> de1:=proc(h,y)<br />

> local df,i,n;<br />

198


<strong>Metode</strong> <strong>Numerice</strong><br />

> n:=nops(y);df:=[seq(1,i=1..n-2)];<br />

> for i from 2 to n-1 do<br />

> df[i-1]:=(y[i+1]-y[i-1])/(2*h)<br />

> od;<br />

> RETURN(df);<br />

> end;<br />

Procedură MAPLE pentru determinarea valorilor aproximative ale<br />

derivatei de ordinul 2 utilizând o formula de aproximare prin diferenţe finite<br />

centrale<br />

Procedura de2 admite drept parametri drept parametri pasul h al discretizării şi<br />

lista y ce conţine valorile y 1 = f(x 1 ), y 1 = f(x 1 ), …., y n = f(x n ) (x i = x i + (i-1)h).<br />

Procedura întoarce lista aproximaţiilor derivatei de ordinul al II-lea a lui f în<br />

punctele x 2 , x 3 , ..., x n-1 .<br />

> de2:=proc(h,y)<br />

> local df,i,n;<br />

> n:=nops(y);df:=[seq(1,i=1..n-2)];<br />

> for i from 2 to n-1 do<br />

> df[i-1]:=(y[i+1]-2*y[i]+y[i-1])/(h*h)<br />

> od;<br />

> RETURN(df);<br />

> end;<br />

Exemple<br />

> x2:=[seq(1+2*i/5,i=0..5)];<br />

> f2:=t->1/(1+t^2);<br />

x2 :=<br />

⎡<br />

⎢ 1, 7 9 11 13<br />

, , , ,<br />

⎤<br />

⎥<br />

⎣ 5 5 5 5 3<br />

⎦<br />

f2 := t →<br />

1<br />

1 + t 2<br />

> y2:=[seq(evalf(f2(1+2*i/5)),i=0..5)];<br />

y2 := [ 0.5000000000, 0.3378378378, 0.2358490566, 0.1712328767, 0.1288659794,<br />

0.1000000000 ]<br />

> de1(2/5,y2);<br />

[ -0.3301886792, -0.2082562014, -0.1337288465,<br />

-0.08904109590 ]<br />

> de2(2/5,y2);<br />

199


Mădălina Roxana Buneci<br />

[ 0.3760836312, 0.2335787581, 0.1390580162,<br />

0.08438073688 ]<br />

> z3:=[seq(D(f2)(1+2*i/5),i=1..4)];<br />

z3 :=<br />

⎡ -875 -1125 -1375 -1625 ⎤<br />

⎢ , , , ⎥<br />

⎣ 2738 5618 10658 18818 ⎦<br />

> z4:=[seq((D@@2)(f2)(1+2*i/5),i=1..4)];<br />

> map(evalf,de1(2/5,y2));<br />

z4 :=<br />

⎡ 38125 68125 105625 150625 ⎤<br />

⎢ , , , ⎥<br />

⎣ 101306 297754 778034 1825346 ⎦<br />

[ -0.3301886792, -0.2082562014, -0.1337288465,<br />

-0.08904109590 ]<br />

> map(evalf,z3);<br />

[ -0.3195763331, -0.2002491990, -0.1290110715,<br />

-0.08635349134 ]<br />

> map(evalf,de2(2/5,y2));<br />

[ 0.3760836312, 0.2335787581, 0.1390580162,<br />

0.08438073688 ]<br />

> map(evalf,z4);<br />

> with(plots):<br />

[ 0.3763350641, 0.2287962546, 0.1357588486,<br />

0.08251860195 ]<br />

> plot([D(f2),t->de1(2/5,[f2(t-2/5),f2(t),f2(t+2/5)])[1]],1..3);<br />

200


<strong>Metode</strong> <strong>Numerice</strong><br />

> plot([(D@@2)(f2),t->de2(2/5,[f2(t-2/5),f2(t),f2(t+2/5)])[1]],<br />

1..3);<br />

> plot([D(f2),t->de1(10^(-8),[f2(t-10^(-8)),f2(t),f2(t+10^(-<br />

8))])[1]],1..3);<br />

201


Mădălina Roxana Buneci<br />

> plot([(D@@2)(f2),t->de2(10^(-4),[f2(t-10^(-4)),f2(t),f2(t+10^(-<br />

4))])[1]],1..3);<br />

Ceea ce vedem în ultimele două grafice se datorează aritmeticii virgulei mobile.<br />

Aşa cum am arătat în primul capitol eroarea de calcul este suma dintre eroarea de<br />

trunchiere şi eroarea de rotunjire, dar de obicei una dintre acestea predomină. De<br />

obicei există o valoare optimală a pasului de discretizare h. Pentru valori mai mici<br />

ale lui h eroarea totală creşte din cauza creşterii erorii de rotunjire, iar pentru valori<br />

mai mari ale lui h eroarea totală creşte din cauza creşterii erorii de trunchiere.<br />

Pentru a evidenţia acest aspect considerăm procedurile eroare1 (respectiv eroare2)<br />

de mai jos care returnează eroarea cu care este aproximată derivata de ordinul 1<br />

(respectiv 2) a funcţiei f în punctul x când se aplică o formulă de aproximare prin<br />

diferenţe finite centrale (nodurile sunt x-h,x,x+h). În exemple ce urmează se poate<br />

face comparaţie între situaţia în care calculul se execută simbolic (şi doar rezultatele<br />

sunt afişate în virgulă mobilă) şi situaţia în care calculul se execută în virgulă<br />

mobilă.<br />

> eroare1:=proc(f,x,h)<br />

> RETURN(D(f)(x)-de1(h,[f(x-h),f(x),f(x+h)])[1])<br />

> end;<br />

202


<strong>Metode</strong> <strong>Numerice</strong><br />

> map(evalf,[seq(eroare1(f2,3/2,10^(-i)),i=1..6)]);<br />

[ 0.0006711385277, 0.6722343900 10 -5 , 0.6722452598 10 -7 , 0.6722453685 10 -9 ,<br />

0.6722453695 10 -11 , 0.6722453696 10 -13 ]<br />

> [seq(eroare1(f2,1.5,10^(-i)),i=1..6)];<br />

[ 0.0006711384, 0.67214 10 -5 , 0.314 10 -7 , -0.1686 10 -6 , 0.13314 10 -5 , -0.0000236686 ]<br />

> plot(h->abs(eroare1(f2,1.5,h)), 10^(-6)..10^(-2));<br />

> plot(h->abs(eroare1(f2,1.5,h)), 10^(-6)..10^(-2),numpoints=2);<br />

> eroare2:=proc(f,x,h)<br />

> RETURN((D@@2)(f)(x)-de2(h,[f(x-h),f(x),f(x+h)])[1])<br />

> end;<br />

203


Mădălina Roxana Buneci<br />

> map(evalf,[seq(eroare2(f2,3/2,10^(-i)),i=1..5)]);<br />

[ -0.0002076099410, -0.2102654016 10 -5 , -0.2102918739 10 -7 , -0.2102921386 10 -9 ,<br />

-0.2102921412 10 -11 ]<br />

> [seq(eroare2(f2,1.5,10^(-i)),i=1..5)];<br />

[ -0.0002076042, -0.17242 10 -5 , 0.22758 10 -5 , 0.0050022758,<br />

-0.6649977242 ]<br />

> plot(h->abs(eroare2(f2,1.5,h)), 10^(-4)..1/3);<br />

> plot(h->abs(eroare2(f2,1.5,h)), 10^(-4)..1/3,numpoints=2);<br />

204


<strong>Metode</strong> <strong>Numerice</strong><br />

VII. 2. Extrapolare Richardson<br />

Să presupunem că dorim să calculăm o cantitate L şi că avem<br />

ϕ(h) = L +<br />

∞<br />

2k<br />

∑ a2kh<br />

.<br />

k=<br />

1<br />

Atunci ϕ(h) reprezintă o aproximaţie pentru L cu eroare de ordinul O(h 2 ). În cele ce<br />

urmează vom arăta cum să obţinem o aproximaţie pentru care eroarea să fie de de<br />

ordinul O(h 2(n+1) ), cu n dat. Notăm<br />

şi definim<br />

D(n,m) =<br />

Se poate arăta utilizând inducţia că<br />

m<br />

h<br />

n<br />

⎛<br />

D(n,0) = ϕ ⎜<br />

⎝ 2<br />

⎞<br />

⎟<br />

⎠<br />

( − ) − ( − − )<br />

4 D n,m 1 D n 1, m 1<br />

m<br />

4 −1<br />

, 1 ≤ m ≤ n.<br />

Teorema 7.9 (Extrapolare Richardson). Cu notaţiile de mai sus există<br />

constantele a k,m astfel încât<br />

D(n,m) = L +<br />

Ca o consecinţă a teoremei precedente rezultă că<br />

∑<br />

∞<br />

2k<br />

⎛ h ⎞<br />

ak,m<br />

⎜ n ⎟<br />

k= m+<br />

1 ⎝ 2 ⎠<br />

.<br />

D(n,m) = L + O(h 2(n+1) ).<br />

Cu alte cuvinte D(n,n) este o aproximaţie a lui L cu eroare de ordinul O(h 2(n+1) ).<br />

triunghiular:<br />

Pentru calculul recursiv al valorilor D(n,m) se poate folosi tabelul<br />

D(0,0)<br />

D(1,0) D(1,1)<br />

D(2,0) D(2,1) D(2,2)<br />

D(n,0) D(n,1) D(n,2)<br />

D(n,n)<br />

205


Mădălina Roxana Buneci<br />

⎛ ⎞<br />

Prima coloană a acestui tabel poate fi calculată direct cu definiţia: D(n,0) = ϕ ⎜ ⎟<br />

⎝ 2 ⎠ .<br />

În cazul elementelor de pe celelalte coloane se observă că fiecare dintre ele depinde<br />

de elementul din stânga de pe aceeaşi linie şi de pe linia de deasupra din stânga.<br />

Să exemplificăm aplicarea acestui procedeu pentru îmbunătăţirea formulei<br />

de aproximare a derivatei de ordinul 1:<br />

Dacă f este analitică avem:<br />

f (x + h) − f (x − h)<br />

f ′(x)<br />

≈ ϕ ( h)<br />

= .<br />

2h<br />

ϕ(h) = f ′(x)<br />

+<br />

∞ ( 2k+<br />

1<br />

f<br />

)<br />

2k<br />

∑ x h .<br />

2k 1 !<br />

( ) ( )<br />

k= 1<br />

+<br />

Deci putem aplica extrapolare Richardson.Vom aproxima f ′(x)<br />

cu D(1,1). Dar<br />

Ca urmare<br />

D(1,1) =<br />

⎛ h ⎞<br />

4ϕ⎜<br />

⎟ − ϕ h<br />

⎝ 2 ⎠<br />

3<br />

( )<br />

ordinul O(h 4 ), unde ( h)<br />

( ) − ( )<br />

4D 1,0 D 0,0<br />

3<br />

=<br />

⎛ h ⎞<br />

4ϕ⎜<br />

⎟ − ϕ h<br />

⎝ 2 ⎠<br />

3<br />

( )<br />

reprezintă o aproximaţie a lui f ′(x)<br />

cu eroare de<br />

f (x + h) − f (x − h)<br />

ϕ = .<br />

2h<br />

.<br />

h<br />

n<br />

VII.3. <strong>Metode</strong> de derivare numerică folosind interpolarea<br />

Fie f : [a, b] → R o funcţie, fie x 0 , x 1 , …, x n n+1 puncte distincte din<br />

intervalul [a, b], şi y i = f(x i ) pentru orice i = 0,1,…n. Aproximăm f (k) prin derivata<br />

de ordinul k a polinomului de interpolare asociat lui f şi x 0 , x 1 , …, x n .<br />

Să presupunem că n = 4 şi că punctele x 0 , x 1 , x 2 , x 3 , x 4 sunt echidistante şi să<br />

construim polinomul Newton ascendent.<br />

206


<strong>Metode</strong> <strong>Numerice</strong><br />

P (x) = P (x + th)<br />

4 4 0<br />

2 3<br />

0 0 0<br />

∆f (x ) ∆ f (x ) ∆ f (x )<br />

= f (x 0) + t + t(t − 1) + t(t −1)(t − 2) +<br />

1! 2! 3!<br />

4<br />

f (x 0) t(t 1)(t 2)(t 3)<br />

∆<br />

+ − − −<br />

4!<br />

2 3<br />

0 0 2 0 3 2<br />

∆f (x ) ∆ f (x ) ∆ f (x )<br />

= f (x 0) + t + (t − t) + (t − 3t + 2t) +<br />

1! 2! 3!<br />

4<br />

f (x 0) (t<br />

4 6t<br />

3 11t<br />

2 6t)<br />

∆<br />

+ − + −<br />

4!<br />

Notăm g(t) = P 4 (x 0 +th). Avem<br />

Pe de altă parte<br />

iar<br />

În consecinţă avem:<br />

g′ (t) = P ′<br />

4 (x 0 +th)h<br />

g′′ (t) = P ′′<br />

4 (x 0 +th)h 2 .<br />

2 3<br />

0 ∆ 0<br />

∆ f (x ) f (x ) 2<br />

g′ ( t)<br />

= ∆ f (x 0) + (2t − 1) + (3t − 6t + 2) +<br />

2 6<br />

4<br />

f (x 0) (4t<br />

3 18t<br />

2 22t 6)<br />

∆<br />

+ − + −<br />

24<br />

2 (2t −1) 3 (3t − 6t + 2)<br />

= ∆ f (x 0) + ∆ f (x 0) + ∆ f (x 0)<br />

+<br />

2 6<br />

3 2<br />

4 (2t − 9t + 11t − 3)<br />

+ ∆ f (x 0)<br />

12<br />

2 3<br />

0 ∆ 0<br />

∆ f (x ) f (x )<br />

g′′ ( t)<br />

= 2 + (6t − 6) +<br />

2 6<br />

4<br />

f (x 0) (6t<br />

2 18t 11)<br />

∆<br />

+ − +<br />

12<br />

2 3 4 (6t − 18t + 11)<br />

= ∆ f (x 0) + ∆ f (x 0) ( t − 1)<br />

+ ∆ f (x 0)<br />

.<br />

12<br />

f ′ (x)= f ′ (x 0 +ht) ≈ 1 2<br />

h ( 2 (2t −1) 3 (3t − 6t + 2)<br />

∆ f (x 0) + ∆ f (x 0) + ∆ f (x 0)<br />

+<br />

2 6<br />

2<br />

2<br />

207


Mădălina Roxana Buneci<br />

f ′′(x) = f ′′(x 0 +ht) ≈<br />

3 2<br />

4 (2t − 9t + 11t − 3)<br />

+ ∆ f (x 0)<br />

)<br />

12<br />

1<br />

2<br />

h ( ( ) 2<br />

2 0 3 0 4<br />

f (x ) f (x ) t 1 f (x 0 )<br />

(6t − 18t + 11)<br />

∆ + ∆ − + ∆ ).<br />

12<br />

208


<strong>Metode</strong> <strong>Numerice</strong><br />

VIII. Integrarea numerică<br />

VIII.1. Formula generală de cuadratură numerică. Formula de<br />

cuadratură Newton-Cotes.<br />

Fie f : [a, b] → R o funcţie continuă. Ne punem problema să calculăm<br />

valoarea aproximativă a integralei<br />

b<br />

∫<br />

a<br />

f (x) ρ(x)dx<br />

, unde ρ : [a, b]→R este o funcţie<br />

continuă strict pozitivă numită pondere. Considerăm x 0 , x 1 , …, x n n+1 puncte<br />

distincte din intervalul [a, b], şi notăm y i = f(x i ) pentru orice i = 0,1,…n.<br />

O formulă de cuadratură presupune aproximarea integralei<br />

printr-o combinaţie liniară de valori ale funcţiei f în punctele x 0 , x 1 , …, x n , i.e<br />

b<br />

∫ f (x) ρ(x)dx<br />

≈ A 0 f(x 0 ) + A 1 f(x 1 ) + ... + A n f(x n ).<br />

a<br />

Fie L n polinomul Lagrange asociat lui f şi punctelor considerate:<br />

L n (x) = f ( x ) l ( x)<br />

b<br />

∫<br />

a<br />

f (x) ρ(x)dx<br />

( )( ) ( )( ) ( )<br />

n<br />

n<br />

x − x<br />

∑ i i =<br />

0 x − x 1 .... x − xi− 1 x − x i+<br />

1 ... x − xn<br />

∑ yi<br />

.<br />

i=<br />

0<br />

i=<br />

0 ( x i − x 0 )( x i − x 1) .... ( x i − x i− 1)( x i − x i+<br />

1) ... ( x i − x n )<br />

Înlocuind f prin L n , obţinem formula de aproximare<br />

b<br />

a<br />

b<br />

∫ ∫<br />

f (x) ρ(x)dx<br />

≈ L (x) ρ(x)dx<br />

b b n<br />

n b<br />

∫ ∫ ∑ ∑ ∫<br />

a<br />

n<br />

( ) ( ) ( ) ( )<br />

f (x) ρ(x)dx ≈ ρ (x) f x l x dx = f x ρ(x)l x dx<br />

i i i i<br />

a a i= 0 i=<br />

0 a<br />

209


Mădălina Roxana Buneci<br />

b<br />

Deci notăm dacă A i = ( )<br />

... + A n f(x n ).<br />

∫<br />

a<br />

ρ(x)l x dx , atunci<br />

i<br />

b<br />

∫ f (x) ρ(x)dx<br />

≈ A 0 f(x 0 ) + A 1 f(x 1 ) +<br />

În cele ce urmează ne propunem să calculăm eroarea cu<br />

b<br />

b<br />

∫ L n (x) ρ(x)dx<br />

aproximeză ∫<br />

a<br />

a<br />

avem<br />

x i =<br />

b<br />

∫ L n (x) ρ(x)dx<br />

=<br />

a<br />

f (x) ρ(x)dx<br />

a<br />

. Reprezentând punctele sub forma<br />

a + b b − a<br />

+ t i , t i ∈[-1, 1], i ∈{0, 1, ..., n},<br />

2 2<br />

b<br />

n<br />

( x − x )( ) ( )( ) ( )<br />

=<br />

0 x − x 1 .... x − xi− 1 x − x i+<br />

1 ... x − xn<br />

∫ ρ( ) ( i )<br />

a<br />

∑<br />

( x − x )( x − x )....( x − x )( x − x )...( x − x )<br />

x f x dx<br />

i=<br />

0<br />

i 0 i 1 i i− 1 i i+<br />

1 i n<br />

n<br />

b ( x − x )( ) ( )( ) ( )<br />

=<br />

0 x − x 1 .... x − xi− 1 x − x i+<br />

1 ... x − xn<br />

∑ ( i ) ∫ ρ( )<br />

a ( x − x )( x − x )....( x − x )( x − x )...( x − x )<br />

i=<br />

0<br />

f x x dx<br />

Facem schimbarea de variabilă<br />

şi obţinem<br />

b<br />

∫ L n (x) ρ(x)dx<br />

=<br />

a<br />

n<br />

i 0 i 1 i i− 1 i i+<br />

1 i n<br />

1<br />

i<br />

i= 0 −1<br />

x = a + b b −<br />

+<br />

a t<br />

2 2<br />

b − a a + b b − a (t − t 0) ⋯(t − t i 1)(t t i 1) (t t n )<br />

f (x ) ( t)<br />

− − + ⋯ −<br />

∑<br />

dt<br />

2<br />

∫ ρ +<br />

2 2 (t − t ) ⋯(t − t )(t − t ) ⋯(t − t )<br />

Formula<br />

n<br />

1<br />

i<br />

i= 0 −1<br />

b<br />

∫<br />

a<br />

i 0 i i− 1 i i+<br />

1 i n<br />

f (x) ρ(x)dx<br />

b − a a + b b − a (t − t 0) ⋯(t − t i 1)(t t i 1) (t t n )<br />

f (x ) ( t)<br />

− − + ⋯ −<br />

∑<br />

dt.<br />

2<br />

∫ ρ +<br />

2 2 (t − t ) ⋯(t − t )(t − t ) ⋯(t − t )<br />

se numeşte formula generală de cuadratură.<br />

≈<br />

i 0 i i− 1 i i+<br />

1 i n<br />

care<br />

210


<strong>Metode</strong> <strong>Numerice</strong><br />

Presupunem că f este de clasă C n+1 . Pentru a evalua restul formulei ţinem<br />

seama că eroarea cu care polinomul de interpolare aproximează funcţia este dată de<br />

unde M =<br />

|f(x) − L n (x)| ≤ M (x − x 0 )(x − x 1 ) ⋯ (x − x n ) ,<br />

(n + 1)!<br />

sup |f( n+1) (x)|<br />

x ∈[a,b]<br />

R n (f) =<br />

b b b<br />

∫ ∫ ∫<br />

f (x) ρ(x)dx − ρ (x)L (x)dx = (f (x) − L (x)) ρ(x)dx<br />

n<br />

a a a<br />

b<br />

|R n (f)| = | (f (x) − L (x)) ρ(x)dx<br />

∫<br />

a<br />

n<br />

| ≤<br />

b<br />

∫<br />

a<br />

| f (x) − L (x) | ρ(x)dx<br />

Procedând ca mai înainte obţinem restul formulei generale de cuadratură:<br />

unde M =<br />

|R n (f)| ≤ ( n<br />

M1 + )!<br />

sup |f( n+1) (x)|.<br />

x ∈[a,b]<br />

n+<br />

2<br />

n<br />

1<br />

∫ ρ + − 0 − 1 ⋯ − n ,<br />

−1<br />

⎛ b − a ⎞ ⎛ a + b b − a ⎞<br />

⎜ ⎟ ⎜ t ⎟ (t t )(t t ) (t t )dt<br />

⎝ 2 ⎠ ⎝ 2 2 ⎠<br />

Presupunem că ρ ≡ 1, punctele sunt echidistante şi că x 0 = a, x n = b. Deci<br />

x i = a + b − a i, i = 0, 1, 2, …, n.<br />

n<br />

Aproximând sub integrală funcţia cu polinomul de interpolare Lagrange şi făcând<br />

schimbarea de variabilă<br />

obţinem<br />

x = a + b − a t,<br />

n<br />

n<br />

unde<br />

b n n<br />

∫<br />

a<br />

( n)<br />

( n)<br />

⎛ b − a ⎞<br />

f (x) ρ(x)dx ≈ ( b − a)<br />

∑ Hi<br />

f ( xi<br />

) = ( b − a)<br />

∑ Hi<br />

f ⎜a + i ⎟<br />

⎝ n ⎠<br />

( n) 1 ( −1)<br />

n ( n − )<br />

( )<br />

( − )<br />

n−i<br />

n<br />

i= 0 i=<br />

0<br />

( ) ( )( ) ( )<br />

Hi = t t −1 ... t − i + 1 t − i −1 ... t − n dt<br />

i !i! 0<br />

1<br />

=<br />

∫<br />

n−i<br />

1 n t t 1 ... t n<br />

( ) ( )<br />

− − −<br />

∫<br />

−<br />

n n i !i! 0 t i<br />

dt<br />

211


Mădălina Roxana Buneci<br />

Numerele<br />

( n)<br />

H se numesc coeficienţii Newton - Cotes ˆ iar formula se aproximare se<br />

i<br />

numeşte formula Newton - Cotes ˆ . Au loc relaţiile<br />

n<br />

∑<br />

i=<br />

0<br />

H ( n)<br />

= 1 şi<br />

i<br />

( n) ( n)<br />

H = , i = 0,1,…,n.<br />

i<br />

Hn − i<br />

Dacă f este o aplicaţie de clasă C n+1 are loc următoarea formulă de evaluare a<br />

restului:<br />

b<br />

∫<br />

a<br />

( n)<br />

⎛ b − a ⎞<br />

f (x) ρ(x)dx − ( b − a)<br />

∑ Hi<br />

f ⎜a + i ⎟<br />

⎝ n ⎠<br />

n<br />

i=<br />

0<br />

≤<br />

⎛<br />

⎜<br />

⎝<br />

1 ⎛ b − a ⎞<br />

⎜ ⎟ t(t −1)(t − 2) (t − n)dt<br />

n 1 ! ⎝ n<br />

∫ ⋯<br />

⎠<br />

( + )<br />

n+<br />

2 n<br />

0<br />

sup |f( n+1) (x)|.<br />

x ∈[a,b]<br />

De reţinut că există funcţii continue pentru care şirul<br />

n<br />

( )<br />

n<br />

( b − a)<br />

∑ Hi<br />

f ( xi<br />

) ⎟ nu converge către ( )<br />

i=<br />

0<br />

⎞<br />

⎟<br />

⎠<br />

n<br />

b<br />

∫ a f x dx .<br />

VIII.2. Formula dreptunghiurilor<br />

Fie f : [a, b] → R o funcţie de clasă C 1 . Aplicăm formula generală de<br />

cuadratură pentru ρ≡1, n=0, x 0 = a + b (deci t 0 = 0). Obţinem<br />

2<br />

b<br />

∫<br />

a<br />

⎛ a + b ⎞<br />

f (x)dx ≈ (b-a) f ⎜ ⎟<br />

⎝ 2 ⎠<br />

cu o eroare ≤ ( b − a )2<br />

4<br />

( )<br />

sup f ' x<br />

∈[ a,b]<br />

x<br />

.<br />

Considerăm o diviziune (x 0 , x 1 , …., x n ) a intervalului [a, b] cu puncte<br />

echidistante (x i = a +<br />

x i+1 ] formula de aproximare<br />

b − a i, i = 0, 1, 2, …, n.) şi aplicăm pe fiecare subinterval [xi ,<br />

n<br />

212


<strong>Metode</strong> <strong>Numerice</strong><br />

⎛ x<br />

∫ f ( x)<br />

dx ≈ (x i+1 -x i )<br />

i + x<br />

f<br />

i+<br />

1 ⎞<br />

⎜ ⎟<br />

⎝ 2 ⎠<br />

x i + 1<br />

x i<br />

b n−1<br />

= x 1<br />

a<br />

∑<br />

x<br />

i=<br />

0 i<br />

∫ ∫ f x dx , obţinem următoarea formulă de<br />

i<br />

Ţinând cont că f ( x) dx<br />

+<br />

( )<br />

cuadratură numită formula dreptunghiurilor:<br />

Restul (eroarea) este dat de:<br />

b<br />

∫ f (x)dx ≈ b a<br />

n<br />

a<br />

− n − 1 ⎛ xi + xi+<br />

1<br />

∑ ⎞<br />

f ⎜ ⎟<br />

⎝ 2 ⎠<br />

.<br />

i=<br />

0<br />

b<br />

n−1<br />

b − a ⎛ xi + x<br />

f<br />

i 1<br />

( x)<br />

dx f<br />

+ ⎞<br />

∫ −<br />

a<br />

∑ ⎜ ⎟ =<br />

n<br />

i=<br />

0 ⎝ 2 ⎠<br />

n−1 x<br />

n−1<br />

∑ ∫<br />

i+<br />

1<br />

= ( )<br />

b − a ⎛ xi + x<br />

f x dx f<br />

i+<br />

1 ⎞<br />

− ∑ ⎜ ⎟<br />

n ⎝ 2 ⎠<br />

xi<br />

i= 0 i=<br />

0<br />

n−1<br />

⎛ x b − a ⎛ xi + x<br />

f x dx f<br />

i+<br />

1 ⎞⎞<br />

∑ ⎜∫<br />

−<br />

x<br />

⎜ ⎟⎟<br />

i<br />

i=<br />

0 ⎝<br />

n ⎝ 2 ⎠⎠<br />

i+<br />

1<br />

= ( )<br />

n−1 x b a xi + x<br />

f x dx f<br />

i+<br />

1<br />

∑ ∫ xi<br />

i=<br />

0<br />

n ⎝ 2<br />

i+<br />

1<br />

≤ ( )<br />

− ⎛ ⎞<br />

− ⎜ ⎟<br />

⎠<br />

n−1 x ⎛ xi + x<br />

f x dx x<br />

i 1<br />

x<br />

i 1 xi<br />

f<br />

+<br />

∑ ∫<br />

+<br />

i<br />

i=<br />

0<br />

⎝ 2<br />

i+<br />

1<br />

= ( ) ( )<br />

≤<br />

≤<br />

n−1<br />

∑<br />

i=<br />

0<br />

( x − x )<br />

x ∈[a,b]<br />

i+<br />

1<br />

4<br />

sup | f ′(x) |<br />

i<br />

2<br />

⎞<br />

− − ⎜ ⎟<br />

⎠<br />

sup | f ′(x) |<br />

x ∈[x ,x ]<br />

i i+<br />

1<br />

n−<br />

1<br />

( ) 2<br />

∑<br />

i=<br />

0<br />

x<br />

i+<br />

1<br />

− x<br />

4<br />

i<br />

=<br />

=<br />

sup | f ′(x) |<br />

x ∈[a,b]<br />

sup | f ′(x) |<br />

x ∈[a,b]<br />

n−<br />

1<br />

( ) 2<br />

∑<br />

i=<br />

0<br />

b − a<br />

4n<br />

( b − a) 2<br />

4n<br />

2<br />

213


Mădălina Roxana Buneci<br />

Ca urmare restul (eroarea) în formula dreptunghiurilor este<br />

b<br />

n−1<br />

f<br />

i i 1<br />

( x)<br />

dx − f<br />

+<br />

∫ ∑ ⎜ ⎟ ≤ ( )2<br />

a<br />

b − a ⎛ x + x ⎞<br />

n ⎝ 2 ⎠<br />

i=<br />

0<br />

b − a<br />

4n<br />

( )<br />

sup f ' x<br />

∈[ a,b]<br />

x<br />

Interpretarea geometrică a formulei dreptunghiurilor<br />

Fie D i dreptunghiul cu o dimensiune dată intervalul [x i , x i+] ] şi cu cealaltă<br />

⎛ x<br />

dimensiune dată de<br />

i + x<br />

f<br />

i+<br />

1 ⎞<br />

⎜ ⎟<br />

⎝ 2 ⎠<br />

⎛ x<br />

f ⎜<br />

⎝<br />

+ x<br />

2<br />

i i+<br />

1<br />

⎞<br />

⎟<br />

⎠<br />

x i x i+1<br />

Atunci aria dreptunghiului D i este<br />

⎛ x<br />

(x i+1 -x i )<br />

i + x<br />

f<br />

i+<br />

1 ⎞<br />

⎜ ⎟<br />

⎝ 2 ⎠ = b − a ⎛ xi + x<br />

f<br />

i+<br />

1 ⎞<br />

⎜ ⎟<br />

n ⎝ 2 ⎠ ,<br />

şi deci formula dreptunghiurilor presupune aproximarea<br />

dreptunghiurilor D i , i = 0, 1, …n-1.<br />

b<br />

∫ f (x)dx prin suma ariilor<br />

a<br />

Proceduri MAPLE pentru calculul valorii aproximative a unei integrale<br />

definite folosind formula dreptunghiurilor:<br />

Procedura dreptunghiuri1 are drept parametri funcţia care se integrează,<br />

limitele de integrare, şi numărul de subintervale din diviziune. Procedura întoarce<br />

valoarea aproximativă a integralei obţinută aplicând formula dreptunghiurilor.<br />

Procedura dreptunghiuri2 este similară, cu singura deosebire că în locul numărului<br />

214


<strong>Metode</strong> <strong>Numerice</strong><br />

de subintervale se introduce un număr pozitiv eps ce reprezintă eroarea maximă.<br />

> dreptunghiuri1:=proc(f,a,b,n)<br />

> local i,iab,h,h0;<br />

> iab:=0;h:=(b-a)/n;h0:=a+1/2*h;<br />

> for i from 0 to n-1 do<br />

> iab:=iab+evalf(f(h0+i*h))<br />

> od;<br />

> iab:=iab*h;<br />

> RETURN(evalf(iab))<br />

> end;<br />

> dreptunghiuri2:=proc(f,a,b,eps)<br />

> local i,iab,h,h0,n;n:=floor(1/4*(b-a)^2/eps)+1;<br />

> print(`Numar de pasi`,n); h:=(b-a)/n;iab:=0;h0:=a+1/2*h;<br />

> for i from 0 to n-1 do<br />

> iab:=iab+evalf(f(h0+i*h))<br />

> od;<br />

> iab:=iab*h;<br />

> RETURN(evalf(iab))<br />

> end;<br />

Exemple<br />

> f:=(x->x^7*ln(x)+x*cos(x));<br />

> evalf(int(f(x),x=2..3));<br />

> dreptunghiuri1(f,2,3,5);<br />

> dreptunghiuri1(f,2,3,50);<br />

> dreptunghiuri1(f,2,3,500);<br />

> dreptunghiuri2(f,2,3,0.01);<br />

f := x → x 7 ln( x ) + x cos( x )<br />

778.3339881<br />

768.4434052<br />

778.2346340<br />

778.3329936<br />

Numar de pasi,<br />

26<br />

777.9666004<br />

215


Mădălina Roxana Buneci<br />

> dreptunghiuri2(f,2,3,0.001);<br />

> dreptunghiuri2(f,2,3,0.0001);<br />

> g:=(x->exp(-x^2));<br />

> evalf(int(g(x),x=-1..1));<br />

Numar de pasi,<br />

251<br />

778.3300446<br />

Numar de pasi,<br />

2501<br />

778.3339476<br />

g := x → e ( −x2 )<br />

1.493648266<br />

> dreptunghiuri1(g,-1,1,5);<br />

> dreptunghiuri1(g,-1,1,10);<br />

> dreptunghiuri1(g,-1,1,500);<br />

> dreptunghiuri2(g,-1,1,0.01);<br />

> dreptunghiuri2(g,-1,1,0.001);<br />

> dreptunghiuri2(g,-1,1,0.0001);<br />

> with(student):<br />

1.503548970<br />

1.496106505<br />

1.493649246<br />

Numar de pasi,<br />

101<br />

1.493672307<br />

Numar de pasi,<br />

1001<br />

1.493648512<br />

Numar de pasi,<br />

10001<br />

1.493648267<br />

> middlesum(g(x),x=-1..1,5);<br />

2<br />

5<br />

⎛<br />

⎜<br />

⎝<br />

4<br />

∑<br />

i = 0<br />

⎛<br />

⎜ − ⎛<br />

⎝ ⎝ ⎜ − 4/<br />

5 +<br />

> evalf(middlesum(g(x),x=-1..1,5));<br />

> middlebox(g(x),x=-1..1,5);<br />

e<br />

2 i<br />

5<br />

1.503548970<br />

2 ⎞<br />

⎞<br />

⎟ ⎟<br />

⎠ ⎠<br />

⎞<br />

⎟<br />

⎠<br />

216


<strong>Metode</strong> <strong>Numerice</strong><br />

> middlesum(g(x),x=-1..1,10);<br />

1<br />

5<br />

⎛<br />

⎜<br />

⎝<br />

9<br />

∑<br />

i = 0<br />

e<br />

⎛<br />

⎜− ⎛<br />

⎝ ⎝ ⎜<br />

− 9/<br />

10 +<br />

> evalf(middlesum(g(x),x=-1..1,10));<br />

> middlebox(g(x),x=-1..1,10);<br />

1.496106505<br />

2<br />

i<br />

⎞<br />

⎞<br />

5 ⎟ ⎟<br />

⎠ ⎠<br />

⎞<br />

⎟<br />

⎠<br />

Comanda middlesum(g(x), x=a..b,n) din pachetul student întoarce aproximaţia<br />

b<br />

integralei g(x)dx<br />

∫<br />

a<br />

obţinută prin aplicarea formulei dreptunghiurilor utilizând n<br />

subintervale. Comanda middlebox(g(x), x=a..b,n) reprezintă grafic dreptunghiurile<br />

utilizate în formulei dreptunghiurilor.<br />

217


Mădălina Roxana Buneci<br />

VIII.3. Formula trapezelor<br />

Fie f : [a, b] → R o funcţie de clasă C 2 . Aplicăm formula generală de<br />

cuadratură pentru ρ≡1, n=1, x 0 = a, x 1 =b (deci t 0 = -1 şi t 1 =1). Obţinem<br />

Deci<br />

b<br />

a<br />

b<br />

∫<br />

a<br />

1 1<br />

f (x)dx ≈<br />

b − a ⎛ (t − 1) (t + 1) ⎞<br />

f (a) dt + f (b) dt<br />

2 ⎜ ( −1− 1) (1 + 1) ⎟<br />

⎝ −1 −1<br />

⎠<br />

=<br />

∫ ∫<br />

=<br />

⎛<br />

b − a ⎜ (t − 1) (t + 1)<br />

f (a) + f (b)<br />

2 ⎜ −4 4<br />

⎝<br />

= b − a<br />

2<br />

∫ f (x)dx ≈ b − a (f(a) +f(b)).<br />

2<br />

Eroarea este<br />

|<br />

b<br />

a<br />

(f(a) +f(b)).<br />

∫ f (x)dx - b − a<br />

1<br />

(f(a) +f(b)) | ≤ sup f " x<br />

2<br />

2! x∈[ a,b]<br />

( )<br />

= 1 sup f " x<br />

2! x∈[ a,b]<br />

=<br />

=<br />

( )<br />

sup f " x<br />

∈[ a,b]<br />

x<br />

sup f " x<br />

∈[ a,b]<br />

x<br />

Deci<br />

( )<br />

|<br />

b<br />

( b − a) 3<br />

8<br />

( b − a) 3<br />

8<br />

( b − a) 3<br />

12<br />

∫ f (x)dx - b a<br />

2<br />

a<br />

2<br />

1<br />

2<br />

1<br />

−1 −1<br />

( )<br />

1<br />

∫ 2<br />

t −1dt<br />

= 1<br />

−1<br />

2! sup<br />

x∈<br />

[ a,b ]<br />

1<br />

2<br />

∫ 1−<br />

t dt = sup<br />

0 x∈<br />

a,b<br />

.<br />

( )<br />

f " x<br />

[ ]<br />

( b − a) 3<br />

8<br />

( )<br />

f " x<br />

( b − a) 3<br />

− (f(a) +f(b)) | ≤<br />

( b − a) 3<br />

12<br />

8<br />

x<br />

1<br />

−1<br />

⎞<br />

⎟<br />

⎟<br />

⎠<br />

∫ (t − 1)(t + 1)dt =<br />

( b − a) 3<br />

⎛<br />

⎜ t<br />

⎜<br />

⎝<br />

8<br />

1<br />

0<br />

t<br />

−<br />

3<br />

2<br />

3<br />

1<br />

0<br />

1<br />

2<br />

∫<br />

0<br />

⎞<br />

⎟<br />

⎟<br />

⎠<br />

( )<br />

sup f " x .<br />

∈[ a,b]<br />

t<br />

−1dt<br />

218


<strong>Metode</strong> <strong>Numerice</strong><br />

Considerăm o diviziune (x 0 , x 1 , …., x n ) a intervalului [a, b] cu puncte<br />

echidistante (x i = a + b − a i, i = 0, 1, 2, …, n.) şi aplicăm pe fiecare subinterval [xi ,<br />

n<br />

x i+1 ] formula de aproximare<br />

x<br />

∫ f ( x)<br />

dx ≈<br />

i+ 1 − xi<br />

( f(x i ) + f(x i+1 ))<br />

2<br />

x i + 1<br />

x i<br />

b n−1<br />

= x 1<br />

a<br />

∑<br />

x<br />

i=<br />

0 i<br />

∫ ∫ f x dx , obţinem următoarea formulă de<br />

i<br />

Ţinând cont că f ( x) dx<br />

+<br />

( )<br />

cuadratură numită formula trapezelor:<br />

Restul (eroarea) este dat de:<br />

b<br />

∫ f (x)dx ≈ b a ⎛ f a<br />

n ⎜<br />

⎝<br />

a<br />

⎛<br />

− ( ) + f ( b)<br />

( ) + f ( b)<br />

2<br />

+<br />

n−1<br />

b<br />

f a<br />

n−1<br />

b − a<br />

∫ f ( x)<br />

dx − + f ( xi<br />

)<br />

a n ⎜ ∑<br />

=<br />

2<br />

⎟<br />

i=<br />

1<br />

⎝<br />

⎞<br />

⎠<br />

∑ f ( xi<br />

) ⎟ .<br />

i=<br />

1<br />

⎞<br />

⎟<br />

⎠<br />

i+<br />

1<br />

= ( )<br />

( ) + f ( b)<br />

n−1 x<br />

n−1<br />

∑ ∫<br />

x<br />

b − a ⎛ f a<br />

f x dx − +<br />

n ⎜<br />

⎝ 2<br />

∑<br />

i<br />

i= 0 i=<br />

1<br />

n−1 n−1<br />

( )<br />

f x<br />

xi+<br />

1<br />

= f ( x) dx −<br />

i+<br />

1 i<br />

( f ( x ) + f ( x ))<br />

∑ ∫<br />

∑<br />

x<br />

= =<br />

i<br />

i 0 i 0<br />

n−1 x xi 1 − xi<br />

∑ ∫ xi<br />

i=<br />

0<br />

2<br />

x<br />

− x<br />

2<br />

i i+<br />

1<br />

i+<br />

1<br />

= f ( x) dx −<br />

+<br />

( f ( x ) + f ( x ))<br />

n−1 x xi 1 − xi<br />

∑ ∫ xi<br />

i=<br />

0<br />

2<br />

i i+<br />

1<br />

i+<br />

1<br />

≤ f ( x) dx −<br />

+<br />

( f ( x ) + f ( x ))<br />

≤<br />

≤<br />

n−1<br />

∑<br />

i=<br />

0<br />

( x − x )<br />

i+<br />

1<br />

12<br />

sup | f ′′(x) |<br />

x ∈[a,b]<br />

i<br />

3<br />

sup | f ′′ (x) |<br />

x ∈[x ,x ]<br />

i i+<br />

1<br />

n−<br />

1<br />

( ) 3<br />

∑<br />

i=<br />

0<br />

x<br />

i+<br />

1<br />

− x<br />

12<br />

i<br />

i i+<br />

1<br />

i<br />

⎞<br />

⎟<br />

⎠<br />

219


Mădălina Roxana Buneci<br />

=<br />

sup | f ′′(x) |<br />

x ∈[a,b]<br />

n−<br />

1<br />

( ) 3<br />

∑<br />

i=<br />

0<br />

b − a<br />

12n<br />

3<br />

≤ ( b − a )3<br />

2<br />

12n<br />

( )<br />

sup f " x<br />

∈[ a,b]<br />

x<br />

Ca urmare restul (eroarea) în formula trapezelor este<br />

.<br />

b<br />

f ( a) f ( b<br />

n−1<br />

b − a ⎛ + ) ⎞<br />

∫ f ( x)<br />

dx − ⎜<br />

+ ∑ f ( xi<br />

) ⎟ ≤ ( b − a )3<br />

2<br />

a<br />

n ⎜<br />

⎝ 2<br />

i=<br />

1<br />

⎟<br />

⎠<br />

12n<br />

( )<br />

sup f " x<br />

∈[ a,b]<br />

x<br />

Interpretarea geometrică a formulei trapezelor<br />

Fie T i trapezul dreptunghic cu înălţimea egală cu lungimea intervalului [x i ,<br />

x i+] ] şi cu bazele f(x i ) şi f(x i+1 ).<br />

f(x i+1 )<br />

f(x i )<br />

x i x i+1<br />

Atunci aria trapezului T i este<br />

x<br />

x<br />

i+ 1 − i<br />

( f(x i ) + f(x i+1 )) = b a<br />

2<br />

− ( f(xi ) + f(x i+1 )),<br />

2n<br />

b<br />

şi deci formula trapezelor arată că ∫ ( )<br />

a f x dx se poate aproxima prin suma ariilor<br />

trapezelor T i , i = 0, 1, …n-1.<br />

Proceduri MAPLE pentru calculul valorii aproximative a unei integrale<br />

definite folosind formula trapezelor:<br />

Procedura trapeze1 are drept parametri funcţia care se integrează,<br />

limitele de integrare, şi numărul de subintervale din diviziune. Procedura întoarce<br />

220


<strong>Metode</strong> <strong>Numerice</strong><br />

valoarea aproximativă a integralei obţinută aplicând formula trapezelor. Procedura<br />

trapeze2 este similară, cu singura deosebire că în locul numărului de<br />

subintervale se introduce un număr pozitiv eps ce reprezintă eroarea maximă.<br />

> trapeze1:=proc(f,a,b,n)<br />

> local i,iab,h;<br />

> iab:=0;h:=(b-a)/n;;<br />

> for i from 1 to n-1 do<br />

> iab:=iab+evalf(f(a+i*h))<br />

> od;<br />

> iab:=iab+(f(a)+f(b))/2;iab:=iab*h;<br />

> RETURN(evalf(iab))<br />

> end;<br />

> trapeze2:=proc(f,a,b,eps)<br />

> local i,iab,h,n;n:=floor(abs((b-a)^3/(12*eps))^(1/2))+1;<br />

> print(`Numar de pasi`,n); h:=(b-a)/n;iab:=0;<br />

> for i from 1 to n-1 do<br />

> iab:=iab+evalf(f(a+i*h))<br />

> od;<br />

> iab:=iab+(f(a)+f(b))/2;iab:=iab*h;<br />

> RETURN(evalf(iab))<br />

> end;<br />

Exemple<br />

> f:=(x->x^7*ln(x)+x*cos(x));<br />

> evalf(int(f(x),x=2..3));<br />

> trapeze1(f,2,3,5);<br />

> trapeze1(f,2,3,50);<br />

> trapeze1(f,2,3,500);<br />

> trapeze2(f,2,3,0.01);<br />

f := x → x 7 ln( x ) + x cos( x )<br />

778.3339881<br />

798.1539466<br />

778.5326999<br />

778.3359754<br />

221


Mădălina Roxana Buneci<br />

> trapeze2(f,2,3,0.001);<br />

> trapeze2(f,2,3,0.0001);<br />

> g:=(x->exp(-x^2));<br />

Numar de pasi,<br />

3<br />

833.1348363<br />

Numar de pasi,<br />

10<br />

783.2986759<br />

Numar de pasi,<br />

29<br />

778.9246586<br />

> evalf(int(g(x),x=0..1));<br />

> trapeze1(g,0,1,5);<br />

> trapeze1(g,0,1,50);<br />

> trapeze1(g,0,1,500);<br />

> trapeze2(g,0,1,0.01);<br />

> trapeze2(g,0,1,0.001);<br />

> trapeze2(g,0,1,0.0001);<br />

> trapeze2(g,0,1,10^(-8));<br />

> with(student):<br />

> trapezoid(g(x),x=-1..1,5);<br />

g := x → e ( −x2 )<br />

0.7468241330<br />

0.7443683397<br />

0.7467996064<br />

0.7468238866<br />

Numar de pasi,<br />

3<br />

0.7399864752<br />

Numar de pasi,<br />

10<br />

0.7462107961<br />

Numar de pasi,<br />

29<br />

0.7467512252<br />

Numar de pasi,<br />

2887<br />

2<br />

+<br />

5 e (-1 ) 2 ⎛<br />

5<br />

⎜<br />

⎝<br />

0.7468241295<br />

4<br />

∑<br />

i = 1<br />

⎛<br />

⎜ − ⎛<br />

⎝ ⎝ ⎜ − 1 +<br />

e<br />

2 i<br />

5<br />

2 ⎞<br />

⎞<br />

⎟ ⎟<br />

⎠ ⎠<br />

⎞<br />

⎟<br />

⎠<br />

222


<strong>Metode</strong> <strong>Numerice</strong><br />

> evalf(trapezoid(g(x),x=-1..1,5));<br />

> trapezoid(g(x),x=-1..1,10);<br />

1<br />

+<br />

5 e (-1 ) 1 ⎛<br />

5<br />

⎜<br />

⎝<br />

1.473924388<br />

9<br />

∑<br />

i = 1<br />

> evalf(trapezoid(g(x),x=-1..1,10));<br />

e<br />

⎛<br />

⎜− ⎛<br />

⎝ ⎝ ⎜<br />

1.488736679<br />

− 1 +<br />

2<br />

i<br />

⎞<br />

⎞<br />

5 ⎟ ⎟<br />

⎠ ⎠<br />

Comanda trapezoid(g(x), x=a..b,n) din pachetul student întoarce aproximaţia<br />

b<br />

integralei g(x)dx<br />

∫<br />

a<br />

subintervale.<br />

obţinută prin aplicarea formulei trapezelor utilizând n<br />

⎞<br />

⎟<br />

⎠<br />

VIII.4. Formula lui Simpson<br />

Fie f : [a, b] → R o funcţie de clasă C 4 . Aplicăm formula generală de<br />

cuadratură pentru ρ≡1, n=2, x 0 = a, x 1 = a + b , x2 =b (deci t 0 = -1 şi t 1 = 0, t 2 =1).<br />

2<br />

Obţinem<br />

b<br />

∫ ( ) ≈ b a<br />

a f x dx<br />

− (f(a) +4<br />

a b<br />

( )<br />

6<br />

f<br />

+<br />

+ f(b))<br />

Considerăm o diviziune (x 0 , x 1 , …., x 2n ) a intervalului [a, b] cu puncte<br />

echidistante (x i = a + b − a i, i = 0, 1, 2, …, 2n.) şi aplicăm pe fiecare subinterval<br />

2n<br />

[x i , x i+2 ] cu i par formula de aproximare<br />

x<br />

∫ f ( x)<br />

dx ≈<br />

i+ 2 − xi<br />

( f(x i ) +4f(x i+1 ) + f(x i+2 ))<br />

6<br />

x i + 2<br />

x i<br />

b<br />

2n−2<br />

x<br />

= i 2<br />

a<br />

∑<br />

x<br />

i=<br />

0 i<br />

ipar<br />

∫ ∫ f x dx , obţinem următoarea formulă de<br />

Ţinând cont că f ( x) dx<br />

+<br />

( )<br />

cuadratură numită formula lui Simpson:<br />

2<br />

223


Mădălina Roxana Buneci<br />

b<br />

∫ ( ) ≈ b − a<br />

a f x dx<br />

6n<br />

Se poate arăta că restul (eroarea) este dat de:<br />

⎛<br />

n−1 n−1<br />

f a f b 2 f x 4 f x<br />

⎜<br />

⎝<br />

( ) + ( ) + ( ) + ( )<br />

2i 2i−1<br />

i= 1 i=<br />

1<br />

⎞<br />

⎟<br />

⎠<br />

∑ ∑ .<br />

∫<br />

b<br />

a<br />

n−1 n−1<br />

b − a ⎛<br />

f x dx f a f b 2 f x 4 f x<br />

6n ⎜ ∑ ∑<br />

⎝<br />

( ) − ⎜ ( ) + ( ) + ( ) + ( )<br />

2i 2i−1<br />

i= 1 i=<br />

1<br />

⎞<br />

⎟<br />

⎠<br />

≤<br />

( b − a) 5 4<br />

2880n<br />

( 4 ) ( )<br />

sup f x<br />

∈[ a,b]<br />

x<br />

.<br />

VIII.5. Algoritmul lui Romberg<br />

Fie f : [a, b] → R o funcţie de clasă C 2 . Considerăm o diviziune (x 0 , x 1 , ….,<br />

x n<br />

2<br />

) a intervalului [a, b] cu puncte echidistante (x i = a +<br />

Aplicând formula trapezelor:<br />

b − a i, i = 0.. 2 n ).<br />

2<br />

n<br />

⎛<br />

b a<br />

f (x)dx ≈ ⎜<br />

n<br />

2 ⎜<br />

⎝<br />

b<br />

∫<br />

a<br />

− f ( a) + f ( b)<br />

2<br />

+<br />

2<br />

n<br />

−1<br />

f ( xi<br />

) ⎟<br />

∑ .<br />

i=<br />

1<br />

⎞<br />

⎟<br />

⎠<br />

Dacă notăm ϕ(n) =<br />

⎛<br />

b − a ⎜<br />

f ( a) + f ( b)<br />

+<br />

n<br />

2 ⎜ 2<br />

⎝<br />

b<br />

aproximează ∫ ( )<br />

a f x dx este dată de<br />

b<br />

2<br />

n<br />

−1<br />

∑<br />

i=<br />

1<br />

( )<br />

f x<br />

∫ ( ) −ϕ ( n ) ≤ ( ) 2<br />

n<br />

a f x dx<br />

i<br />

b − a h<br />

12<br />

⎞<br />

⎟ , atunci eroarea cu care ϕ(n)<br />

⎟<br />

⎠<br />

( )<br />

sup f " x<br />

∈[ a,b]<br />

x<br />

unde h n =<br />

b − a<br />

2<br />

n<br />

. Deci eroarea este de ordinul O(<br />

2<br />

h n ). Se poate arăta că<br />

224


<strong>Metode</strong> <strong>Numerice</strong><br />

ϕ(n) =<br />

b<br />

2 4 6 8<br />

∫ f (x)dx + a 2 h n + a 4 h n + a 6 h n + a 8 h n +....<br />

a<br />

unde pentru orice i a i depinde doar de f (i) . Pe de altă parte<br />

şi ca urmare<br />

ϕ(n+1) =<br />

=<br />

b<br />

2<br />

∫ f (x)dx + a 2 n 1<br />

a<br />

b<br />

a<br />

( ) ( )<br />

4ϕ n + 1 − ϕ n<br />

3<br />

h<br />

4 6 8 + + a 4 h n+ 1 + a 6 h n+ 1 + a 8 h n+ 1 +....<br />

∫ f (x)dx + 1 4 a 2<br />

2 h n + 1<br />

16 a 4<br />

4 h n + 1 64 a 6<br />

6 h n +<br />

b<br />

=<br />

a<br />

1<br />

256 a 8<br />

8 h n +....<br />

∫ f (x)dx - 1 4 a 4<br />

4 h n - 5<br />

16 a 6<br />

6 h n - 21<br />

64 a 8<br />

8 h n +....<br />

În cazul acestei formule de aproximare eroarea de trunchiere este de ordinul O( h ).<br />

Ca şi în cazul extrapolării Richardson formula poate fi înbunătăţită succesiv. Pentru<br />

aceasta notăm<br />

şi definim<br />

triunghiular:<br />

I(n,m) =<br />

m<br />

I (n,0) = ϕ(n)<br />

( − ) − ( − − )<br />

4 I n, m 1 I n 1, m 1<br />

m<br />

4 −1<br />

, 1 ≤ m ≤ n.<br />

Pentru calculul recursiv al valorilor I(n,m) se poate folosi tabelul<br />

I(0,0)<br />

I(1,0) I(1,1)<br />

I(2,0) I(2,1) I(2,2)<br />

4<br />

n<br />

I(n,0) I(n,1) I(n,2)<br />

I(n,n)<br />

Prima coloană a acestui tabel poate fi calculată direct cu definiţia: I(n,0) =ϕ(n). În<br />

cazul elementelor de pe celelalte coloane se observă că fiecare dintre ele depinde de<br />

elementul din stânga de pe aceeaşi linie şi de pe linia de deasupra din stânga.<br />

225


Mădălina Roxana Buneci<br />

În situaţia în care h 0 = b-a >1, alegem k astfel încât<br />

b − a<br />

2<br />

k<br />

să fie suficient de<br />

mic (de exemplu mai mic decât 1) şi facem calculul recursiv al valorilor I(k+l,m)<br />

folosind tabelul triunghiular:<br />

I(k,0)<br />

I(k+1,0)<br />

I(k+2,0)<br />

I(k+1,1)<br />

I(k+2,1) I(k+2,2)<br />

I(k+n,0) I(k+n,1) I(k+n,2) I(k+n,n)<br />

În final se ţine seama că I(k+n+j,n) este o aproximaţie bună a<br />

De obicei n este mic (n = 2 sau n = 3).<br />

b<br />

∫ f (x)dx când j → ∞.<br />

Încheiem acestă sectiune prezentând o modalitate mai eficientă de calcul a<br />

lui I(n,0) = ϕ(n). Se observă că<br />

a<br />

I(n+1,0) = ϕ(n+1) =<br />

⎛<br />

b − a ( ) ( )<br />

2<br />

n 1<br />

1<br />

⎜<br />

f a + f b<br />

n 1<br />

2 +<br />

+ f a + ih<br />

⎜<br />

∑<br />

2<br />

⎝<br />

i=<br />

1<br />

+ −<br />

n+<br />

1<br />

( )<br />

⎞<br />

⎟<br />

⎟<br />

⎠<br />

= 1 ⎛<br />

b a ⎜<br />

2 n<br />

2 ⎜<br />

⎝<br />

= 1 ⎛<br />

b a ⎜<br />

2 n<br />

2 ⎜<br />

⎝<br />

− f ( a) + f ( b)<br />

2<br />

− f ( a) + f ( b)<br />

2<br />

2<br />

n<br />

−1<br />

∑<br />

i=<br />

1<br />

( ) ( )<br />

+ f a + (2i − 1)h + f a + (2i)h<br />

2<br />

n<br />

−1 2<br />

n<br />

−1<br />

∑ ∑<br />

= 1 2 I(n,0) + h n+1 f ( a + (2i −1)h<br />

)<br />

n+ 1 n+<br />

1<br />

( ) ( )<br />

+ f a + ih + f a + (2i −1)h<br />

n n+<br />

1<br />

i= 1 i=<br />

1<br />

2<br />

n<br />

−1<br />

∑ n+<br />

1 .<br />

i=<br />

1<br />

Astfel utilizând această formulă recursivă calculul lui I(n+1,0) necesită doar 2 n – 1<br />

evaluri ale lui f în loc de 2 n+1 + 1 câte ar necesita dacă s-ar aplica definiţia.<br />

⎞<br />

⎟<br />

⎟<br />

⎠<br />

⎞<br />

⎟<br />

⎟<br />

⎠<br />

226


<strong>Metode</strong> <strong>Numerice</strong><br />

VIII.6. Cuadratura Gauss<br />

Fie f : [a, b] → R o funcţie continuă şi ρ : [a, b]→R o pondere. Presupunem<br />

că nodurilor x 0 , x 1 , …, x n ∈[a, b] sunt date. Formula generală de cuadratură pentru<br />

calcului lui<br />

b<br />

∫ f (x) ρ(x)dx<br />

dă integrala polinomului de interpolare asociat nodurilor<br />

a<br />

x 0 , x 1 , …, x n şi valorilor f(x 0 ), f(x 1 ), ..., f(x n ):<br />

b b n n b<br />

n<br />

∫ ∫ ∑ ∑ ∫ ∑<br />

( ) ( ) ( ) ( ) ( )<br />

f (x) ρ(x)dx ≈ ρ (x) f x l x dx = f x ρ (x)l x dx = A f x<br />

i i i i i i<br />

a a i= 0 i= 0 a<br />

i=<br />

0<br />

b<br />

unde A i = ( )<br />

∫ ρ(x)li<br />

x dx pentru orice i. Dacă nu se impune nici o condiţie asupra<br />

a<br />

nodurilor x 0 , x 1 , …, x n formula de cuadratură<br />

b<br />

∫ f (x) ρ(x)dx<br />

≈ A 0 f(x 0 ) + A 1 f(x 1 ) + ... + A n f(x n )<br />

a<br />

este exactă pentru orice polinom de grad ≤ n.<br />

Există însă posibilitatea alegerii a n+1 noduri astfel încât formula de<br />

cuadratură să fie exactă pentru orice polinoam de grad ≤ 2n+1. Gauss a arătat că<br />

cele n+1 noduri trebuie să fie rădăcile unui polinom q de grad n+1 cu proprietatea<br />

că<br />

b<br />

k<br />

∫ q(x)x ρ(x)dx<br />

= 0 pentru orice 0 ≤ k ≤n.<br />

a<br />

Să presupunem că polinomul q are proprietatea de mai sus şi să arătăm că<br />

formula de cuadratură pentru care nodurile sunt rădăcinile lui q este exactă pentru<br />

orice polinom f de grad ≤ 2n+1. Efectuând împărţirea lui f la q rezultă că există<br />

polinoamele p şi r de grade ≤ n astfel încât<br />

Pentru orice i fie<br />

b<br />

A i = ( )<br />

∫<br />

a<br />

ρ(x)l x dx<br />

i<br />

f(x) = p(x)q(x) + r(x).<br />

227


Mădălina Roxana Buneci<br />

=<br />

∫<br />

( x − x )( x − x )....( x − x − )( x − x + )...( x − x )<br />

ρ<br />

( )( ) ( )( ) ( ) ( )<br />

x − x x − x .... x − x x − x ... x − x<br />

b 0 1 i 1 i 1 n<br />

a<br />

i 0 i 1 i i− 1 i i+<br />

1 i n<br />

x dx<br />

Formula generală de cuadratură fiind exactă pentru orice polinom de grad ≤ n avem<br />

b<br />

∫ f (x) ρ(x)dx<br />

= ∫ ( ) ( ) ( )<br />

a<br />

Pe de altă parte avem<br />

n<br />

b<br />

b<br />

( )<br />

a<br />

p x q x + r x ρ(x)dx<br />

= ∫ p( x) q ( x ) ρ(x)dx<br />

+ ∫ r ( x )<br />

a<br />

b<br />

∫<br />

= r ( x )<br />

a<br />

n<br />

∑<br />

ρ(x)dx<br />

= A r ( x )<br />

i=<br />

0<br />

i<br />

i<br />

b<br />

a<br />

ρ(x)dx<br />

∑ Aif ( xi<br />

) = ∑ Ai ( p( xi ) q ( xi ) + r ( xi<br />

))<br />

= Air ( xi<br />

)<br />

i=<br />

0<br />

n<br />

i=<br />

0<br />

n<br />

∑ .<br />

i=<br />

0<br />

deoarece x i este rădăcină a lui q pentru orice i. În consecinţă,<br />

b<br />

∫ f (x) ρ(x)dx<br />

= ∑ Aif ( xi<br />

) .<br />

a<br />

n<br />

i=<br />

0<br />

Teorema 8. (cuadratura Gauss) Fie ρ : [a, b]→R o pondere. Fie {x i } i cele<br />

n+1 noduri ale polinomului q n+1 de grad n+1 cu prorietatea că<br />

0 pentru orice 0 ≤ k ≤n. Pentru orice i fie<br />

b<br />

A i = ( )<br />

∫<br />

a<br />

ρ(x)l x dx<br />

i<br />

b<br />

k<br />

∫ q n+ 1(x)x ρ(x)dx<br />

=<br />

a<br />

b ( x − x )( ) ( )( ) ( )<br />

=<br />

0 x − x 1 .... x − xi− 1 x − x i+<br />

1 ... x − xn<br />

ρ( x)<br />

a ( x − x )( x − x )....( x − x )( x − x )...( x − x )<br />

dx .<br />

∫<br />

i 0 i 1 i i− 1 i i+<br />

1 i n<br />

Atunci formula de cuadratură<br />

228


<strong>Metode</strong> <strong>Numerice</strong><br />

b<br />

∫ f (x) ρ(x)dx<br />

≈ A 0 f(x 0 ) + A 1 f(x 1 ) + ... + A n f(x n )<br />

a<br />

este exactă pentru orice polinom de grad ≤ 2n+1.<br />

Restul (eroarea) este dat de<br />

b<br />

a<br />

n<br />

i=<br />

0<br />

( 2n+<br />

2 ) ( ξ)<br />

( 2n + 2 )!<br />

b<br />

f<br />

2<br />

i ( i )<br />

n+<br />

1<br />

a<br />

∫ ∑<br />

∫<br />

pentru un anumit ξ ∈(a, b).<br />

( ) ( )<br />

f (x) ρ(x)dx − A f x ≤ q x ρ x dx<br />

Particularizăm în continuare ponderea ρ<br />

1. Dacă ρ(x) = 1 pe intevalul [a,b], atunci polinomele q n care satisfac<br />

condiţiile din teorema precedentă sunt polinoamele Legendre L n .<br />

Expresia acestor polinoame este dată de<br />

n<br />

n! d<br />

2n ! dx<br />

L n (x) = ( x − a) ( x − b)<br />

( )<br />

n<br />

⎡<br />

⎢⎣<br />

Restul (eroarea) formulei de cuadratură în situaţia în care se folosesc<br />

( n! ) ( b − a ) f<br />

( ) ( ξ)<br />

ca noduri rădăcinile lui L n este dat de<br />

3<br />

⎡( 2n )! ⎤ ( 2n + 1)<br />

n<br />

n<br />

⎤<br />

⎥⎦<br />

4 2n+<br />

1 2n<br />

⎣<br />

⎦<br />

.<br />

2. Dacă ρ(x) =<br />

1<br />

1−<br />

x<br />

2<br />

pe intervalul (-1,1), atunci polinomele q n care<br />

satisfac condiţiile din teorema precedentă sunt polinoamele Cebîşev<br />

de speţa I T n . Polinoamele Cebîşev de prima speţă pot fi definite<br />

recursiv prin : T 0 (x) = 1, T 1 (x) = x, T n+2 (x) = 2xT n+1 (x) – T n (x), n ≥ 0,<br />

sau pot fi definite prin T n (x) = cos(n arccos(x)). Rădăcinile<br />

polinomului Cebîşev de grad n+1 sunt:<br />

π<br />

În acest caz A i = n + 1<br />

⎛ 2i + 1 ⎞<br />

x i = cos⎜<br />

π⎟<br />

⎝ 2n + 2 ⎠ , 0 ≤ i ≤ n.<br />

pentru orice i = 0,..., n.<br />

229


Mădălina Roxana Buneci<br />

3. Dacă ρ(x) =<br />

2<br />

1− x pe intervalul [-1, 1], atunci polinomele q n care<br />

satisfac condiţiile din teorema precedentă sunt polinoamele Cebîşev<br />

de speţa a II-a U n . Polinoamele Cebîşev de prima speţă pot fi definite<br />

recursiv prin : U 0 (x) = 1, U 1 (x) = 2x, U n+2 (x) = 2xU n+1 (x) – U n (x), n<br />

≥ 0, sau pot fi definite prin U n (x) =<br />

polinomului Cebîşev U n+1 de grad n+1 sunt:<br />

⎛ i + 1 ⎞<br />

x i = cos⎜<br />

π⎟<br />

⎝ n + 2 ⎠ , 0 ≤ i ≤ n.<br />

(( + ) )<br />

sin ( arccos x)<br />

sin n 1 arccos x<br />

2 i 1<br />

În acest caz A i =<br />

π ⎛<br />

sin<br />

+ ⎞<br />

⎜ π⎟<br />

pentru orice i = 0,..., n.<br />

n + 2 ⎝ n + 2 ⎠<br />

. Rădăcinile<br />

4. Dacă ρ(x) =(1-x) α (1+x) β (α, β> -1) pe intervalul (-1,1), atunci<br />

polinomele q n care satisfac condiţiile din teorema precedentă sunt<br />

polinoamele Jacobi.<br />

Intervalul [a, b] poate fi transformat în intervalul [-1, 1] cu ajutorul<br />

schimbării de variabilă t = b − a b + a x - .<br />

2 2<br />

VIII.7. Formule pentru calculul aproximativ al unei integrale<br />

duble<br />

Fie ϕ 1 , ϕ 2 : [a, b] → R două funcţii de clsă C 1 şi fie<br />

D = {(x,y) ∈ R 2 | a≤x≤b, ϕ 1 (x) ≤ y ≤ ϕ 2 (x) }.<br />

Atunci D este un domeniu simplu. Considerăm o funcţie continuă f : D → R. Ne<br />

punem problema aproximării integralei ( )<br />

putem trece la integrale iterate:<br />

∫∫ f ( x, y)<br />

dxdy = 2<br />

⎜ ( )<br />

D<br />

b<br />

a<br />

⎛<br />

⎝<br />

ϕ<br />

ϕ<br />

1<br />

∫∫ f x, y dxdy . D fiind un domeniu simplu<br />

D<br />

( x)<br />

⎞<br />

f x, y dy dx<br />

( x)<br />

⎟<br />

⎠<br />

∫ ∫ = ∫ ( )<br />

b<br />

a F x dx<br />

230


<strong>Metode</strong> <strong>Numerice</strong><br />

∫<br />

unde F(x) = 2<br />

( )<br />

ϕ<br />

ϕ<br />

1<br />

( x)<br />

f x, y dy . Considerăm o reţea de noduri (x i , y j ), i = 0, 1, …, n şi<br />

( x)<br />

b<br />

j = 0, 1, …, m. Aplicând integralei ( )<br />

unde<br />

D<br />

∫<br />

( )<br />

a F x dx o formulă de cuadratură se obţine:<br />

∫∫ f x, y dxdy ≈ AiF( xi<br />

)<br />

( x )<br />

( x )<br />

n<br />

∑<br />

i=<br />

0<br />

ϕ<br />

∫ f x i, y dy .<br />

ϕ<br />

1 i<br />

F(x i ) =<br />

2 i<br />

( )<br />

Aplicând şi acestei ultime integrale o formulă de cuadratură:<br />

rezultă formula de aproximare<br />

m i<br />

ij i j<br />

∑<br />

F(x i ) ≈ B f ( x , y )<br />

j=<br />

0<br />

∫∫ f ( x, y)<br />

dxdy ≈ AiBijf ( x i, y j)<br />

D<br />

n<br />

m<br />

i<br />

∑∑ .<br />

i= 0 j=<br />

0<br />

Să considerăm cazul în care D este un dreptunghi:<br />

şi reţeaua este formată din punctele<br />

D = {(x,y) ∈ R 2 | a≤x≤b, c ≤ y ≤ d }.<br />

x i = a + ih, i = 0, 1, …, n, h = b − a<br />

n<br />

y i = c + jk, j = 0, 1, …, m, k = d − c<br />

m<br />

Y<br />

d<br />

y i+1<br />

y i<br />

c<br />

a x i x i+1 b X<br />

231


Mădălina Roxana Buneci<br />

Vom obţine valoarea aproximativă a integralei funcţiei f pe dreptunghiul de<br />

vârfuri (x i , y i ), (x i , y i+1 ) , (x i+1 , y i ) şi (x i+1 , y i+1 ) prin aplicarea repetată a formulei<br />

trapezelor:<br />

=<br />

x i + 1 ⎛ y j 1<br />

+<br />

I ij = ⎜ ( )<br />

x i<br />

⎜<br />

⎝<br />

y j<br />

⎞<br />

f x, y dy dx<br />

⎟<br />

⎠<br />

∫ ∫ ≈ + ⎛<br />

⎜ ( )<br />

⎛<br />

k x<br />

x<br />

= i+ 1 i+<br />

1<br />

⎜ ( j) + ( j+<br />

1)<br />

2 ⎝<br />

x<br />

i<br />

⎞<br />

f x, y dx f x, y dx<br />

x<br />

⎟<br />

i<br />

⎠<br />

∫ ∫<br />

( ) + ( + )<br />

x k i 1 ⎞<br />

f x, y<br />

x j f x, y j 1 ⎟ dx<br />

i ⎝ 2<br />

⎠<br />

( )<br />

k h<br />

≈ f ( x, i y j) + f ( x, i+ 1 y j) + f ( x i , y j+ 1) + f ( x i+ 1 , y j+<br />

1)<br />

2 2<br />

Astfel valoarea aproximativă a integralei<br />

D<br />

∫<br />

( )<br />

∫∫ f x, y dxdy =<br />

( )<br />

n−1m−1<br />

n−1m−1<br />

kh<br />

∑ ∑ Iij<br />

≈ f ( x, i y j) + f ( x, i+ 1 y j) + f ( x i , y j+ 1) + f ( x i+ 1 , y j+<br />

1)<br />

i= 0 j=<br />

0 i= 0 j=<br />

0<br />

4<br />

∑ ∑ .<br />

Presupunem că<br />

x i = a + ih, i = 0, 1, …, 2n, h = b − a<br />

2n<br />

y i = c + jk, j = 0, 1, …, 2m, k = d − c<br />

2m<br />

Dacă pentru calculul integralei I ij cu i şi j pare se aplică formula Simpson repetată se<br />

obţine<br />

x i + 2 ⎛ y j 2<br />

∫ ∫<br />

+<br />

I ij = ⎜ ( )<br />

x i<br />

⎜<br />

⎝<br />

y j<br />

⎞<br />

f x, y dy dx<br />

⎟<br />

⎠<br />

( )<br />

≈ x i + 2 ⎛<br />

⎜ ( ) ( ) ( )<br />

j + j + 1 + j + 2<br />

k ⎞<br />

f x, y 4f x, y f x, y dx<br />

x<br />

⎟<br />

i ⎝ 6<br />

⎠<br />

∫<br />

⎛<br />

⎞<br />

f x, y dx 4 f x, y dx f x, y dx ⎟<br />

⎠<br />

k x<br />

= i x x<br />

+ 2 ( ) i +<br />

j 2 ( j 1) i +<br />

⎜<br />

+ + + 2 ( j+<br />

2 )<br />

3 ⎝<br />

∫ ∫ ∫<br />

x x x<br />

i i i<br />

232


<strong>Metode</strong> <strong>Numerice</strong><br />

( i j ) ( i+ 2 j) ( i j+ 2 ) ( i+ 2 j+<br />

2 )<br />

( i+ 1 j) ( i+ 1 j+ 1) ( i+ 2 j+ 1) ( i+ 1 j+<br />

2 )<br />

( i+ 1 j+<br />

1)<br />

hk<br />

≈ (f x , y + f x , y + f x , y + f x , y +<br />

9<br />

Notăm<br />

( )<br />

+ 4 f x , y + f x y + f x , y + f x , y +<br />

+ 16f x , y )<br />

( ) ( + ) ( + ) ( + + )<br />

( i+ 1 j) ( i+ 1 j+ 1) ( i+ 2 j+ 1) ( i+ 1 j+<br />

2 )<br />

( i+ 1 j+<br />

1)<br />

hk<br />

F ij = (f x i, y j + f x i 2, y j + f x i, y j 2 + f x i 2, y j 2 +<br />

9<br />

Atunci<br />

( )<br />

+ 4 f x , y + f x y + f x , y + f x , y +<br />

+ 16f x , y )<br />

D<br />

( )<br />

∫∫ f x, y dxdy =<br />

n−1m−1<br />

∑ ∑<br />

i= 0 j=<br />

0<br />

I<br />

2i,2 j<br />

≈<br />

n−1m−1<br />

∑ ∑<br />

i= 0 j=<br />

0<br />

F<br />

2i,2 j<br />

Procedura dtrapeze are drept parametri funcţia care se integrează, limitele<br />

de integrare, şi numerele n şi m care determină punctele din reţea. Procedura<br />

returnează valoarea aproximativă a integralei duble obţinută prin aplicarea repetată<br />

a formulei trapezelor.<br />

> dtrapeze := proc(f, a, b, c, d, n, m)<br />

> local i, j, iabcd, h, k;<br />

> iabcd := 0;<br />

> h := (b - a)/n;<br />

> k := (d - c)/m;<br />

> for i from 0 to n - 1 do for j from 0 to m - 1 do iabcd :=<br />

> iabcd + f(a + i*h, c + j*k)+ f(a + i*h, c + (j + 1)*k)<br />

+ f(a + (i + 1)*h, c + j*k) + f(a + (i + 1)*h, c + (j + 1)*k)<br />

> od<br />

> od;<br />

> iabcd := 1/4*iabcd*h*k;<br />

> RETURN(evalf(iabcd))<br />

> end;<br />

Exemple<br />

> f:=((x,y)->x^7*ln(x+y)+x*y*cos(x));<br />

233


Mădălina Roxana Buneci<br />

f := ( x,<br />

y ) → x 7 ln ( x + y ) + x y cos( x )<br />

> evalf(int(int(f(x,y),y=1..3),x=2..3));<br />

2418.125737<br />

> evalf(dtrapeze(f,2,3,1,3,5,10));<br />

2470.913760<br />

> dtrapeze(f,2.,3.,1.,3.,5,10);<br />

2470.913767<br />

234


<strong>Metode</strong> <strong>Numerice</strong><br />

Anexa : Iniţiere în Maple<br />

A.1 Structura internă. Categorii de comenzi MAPLE.<br />

MAPLE este un mediu de programare pentru calcule numerice şi simbolice.<br />

Calculul simbolic este calculul cu variabile şi constante care respectă regulile<br />

algebrice, ale analizei şi ale altor ramuri ale matematicii. MAPLE-ul permite<br />

manipularea formulelor care utilizează simboluri, necunoscute şi operaţii formale,<br />

în comparaţie cu limbajele de programare tradiţionale care utilizează doar date<br />

numerice, caractere şi şiruri de caractere. Se încadrează în aceeaşi clasă de produse<br />

software ca şi Mathematica, MathCAD, MATLAB şi TKSolver.<br />

MAPLE are trei componente de bază: nucleul (kernel), biblioteca standard<br />

(library) şi interfaţă cu utilizatorul (interface). Nucleul este scris în C şi realizează<br />

cea mai mare parte a calculelor făcute de sistem. Biblioteca standard este automat<br />

încărcată în memorie la deschidere unei sesiuni MAPLE. În afara acestei biblioteci<br />

există o bibliotecă extinsă cu rutine destinate rezolvării unor probleme mai<br />

complicate, ca de exemplu, rezolvarea sistemelor de ecuaţii, probleme de statistică<br />

sau algebră liniară. Această bibliotecă nu este încărcată automat în memorie, ci<br />

trebuie accesată, atunci când este necesar. Interfaţa cu utilizatorul este scrisă în C.<br />

Interfaţa pentru sistemul de operare Windows este bazată pe ferestre. O foaie<br />

(formular) de programare MAPLE (fişier MAPLE, fişier cu extensia .mws)<br />

existentă poate fi încărcată selectând Open din meniul File, iar o foaie nouă de<br />

programare MAPLE poate fi creată selectând New din meniul File. Salvarea foii de<br />

programare MAPLE se realizează selectând Save sau Save as (pentru salvarea sub<br />

un alt nume) din meniul File. Foia de programare se poate salva sub forma unui<br />

fişier text sau latex dacă se selectează Export as din meniu File. Încheierea<br />

sesiunii MAPLE se face selectând Exit din meniul File, sau prin clic pe butonul de<br />

închidere X.<br />

235


Mădălina Roxana Buneci<br />

Foile de programare MAPLE constau în cinci tipuri de zone: text, input<br />

(intrare), ouput (ieşire), 2D graphics (grafică 2D), 3D graphics (grafică 3D), şi<br />

animation (animaţie). În zona text se introduce textul necesar documentării. Zona<br />

input este zona în care se introduc comenzile MAPLE şi este recunoscută după<br />

promptul > prezent în marginea din stânga. Întinderea zonei input sau a zonei text<br />

este arătată printr-o bară verticală în partea stângă. Comutarea între cele două zone<br />

se poate face cu ajutorul tastei funcţionale F5 sau din bara de meniu. Zona output<br />

este generată automat la furnizarea răspunsului. Colecţia de butoane şi informaţia<br />

afişată în bara de context (sub bara de instrumente) depind de conţinutul curent<br />

definit tipul de zonă în care se găseşte cursorul. Informaţia despre foia de<br />

programare curentă este afişată în bara de stare, în partea de jos a ecranului.<br />

MAPLE este un mediu interpretat. Explicăm în continuare ce înseamnă<br />

aceasta. Pentru ca un program (indiferent de limbajul în care este scris) să poată fi<br />

executat de calculator este necesar să fi tradus în limbaj maşină. Există trei<br />

modalităţi principale pentru a obţine această traducere: interpretarea, asamblarea<br />

şi compilarea. Programele asamblate şi cele compilate sunt traduse în limbaj<br />

maşină înainte ca să fie utilizate. Interpretarea este un tip special de traducere, în<br />

care programul este tradus în instrucţiuni în limbaj maşină “din mers”, adică în<br />

timpul execuţiei sale. Mai precis, programul care trebuie interpretat (să-l numim P)<br />

este preluat de un program de interpretare (interpretorul I). Când se utilizează<br />

programul P, calculatorul rulează de fapt interpretorul I, iar interpretorul I execută<br />

paşii programului P. Interpretorul verifică textul programului P şi îndeplineşte<br />

instrucţiunile acestuia pas cu pas. Interpretarea este flexibilă deoarece un program<br />

interpretat poate fi adaptat, schimbat sau revizuit din mers. Sigur, interpretarea are<br />

şi dezavantaje asupra cărora nu insistăm aici (de exemplu, programele interpretate<br />

nu pot fi executate dacă nu există şi un interpretor corespunzător).<br />

Fiind un mediu interpretat MAPLE permite realizare de rutine interactive.<br />

Apariţia promptului > în fereastra MAPLE semnifică faptul că se poate introduce o<br />

comandă. Fiecare comandă (cu excepţia comenzii ?) trebuie încheiată cu punct şi<br />

virgulă (;) sau două puncte (:). Omiterea acestora generează o eroare de sintaxă.<br />

Rectificarea se face tipărind ; sau : pe o linie nouă. Fiecare comanda este executată<br />

236


<strong>Metode</strong> <strong>Numerice</strong><br />

după apăsarea tastei ENTER. Dacă s-a utilizat : pentru încheierea comenzii,<br />

comanda este executată fără a se afişa rezultatele, iar în cazul utilizării ; se afişează<br />

şi rezultatele.<br />

MAPLE dispune de peste 2000 de funcţii predefinite şi comenzi. Fiecare<br />

comandă este introdusă, în zona input, în felul următor:<br />

> nume_comanda(param1,param2,...);<br />

Numele comenzilor a fost ales astfel încât pe de o parte să fie apropiat de<br />

funcţionalitatea comenzii şi pe de altă parte să fie cât mai scurt posibil. MAPLE<br />

este un mediu “case-sensitive” (se face distincţie între literele mari şi literele mici).<br />

Cele mai multe comenzi încep cu literă mică şi au în corespondenţă o aceeaşi<br />

comandă care începe cu literă mare. Aceasta din urmă poartă denumirea de<br />

comandă inertă şi rolul ei este doar de afişare matematică a unei expresii. Cele mai<br />

multe comenzi MAPLE necesită o listă de parametri la intrare. Această listă poate<br />

conţine de exemplu, numere, expresii, mulţimi, etc., sau poate să nu conţină nici un<br />

parametru. Indiferent de numărul de parametri specificaţi, ei trebuie incluşi între<br />

paranteze rotunde (). Toate comenzile au număr minim de parametri de tip precizat,<br />

de cele mai multe ori într-o ordine precizată. Multe comenzi pot fi utilizate cu un<br />

număr de parametri mai mare strict decât acest număr minim de parametri. Aceşti<br />

“extra” parametri reprezintă de obicei opţiuni de control al funcţionării comenzii<br />

respective. Comenzile MAPLE pot fi folosite ca parametri. Acestea sunt evaluate şi<br />

rezultatele lor sunt inserate în lista de parametri.<br />

Comenzile MAPLE se pot clasifica în trei categorii:<br />

1. Comenzi care se încarcă automat la deschiderea unei sesiuni<br />

MAPLE. Acestea pot fi apelate direct aşa cum s-a precizat mai sus.<br />

2. Comenzi din biblioteca extinsă. Înainte de a le folosi acestea trebuie<br />

mai întâi încărcate în memorie cu ajutorul comenzii readlib sub forma<br />

> readlib(nume_comanda);<br />

3. Comenzi care aparţin unor pachete specializate. Există două<br />

modalităţi de utilizare a acestor comenzi:<br />

• prin specificarea pachetului sub forma:<br />

> nume_pachet[nume_comanda](param1,param2,...);<br />

237


Mădălina Roxana Buneci<br />

• cu ajutorul comenzii with. Un apel de forma<br />

> with(nume_pachet);<br />

are ca urmare încărcarea în memorie şi afişarea în zona ouput a tuturor comenzilor<br />

din pachet. Până la încheierea sesiunii MAPLE acestea pot fi utilizate ca şi cele din<br />

prima categorie.<br />

Din cele de mai sus rezultă că nu este întotdeauna suficient să se cunoască<br />

numele unei comenzii. Uneori ea trebuie încărcată din bibliotecă sau dintr-un<br />

pachet. Dacă nu s-a făcut acest lucru şi s-a introdus comanda, MAPLE nu generează<br />

un mesaj de eroare, ci afişează în zona output, comanda introdusă în zona input. În<br />

acest caz trebuie verificat dacă este scrisă corect comanda (inclusiv dacă literele<br />

mari şi mici se potrivesc), sau trebuie încărcată în memorie. Informaţii asupra<br />

modului corect de introducere a unei comenzi se pot obţine cu ajutorul comenzii<br />

help. Există mai mute modalităţi de utilizare a acestei comenzi. Este recomandabilă,<br />

următoarea formă:<br />

> ? nume_comanda<br />

O comandă de forma:<br />

> ?<br />

afişează informaţii generale despre structura help-ului.<br />

Altă variantă presupune un apel de forma<br />

> help(`nume_comanda`);<br />

De remarcat faptul că numele comenzii este inclus între apostrofuri întoarse<br />

(backquotes).<br />

A.2. Operatori, constante şi funcţii predefinite în MAPLE.<br />

Expresii.<br />

O expresie este o combinaţie validă de operatori şi variabile, constante, şi<br />

apeluri de funcţii.<br />

Operaţie Operator Exemple<br />

Adunare + x+y<br />

238


<strong>Metode</strong> <strong>Numerice</strong><br />

Scădere - x-y<br />

Opus - -x<br />

Înmulţire * x*y<br />

Împărţire / x/y<br />

Ridicare la putere (x y ) ** sau ^ x**y sau x^y<br />

Tabelul precedent conţine operatorii aritmetici de bază din MAPLE.<br />

Precedenţa operatorilor este aceeaşi ca în majoritatea limbajelor de programare. Mai<br />

întâi sunt evaluate expresiile din paranteze. În lista următoare prioritatea cade de sus<br />

în jos:<br />

1. – (operator unar)<br />

2. **, ^<br />

3. *, /<br />

4. +, -(scădere)<br />

De remarcat faptul că exponenţierea succesivă nu e validă. Astfel MAPLE nu poate<br />

evalua x^y^z. O expresie de acest fel trebuie introdusă sub forma x^(y^z). Ori de<br />

câte ori există ambiguităţi trebuie utilizate ( ).<br />

Următorul tabel prezintă funcţiile de bază din MAPLE ce pot interveni în<br />

expresiile aritmetice.<br />

Notaţie MAPLE Semnificaţie<br />

abs(x)<br />

|x| (modulul)<br />

iquo(x,y)<br />

partea întreagă a împărţirii x/y<br />

irem(x,y)<br />

restul împărţirii lui x la y<br />

trunc(x) cel mai mare număr întreg ≤ x,<br />

dacă x ≥ 0, sau cel mai mic<br />

număr întreg ≥ x, dacă x < 0<br />

frac(x)<br />

x-trunc(x)<br />

round(x)<br />

rotunjeşte pe x la cel mai<br />

apropiat întreg<br />

floor(x)<br />

cel mai mare număr întreg ≤ x<br />

ceil(x)<br />

cel mai mic număr întreg ≥ x<br />

239


Mădălina Roxana Buneci<br />

sqrt(x) sau x^(1/2)<br />

exp(x)<br />

ln(x) sau log(x)<br />

sin(x)<br />

cos(x)<br />

tan(x)<br />

e x<br />

x<br />

lnx (logaritm natural)<br />

sinx<br />

cosx<br />

tgx<br />

Facem câteva remarci asupra funcţiilor irem şi iqou (deoarece nu respectă<br />

întocmai teorema împărţirii cu rest). Astfel dacă m şi n sunt două numere întregi, n<br />

este nenul şi r este numărul întreg returnat de irem, atunci este satisfăcută relaţia:<br />

m = n*q + r, abs(r) < abs(n) şi m*r ≥ 0.<br />

Dacă m şi n nu sunt amândouă numere întregi, atunci irem rămâne neevaluată.<br />

Ambele funcţii pot fi utilizate şi cu câte trei parametri. Dacă al treilea parametru<br />

este prezent în funcţia irem, atunci lui i se asignează câtul, iar în cazul funcţiei iquo<br />

i se asignează restul împărţirii.<br />

Exemple:<br />

> irem(29,4,'q');<br />

1<br />

> q;<br />

7<br />

> iquo(29,4,'r');<br />

7<br />

> r;<br />

1<br />

> irem(-29,4);<br />

-1<br />

> irem(29,-4);<br />

1<br />

> irem(-29,-4);<br />

-1<br />

> iquo(-29,4);<br />

-7<br />

> iquo(29,-4);<br />

240


<strong>Metode</strong> <strong>Numerice</strong><br />

-7<br />

> iquo(-29,-4);<br />

7<br />

Funcţiile rem şi quo se aplică polinoamelor şi reprezintă analoagele<br />

funcţiilor irem şi iquo. Acestea cer obligatoriu al treilea parametru ce indică<br />

nedeterminata în raport cu care se consideră polinomul. Opţional admit al patrulea<br />

parametru, cu acelaşi rol ca parametru 3 din funcţiile irem şi iquo. Asfel dacă a şi b<br />

sunt două polinoame, b este nenul, r restul returnat de rem şi q este câtul returnat de<br />

quo, atunci este satisfăcută relaţia:<br />

Exemple:<br />

a = b*q + r, grad(r) < grad(n)<br />

> rem(x^5+2*x+1, x^2+x+1, x, 'q');<br />

> q;<br />

> quo(x^5+2*x+1, x^2+x+1, x);<br />

> quo(x^5+2*y+z, x^2+x+1, x,'r');<br />

> r;<br />

x<br />

x 3 − x 2 + 1<br />

x 3 − x 2 + 1<br />

x 3 − x 2 + 1<br />

2 y + z − 1 − x<br />

Funcţia factorial(k) calculează k! (k factorial, 12…k). Acelaşi efect în are şi k!,<br />

după cum rezultă din exemplele de mai jos:<br />

> factorial(4);<br />

> 4!;<br />

> 6!;<br />

> factorial(factorial(3))=3!!;<br />

24<br />

24<br />

720<br />

720 = 720<br />

Tabelul de mai jos conţine câteva constante MAPLE:<br />

Constantă<br />

Notaţia matematică<br />

241


Mădălina Roxana Buneci<br />

Pi<br />

infinity<br />

gamma<br />

true<br />

false<br />

π<br />

∞<br />

constanta lui Euler<br />

adevăr, în cazul evaluării booleene<br />

fals, în cazul evaluării booleene<br />

Numărul complex i (i 2 = -1) este desemnat în MAPLE prin I.<br />

De reţinut că pi (scris cu literă mică) se referă la litera grecească π.<br />

Tipul booleean în MAPLE are două valori: true şi false. Expresiile booleene<br />

(logice) pot fi formate cu ajutorul operatorilor de comparaţie şi operatorilor logici.<br />

Următoarele două tabele conţin aceşti operatori.<br />

Operator Simbol Exemple<br />

egal = x=y<br />

diferit xy<br />

mai mare > x>y<br />

mai mare egal >= x>=y<br />

mai mic < x


<strong>Metode</strong> <strong>Numerice</strong><br />

> a=1,b=a+2,c+2;<br />

1, 2, 3, 4,<br />

5<br />

a = 1 , b = a + 2 , c + 2<br />

Alternativ, există alte două moduri de a crea secvenţe de instrucţiuni în<br />

MAPLE: cu ajutorul operatorului $ sau cu ajutorul comenzii seq. Următoarele<br />

exemple sunt edificatoare:<br />

> a$5;<br />

a, a, a, a,<br />

a<br />

> $2..7;<br />

> i^2$i=1..4;<br />

> seq(i!,i=1..4);<br />

2, 3, 4, 5, 6,<br />

7<br />

1, 4, 9,<br />

16<br />

1, 2, 6,<br />

24<br />

> seq(i!!,i=1..4);<br />

1, 2, 720,<br />

620448401733239439360000<br />

Secvenţă vidă este desemnată prin NULL.<br />

A.3. Numere, şiruri şi identificatori.<br />

Constantele numerice din MAPLE sunt de trei tipuri:<br />

• întregi<br />

• raţionale<br />

• în virgulă mobilă<br />

Constantele întregi sunt şiruri de cifre zecimale (0..9) eventual<br />

precedate de un semn (+,-) reprezentând un număr întreg. Numărul maxim de cifre<br />

permise este dependent de sistem, dar în general este mai mare de 500 000. Nu<br />

poate fi aflat cu ajutorul comenzii kernelopts(maxdigits).<br />

Exemple de constante întregi:<br />

> 0;<br />

0<br />

243


Mădălina Roxana Buneci<br />

> 123;<br />

> -6789;<br />

123<br />

-6789<br />

> 123456789123456789012;<br />

123456789123456789012<br />

Constantele raţionale utilizează operatorul de împărţire / pentru a separa<br />

numărătorul de numitor. Astfel m/n cu m şi n constante întregi reprezintă numărul<br />

m<br />

raţional . n<br />

Exemple de constante raţionale:<br />

> 2/3;<br />

> 6/7;<br />

> 4/6;<br />

> 4/2;<br />

> -39/13;<br />

2<br />

3<br />

6<br />

7<br />

2<br />

3<br />

2<br />

-3<br />

Se observă că MAPLE face automat simplificarea fracţiilor.<br />

Reprezentarea unei constante în virgulă mobilă conţine în general<br />

câmpurile următoare:<br />

• partea întreagă<br />

• punctul zecimal<br />

• partea fracţionară<br />

e sau E şi un exponent cu semn (opţional);<br />

244


<strong>Metode</strong> <strong>Numerice</strong><br />

Se poate omite partea întreagă sau partea fracţionară, dar nu amândouă. De<br />

asemenea, se poate omite punctul zecimal sau litera e(E) şi exponentul, dar nu<br />

amândouă.<br />

Exemple de constante în virgulă mobilă:<br />

> 2.3;<br />

2.3<br />

> 678.96e-9;<br />

> .1234;<br />

> 123E56;<br />

> 1.;<br />

0.67896 10 -6<br />

0.1234<br />

0.123 10 59<br />

1.<br />

Constante în virgulă mobilă pot fi obţinute şi cu comanda Float. Această<br />

comandă are forma<br />

Float(mantisa,exponent);<br />

şi întoarce mantisa*10 ^exponent.<br />

> Float(123,56);<br />

0.123 10 59<br />

Expresiile aritmetice cu operanzi constante întregi sau raţionale sunt evaluate exact<br />

în MAPLE (rezultatul este o constantă raţională sau o constantă întreagă).<br />

Exemple:<br />

> 1/3+4/5;<br />

17<br />

15<br />

> 1/3+8;<br />

> 1/3+2/3;<br />

25<br />

3<br />

1<br />

245


Mădălina Roxana Buneci<br />

În cazul în care expresia conţine constante în virgulă mobilă, atunci<br />

constantele întregi şi cele raţionale (care apar eventual în expresie) sunt convertite<br />

în virgulă mobilă (sunt aproximate cu constante în virgulă mobilă). Rezultatul<br />

expresiei este în acest caz o constantă în virgulă mobilă.<br />

Exemple:<br />

> 1/3.+4/5;<br />

1.133333333<br />

> 1./3+8;<br />

> 1/3+2/3.;<br />

8.333333333<br />

1.000000000<br />

> 20+45.75e-2;<br />

20.4575<br />

Orice număr real nenul x poate fi scris sub formă normalizată, în baza 10:<br />

x = ±m 10 p<br />

cu 0,1≤m 1./7;<br />

0.1428571429<br />

> Digits:=20;<br />

Digits := 20<br />

> 1./7;<br />

0.14285714285714285714<br />

Deci MAPLE poate lucra în virgulă mobilă cu o precizie teoretic “infinită”.<br />

Pentru a determina evaluarea unei expresii în virgulă mobilă (chiar dacă toţi<br />

operanzii din expresie sunt întregi sau raţionali) se poate folosi comanda evalf.<br />

evalf(expresie)<br />

determină evaluarea expresiei la o valoare în virgulă mobilă, cu numărul de cifre<br />

semnificative stabilit de variabila Digits.<br />

246


<strong>Metode</strong> <strong>Numerice</strong><br />

evalf(expresie,n)<br />

determină evaluarea expresiei la o valoare în virgulă mobilă, utilizând n de cifre<br />

semnificative (valoarea variabilei Digits nu este afectată).<br />

Exemple:<br />

> evalf(1/7);<br />

0.1428571429<br />

> evalf(1/7,20);<br />

> evalf(Pi);<br />

> evalf(Pi,30);<br />

0.14285714285714285714<br />

3.141592654<br />

3.14159265358979323846264338328<br />

Există o întreagă familie de funcţii de evaluare numerică şi algebrică a expresiilor:<br />

• eval – evaluează în întregime o expresie<br />

• evala– evaluează algebric o expresie<br />

• evalf– evaluează numeric o expresie<br />

• evalb– evaluează boolean o expresie<br />

• evalm– evaluează matriceal o expresie<br />

• evalc– evaluează în mulţimea numerelor complexe o expresie<br />

În MAPLE un şir de caractere (string) constă dintr-o succesiune de<br />

caractere cuprinse între apostrofuri întoarse (backquote) (`) sau între ghilimele (“).<br />

Operatorul de concatenare pentru şirurile de caractere în MAPLE este || (de<br />

asemenea se poate utiliza comanda cat).<br />

Exemple:<br />

> `Acesta este un string in MAPLE`;<br />

Acesta este un string in MAPLE<br />

> `1+2=?`;<br />

1+2=?<br />

> `acesta este`||` un string`;<br />

acesta este un string<br />

Un identificator în MAPLE este un şir de caractere alfabetice (A-Z, a-z),<br />

cifre (0-9) şi caracterul _ (liniuţa de subliniere, underline), şir în care primul<br />

247


Mădălina Roxana Buneci<br />

caracter este un caracter alfabetic (A-Z, a-z). Lungimea maximă a unui identificator<br />

este dependentă de sistem . MAPLE este case-sensitive, ceea ce însemnă că<br />

identificatorul nume este diferit de identificatorul Nume. MAPLE conţine un număr<br />

de identificatori predefiniţi (identificatori rezervaţi). O listă a acestora poate fi<br />

obţinută cu comanda<br />

> ?ininame<br />

sau<br />

> help(`ininame`);<br />

A.4. Comenzi de calcul în MAPLE<br />

Tabelul de mai jos conţine comenzile din MAPLE pentru diferenţiere,<br />

integrare şi însumare.<br />

Notaţie MAPLE Semnificaţie<br />

diff(f(x),x)<br />

derivată parţială<br />

Notaţie<br />

matematică<br />

∂f<br />

∂x<br />

int(f(x),x) integrală indefinită f ( x)<br />

sum(f(n),n)<br />

int(f(x),x=a..b)<br />

suma seriei<br />

integrală definită<br />

sum(f(k),k=a..b) sumă de la a la b<br />

∫<br />

∑ ∞<br />

=1 n<br />

∫<br />

b<br />

f<br />

dx<br />

( n)<br />

( )<br />

a f x dx<br />

b<br />

∑<br />

k=<br />

a<br />

f<br />

( k)<br />

limit(f(x), x=a) limita funcţiei f în a; lim f ( x)<br />

x→a<br />

Diff, Int, Sum, Limit reprezintă comenzile inerte corespunzătoare. Comanda<br />

limit admite un al treilea parametru opţional (dacă acesta este left se calculează<br />

limita la stânga, dacă este right se calculează limita la dreapta<br />

248


<strong>Metode</strong> <strong>Numerice</strong><br />

Exemple:<br />

> diff(sin(x),x);<br />

> diff(cox(x),y);<br />

cos( x )<br />

0<br />

> diff(x*sin(cos(x)),x);<br />

sin ( cos( x)<br />

) − x cos ( cos( x ) ) sin( x )<br />

> diff(ln(x),x);<br />

> Diff(ln(x),x);<br />

1<br />

x<br />

d<br />

ln( x )<br />

dx<br />

> Diff(ln(x),x) = diff(ln(x),x);<br />

d<br />

ln( x)<br />

dx<br />

> Diff(sin(x)*tan(y),x,y)= diff(sin(x)*tan(y),x,y);<br />

∂ 2<br />

=<br />

∂y ∂x ( sin( x ) tan( y ) ) cos( x ) ( 1 + tan( y)<br />

2 )<br />

=<br />

1<br />

x<br />

> int( sin(x), x );<br />

> Int( sin(x), x );<br />

> int( sin(x), x=0..Pi );<br />

− cos( x )<br />

⌠<br />

⎮ sin( x ) dx<br />

⌡<br />

2<br />

> Int( x^2*ln(x), x=1..3 )=int( x^2*ln(x), x=1..3 );<br />

3<br />

⌠<br />

⎮ x 2 ln( x ) dx = 9 ln( 3 ) −<br />

⌡<br />

1<br />

> Int( Int(exp(-x^2-y^2), x=0..infinity ), y=0..infinity) =int(int(<br />

exp(-x^2-y^2), x=0..infinity ), y=0..infinity);<br />

26<br />

9<br />

249


Mădălina Roxana Buneci<br />

0<br />

∞<br />

⌠ ⌠<br />

⎮ ⎮<br />

⌡ ⌡<br />

∞<br />

e ( − − )<br />

0<br />

x2 y 2 dx dy<br />

=<br />

π<br />

4<br />

> sum(k^2,k=1..4);<br />

> Sum(k^2,k=1..4);<br />

30<br />

4<br />

∑ k 2<br />

k = 1<br />

> Sum(k^2,k=1..n)=sum(k^2,k=1..n);<br />

n<br />

∑<br />

k = 1<br />

k 2 ( n + 1 )<br />

3 ( n + 1 )<br />

2 n<br />

= − + +<br />

3 2 6<br />

1<br />

6<br />

> sum(1/k^2,k=1..infinity);<br />

π 2<br />

6<br />

> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);<br />

∞<br />

∑<br />

k = 0<br />

1<br />

k!<br />

= e<br />

> limit(sin(x)/x, x=0);<br />

> Limit(sin(x)/x, x=0);<br />

lim<br />

x → 0<br />

1<br />

sin( x )<br />

x<br />

> Limit(sin(x)/x, x=0)=limit(sin(x)/x, x=0);<br />

lim<br />

x → 0<br />

sin( x )<br />

x<br />

= 1<br />

> Limit((cos(2*x)-1)/x^2, x=0)=limit((cos(2*x)-1)/x^2, x=0);<br />

lim<br />

x → 0<br />

cos( 2 x ) − 1<br />

= -2<br />

x 2<br />

> Limit(exp(x), x=infinity)=limit(exp(x), x=infinity);<br />

lim e x<br />

x → ∞<br />

= ∞<br />

> Limit(exp(x), x=-infinity)=limit(exp(x), x=-infinity);<br />

lim<br />

x → ( −∞)<br />

e x = 0<br />

250


<strong>Metode</strong> <strong>Numerice</strong><br />

> Limit(1/x, x=0)=limit(1/x, x=0);<br />

lim<br />

x → 0<br />

1<br />

x<br />

= undefined<br />

> Limit(1/x, x=0, left)=limit(1/x, x=0, left);<br />

lim<br />

x → 0-<br />

1<br />

x<br />

= −∞<br />

> Limit(1/x, x=0, right)=limit(1/x, x=0, right);<br />

lim<br />

x → 0+<br />

1<br />

x<br />

= ∞<br />

Prezentăm în continuare câteva exemple cu comenzile expand, factor şi<br />

simplify. Principalul rol al comenzii expand este aplicarea distributivităţii<br />

produsului faţă de adunare. Comanda factor se aplică pentru descompunerea în<br />

factori ireductibili a polinoamelor de mai multe variabile. Iar comanda simplify<br />

aplică regulile de simplificare într-o expresie.<br />

> expand((X^2-Y^2)^2*(X^2+Y^2)^2);<br />

> factor(X^6-Y^6);<br />

X 8 − 2 X 4 Y 4 + Y 8<br />

( X − Y ) ( X + Y ) ( X 2 + X Y + Y 2 ) ( X 2 − X Y + Y 2 )<br />

> simplify((X^6-Y^6)/(X^2+X*Y+Y^2));<br />

X 4 − Y X 3 + Y 3 X − Y 4<br />

A.5. Reprezentări grafice în MAPLE<br />

Comenzile destinate reprezentărilor grafice sunt incluse în pachetul plots.<br />

Numele pachetului trebuie să preceadă fiecare comandă. Altă variantă presupune<br />

încărcarea întregului pachet în memorie cu ajutorul comenzii with:<br />

> with(plots);<br />

251


Mădălina Roxana Buneci<br />

[ animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d,<br />

conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d,<br />

cylinderplot, densityplot, display, display3d, fieldplot, fieldplot3d, gradplot,<br />

gradplot3d, graphplot3d, implicitplot, implicitplot3d, inequal, interactive,<br />

listcontplot, listcontplot3d, listdensityplot, listplot, listplot3d, loglogplot, logplot,<br />

matrixplot, odeplot, pareto, plotcompare, pointplot, pointplot3d, polarplot,<br />

polygonplot, polygonplot3d, polyhedra_supported, polyhedraplot, replot, rootlocus,<br />

semilogplot, setoptions, setoptions3d, spacecurve, sparsematrixplot, sphereplot,<br />

surfdata, textplot, textplot3d, tubeplot]<br />

Prezentăm câteva exemple cu comenzile plot, plot3d şi animate3d.<br />

Plot este destinată reprezentărilor grafice în plan şi poate fi folosită sub mai<br />

multe forme. Prezentăm de fiecare dată numărul minim de parametri ceruţi.<br />

Notaţie MAPLE<br />

plot(f(x),x = a..b)<br />

plot([f(x),g(x),…],x = a..b)<br />

Curba/Curbele reprezentate<br />

y = f(x), x∈[a,b]<br />

plot([f(t),g(t),t = a..b]) ⎧x<br />

= f ( t)<br />

⎨<br />

y = g( t)<br />

y = f(x),y = g(x)…, x∈[a,b]<br />

⎩<br />

t ∈<br />

[ a, b]<br />

Reprezentarea grafică se face conform cu opţiunile (de stil, culoare, axe,<br />

coordonate, rezoluţie …) indicate în comandă sau în raport cu cele implicite. Unele<br />

din aceste opţiuni se pot stabili şi din meniul contextual: se introduce comanda de<br />

reprezentare grafică a curbei, iar apoi se selectează din bara de context, sau prin<br />

clic cu butonul drept al mouse-ului pe grafic, opţiunile dorite.<br />

Implicit se folosesc coordonatele carteziene. Dacă se doreşte utilizarea altor<br />

coordonate, acestea trebuie specificate, prin introducerea în lista de opţiuni sub<br />

forma coords = nume_coordonate. O opţiune de forma discont=true, determină<br />

apelul comenzii Discont pentru determinarea punctelor de discontinuitate a funcţiei<br />

ce se reprezintă grafic.<br />

Exemple:<br />

> plot(sin(x)*ln(x), x=Pi..8*Pi, color=black);<br />

252


<strong>Metode</strong> <strong>Numerice</strong><br />

> plot([sin(x),cos(x)],x=0..2*Pi,title=`sinus si cosinus`);<br />

>plot([sin(t),cos(t),t=0..2*Pi],title=`cerc`,color=black);<br />

> plot(sin(2*t),t=0..2*Pi,coords=polar, color=black);<br />

253


Mădălina Roxana Buneci<br />

>plot(sin(x)/x, x=-3*Pi..3*Pi,discont=true,color=black);<br />

Comanda plot3d este destinată reprezentării grafice a suprafeţelor în spaţiu<br />

tridimensional. Ca şi în cazul comenzii plot reprezentarea grafică se face conform<br />

cu opţiunile indicate în comandă sau în raport cu cele implicite. Unele din aceste<br />

opţiuni se pot stabili şi din meniul contextual. Comanda plot3d poate fi folosită sub<br />

mai multe forme. Prezentăm de fiecare dată numărul minim de parametri ceruţi.<br />

Notaţie MAPLE<br />

plot3d(f(x,y),x = a..b,y=c..d)<br />

plot({f(x,y),g(x,y)},x = a..b,y=c..d)<br />

plot([f(u,v),g(u,v),h(u,v)],u=a..b,v=c..<br />

d)<br />

Suprafaţa/Suprafe<br />

ţele reprezentate<br />

z = f(x,y),<br />

(x,y)∈[a,b]×[c,d]<br />

z = f(x,y),z=g(x,y)<br />

(x,y)∈[a,b]×[c,d]<br />

⎧x<br />

= f<br />

⎪<br />

⎨y<br />

= g<br />

⎪<br />

⎩z<br />

= h<br />

( u, v)<br />

( u, v)<br />

( u, v)<br />

254


<strong>Metode</strong> <strong>Numerice</strong><br />

Exemple<br />

>plot3d(cos(x)*sin(y),x=-2*Pi..2*Pi,y=-2*Pi..2*Pi);<br />

>plot3d([v*cos(u),v*sin(u),v*ln(u)],u=Pi..4*Pi,v=0..1);<br />

Comenzile animate şi animate3d sunt destinate animaţiei în plan şi spaţiu.<br />

Comanda<br />

animate3d(f(x,y,t),x=a..b,y=b..c,t=t1..t2)<br />

creează animaţie cu ajutorul cadrelor obţinute prin reprezentarea grafică a<br />

suprafeţelor<br />

z t = f(x,y,t), (x,y)∈[a,b]×[c,d]<br />

pentru valori ale lui t în intervalul [t1,t2]. Numărul de cadre poate fi stabilit cu<br />

ajutorul opţiunii frames (implicit sunt 8).<br />

Exemplu:<br />

>animate3d(cos(x)*sin(t*y),x=-Pi..Pi,y=-Pi..Pi,t=1..2);<br />

255


Mădălina Roxana Buneci<br />

A.6. Structuri de date în MAPLE<br />

Comanda<br />

>subs(x=a, expr);<br />

A.6.1 Expresii şi funcţii<br />

întoarce expresia obţinută prin înlocuirea lui x cu a în expresia expr<br />

Comanda<br />

>subs(s1,s2,..., sn, expr);<br />

(unde s1,s2,..., sn sunt ecuaţii sau mulţimi de ecuaţii sau liste de ecuaţii)<br />

întoarce expresia obţinută în urma substituţiilor indicate de s1, s2, ..., sn în expresia<br />

expr. Substituţiile se execută secvenţial începând cu s1. Substituţiile dintr-o<br />

mulţime sau dintr-o listă se execută simultan.<br />

Acţiunea comenzii subs nu este urmată de o evaluare completă. Dacă se<br />

doreşte evaluarea completă se foloseşte comanda<br />

>eval(expr, x=a);<br />

care întoarce expresia obţinută prin înlocuirea lui x cu a în expresia expr sau<br />

comanda<br />

>eval(expr, s1,s2,..., sn);<br />

(unde s1,s2,..., sn sunt ecuaţii sau mulţimi de ecuaţii sau liste de ecuaţii)<br />

care întoarce expresia obţinută în urma substituţiilor simultane indicate de s1, s2, ...,<br />

sn în expresia expr.<br />

Exemple:<br />

> subs(x=Pi, sin(x));<br />

sin( π )<br />

> eval(sin(x), x=Pi);<br />

Comanda<br />

0<br />

>nops(expr);<br />

întoarce numărul de operanzi ai expresiei expr<br />

Comanda<br />

>op(i, expr);<br />

256


<strong>Metode</strong> <strong>Numerice</strong><br />

extrage un operand din expresia expr:<br />

• dacă i > 0, comanda extrage cel de al i-lea operand<br />

• dacă i < 0, comanda extrage cel de al nops(expr) +i +1 operand<br />

• în cazul funcţiilor, dacă i = 0, comanda returnează numele funcţiei<br />

• dacă i > nops(expr) sau i < -nops(expr) se generează mesaj de eroare<br />

Comanda<br />

>op(i..j, expr);<br />

întoarce şirul operanzilor de la operandul i la operandul j.<br />

Comanda<br />

>subsop(i=expr1, expr);<br />

întoarce expresia obţinută prin înlocuirea unui operand al expresiei expr cu expresia<br />

expr1<br />

• dacă i > 0, se înlocuieşte cel de al i-lea operand<br />

• dacă i < 0, se înlocuieşte cel de al nops(expr) +i +1 operand<br />

Comanda<br />

>subsop(i1=expr1, i2=expr2,..., ik=exprk, expr);<br />

întoarce expresia obţinută prin înlocuirea simultană a operanzilor expresiei expr<br />

desemnaţi de i1, i2, ... ik (în acelaşi mod ca mai sus) cu expresiile expri1, ..., exprik<br />

(respectiv).<br />

Exemple:<br />

> expr:=u*v+cos(u*v)/exp(-u^2);<br />

expr := u v +<br />

cos( u v )<br />

e ( −u2 )<br />

> nops(expr);<br />

> op(1,expr);<br />

> op(2,expr);<br />

2<br />

u v<br />

cos( u v )<br />

e ( −u2 )<br />

> subsop(2=u+v,expr);<br />

257


Mădălina Roxana Buneci<br />

u v + u + v<br />

> expr;<br />

u v +<br />

cos( u v )<br />

e ( −u2 )<br />

Definirea unei legături fucţionale în MAPLE se face sub forma<br />

>nume_functie: (lista variabile) -> expresie;<br />

Comanda<br />

>nume_functie(lista argumente curente);<br />

întoarce valoarea funcţiei nume_funcţie pentru argumentele precizate.<br />

Operatorii pentru adunarea, înmulţirea, compunerea funcţiilor sunt +, *, respectiv,<br />

@.<br />

Operatorul pentru compunere repetată este @@. Astfel dacă f este o funcţie şi n un<br />

număr natural, atunci<br />

Comanda<br />

• dacă n > 0, f @@ n reprezintă compunerea de n ori a funcţiei f cu ea<br />

însăşi.<br />

• dacă n = 0, f @@ 0 reprezintă funcţia identică<br />

• dacă n < 0 şi f este inversabilă, atunci f @@ n reprezintă<br />

>unapply(expr, x);<br />

compunerea de -n ori a inversei funcţiei f cu ea însăşi (inversa<br />

funcţie este dată de invfunc[f]).<br />

întoarce funcţia x -> expr, iar comanda<br />

>unapply(expr, x, y, ...);<br />

întoarce funcţia (x,y, ...) -> expr<br />

Exemple:<br />

> f:=x->x^3+cos(x)*x^(1/3)+exp(-x^2);<br />

f := x → x 3 + cos( x ) x ( / )<br />

+<br />

1 3 e ( −x2 )<br />

> nops(f);<br />

1<br />

> g:=(x,y)->x^2*exp(-x^2-y^2)+cos(x)*sin(y);<br />

258


<strong>Metode</strong> <strong>Numerice</strong><br />

g := ( x,<br />

y ) → x 2 e ( − x2 − y 2 )<br />

+ cos( x ) sin( y )<br />

> nops(g);<br />

1<br />

> h:=(u,v,w)->sin(u)*cos(w)*v+u;<br />

h := ( u, v,<br />

w ) → sin( u ) cos( w)<br />

v + u<br />

> f(1);<br />

> f(1.);<br />

> evalf(f(1));<br />

1 + cos( 1 ) + e ( -1 )<br />

1.908181747<br />

1.908181747<br />

> evalf(f(1),50);<br />

1.9081817470395820389964603776044374711781215516497<br />

> f(alpha);<br />

α 3 + cos( α)<br />

α ( / )<br />

+<br />

1 3 e ( −α2 )<br />

> g(Pi/2,3);<br />

> evalf(g(Pi/2,3));<br />

> g(2,3);<br />

1<br />

4 π2 e<br />

⎛<br />

⎜<br />

⎝<br />

π 2<br />

− −<br />

4<br />

⎞<br />

9<br />

⎟<br />

⎠<br />

0.00002582324018<br />

4 e ( -13 )<br />

+ cos ( 2 ) sin( 3 )<br />

> g(2,3.);<br />

> g(2.,3);<br />

> g(2.,3.);<br />

> evalf(g(2,3));<br />

0.9041317628 10 -5 + 0.1411200081 cos( 2 )<br />

0.9041317628 10 -5 − 0.4161468365 sin( 3 )<br />

-0.05871760362<br />

-0.05871760362<br />

> h(Pi/3,2,Pi/4);<br />

259


Mădălina Roxana Buneci<br />

3 2<br />

2<br />

+<br />

π<br />

3<br />

> evalf(h(Pi/3,2,Pi/4));<br />

> h(alpha,beta,gamma);<br />

> h(alpha,3,Pi/4);<br />

2.271942423<br />

sin( α ) cos( γ ) β + α<br />

3<br />

sin( α)<br />

2 + α<br />

2<br />

> expresie:=u*v^2+cos(Pi/u*v)/u^(1/2);<br />

> f1:=unapply(expresie,u);<br />

expresie := u v 2 +<br />

f1 := u → u v 2 +<br />

cos ⎛ π v<br />

⎜<br />

⎝ u<br />

u<br />

cos ⎛ π v<br />

⎜<br />

⎝ u<br />

u<br />

⎞<br />

⎟<br />

⎠<br />

⎞<br />

⎟<br />

⎠<br />

> f1(1);<br />

v 2 + cos( π v )<br />

> f2:=unapply(expresie,u,v);<br />

f2 := ( u,<br />

v ) → u v 2 +<br />

cos ⎛ π v<br />

⎜<br />

⎝ u<br />

u<br />

⎞<br />

⎟<br />

⎠<br />

> f2(1,2/3);<br />

> f2(alpha, 2);<br />

4 α +<br />

-1<br />

18<br />

cos ⎛ 2 π ⎞<br />

⎜<br />

⎝ α ⎠<br />

⎟<br />

α<br />

> f3:=unapply(expresie,v);<br />

> f3(1);<br />

f3 := v → u v 2 +<br />

cos ⎛ π v<br />

⎜<br />

⎝ u<br />

u<br />

⎞<br />

⎟<br />

⎠<br />

260


<strong>Metode</strong> <strong>Numerice</strong><br />

u +<br />

cos ⎛ π ⎜<br />

⎝ u<br />

u<br />

⎞<br />

⎟<br />

⎠<br />

A.6.2. Liste<br />

Listele (lists) în MAPLE sunt şiruri ordonate de expresii, separate între ele<br />

prin virgulă şi incluse între paranteze drepte []. Ordinea expresiilor este dată de<br />

poziţia în care apar în listă. Dacă L este o listă L[i] desemnează elementul de pe<br />

poziţia i. Lista vidă este desemnată prin []. Se pot efectua următoarele operaţii cu<br />

liste:<br />

• extragerea din lista L a elementelor de poziţia i până la poziţia j: L(i..j)<br />

sau op(i..j,L).;<br />

• adăugarea unui element x la lista L: [x,op(L)] (adaugă elementul pe<br />

prima poziţie), [op(L),x] (adaugă elementul pe ultima poziţie);<br />

• modificarea elementului de pe poziţia i: subsop(i=x,L) sau L[i]:=x;<br />

• eliminarea elementului de pe poziţia i: subsop(i=NULL,L);<br />

Exemple:<br />

> L:=[1,-1,1,2,3,-1,1,1];<br />

L := [ 1, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

> nops(L);<br />

> L[2];<br />

> op(2,L);<br />

> op(3..6,L);<br />

> L[3..6];<br />

> L;<br />

8<br />

-1<br />

-1<br />

1, 2, 3,<br />

-1<br />

[ 1, 2, 3,<br />

-1 ]<br />

[ 1, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

261


Mădălina Roxana Buneci<br />

> L1:=[5,op(L)];<br />

> L;<br />

> L2:=[op(L),5];<br />

> L;<br />

> L[3]:=8;<br />

> L;<br />

> subsop(4=10,L);<br />

> L;<br />

L1 := [ 5, 1, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

[ 1, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

L2 := [ 1, -1, 1, 2, 3, -1, 1, 1,<br />

5 ]<br />

[ 1, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

L 3<br />

:= 8<br />

[ 1, -1, 8, 2, 3, -1, 1,<br />

1 ]<br />

[ 1, -1, 8, 10, 3, -1, 1,<br />

1 ]<br />

[ 1, -1, 8, 2, 3, -1, 1,<br />

1 ]<br />

> L3:=subsop(6=NULL,L);<br />

> L3;<br />

> L;<br />

> op(-3,L);<br />

L3 := [ 1, -1, 8, 2, 3, 1,<br />

1 ]<br />

[ 1, -1, 8, 2, 3, 1,<br />

1 ]<br />

[ 1, -1, 8, 2, 3, -1, 1,<br />

1 ]<br />

-1<br />

A.6.3. Mulţimi<br />

Mulţimile (sets) în MAPLE sunt şiruri neordonate de expresii, separate<br />

între ele prin virgulă şi incluse între acolade {}. Duplicatele sunt eliminate.<br />

Mulţimea vidă este desemnată prin {}. Se pot efectua următoarele operaţii cu<br />

mulţimi:<br />

• reuniune: operatorul union<br />

262


<strong>Metode</strong> <strong>Numerice</strong><br />

• intersecţie: operatorul intersect<br />

• diferenţă: operatorul minus<br />

Exemple:<br />

> A:={1,2,-3,-7,12};<br />

A := {-7, -3, 1, 2,<br />

12 }<br />

> nops(A);<br />

> op(3,A);<br />

5<br />

1<br />

> B:={0,-1,2,-7,11,15,16};<br />

B := {-7, -1, 0, 2, 11, 15,<br />

16 }<br />

> C:=A union B;<br />

> A;<br />

C := {-7, -3, -1, 0, 1, 2, 11, 12, 15,<br />

16 }<br />

{-7, -3, 1, 2,<br />

12 }<br />

> {-7, -3, 1, 2, 12};<br />

> B;<br />

> A intersect B;<br />

> B minus A;<br />

{-7, -3, 1, 2,<br />

12 }<br />

{-7, -1, 0, 2, 11, 15,<br />

16 }<br />

{-7,<br />

2 }<br />

{-1, 0, 11, 15,<br />

16 }<br />

> Delta:=(A minus B) union (B minus A);<br />

∆ := {-3, -1, 0, 1, 11, 12, 15,<br />

16 }<br />

> culori_calde:={rosu,galben,portocaliu};<br />

culori_calde := { rosu, portocaliu,<br />

galben }<br />

> culori_reci:={verde,albastru,violet};<br />

culori_reci := { albastru, verde,<br />

violet }<br />

> culori:=culori_calde union culori_reci;<br />

culori := { rosu, portocaliu, albastru, galben, verde,<br />

violet }<br />

> culori_calde intersect culori_reci;<br />

{ }<br />

263


Mădălina Roxana Buneci<br />

A.6.4. Tablouri<br />

Tablourile (tables) în MAPLE sunt structuri de date ai căror membri sunt<br />

indexaţi.<br />

Exemple:<br />

> t:=table([(culoare1)=red,(culoare2)=green, (culoare3)=blue]);<br />

t := table([ culoare1 = red , culoare2 = green , culoare3 = blue ])<br />

> t[culoare2];<br />

green<br />

Un tablou cu zero sau mai multe dimensiuni, pentru care fiecare dimensiune<br />

are domeniu întreg se numeşte în MAPLE array. Pentru a crea un array se poate<br />

apela funcţia array sub forma:<br />

>array( domeniile de indexare, listă de iniţializare);<br />

Parametrii sunt opţionali şi pot apărea în orice ordine.<br />

Exemple:<br />

> v := array(1..4);<br />

v := array ( 1 .. 4 , [ ] )<br />

> v[2];<br />

v 2<br />

> v[2]:=3;<br />

> evalm(v);<br />

v 2<br />

:= 3<br />

[ v 1<br />

, 3, v 3<br />

, v 4<br />

]<br />

> A := array(1..2,1..2);<br />

A := array ( 1 .. 2 , 1 .. 2 , [ ] )<br />

> A[1,2] := x;<br />

A ,<br />

1 2<br />

:= x<br />

> A[1,1];<br />

A 1,<br />

1<br />

> A[1,2];<br />

x<br />

264


<strong>Metode</strong> <strong>Numerice</strong><br />

> evalm(A);<br />

⎡<br />

⎢<br />

⎣<br />

A 1,<br />

1<br />

x<br />

A 2,<br />

1<br />

A 2,<br />

2<br />

> A := array(1..2,1..2, [ [1,x], [x,x^2] ] );<br />

⎡1 x ⎤<br />

A :=<br />

⎢ ⎥<br />

⎣x x 2<br />

⎦<br />

⎤<br />

⎥<br />

⎦<br />

Vectorii şi matricele pot fi creaţi şi cu comenzile vector şi matrix din<br />

pachetul linalg. Vectorii în MAPLE sunt tablouri unidimensionale cu indexate de la<br />

1. Comanda<br />

>vector(n, listă de iniţializare);<br />

este echivalentă cu array(1..n, listă de iniţializare). Matricele (matrix) în MAPLE<br />

sunt tablouri bidimensionale indexate de la 1. Cu alte cuvinte un apel<br />

>matrix(m,n, listă de iniţializare);<br />

este echivalent cu array(1..m,1..n, listă de iniţializare).<br />

Exemple:<br />

> with(linalg):<br />

> x:=vector(3,[1,-1,0]);<br />

x := [ 1, -1,<br />

0 ]<br />

> x[1];<br />

> y:=vector(3);<br />

1<br />

y := array ( 1 .. 3 , [ ] )<br />

> y[1];<br />

y 1<br />

> M:=matrix(3,2,[[1,2],[3,4],[5,6]]);<br />

⎡ 1 2⎤<br />

M :=<br />

3 4<br />

⎢ ⎥<br />

⎣ 5 6⎦<br />

> M[1,2];<br />

2<br />

Pachetul linalg conţine comenzi pentru operaţii cu vectori şi matrice.<br />

265


Mădălina Roxana Buneci<br />

Comanda<br />

> map(fcn, expr, arg2, arg3, ..., argn);<br />

aplică o funcţie sau o procedură fiecărui operand al unei expresii. Se înlocuieşte<br />

fiecare operand i al expresiei expr cu fcn(operand_i, arg2, ..., argn).<br />

Comanda<br />

> map2(fcn, arg1, expr, arg3, ..., argn);<br />

este similară comenzii map, cu deosebirea că se înlocuieşte operandul i al expresiei<br />

expr cu fcn(arg1, operand_i, arg3, ..., argn).<br />

Comanda<br />

> applyop(f, i, expr, arg2, arg3, ..., argn);<br />

înlocuieşte operandul desemnat de i (dacă i > 0, se înlocuieşte cel de al i-lea<br />

operand iar dacă i < 0, se înlocuieşte cel de al nops(expr) +i +1 operand) al<br />

expresiei expr cu f(operand_i, arg2, ..., argn) (f este o funcţie).<br />

Exemple:<br />

> f:=x->x^3+cos(x)*x^(1/3)+exp(-x^2);<br />

f := x → x 3 + cos( x ) x ( / )<br />

+<br />

1 3 e ( −x2 )<br />

> g:=(x,y)->x^2*exp(-x^2-y^2)+cos(x)*sin(y);<br />

> h:=(u,v,w)->sin(u)*cos(w)*v+u;<br />

g := ( x,<br />

y ) → x 2 e ( − x2 − y 2 )<br />

+ cos( x ) sin( y )<br />

h := ( u, v,<br />

w ) → sin( u ) cos( w)<br />

v + u<br />

> with(linalg):<br />

> x:=vector(3,[1,-1,0]);<br />

x := [ 1, -1,<br />

0 ]<br />

> map(f,x);<br />

[ 1 + cos( 1 ) + e ( -1 )<br />

, − 1 + cos( 1 ) ( -1 )<br />

( 1/<br />

3 )<br />

+ e ( -1 )<br />

, 1 ]<br />

> map(g,x,Pi/3);<br />

⎡<br />

⎛<br />

π 2 ⎞<br />

⎛<br />

⎜ − 1 −<br />

π 2 ⎞<br />

⎟<br />

⎝ 9 ⎠ 1<br />

⎜ − 1 −<br />

⎝ 9 ⎟<br />

⎠ 1<br />

⎢ e + cos( 1 ) 3 , e + cos( 1 ) 3 ,<br />

⎣ 2<br />

2<br />

> map(h,x,2,Pi/2);<br />

> map(h,x,2,Pi/4);<br />

[ 1, -1,<br />

0 ]<br />

3<br />

2<br />

⎤<br />

⎥<br />

⎦<br />

266


<strong>Metode</strong> <strong>Numerice</strong><br />

[ sin( 1 ) 2 + 1, − sin( 1 ) 2 − 1,<br />

0 ]<br />

> M:={Pi,-Pi,Pi/2,-Pi/2};<br />

M := { π, π , , }<br />

2 −π − π 2<br />

> map(h,M,3,Pi/3);<br />

3 π 3 π<br />

{ π, − − , + , }<br />

2 2 2 2 −π<br />

> map2(g,Pi/3, x);<br />

⎡<br />

1<br />

⎢<br />

⎣ 9 π2 e<br />

⎛<br />

⎜<br />

⎝<br />

− 1 −<br />

> map2(h,2, x,Pi/2);<br />

π 2 ⎞<br />

9 ⎟<br />

⎠ 1<br />

⎛<br />

⎜<br />

− 1 −<br />

π 2 ⎞<br />

⎟<br />

1 ⎜<br />

+ sin( 1 ), − ,<br />

2 9 π2 ⎝ 9 ⎟<br />

⎠ 1 1<br />

e sin( 1 )<br />

2 9 π2 e<br />

[ 2, 2,<br />

2 ]<br />

⎛<br />

⎜<br />

⎝<br />

− π2<br />

9<br />

⎞<br />

⎟<br />

⎠<br />

⎤<br />

⎥<br />

⎦<br />

> map(h,2, x,Pi/4);<br />

1<br />

sin( 2 ) 2 x + 2<br />

2<br />

> M:={Pi,-Pi,Pi/2,-Pi/2};<br />

M := { π, π , , }<br />

2 −π − π 2<br />

> map(h,3,M,Pi/3);<br />

1<br />

sin( 3 ) { π, π , , } +<br />

2 2 −π − π 3<br />

2<br />

> expr:=u*v+cos(u*v)/exp(-u^2);<br />

> applyop(f,1,expr);<br />

> applyop(g,1,expr,Pi/3);<br />

expr := u v +<br />

cos( u v )<br />

e ( −u2 )<br />

u 3 v 3 + cos( u v ) ( u v )<br />

( 1/<br />

3 )<br />

+ e ( −u2 v 2 ) cos( u v )<br />

+<br />

u 2 v 2 e<br />

> applyop(g,2,expr,0);<br />

⎛<br />

⎞<br />

⎜ − u 2 v 2 π 2<br />

−<br />

⎟<br />

⎝ 9 ⎠ 1<br />

+ cos( u v)<br />

3 +<br />

2<br />

e ( −u2 )<br />

cos( u v )<br />

e ( −u2 )<br />

267


Mădălina Roxana Buneci<br />

u v +<br />

cos( u v )<br />

2 e<br />

⎛<br />

cos( u v )<br />

2 ⎞<br />

−<br />

2<br />

⎛ ⎞<br />

⎜ ⎜ ⎟<br />

⎝ ⎝ e ( −u2 ) ⎟<br />

⎠ ⎠<br />

2<br />

( e ( −u2 )<br />

)<br />

> applyop(h,1,expr,0, Pi/2);<br />

> L:=[1,-1,1,2,3,-1,1,1];<br />

u v +<br />

cos( u v )<br />

e ( −u2 )<br />

L := [ 1, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

> op(1,L);<br />

> applyop(f,1,L);<br />

> op(3,L);<br />

> applyop(f,3,L);<br />

1<br />

[ 1 + cos( 1 ) + e ( -1 )<br />

, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

1<br />

[ 1, -1, 1 + cos( 1 ) + e ( -1 )<br />

, 2, 3, -1, 1,<br />

1 ]<br />

> applyop(g,3,L, Pi/2);<br />

> applyop(g,3,L, Pi);<br />

> applyop(h,3,L, 2,Pi/3);<br />

> applyop(h,3,L, 2,Pi/2);<br />

> applyop(h,-1,L, 2,Pi/3);<br />

⎡<br />

⎛ ⎞<br />

⎤<br />

⎜ − 1 −<br />

⎢ ⎝ 4 ⎟<br />

⎠<br />

⎥<br />

⎣ 1, -1, e + cos( 1 ), 2, 3, -1, 1,<br />

1 ⎦<br />

π 2<br />

[ 1, -1, e ( − 1 − π2 )<br />

, 2, 3, -1, 1,<br />

1 ]<br />

[ 1, -1, sin( 1 ) + 1, 2, 3, -1, 1,<br />

1 ]<br />

[ 1, -1, 1, 2, 3, -1, 1,<br />

1 ]<br />

[ 1, -1, 1, 2, 3, -1, 1 , sin( 1 ) + 1 ]<br />

268


<strong>Metode</strong> <strong>Numerice</strong><br />

A.7. Elemente de programare în MAPLE<br />

Vom prezenta câte două variante pentru fiecare instrucţiune. Prima variantă<br />

este valabilă în MAPLE V iar cea de a doua în versiuni mai noi de MAPLE.<br />

Anumite versiuni (cum ar fi MAPLE 8) admit ambele forme. Vom folosi ulterior<br />

prima variantă.<br />

A.7.1 Atribuirea. Decizia. Structuri repetitive<br />

Atribuirea are forma<br />

x:=v;<br />

Efectul acestei instrucţiuni constă în evaluarea expresiei v pentru valorile curente<br />

ale variabilelor pe care le conţine şi înscrierea rezultatului în locaţia de memorie<br />

rezervată variabilei x<br />

Decizia are forma:<br />

if condiţie then instrucţiuni1 else instrucţiuni2 fi;<br />

if condiţie then instrucţiuni1 else instrucţiuni2 end if;<br />

Da<br />

condiţie<br />

Nu<br />

Instrucţiuni1<br />

Instrucţiuni2<br />

Condiţia este o expresie logică (formată cu operatori logici sau relaţionali). Modul<br />

de execuţie al deciziei (precum rezultă din subschema logică de mai sus) este<br />

următorul:<br />

1. se evaluează condiţia<br />

2. dacă rezultatul este adevărat se execută instrucţiuni1, în caz contrar se<br />

execută instrucţiuni2.<br />

3. se trece la comanda care urmează după decizie<br />

În cazul în care else lipseşte se foloseşte forma simplificată:<br />

269


Mădălina Roxana Buneci<br />

if condiţie then instrucţiuni fi;<br />

Da<br />

condiţie<br />

instrucţiuni<br />

Nu<br />

1. se evaluează condiţia<br />

2. dacă rezultatul este adevărat se execută instrucţiuni<br />

3. se trece la comanda care urmează după decizie<br />

Un extra element elif (ţinând loc de else+if) poate fi adăugat în decizie, obţinând:<br />

Exemple:<br />

> a := 3; b := 7;<br />

if/then/elif/then…/else/fi<br />

a := 3<br />

b := 7<br />

> if (a > b) then a else b fi;<br />

> if (a > b) then c:=7 fi;<br />

> c;<br />

7<br />

c<br />

> if (a > b) then c:=7 elif (a


<strong>Metode</strong> <strong>Numerice</strong><br />

iniţială (respectiv finală) a contorului. Modul de execuţie al acestei instrucţiuni este<br />

următorul:<br />

1. se execută atribuirea i : = ei<br />

2. se evaluează condiţia i ≤ ef dacă p > 0 (sau i ≥ ef dacă p < 0), şi dacă<br />

este îndeplinită această condiţie se trece la pasul 3, altfel se trece la<br />

pasul 5<br />

3. se execută instrucţiuni<br />

4. se execută atribuirea i := i + p<br />

5. se execută comanda care urmează după for<br />

Pentru p >0 comanda este echivalentă cu următoarea subschemă logică:<br />

i := ei<br />

Nu<br />

Da<br />

i ≤ ef instrucţiuni i: = i + p<br />

Pentru p < 0 comanda este echivalentă cu următoarea subschemă logică:<br />

i := ei<br />

Nu<br />

Da<br />

i ≥ ef instrucţiuni i: = i + p<br />

Construcţiile from ei şi by p pot lipsi, caz în care ei se ia 1 şi pasul se consideră egal<br />

cu 1.<br />

271


Mădălina Roxana Buneci<br />

(2) for i from ei by p while condiţie do instrucţiuni od;<br />

for i from ei by p while condiţie do instrucţiuni end do;<br />

Modul de execuţie al acestei instrucţiuni este următorul:<br />

1. se execută atribuirea i : = ei<br />

2. se evaluează condiţia trecută după while, şi dacă este îndeplinită, se<br />

trece la pasul 3, altfel se trece la pasul 5<br />

3. se execută instrucţiuni<br />

4. se execută atribuirea i := i + p<br />

5. se execută comanda care urmează după for<br />

Comanda este echivalentă cu următoarea subschemă logică:<br />

i := ei<br />

Da<br />

condiţie instrucţiuni i: = i + p<br />

Nu<br />

Ca şi înainte construcţiile from ei şi by p poate lipsi, caz în care ei se ia 1, iar pasul<br />

se consideră egal cu 1. Condiţia este dată printr-o expresie booleană.<br />

Ambele clauze to şi while pot fi prezente în instrucţiunea for:<br />

(3) for i from ei by p to ef while condiţie do instrucţiuni od;<br />

for i from ei by p to ef while condiţie do instrucţiuni end do;<br />

În acest caz<br />

1. se execută atribuirea i : = ei<br />

2. se evaluează condiţia i ≤ ef dacă p > 0 (sau i ≥ ef dacă p < 0), şi condiţia<br />

trecută după while; dacă amândouă sunt îndeplinite se trece la pasul 3,<br />

altfel se trece la pasul 5<br />

3. se execută instrucţiuni<br />

4. se execută atribuirea i := i + p<br />

5. se execută comanda care urmează după for<br />

272


<strong>Metode</strong> <strong>Numerice</strong><br />

În cazul următoarei instrucţiuni for contorul i parcurge toate elementele unei liste<br />

sau unei mulţimi (expr):<br />

(4) for i in expr while condiţie do instrucţiuni od;<br />

for i in expr while condiţie do instrucţiuni end do;<br />

Exemple:<br />

> for i from 6 by 2 to 10 do print(i) od;<br />

6<br />

8<br />

10<br />

> suma := 0;<br />

suma := 0<br />

> for i from 11 by 2 while i < 15 do suma := suma + i od;<br />

suma := 11<br />

suma := 24<br />

> L:=[1,5,3];<br />

> suma:=0;<br />

L := [ 1, 5,<br />

3 ]<br />

suma := 0<br />

> for z in L do suma:=suma+z od;<br />

Ciclu cu test iniţial are forma:<br />

suma := 1<br />

suma := 6<br />

suma := 9<br />

while condiţie do instrucţiuni od;<br />

while condiţie do instrucţiuni end do;<br />

Testul pentru repetarea calculelor se face înaintea execuţiei grupului de comenzi<br />

care trebuie repetate. Dacă este îndeplinită condiţia, se execută instrucţiunile după<br />

care se reevaluează condiţia. În caz contrar, se trece la comanda care urmează după<br />

ciclul cu test iniţial. Subschema logică echivalentă este următoarea:<br />

273


Mădălina Roxana Buneci<br />

condiţie<br />

Nu<br />

Da<br />

instrucţiuni<br />

Condiţie reprezintă o expresie booleană.<br />

Exemple:<br />

> x:=234;<br />

x := 234<br />

> while x>0 do x:=iquo(x,10,'r');print(r) od;<br />

x := 23<br />

4<br />

x := 2<br />

3<br />

x := 0<br />

2<br />

A.7. 2. Proceduri în MAPLE<br />

În principal, necesitatea subprogramelor se datorează faptului că de multe<br />

ori algoritmul prevede executarea aceloraşi instrucţiuni pentru date diferite. Grupul<br />

de instrucţiuni care se repetă poate constitui o unitate distinctă căreia i se dă un<br />

nume şi un set de parametri. Ori de câte ori va fi necesară execuţia acestui grup de<br />

instrucţiuni se specifică numele şi parametrii care actualizează grupul de<br />

instrucţiuni (astfel se scurtează dimensiunea şi creşte claritate programului). Grupul<br />

de instrucţiuni se numeşte procedură (procedure) în MAPLE.<br />

Forma unei proceduri este:<br />

nume:=proc (param1, param2,…)<br />

local lista declaraţii locale;<br />

global lista declaraţii globale;<br />

274


<strong>Metode</strong> <strong>Numerice</strong><br />

options listă opţiuni;<br />

description descriere;<br />

instrucţiuni<br />

end;<br />

În variantele mai noi de Maple end de la sfârşit se va înlocui cu end proc.<br />

Nu toate elementele de mai sus sunt obligatorii. Dacă este necesar ca<br />

procedura să întoarcă o valoare, se poate folosi apelul<br />

RETURN(v)<br />

în şirul de instrucţiuni din corpul procedurii.<br />

Parametrii care apar în scrierea unei proceduri se numesc parametrii<br />

formali, ei având un rol descriptiv (un parametru formal este o variabilă al cărei<br />

nume este cunoscut, dar al cărei conţinut nu este precizat decât în momentul<br />

execuţiei). În cadrul listei, parametrii formali sunt separaţi prin virgulă. Numele<br />

procedurii (nume) este un identificator MAPLE. Apelul unei proceduri se face cu<br />

comanda:<br />

nume (listă parametrii actuali)<br />

parametrii actuali fiind expresii despărţite între ele prin virgulă în cadrul listei. În<br />

momentul execuţiei parametrii actuali substituie parametrii formali. Un apel de<br />

procedură determină următoarele acţiuni:<br />

♦<br />

♦<br />

se stabileşte corespondenţa între argumente şi parametrii<br />

se execută instrucţiunile subprogramului, până când se ajunge la end sau la<br />

o instrucţiune RETURN. Efectul acestor instrucţiuni (end şi RETURN)<br />

este întoarcerea în unitatea de program în care a avut loc apelul, şi anume la<br />

instrucţiunea ce urmează imediat acestui apel (precizăm că o procedură<br />

poate apela la rândul său o altă procedură). Un apel de procedură este corect<br />

dacă între parametrii actuali şi cei formali există o corespondenţă atât ca<br />

număr, cât şi ca tip şi organizare.<br />

275


Mădălina Roxana Buneci<br />

Exemplu:<br />

Să presupunem că se dă un număr întreg pozitiv x, şi se cere lista cifrelor<br />

corespunzând reprezentării binare a lui x. Procedura următoare rezolvă această<br />

problemă.<br />

> lbinar:=proc(x)<br />

local y,L;<br />

y:=x; L:=[];<br />

while y>0 do<br />

L:=[irem(y,2,'c'),op(L)];y:=c;<br />

od;<br />

RETURN(L)<br />

end;<br />

> lbinar(27);<br />

[ 1, 1, 0, 1,<br />

1 ]<br />

> lbinar(32);<br />

[ 1, 0, 0, 0, 0,<br />

0 ]<br />

Procedura lbinarfr de mai jos întoarce lista primelor n cifre ale reprezentării<br />

binare a unui număr x, cu proprietatea 0≤x lbinarfr:=proc(x,n)<br />

local y,i,L;<br />

y:=x;L:=[];<br />

for i from 1 to n do y:=y*2;<br />

RETURN(L)<br />

end;<br />

L:=[op(L),floor(y)];y:=frac(y)od;<br />

> lbinarfr(0.15,10);<br />

[ 0, 0, 1, 0, 0, 1, 1, 0, 0,<br />

1 ]<br />

Procedura lbin întoarce lista cifrelor binare corespunzătoare unui număr real<br />

x. Pentru partea fracţionară a numărului se reţin n cifre. Procedura lbin apelează<br />

procedurile precedente.<br />

> lbin:=proc(x,n)<br />

local y,L1,L2,L;<br />

y:=abs(x);<br />

276


<strong>Metode</strong> <strong>Numerice</strong><br />

L1:=lbinar(floor(y));<br />

L2:=lbinarfr(frac(y),n);<br />

L:=[L1,L2];<br />

RETURN(L)<br />

end;<br />

> lbin(23.15,10);<br />

[ [ 1, 0, 1, 1,<br />

1 ], [ 0, 0, 1, 0, 0, 1, 1, 0, 0,<br />

1 ] ]<br />

277


Mădălina Roxana Buneci<br />

278


<strong>Metode</strong> <strong>Numerice</strong><br />

BIBLIOGRAFIE<br />

1. K. E. Atkinson, An Introduction to Numerical Analysis, Wiley, New York,<br />

1978.<br />

2. G. Bal, Lecture notes, course on numerical analysis, 2002.<br />

http://www.columbia.edu/~gb2030/COURSES/E6302/NumAnal.ps.<br />

3. B. J. C. Baxter and A. Iserles, On the foundations of computational<br />

mathematics, In P. G. Ciarlet and F. Cucker, editors, Handbook of<br />

Numerical Analysis, volume XI, pages 3–34. North Holland Elsevier,<br />

Amsterdam, 2003.<br />

4. C. M. Bucur, C.A. Popeea, Gh. Gh. Simion, Matematici Speciale-Calcul<br />

Numeric, Editura Didactică şi Pedagogică, Bucuresti, 1983.<br />

5. M. Buneci, <strong>Metode</strong> <strong>Numerice</strong> - Lucrări de laborator, Editura Academica<br />

Brâncusi, 2003.<br />

6. R. L. Burden, J.d: Faires, Numerical Analysis, 5th ed. PWS Publishing,<br />

Boston, 1993.<br />

7. Ghe. Coman, Analiză numerică, Editura Libris Cluj-Napoca, 1995.<br />

8. G. Dahlquist şi A. Bjorck, Numerical Methods in Scientific Computing, Vol<br />

I, SIAM, 2007.<br />

9. S. Dimitriu, E. Cerna Mladin, M. Stan, <strong>Metode</strong> <strong>Numerice</strong>, Editura Matrix<br />

Rom, Bucureşti, 2001.<br />

10. B. Dumitrescu, C. Popeea, B. Jora, <strong>Metode</strong> de calcul numeric matricial.<br />

Algoritmi fundamentali, Editura ALL Educational, Bucureşti, 1998.<br />

11. Gh. Dodescu, M.Toma, <strong>Metode</strong> de calcul numeric, Editura Didactică şi<br />

Pedagogică, Bucureşti, 1976.<br />

12. Gh. Grigore, Lecţii de analiză numerică, Tipografia Univ. Bucuresti, 1990.<br />

279


Mădălina Roxana Buneci<br />

13. J. Hoffman, Numerical Methods for Engineers and Scientist, McGraw-Hill,<br />

New York, 1992.<br />

14. V. Iorga, <strong>Metode</strong> numerice. Îndrumar de laborator, Institutul Politehnic<br />

Bucureşti, 1992.<br />

15. G. Marinescu, Analiză numerică, Editura Academiei R.S. România, 1974.<br />

16. M.B. Monagan, K.O. Geddes, K.M. Heal, G. Labahn, S.M. Vorkoetter, J.<br />

McCarron and P. DeMarco, Maple 8 Advanced Programming Guide.<br />

Waterloo Maple Inc., Waterloo, Ontario, Canada, 2002.<br />

17. S. Pav, Numerical Methods Course Notes, 2004 (UCSD),<br />

http://scicomp.ucsd.edu/~spav/pub/numas.pdf.<br />

18. M. Popa ş.a., Noţiuni de analiză numerică, Sitech Craiova, 2001.<br />

19. M. Postolache, <strong>Metode</strong> numerice în algebră, Universitatea Politehnică<br />

Bucureşti, 1993.<br />

20. A. Rusu Casandra ş.a., <strong>Metode</strong> numerice pentru calculul structurilor,<br />

Editura Universităţii Politehnica Bucureşti, 1998.<br />

21. M. Stan ş.a., <strong>Metode</strong> numerice, Editura Matrix Rom Bucureşti, 2001.<br />

22. J. Stoer şi R. Bulirsch, Introduction to Numerical Analysis (3rd ed.),<br />

Springer, 2002.<br />

280


<strong>Metode</strong> <strong>Numerice</strong><br />

INDEX<br />

A<br />

adjunctul unui operator liniar şi<br />

mărginit, 56<br />

algebră Banach, 54<br />

algoritm polinomial, 16<br />

algoritm stabil, 14<br />

algoritmul Romberg, 224<br />

aplicaţie liniară, 54<br />

aproximare a derivatei prin diferenţe<br />

finite progresive, 192<br />

aproximare a derivatei prin diferenţe<br />

finite regresive, 194<br />

aproximare a derivatelor prin<br />

diferenţe finite centrale, 190<br />

aritmetica în virgulă mobilă, 45<br />

B<br />

bază ortonormală, 55<br />

bază, 17<br />

bit ascuns, 39<br />

bit de semn, 34<br />

bitul cel mai puţin semnificativ, 30<br />

bitul cel mai semnificativ, 30<br />

C<br />

calculul determinantului unei matrice<br />

prin metoda de eliminare Gauss, 70<br />

calculul inversei unei matrice prin<br />

metoda de eliminare Gauss, 71<br />

catastrophic cancellation, 47<br />

cifră în baza b, 17<br />

cifre semnificative, 36<br />

cod complementar, 32<br />

cod direct, 31<br />

cod invers, 31<br />

coeficienţi<br />

ˆ Newton-Cotes , 212<br />

complementul ortogonal, 56<br />

conjugata unei matrice, 57<br />

contracţie, 116<br />

conversie, 19<br />

cuadratură Gauss, 227<br />

D<br />

derivare numerică folosind diferenţe<br />

finite, 189<br />

derivare numerică folosind<br />

interpolarea, 206<br />

desfacere a standard a unei matrice,<br />

82<br />

desfacere a unei matrice, 81<br />

diferenţă finită divizată, 171<br />

diferenţă finită la dreapta, 161<br />

diferenţă finită la stânga, 167<br />

281


Mădălina Roxana Buneci<br />

dimensiunea unui spaţiu Hilbert, 56<br />

dualul unui spaţiu normat, 55<br />

element de cea mai bună aproximare,<br />

175<br />

E<br />

elemente ortogonale, 55<br />

eroare a datelor, 11<br />

eroare backward, 12<br />

eroare de calcul, 10<br />

eroare de interpolare în cazul<br />

nodurilor Cebîşev, 143<br />

eroare de interpolare în cazul<br />

nodurilor echidistante, 142<br />

eroare de interpolare, 140<br />

eroare de metodă, 9<br />

eroare de rotunjire, 9 , 11<br />

eroare de trunchiere, 9, 11<br />

eroare forward, 12<br />

eroare inerentă, 9<br />

eroarea absolută, 10<br />

eroarea relativă , 10<br />

extrapolare Richardson, 205<br />

F<br />

factor de condiţionare în cazul<br />

rezolvării unei ecuaţii neliniare, 91<br />

factor de condiţionare în cazul<br />

rezolvării unui sistem neliniar, 105<br />

factorul de condiţionare al unei<br />

matrice, 74<br />

factorul de condiţionare, 13<br />

fl(x), 37<br />

forma normalizată – exponentul, 35<br />

forma normalizată – mantisa, 35<br />

forma normalizată, 35<br />

formula dreptunghiurilor, 212<br />

formula generală de cuadratură, 210<br />

formula lui Simpson, 223<br />

formula trapezelor, 218<br />

formula<br />

ˆ Newton-Cotes , 212<br />

funcţie pondere, 179<br />

I<br />

IEEE-754- dublă precizie (doubleprecission),<br />

41<br />

IEEE-754-simplă precizie (singleprecission),<br />

40<br />

Inf, 39<br />

integrarea numerică, 209<br />

M<br />

matrice diagonal dominantă, 84<br />

matrice diagonală, 58<br />

matrice hermitiană, 58<br />

matrice inferior Hessenberg, 58<br />

matrice inferior triunghiulară, 58<br />

matrice inversabilă, 58<br />

matrice nesingulară, 58<br />

matrice ortogonală, 58<br />

matrice simetrică, 58<br />

matrice superior Hessenberg, 58<br />

matrice superior triunghiulară, 58<br />

matrice tridiagonală, 58<br />

matrice unitară, 58<br />

matricea unitate, 57<br />

282


<strong>Metode</strong> <strong>Numerice</strong><br />

metoda bisecţiei (metoda înjumătăţirii<br />

intervalului), 93<br />

metoda celor mai mici pătrate, 178<br />

metoda coardei, 96<br />

metoda de eliminare Gauss, 62<br />

metoda Gauss-Seidel, 87<br />

metoda Jacobi, 83<br />

metoda lui Newton, 127, 104<br />

metoda Newton simplificată, 134<br />

metoda Newton-Kantorovici, 138<br />

metoda punctului fix, 116<br />

metoda tangentei, 104<br />

metode directe de rezolvare a<br />

sistemelor liniare, 61<br />

metode iterative de rezolvare a<br />

sistemelor liniare, 80<br />

minori principali, 60<br />

N<br />

NaN, 39<br />

negativ definită, 60<br />

negativ semidefinită, 60<br />

noduri Cebîşev, 143<br />

norma 1 ||⋅|| 1 , 57<br />

norma ∞ ||⋅|| ∞ , 57<br />

norma euclidiană ||⋅|| 2 , 57<br />

normă completă, 54<br />

normă operatorială asociată unei<br />

matrice, 59<br />

normă, 53<br />

norme echivalente, 54<br />

numere denormalizate („denormalized<br />

floating-point numbers”), 39<br />

O<br />

OFL (overflow level), 37<br />

operator liniar şi mărginit, 55<br />

ordine lexicografică, 17<br />

overflow, 37<br />

P<br />

pivotare completă, 63<br />

pivotare parţială, 63<br />

polinoame Cebîşev de speţa a II-a,<br />

230<br />

polinoame Cebîşev de speţa I, 230<br />

polinoame Jacobi, 230<br />

polinoame Legendre,229<br />

polinom de interpolare, 139<br />

polinom generalizat, 179<br />

polinom Lagrange de interpolare, 144<br />

polinom Newton cu diferenţe<br />

divizate, 171<br />

polinom Newton de interpolare de<br />

speţa a II-a (descendent), 166<br />

polinom Newton de interpolare de<br />

speţa I (ascendent), 161<br />

pondere(integrare numerică), 209<br />

pozitiv definită, 60<br />

pozitiv semidefinită, 60<br />

precizie a maşinii, 38<br />

precizie, 36<br />

problemă bine condiţionată, 13<br />

problemă rău condiţionată, 13<br />

283


Mădălina Roxana Buneci<br />

produs scalar, 55<br />

produsul scalar canonic, 57<br />

punct fix, 116<br />

R<br />

rată de convergenţă, 92, 116<br />

rată liniară de convergenţă, 92, 116<br />

rată pătratică de convergenţă, 92, 116<br />

rată superliniară de convergenţă, 92,<br />

116<br />

raza spectrală, 59<br />

rădăcină a unei ecuaţii, 91<br />

reprezentare complement faţă de 1,31<br />

reprezentare complement faţă de 2, 32<br />

reprezentare în virgulă mobilă<br />

normalizată, 37<br />

reprezentare în virgulă mobilă, 36<br />

reprezentare periodică în baza b, 25<br />

reprezentare semn şi valoare absolută,<br />

31<br />

reprezentarea internă a numerelor<br />

întregi fără semn, 29<br />

reprezentarea unui număr întreg în<br />

baza b, 19<br />

reprezentarea unui număr real în baza<br />

b, 21<br />

restul formulei generale de<br />

cuadratură, 211<br />

rezolvarea unui sistem liniar prin<br />

metoda de eliminare Gauss , 67<br />

rotunjire la cel mai apropiat număr în<br />

virgulă mobilă (rotunjire la par), 38<br />

rotunjire prin tăiere, 37<br />

S<br />

sistem de numeraţie, 17<br />

sistem ortogonal, 55<br />

sistem ortonormal, 55<br />

sistemul normal al lui Gauss, 180<br />

soluţie a unei ecuaţii, 91<br />

soluţie a unui sistem neliniar, 105<br />

spaţiu Banach, 54<br />

spaţiu Hilbert, 55<br />

spaţiu normat, 53<br />

spaţiu pre-Hilbert, 55<br />

spaţiul operatorilor liniari şi mărginiţi,<br />

55<br />

spectru, 59<br />

standardul IEEE-754, 39<br />

T<br />

transpusa unei matrice, 57<br />

trunchiere, 37<br />

U<br />

UFL (underflow level), 37<br />

underflow, 37<br />

V<br />

valoare proprie, 59<br />

vector propriu, 59<br />

Z<br />

zerou al funcţiei, 91<br />

284

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!