Metode Numerice - aspecte teoretice Åi practice
Metode Numerice - aspecte teoretice Åi practice
Metode Numerice - aspecte teoretice Åi practice
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