Sei sulla pagina 1di 77

METODE NUMERICE

1. Numere aproximative

1.1. Erori aproximative si erori absolute

Daca A este valoarea exacta a unei cantitati si a este o aproximatie cunoscuta a


acesteia, atunci eroarea absoluta a aproximatiei a se considera de obicei a fi marimea
∆a care satisface relatia

a − A ≤ ∆a (1.1)

Pentru scopuri practice este convenabil sa se ia pentru ∆ a valoarea cea mai


mica pentru care este satisfacuta inegalitatea de mai sus sub circumstantele date..
Numarul exact A poate si scris atunci

A = a ± ∆a (1.2)

Eroarea relativa ∂ a a unui numar aproximativa este egala cu raportul dintre


eroarea absoluta ∆ a a numarului si valorea sa absoluta:

∆a
δa = (a ≠ 0) (1.3)
a
∆a
Uneori, eroarea relativa se defineste ca raportul A , cu A valoarea exacta insa

necunoscuta. Introducand ∆ a din (1.3) in (1.2), rezulta limite pentru numarul exact
A:

A = a(1 ± δ a ) (1.4)

Exemplu:

Fie numarul aproximativ a = 3.14, utilizat in locul numarului exact A = π .


Avand in vedere ca 3.14 < π < 3.15, rezulta ca a − π < 0.01 si se poate lua eroarea

absoluta ∆ a =0.01.
Corespunzator avem eroarea relativa δa = 0.01/3.14 = 0.003 si deci putem
scrie π = 3.14(1 ± 0.003).

1
METODE NUMERICE

1.2. Sursele si clasificarea erorilor

Erorile care apar în rezolvarea numeric a problemelor matematice se împart, în


esen , în cinci categorii: erori de problema, erori de metod , erori ini iale, erori de
rotunjire i erori de trunchiere.

Erorile de problem sunt cauzate de faptul c nu totdeauna formularea matematic


descrie exact procesul modelat, deoarece de multe ori, pentru a reduce complexitatea
formul rii, suntem forta i s accept m conditii simplificatoare.

Erorile de metod se datoreaz faptului c uneori este dificil , dac nu chiar


imposibil rezolvarea formul rii exacte a problemei. In aceste cazuri, problema este
înlocuit cu o problem aproximativ , pentru care exist tehnici adecvate de rezolvare
si care are un rezultat foarte apropiat. Metodele numerice sunt în majoritatea
contextelor în care sunt utilizate metode de aproximare.

Erorile initiale (inerente) sunt erori în valorile datelor, cauzate de incertitudini în


sur tori sau de natura inerent aproximativ a reprezent rii numerelor cu ajutorul
unui num r finit de cifre.

Erorile de rotunjire sunt cauzate de reprezentarea numerelor (date ini iale sau
rezultate ale unor calcule) cu un num r finit de cifre semnificative exacte.

De exemplu:
reprezentarea rezultatului opera iei 1/3 sub forma 0.333 implic o eroare de
trunchiere de aproximativ 3x10-4. Erorile de rotunjire depind de particularit ile
hardware ale calculatorului, de modul de reprezentare intern al diferitelor tipuri de
date utilizate în calcule. Erorile de rotunjire se acumuleaz prin cre terea num rului de
calcule, mai ales al celor care implic sc derea unor valori aproximativ egale.

Erorile de trunchiere (reziduale) provin din natura infinit a unor procese utilizate
în descrierea solutiei problemelor matematice. Faptul c , practic, aceste procese
trebuie întrerupte dup un num r finit de paji, introduce o eroare de trunchiere.
Considerand exemplul dezvolt rii func iilor în serie, însumarea trebuie întrerupt la un
anumit termen, trunchiind seria i introducand o anumit eroare de trunchiere.
Metodele numerice permit, în principiu, controlul erorilor de rotunjire i al celor
de trunchiere, cu condi ia transcrierii adecvate a algoritmului. Astfel, în cazul erorilor
de rotunjire, trebuie considerat acea form a expresiilor matematice, în care sunt
evitate operatiile care introduc acest tip de erori. In ceea ce prive te erorile de
trunchiere, acestea se afl sub controlul deplin al programatorului, care îns trebuie s
fie preocupat de construirea unor algoritmi fini i i eficien i. Dac finitudinea
algoritmului este obligatorie pentru convergenta rezultatelor, eficienta este o reflectare
direct a experien ei i stilului de programare.

2
METODE NUMERICE

1.3 Reprezentarea numerelor. Cifre semnificative exacte.

Orice num r pozitiv poate fi reprezentat în baza 10 sub forma

a = αm • 10m + αm − 1 • 10m −1 + Κ + αm − n + 1 • 10m − n + 1 + Κ (1.5)

unde α i , sînt cifrele num rului a, cu αm ≠ 0 .

De exemplu:

314.15 = 3*102 + 1*101 + 4*100 + 1*10-1 + 5*10-2.

Situa iile concrete implic utilizarea unor numere aproximative cu un num r finit
de cifre. Toate cele n cifre zecimale re inute αi , i = m, m-1, . . ., m-n+1 , se numesc
cifre semnificative. Unele dintre cifrele semnificative pot fi egale cu zero, cu excep ia
primei cifre, α m .
De exemplu, în num rul 0.00208 = 0*10-3 + 0*10-4 + 8*10-5, primele trei
zerouri nu sunt cifre semnificative, deoarece ele servesc numai pentru fixarea pozi iei
punctului zecimal în scrierea zecimal a num rului.

Defini ie. Spunem c un num r aproximativ a are n cifre semnificative exacte,


αm , αm −1 , Κ , αm − n + 1 dac , eroarea absolut
a num rului nu dep este jum tate de
unitate în pozi ia n , num rand de la stînga la dreapta, adic

1
∆a ≤ • 10 m − n +1 (1.6)
2
De exemplu, num rul a = 36.00 este în raport cu num rul exact A = 35.97 o
aproxima ie cu trei cifre semnificative exacte. Intr-adev r, avînd în vedere ca |a - A|=
0.03 < 1/2*10-1, rezult m-n+1 = -1, de unde n=3 (m=1).

Termenul "n cifre semnificative exacte" nu trebuie luat ad literam, deoarece nu


este obligatoriu ca într-un num r aproximativ a avînd n cifre exacte, primele n cifre
semnificative coincid cu cifrele corespunz toare ale num rului exact A. De
exemplu, num rul a = 9.995 este o aproxima ie cu trei cifre corecte a num rului exact
A=10 i totu i are toate cifrele diferite.

Teorem . Dac un num r pozitiv a are n cifre exacte, eroarea relativ δa a acestui
num r satisface inegalitatea

1 (1.7)
δa ≤ • 10 − (n −1)
2 αm

3
METODE NUMERICE

unde αm este prima cifr semnificativ a num rului a.

Intr-adev r,

∆a (1 / 2) • 10m − n + 1 1
δa = ≤ ≤ • 10 − (n −1)
a m m − 1 2αm
αm • 10 + αm − 1 • 10 +Κ

Num rul de cifre semnificative exacte corespunz tor unei erori relative δa date
este conform relatiei (1.7).

n ≤ 1 − log10 (2δaαm ) (1.8)

De exemplu, num rul aproximativ a = 3.15, utilizat în locul num rului exact
A= π , are n <= 2.72 , adic dou cifre exacte.
Num rul aproximativ a = 3.14 va avea n <= 3.29, adic trei cifre exacte.

Pentru num rul de cifre semnificative exacte, se poate ob ine o estimare


grosier îns foarte util în practic , considerînd c eroare relativ are forma
δa ≈ 10−p si αm ≈ 5 :
n≈p (1.9)

Acest criteriu poate fi utilizat în situa iile în care, cunoscîndu-se eroarea relativ
a unui num r, se impune estimarea rapid îns nu neap rat foarte precis a num rului
de cifre exacte ale acestuia.

1.4 Erori ale operatiilor elementare

1.4.1 Eroarea sumei

Teorem . Eroarea absolut pentru suma algebric a mai multor numere


aproximative nu dep te suma erorilor absolute ale numerelor.

Intr-adev r, considerînd suma algebric a numerelor aproximative a1, a2, . . . ,


an :
a = ± a1 ± a2 ± Κ ± an

avem în mod evident

4
METODE NUMERICE

∆a = ± ∆a1 ± ∆a2 ± Κ ± ∆an


si deci,

∆a ≤ ∆a1 + ∆a2 + Κ + ∆an

Pentru eroarea absolut a sumei avem, prin urmare,

∆a ≤ ∆a1 + ∆a2 + Κ + ∆an (1.10)

iar pentru eroarea absolut limit ,

∆*a = ∆ a1 + ∆ a2 + Κ + ∆ an (1.11)

Din aceast relatie rezult c eroarea absolut limit nu poate fi mai mic decat
eroarea absolut a celui mai pu in exact termen din sum

∆* a ≥ max(∆ a1 , ∆ a2 ,Κ , ∆ an ) (1.12)

In consecint , ceilal i termeni, cu grad de precizie mai mare (cu erori absolute
mai mici) nu pot ameliora precizia rezultatului.

Teorem . Dac toti termenii unei sume au acela i semn, eroarea relativ (limit ) a
sumei nu dep te cea mai mare eroare relativ a termenilor.

1.4.2 Eroarea diferen ei

Consider m diferen a a doua numere aproximative a = a1 – a2

Conform rela iei (1.11), eroarea absolut limit a diferen ei este egal cu suma erorilor
absolute ale celor doi termeni

∆*a = ∆ a1 + ∆a2

si eroarea relativ limit a diferen ei va fi

∆*a ∆ a1 + ∆ a2
δ*a = =
A A1 − A2
unde A este valoarea exact a modulului diferen ei.

5
METODE NUMERICE

Dac numerele aproximative a 1 i a2 sunt foarte apropiate ca valoare, atunci


diferen a exact A este mic i, chiar în condi iile în care erorile relative δa1 i δ a2
*
sunt mici, eroarea relativ limit a diferen ei, δ a , poate fi foarte mare.

Pentru a exemplifica cele ar tate mai sus, consider m numerele aproximative


a1=47.132 i a2=47.111 , fiecare avînd cinci cifre semnificative exacte, adic o eroare
absolut de cel mult 0.0005. Diferen a a=47.132 -47.1 11 = 0.021 are doar dou cifre
semnificative exacte, iar eroarea absolut limit a diferen ei este

∆*a =0.0005+0.0005 =0.001

si vom avea urm toarele erori relative limit

0.0005 0.0005 0.001


δ a1 = ≈ 0.00001 , δ a =
2
≈ 0.00001 , δ* a = ≈ 0.05
47.132 47.111 0.021
Dup cum se observ , eroarea relativ limit a diferen ei este de aproximativ
5000 de ori mai mare decat erorile relative ale termenilor. Este de aceea de dorit, ca în
calcule numerice s se rescrie expresiile care implic sc derea unor numere
aproximativ egale.

6
METODE NUMERICE

2. Rezolvarea numeric a ecua iilor algebrice i transcendente

Exist numeroase situa ii în care avem de rezolvat ecua ii polinomiale sau


nepolinomiale (transcendente) cu o singur variabil de forma f ( x ) = 0 ale c ror solu ii nu se
pot determina prin metodele algebrice cunoscute. Pentru rezolvarea acestor ecua ii este
necesar mai întâi s se identifice printr-o anumit metod intervalele în care se afl exact o
cin a ecua iei.
Pentru ca ecua ia s aib o solu ie în acest interval [a , b ] este necesar ca func ia f ( x )
fie continu , strict monoton , adic f ′( x ) s aib acela i semn pe intervalul [a , b ] i func ia
prezinte schimbarea de semn: f ( a ) ⋅ f ( b ) < 0 . Aceste condi ii pentru determinarea solu iilor
sunt echivalente cu urm toarele ipoteze:
Ø f : [a , b ] → R este o func ie continu i derivabil (func ie Rolle);
 f ( a ) < 0, f ( b ) > 0
Ø f ( a )⋅ f (b ) < 0  ;
 f ( a ) > 0, f ( b ) < 0
Ø f ( x ) are numai o singur solu ie pe [a , b ] .
Metodele cele mai utilizate în calculul numeric aproximativ al solu iilor unei ecua ii care
satisface ipotezele de mai sus sunt:
1. Metoda înjum irii intervalului (bisec iei);
2. Metoda coardei (secantei);
3. Metoda tangentelor de ordinul I (Newton Raphson);
4. Metoda tangentelor de ordinul II (Newton)
5. Metoda parabolelor (Blumenfeld)
6. Metoda iterativ : x=g(x)
Pentru extragerea r cinii de ordinul k dintr-un num r N se poate folosi una din metodele
lui Newton (tangentelor de ordinul I sau II).
În continuare sunt prezentate aceste metode i modul de aplicare al lor pentru un
exemplu concret.

2.1. Metoda înjum irii intervalului (bisec iei)

Este cea mai simpl metod de determinare a r cinii unei ecua ii f ( x ) = 0 care se
afl în intervalul [a , b ] . Pentru aplicarea acestei metode se verific dac :
Ø f : [a , b ] → R este o func ie continu i derivabil ;
Ø f (a )⋅ f (b )< 0
Metoda înjum irii intervalului sau a bisec iei se bazeaz pe urm torul algoritm:
1. se calculeaz valoarea func iei f(x) la capetele intervalului i într-un punct situat la mijlocul
a+b
intervalului: x = c =
2

1
METODE NUMERICE

2. Se verific semnele func iei în cele trei puncte ale intervalului (a, c, b) i subintervalul în
care func ia prezint schimbarea de semn; acest subinterval este noul interval în care afl
cina. Sunt posibile urm toarele variante prezentate în tabelul urm tor :

Tabelul 1
F(a) f(b) f(c) cina ξ
- + + ξ ∈ (a ,c )
- + - ξ ∈ (c ,b )
+ - + ξ ∈ (c ,b )
+ - - ξ ∈ (a ,c )
Pentru noul interval se procedeaz analog calculând valorile func iei la capele lui i la
mijloc, din semnele func iei în cele trei puncte rezultând subintervalul pentru care are loc
schimbarea de semn;
y a1 + b1
c2 =
2 y=f(x)

x=a

O x=b x
a +b
c1 =
2
Fig. 1

Procesul este iterativ i se încheie atunci când se ob ine o eroare mai mic decât
precizia impus r cinii : a − b < ε
Exemplu
se afle r cina ecua iei algebrice:
ln x + 3 x − 4 x − 1 = 0 ,
2

cu o eroare mai mic de 0,02 tiind c se afl în intervalul [1, 2]


Pentru determinarea solu iei ecua iei se aplic algoritmul prezentat mai sus: rezult
valorile din tabelul 2:
Tabelul 2
Nr a c b f(a) f(c) f(b)
1. 1 1,5 2 -2 0,155465 3,693
2. 1 1,25 1,5 -2 -1,089 0,155465
3. 1,25 1,375 1,5 -1,089 -0,50967 0,155465
4. 1,375 1,4375 1,5 -0,50967 -0,1878 0,155465
5. 1,4375 1,46875 1,5 -0,1878 -0,0189 0,155465
6. 1,46875 1,484375 1,5 -0,0189 0,0676 0,155465
7. 1,46875 1,4765625 1,484375 -0,0189 0,024177
2
Se observ din rezultatele ob inute c aceast metod este slab convergent . Solu ia
aproximativ a ecua iei este ξ=1,4765625 calculat cu o eroare: ε = 1,4765625-1,
46875=0,0078125

2
METODE NUMERICE

Implementare in C++:

/*

Rezolvarea numerica a ecuatiilor algebrice si transcedentale

1. Metoda bisectiilor (metoda injumatatirii)

*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>

float a,b,c,eps;
int i,n;

float functie(float x)
{
return ( log(x) + 3*x*x - 4*x - 1);
}
void bisectie(float a, float b)
{
if( ( functie(a) < 0 ) && ( functie(b) > 0) )
{
n=ceil(log((b-a)/eps)/log(2))+1;
// cout<<"Tabelul cu aproximarile succesive"<<endl;
// cout<<"| a | c | b | f(a) | f(c) | f(b) |"<<endl;
for(i=1;i<=n;i++)
{
c=(a+b)/2;
if( functie(c) < 0) a=c;
else b=c;
// cout<<"-------------------------------------------------------"<<endl;
//cout<<"|"<<a<<"|"<<c<<"|"<<b<<"|"<<functie(a)<<"|"<<functie(c)<<"|"<<functie(b)<<"|"<<e
ndl;
// getch();
}
cout<<"solutia : "<<c<<endl;
}
else
cout<<"Nu se incadreaza in ipoteza f(a)<0 si f(b)>0";
return;
}

void main(void)
{
clrscr();
cout<<" a = ";cin>>a;
cout<<" b = ";cin>>b;
cout<<"Dati precizia de calcul eps = ";cin>>eps;
bisectie(a,b);
getch();
}

3
METODE NUMERICE

2.2. Metoda coardei sau secantei

Fie o func ie continu i derivabil f(x) având pe intervalul [a, b] o singur r cin
ξ ∈ (a , b ) . Deoarece f ( a ) ⋅ f ( b ) < 0 , se poate aproxima r cina cu abscisa punctului de
intersec ie a coardei (secantei) care trece prin punctele A(a, f(a)) i B(b, f(b)) cu axa Ox (fig.
1.2.1). Ecua ia acestei coarde este:

y − f(a) x−a y
=
f(b)− f(a) b − a

y=f(x B
f (b ) − f (a )
y − f ( a ) = (x − a) )
b−a
x=a ξ x=b
O x2 x1 x

Fig.1.2.1

Pentru primul interval [a,b] se poate scrie aceast abscis astfel :


b−a
x1 = a − f ( a )
f(b)− f(a)
Dac f ( a ) ⋅ f ( x1 ) < 0 atunci noul subinterval [a,x1] va cuprinde solu ia ecua iei.
Procedeul de aproximare se repet în acela i mod pentru noul subinterval. Presupunând c
pentru subintervalul [xn-1, xn] este îndeplinit condi ia:
f ( xn −1 ) ⋅ f ( xn ) < 0 ,
atunci pentru determinarea solu iei aproximative xn+1 este valabil rela ia de recuren a
metodei coardei sau secantei:
xn − xn −1
xn +1 = xn − f ( xn )
f ( xn ) − f ( xn −1 )
Din punct de vedere geometric determinarea solu iei aproximative se realizeaz cu
ajutorul intersec iilor succesive ale secantelor la graficul func iei f(x) cu axa Ox , duse prin
punctele:
Ø An+1[xn+1, f(xn+1)] , An[(xn, f(xn)] pentru cazul f ( xn +1 ) ⋅ f ( xn ) < 0 , respectiv
Ø An-1[xn-1, f(xn-1)] , An[xn, f(xn)], pentru cazul f ( xn −1 ) ⋅ f ( xn ) < 0 .
Exemplu
se afle r cina ecua iei algebrice: ln x + 3 x 2 − 4 x − 1 = 0 , cu o eroare ε ≤ 0,02 tiind
se afl în intervalul [1, 2] .
Pentru ecua ia de mai sus se aplic rela ia de recuren (1.2.3) care conduce succesiv
la valorile din tabelul 3:

4
METODE NUMERICE

Tabelul 3
Pas xn-1 xn xn+1 f(xn-1) f(xn) f(xn+1)
1. 1.000000 2.000000 1.351300 -2.000000 3.693147 -0.626100
2. 1.351300 2.000000 1.445332 -0.626100 3.693147 -0.146033
3. 1.445332 2.000000 1.466431 -0.146033 3.693147 -0.031635
4. 1.466431 2.000000 1.470962 -0.031635 3.693147 -0.006742
5. 1.470962 2.000000 1.471926 -0.006742 3.693147 -0.001432
6. 1.471926 2.000000 1.472131 -0.001432 3.693147 -0.000304
7 1.472131 2.000000 1.472174 -0.000304 3.693147 -0.000064
8 1.472174 2.000000 1.472184 -0.000064 3.693147 -0.000014

Se observ c i aceast metod este slab convergent .


Deci solu ia aproximativ a ecua iei calculat prin metoda coardei sau secantei este:
ξ=1, 47176 cu o eroare ε = 0,02824 .

Implementare in C++:

Sa se determine solutia ecuatiei x 5 + 7 x + 5 = 0 continuta in intervalul [-1,0].


Se observa cu usurinta ca metoda se poate aplica functiei f :[-1,0]->R, f(x)=x5+7x+5. Derivata
functiei f este f’(x)=5x4+7, deci valoarea minima, respectiv maxima a modulului derivatei pe
intervalul [-1,0] este 7 (notam cu m1) si 12 (notam cu m2).

/*

Rezolvarea numerica a ecuatiilor algebrice si transcedentale

2. Metoda coardei (metoda secantei)


varianta cu estimarea erorii
*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>

float a,b,cn,cn_1,eps,m1,m2;
int i;

float functie(float x)
{
return ( log(x) + 3*x*x - 4*x + 1 );
}
void coarda(float a, float b, float eps)
{
m1=4;m2=9.5;
i=1;
cn_1=a;
cn=(a*functie(b) - b*functie(a))/(functie(b)-functie(a));
while(fabs(cn-cn_1)*m2/m1 > eps)
{
cn_1=cn;

5
METODE NUMERICE

if( functie(cn) < 0) a=cn;


else b=cn;
i++;
cout<<cn<<" an = "<<a<<" bn = "<<b<<" iteratia = "<<i<<endl;
cn=(a*functie(b) - b*functie(a))/(functie(b)-functie(a));
}
return;
}

void main(void)
{
clrscr();
cout<<" a = ";cin>>a;
cout<<" b = ";cin>>b;
cout<<"Dati precizia de calcul eps = ";cin>>eps;
coarda(a,b,eps);
getch();
}

6
METODE NUMERICE

3. Rezolvarea numeric a ecua iilor algebrice i transcendente

3.1. Metoda tangentelor de ordinul I


(sau prima metod a lui Newton sau Newton-Raphson)

Fie o func ie continu i derivabil f(x) pe intervalul [a, b], care satisface
condi ia f ( a ) ⋅ f ( b ) < 0 i are o singur r cin pe intervalul [a, b].
Dac se dezvolt în serie Taylor func ia f(x) în jurul punctului x=a se ob ine:

f ( x ) = f (a ) +
x−a
f ′(a ) +
(x − a )2 f ′′(a ) + ... (3.1)
1! 2!
Re inând doar primii doi termeni ai dezvolt rii (3.1) se ob ine o rela ie aproximativ de
calcul a lui f(x) în func ie de f(a) i f’(a):
x−a x−b
f ( x ) ≅ f (a ) + f ′(a ) sau f ( x ) ≅ f (b ) + f ′(b ). (3.2)
1! 1!
Aceast func ie reprezint tangenta la graficul func iei f(x) în punctul A[a, f(a)]
respectiv în punctul B[b, f(b)], conform figurii 3.1. Punând condi ia f ( x ) = 0 se ob ine
intersec ia cu axa Ox i rezult o solu ie aproximativ de forma:
f (a ) f (a )
x−a = − ⇒ x1 = a −
f ′(a ) f ′(a )
(3.3)
f (b ) f (b )
sau : x − b = − ⇒ x2 = b −
f ′(b ) f ′(b )

Alegerea lui a sau b trebuie s se fac astfel încât s nu se ob in o valoare a lui x2 în


afara intervalului [a, b] a a cum rezult din figura 3.3 pentru x1=a.

Folosind aceast rela ie rezult formula de recuren a metodei tangentelor de


ordinul I (prima formul a lui Newton sau Newton-Raphson):
f ( xn )
xn +1 = xn − (3.4)
f ′(xn )

B
y

y=f(x)

a
b x1
O x4 x3 x2 x
A

Fig.1.3.1

1
METODE NUMERICE

Exemplu
se afle r cina ecua iei algebrice: ln x + 3 x 2 − 4 x − 1 = 0 , cu o eroare mai mic de
0,00001 tiind c se afl în intervalul [1, 2] .
Dac not m f ( x ) = ln x + 3 x 2 − 4 x − 1 , atunci derivata func iei f ( x ) este:
1
f ′( x ) = + 6x − 4 (3.5)
x
Pentru determinarea solu iei aproximative prin metoda Newton Raphson se aplic
rela ia de recuren (3.4) i se ob in succesiv valorile din tabelul 3.1
Tabelul 3.1
Pas xn f(xn) f '(xn) xn+1 f(xn+1)
1. 2 3.693147 8.5 1.565512 0.538649
2. 1.565512 0.538649 6.031841 1.476211 0.022232
3. 1.476211 0.022232 5.534677 1.472194 4.47E-05
4. 1.472194 4.47E-05 5.512424 1.472186 1.82E-10

Se observ c aceast metod este rapid convergent .


O solu ie aproximativ a ecua iei este ξ=1, 472186 calculat cu o eroare ε =0,00001.

Aplicatie:

Se considera ecuatia x – sin x – 0.25 = 0. Vom construi trei functii:


1. Functia denumita functie() care returneaza functia pentru care aproximam solutia intr-un
anumit interval.
2. Functia denumita deriv() care returneaza derivata functiei date.
3. Functia denumita newton() care aplica metoda lui Newton asupra functiei date.
In aceasta functie consideram in numar dat de iteratii, in variabila imax, o eroare notata eps,
variabilele dx pentru functia data si df pentru derivata corespunzatoare.
Valoarea initiala a lui x va fi 0, iar dupa mai multe iteratii vom obtine valoarea
arpoximativa a lui x = 1.7123.

Implementare in C++

#include<stdio.h>
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
float x,dx;

float functie(float x)
{
return(x - sin(x) - 0.25);
}
float deriv(float x)
{
return(1 - cos(x));
}

2
METODE NUMERICE

void newton(float x, float dx)


{
float eps=0.0000000001;
int imax = 25;
float f,df;
int i;
i=0;
do{
i=i+1;
dx=functie(x);
df=deriv(x);
if(abs(df) >eps) dx = dx/df;
x = x - dx;
if(x!=0) dx = dx / x;
cout<<x<<" dx "<<dx<<" iteratia i = "<<i<<endl;
}while( abs(dx<=eps) && i<=imax );
return;
}
int main(void)
{
clrscr();
cout<<"dati x = "; cin>>x;
newton(x,dx);
getch();
}

3.2. Metoda iterativ x=g(x)


(metoda aproximatiilor successive, metoda contractiilor)

Fie o func ie continu i derivabil f(x) pe intervalul [a, b]. Deoarece f ( a ) ⋅ f ( b ) < 0 ,
presupunem c ecua ia f(x)=0 are o singur r cin ξ ∈ (a ,b ) . O r cin aproximativ a
ecua iei f(x)=0 se poate ob ine dac aceasta se poate scrie o rela ie de recuren echivalent
x=g(x). Aceast metod nu conduce întotdeauna la rela ii iterative convergente.

Rela ia de recuren a metodei se scrie:

xn+1=g(xn) (3.2.1)

Exemplul 1
se g seasc r cina ecua iei: 3 x 4 + 4 x − 1 = 0 , cu o precizie de 0,001 dac se afl
în intervalul (0, 1).
3x 4 + 4 x − 1 = 0 ⇔ x( 3 x 3 + 4 ) = 1 (3.2.2)

3
METODE NUMERICE

Dac se consider g ( x ) = 3 x 3 + 4 atunci ecua ia (3.2.2) se scrie sub forma echivalent :


1
x= (3.2.3)
3x 3 + 4
Cu ajutorul rela iei(1.6.3) se ob ine rela ia de recuren :
1
xn+1 = 3 (3.2.4)
3 xn + 4
Plecând de la x1=0 avem succesiv valorile din de mai jos:
Pas xn xn+1
1. 0 0,25
2. 0,25 0,2471
3. 0,2471 0,2472

Se observ c aceast metod este rapid convergent .

O solu ie aproximativ a ecua iei calculat cu o eroare ε = 0,0001 este: ξ=0,22472

Exemplul 2
se g seasc r cina ecua iei: x 4 − x − 1 = 0 (1.6.5)
cu o precizie de 0,001 dac se afl în intervalul (1, 2).
Dac g ( x ) = 4 1 + x atunci ecua ia de mai sus se scrie: x = 4 1 + x
Se ob ine deci rela ia de recuren : xn +1 = 4 1 + x n (1.6.6)
Plecând de la x1=1 avem succesiv valorile din tabelul 1.6.2:

Pas xn xn+1 Tabelul 1.6.2


1. 1 1,1892
2. 1,1892 1,21638
3. 1,21638 1,220145
4. 1,220145 1,22066
Se observ c aceast metod este rapid convergent .
O solu ie aproximativ a ecua iei calculat cu o eroare ε = 0,00052 este: ξ=1,2206.

Aplicatie:

Se considera ecuatia x – sin x – 0.25 = 0. Vom construi doua functii:


1. Functia denumita functie() care returneaza functia pentru care aproximam solutia intr-un
anumit interval.
2. Functia denumita contractii() care aplica metoda contractiilor (aproximarilor succesive)
asupra functiei date.
In aceasta functie consideram in numar dat de iteratii, in variabila imax, o eroare
notata eps, variabila dx pentru functia data.
Valoarea initiala a lui x va fi 0, iar dupa mai multe iteratii vom obtine valoarea

4
METODE NUMERICE

aproximativa a lui x = 1.7123.

Implementare in C++

#include<stdio.h>
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
float x,dx;
int zero;

float functie(float x)
{
return(x - sin(x) - 0.25);
}

void contractii(float x, float dx, int zero)


{
float eps=0.0000000001;
int imax = 25;
float f;
int i;
i=0;
zero=1;
do{
i=i+1;
dx=functie(x);
x = x - dx;
if(x!=0) dx = dx / x;
cout<<x<<" dx "<<dx<<" iteratia i = "<<i<<endl;
}while( abs(dx<=eps) && i<=imax );
return;
}
int main(void)
{
clrscr();
cout<<"Dati x = "; cin>>x;
contractii(x,dx,zero);
if( zero==1 ) cout<<"x = "<<x<<" dx = "<<dx;
getch();
}

5
METODE NUMERICE

4. Rezolvarea sistemelor de ecua ii algebrice liniare

Metodele de rezolvare a sistemelor de ecuatii liniare, se pot imparti in doua


categorii:

1. Metode exacte(directe) – care sunt algoritmi finiti pentru calculul solutiilor


sistemelor de ecuatii liniare:
Ø Metoda lui Cramer, bazata pe calculul determinantilor
Ø Metoda eliminarilor succesive (metoda lui Gauss)
2. Metode iterative – care permit gasirea solutiei sistemelor liniare cu o anumita
precizie, intr-un numar finit de pasi:
Ø Metoda lui Jacobi
Ø Metoda Gauss-Seidel

4.1.1. Metoda lui Cramer

Consideram urmatorul sistem de n ecuatii liniare cu n necunoscute :

a11x1 + a12 x 2 + a13x 3 + Κ + a1n x n = b1



a21x1 + a22 x 2 + a23x 3 + Κ + a2n x n = b2

a31x1 + a32 x 2 + a33x 3 + Κ + a3n x n = b3
 Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ

 an1x1 + an2 x 2 + an3 x 3 + Κ + ann xn = bn

Conform notiunilor de algebra din liceu, daca un sistem liniar cu n ecuatii si n


necunoscute are determinantul principal nenul, atunci el are solutie unica, determinat
prin regula lui Cramer, si anume :

∆ x1 ∆x2 ∆ xn
x1 = x2 = ΚΚΚ xn =
∆ ∆ ∆

unde, ∆ x1 ,∆ x 2 ,Κ , ∆ xn se obtin prin inlocuirea in ∆ a coloanei corespunzatoare


necunoscutei xi, prin coloana termenilor liberi.
Rezolvarea efectiva a sistemului de n ecuatii cu n necunoscute se face prin
calculul a n +1 determinanti.

Deci, trebuie sa construim un algoritm de calcul numeric al determinantilor :


Sa presupunem, de exemplu, ca avem un determinant de ordin 3, in forma
generala :

1
METODE NUMERICE

a11 a12 a13


a21 a22 a23
a31 a32 a33

Daca elementul a11 este diferit de zero, atunci cautam sa ajungem la un


determinant care sa contina pe prima coloana numai pe zero, cu exceptia elementului
a11. Acesta se poate obtine succesiv inmultind prima linie cu − a21 si adunand rezultatul
a11
a
la linia a doua. De asemenea inmultind prima linie cu − 31 si adunand la linia a treia se
a11
ajunge la un determinant, cu aceeasi valoare ca cel initial, dar care are pe prima
coloana un singur element nenul. Deci determinatul devine :

a11 a12 a13


0 a'22 a'23
0 a'32 a'33

In continuare, daca a'22 este diferit de zero, putem, fara a afecta valoarea
a'
determinatului, sa inmultim linia a doua cu − 32 si sa adunam la a treia; vom obtine :
a'22

a11 a12 a13


0 a'22 a'23
0 0 a'33
'

Evident valoarea acestui determinant este egala cu a11 a '22 a'33


'
.

Inainte, de a generaliza acest procedeu, trebuie sa vedem ce se intampla daca,


de exemplu, la primul pas, a11=0.
ü In aceasta situatie, daca pe prima coloana toate elementele sunt nule
atunci determinantul este zero.
ü Daca exista, totusi un element nenul pe prima coloana, atunci putem
permuta linia care contine acel element nenul, cu prima linie. Obtinem un
nou determinant, avand semnul schimbat fata de cel anterior.
Procedeul poate fi aplicat in continuare ca mai sus, cu singura observatie ca
determinantul isi schimba semnul de fiecare data cand se efectueaza o permutare de
doua linii.

In, general, pentru calculul unui determinant de ordin n putem folosi metoda de
mai sus. Astfel, avem :

2
METODE NUMERICE

a11 a12 a13 Κ a1n


a 21 a 22 a 23 Κ a 2n
a 31 a 32 a 33 Κ a 3n
Κ Κ Κ Κ Κ
a n1 a n2 a n3 Κ a nn

Pentru rezolvarea sistemului de n ecuatii cu n necunoscute vom construi o


functie de calcul a determinantului conform metodei de mai sus, pe care o vom apela,
prima data pentru calcului determinantului principal al sistemului ( ∆ ), si apoi de n ori
pentru calculul celor n determinanti corespunzatori celor n necunoscute : ∆ x ,∆ x , Κ , ∆ x
1 2 n

Solutia in limbajul C++ :

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
float a[10][10],b[10],x[10],save[10],dp;
int i,j,n;

float determinant(float a[10][10], int n)


{
int i,j,k,l,t,iv;
float temp,d=1;
for(j=1;j<=n-1;j++)
{
iv=j;
t=1;
while( (iv<=n) && (t==1) )
if(a[iv][j] == 0) iv=iv+1;
else t=0;
if(t==1)
{
return 0;
}
if(j!=iv)
{
d=-d;
for(k=j;k<=n;k++)
{
temp=a[j][k];
a[j][k]=a[iv][k];
a[iv][k]=temp;
}
}
for(l=j+1;l<=n;l++)
for(k=j+1;k<=n;k++)
a[l][k]=a[l][k] - a[j][k] * a[l][j] / a[j][j];
}
for(j=1;j<=n;j++)
d=d*a[i][j];
return d;

3
METODE NUMERICE

}
void main(void)
{
clrscr();
cout<<"Dati numarul de ecuatii ";cin>>n;
cout<<"Dati matricea A "<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Dati termenul liber"<<endl;
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];
}

dp=determinant(a,n);
if(dp==0)
{
cout<<"Nu se poate rezolva cu regula lui Cramer"<<endl;
exit(0);
}
for(j=1;j<=n;j++)
{
for(i=1;i<=n;i++)
{
save[i]=a[i][j];
a[i][j]=b[i];
}
x[j]=determinant(a,n) / dp;
cout<<x[j]<<endl;
for(i=1;i<=n;i++)
a[i][j]=save[i];
}
}

4.1.2. Metoda eliminarilor succesive (metoda lui Gauss)

Metoda eliminarilor succesive porneste de la o observatie foarte simpla facuta


asupra metodei de calcul a determinantilor, prezentata anterior. Este vorba de faptul
ca daca folosim asa numita metoda a reducerii, prin eliminarea necunoscutei x1, din
ecatiile 2,3,…,n nu facem altceva decat sa aplicam primul pas din procedeul de calcul
al determinantilor. Astfel, daca sistemul urmator este compatibil si determinat (adica
determinantul principal este nenul) :

a11x1 + a12x 2 + a13x 3 + Κ + a1nx n = b1



a21x1 + a22x 2 + a23x 3 + Κ + a2n xn = b2

a31x1 + a32x 2 + a33x 3 + Κ + a3nx n = b3
 Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ

an1x1 + an2 x 2 + an3x 3 + Κ + ann x n = bn
4
METODE NUMERICE

Atunci, se transforma intr-un sistem echivalent, de forma :

a11 x 1 + a12 x 2 + a13 x 3 + Κ + a1n x n = b1



 a 22 x 2 + a 23 x 3 + Κ + a 2n x n = b2

 a 32 x 2 + a 33 x 3 + Κ + a 3n x n = b3
 Κ Κ Κ Κ Κ Κ Κ Κ Κ

 a n2 x 2 + an3 x 3 + Κ + ann x n = bn

Daca, iteram, procesul, eliminand necunoscutele xi, din ecuatiile i+1, …, n (unde
i = 2, …, n-1 ), vom obtine in final un sistem de forma :

a11 x 1 + a12 x 2 + a13 x 3 + Κ + a1n x n = b1



 α 22 x 2 + α 23 x 3 + Κ + α 2n x n = β2

 α 33 x 3 + Κ + α 3n x n = β3
 Κ Κ Κ Κ Κ Κ Κ

 α nn x n = βn

Acest sistem, numit sistem triunghiular superior, se poate rezolva, incepand


cu valoarea lui xm care se determina din ultima ecuatie. Cu xn, cunoscut de determina
xn-1 din penultima ecuatie, s.a.m.d.

Solutia in limbajul C++, se aseamana foarte mult cu cea de la metoda lui


Cramer, doar ca cateva mici modificari :

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
float a[10][10],b[10],x[10],dp;
int i,j,n,iv,t,k,l;
float temp;

void main(void)
{
clrscr();
cout<<"Dati numarul de ecuatii ";cin>>n;
cout<<"Dati matricea A "<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Dati termenul liber"<<endl;
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];
}

5
METODE NUMERICE

for(j=1;j<=n-1;j++)
{
iv=j;
t=1;
while( (iv<=n) && (t==1) )
if(a[iv][j] == 0) iv=iv+1;
else t=0;
if(t==1)
{
cout<<"Determinantul pricipal este nul ";
exit(0);
}
if(j!=iv)
{
for(k=j;k<=n;k++)
{
temp=a[j][k];
a[j][k]=a[iv][k];
a[iv][k]=temp;
}
// schimbam si elementul corespunzator liniei k al termenului liber
temp=b[j];
b[j]=b[iv];
b[iv]=temp;
}
for(l=j+1;l<=n;l++)
{
for(k=j+1;k<=n;k++)
a[l][k]=a[l][k] - a[j][k] * a[l][j] / a[j][j];
// calcul pt. termenul liber
b[l]=b[l] - b[j] * a[l][j] / a[j][j];
}
}
if(a[n][n]==0)
{
cout<<"Deterninantul principal este nul";
exit(0);
}
// calculul lui xn
x[n]=b[n] / a[n][n];
for(i=n-1;i>=1;i--)
{
temp = b[i];
for(j=i+1;j<=n;j++) temp = temp - a[i][j] * x[j];
x[i] = temp / a[i][i];
}
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]= "<<x[i]<<endl;
getch();
}

6
METODE NUMERICE

5. Rezolvarea sistemelor de ecua ii algebrice liniare


Metode iterative

2. Metode iterative – permit gasirea solutiei sistemelor liniare cu o anumita precizie,


intr-un numar finit de pasi:
Ø Metoda lui Jacobi
Ø Metoda Gauss-Seidel

5.1 Metoda lui Jacobi

Consideram urmatorul sistem de n ecuatii liniare cu n necunoscute :

a11x1 + a12 x 2 + a13x 3 + Κ + a1n x n = b1



a21x1 + a22 x 2 + a23x 3 + Κ + a2n x n = b2

a31x1 + a32 x 2 + a33x 3 + Κ + a3n x n = b3
 Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ

 an1x1 + an2 x 2 + an3 x 3 + Κ + ann xn = bn
care se poate scrie: Ax = b, unde A=(a ij)i=1,n ;j=1,m este matricea sistemului, iar b este
vectorul termenilor liberi :
 b1 
 
 b2 
 Μ
 
b 
 n

Definitie :
Numim norma unui vector x, pe care o notam cu ||x||, un numar real definit
astfel :
n
x = max x i
i =1
Numim norma unei matrice A cu n lini si m coloane, pe care o notam ||A||,
un numar real definit astfel :

n m
A = max
i =1
∑ aij
j =1

1
METODE NUMERICE

Teorema :

Daca numarul q = || I - A || are proprietatea q ∈ (0,1) , atunci, sistemul de ecuatii


Ax = b,are o solutie unica, x, iar sirul {xm}, definit :

x0 = 0, xm+1 = (I- A) xm + b, converge la x.

In plus, sunt adevarate inegalitatile :

1 qm
xm − x ≤ x m +1 − x m ≤ b
1−q 1−q

Determinarea aproximativa a solutiei sistemului Ax=b ca limita a sirului {xm},


poata numele de metoda Jacobi.

Exemplu:

Consideram urmatorul system de trei ecuatii cu trei necunoscute:

 x1 + 0.3x 2 − 0.2 x 3 = 1

 0.4 x1 + x 2 + x 3 = −0.9
− 0.1x − 0.6 x + x = 1.1
 1 2 3

Daca notam cu A matricea sistemului si cu b vectorul de termeni liberi, atunci


avem :
1 0.3 − 0.2
A = 0.4 1 0.1
− 0.1 − 0.6 1
1 0 0 1 0.3 − 0.2 0 − 0.3 0.2
Deci I − A = 0 1 0 − 0.4 1 0.1 = − 0.4 0 − 0.1
0 0 1 − 0.1 − 0.6 1 0.1 0.6 0

rezulta ca || I-A || = max {0.5, 0.5, 0.7} = 0.7. Ceea ce inseamna ca se


indeplineste conditia teoemei, si anume q= || I-A || sa fie din intervalul (0,1).
In plus, || b || = max {1, 0.9, 1,1} = 1.1.
Consideram aproximarea cu trei zecimale exacte eps = 0.001.

2
METODE NUMERICE

Astfel, putem rezolva inecuatia: qm


b < 0.001
1−q
Cea mai mica solutie a acestei inecuatii este:
 0.001(1 − q) 
 ln b 
m=   +1
 ln q 
 
 
Prezentam in continuare solutia exemplului dat mai sus, cu precizarea ca pentru
a putea generaliza metoda lui Jacobi, trebuie scrise cate o functie de calcul a normei
unui vector, respectiv, o functie de calcul a normei unei matrice.

Solutia in limbajul C++ :

/*
rezolvarea sistemelor de ecuatii liniare
metoda JACOBI
*/
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>

double a[10][10],x[10],b[10],temp[10];
// a este matricea sistemului
// x vectorul de necunoscute ale sistemului
// b vectorul de termeni liberi
// temp un vector pentru calcul al unor valori temporare
double q,eps,nb,s;
// q numar egal cu norma matricei I-A ( adica q = |I - A| )
// eps eroarea de calcul aproximativ al solutiilor sistemului
// nb numar egal cu norma vectorului B ( adica nb = |B| )
int n,m,j,i,iteratii;

void main(void)
{
clrscr();
cout<<"Intoduceti nr. de linii si de coloane ale matricei sistemului ";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Introduceti elementele termenului liber "<<endl;
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];

3
METODE NUMERICE

}
cout<<"Sistemul initial este :"<<endl;
for(i=1;i<=n;i++)
{
cout<<a[i][1]<<" x"<<1;
for(j=2;j<=n;j++)
cout<<" + "<<a[i][j]<<" x"<<j;
cout<<" = "<<b[i]<<endl;
}
cout<<"are solutiile :"<<endl;
eps=0.0001;
/*
caz particular pentru sistemul :
x1 + 0.3x2 - 0.2x3 = 1
0.4x1 + x2 + 0.1x3 =-0.9
-0.1x1 - 0.6x2 + x3 = 1.1
*/
nb=1.1;
q=0.7;

m=(int)(log(eps * (1-q) / nb ) / log(q) + 1);


for(i=1;i<=n;i++) x[i]=0.0;
for(iteratii=1;iteratii<=m;iteratii++)
{
for(i=1;i<=n;i++)
{
s=0.0;
for(j=1;j<=n;j++)
s+=a[i][j] * x[j];
temp[i]=x[i] - s + b[i];
}
for(i=1;i<=n;i++) x[i]=temp[i];
}
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]= "<<x[i]<<endl;
getch();
}

Dupa executia programului, se vor obtine solutiile x = {0.63, 0.54, 1.04}.

5.2. Metoda Gauss-Seidel

Consideram urmatorul sistem de n ecuatii liniare cu n necunoscute :

a11x1 + a12 x 2 + a13x 3 + Κ + a1n x n = b1



a21x1 + a22 x 2 + a23x 3 + Κ + a2n x n = b2

a31x1 + a32 x 2 + a33x 3 + Κ + a3n x n = b3
 Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ Κ

 an1x1 + an2 x 2 + an3 x 3 + Κ + ann xn = bn

4
METODE NUMERICE

Metoda Gauss-Seidel este o varianta a metodei Jacobi, in scopul de a creste


convergenta sirului de solutii {xm}.

Definitie :
Un sistem liniar Ax=b se numeste normal daca matricea coeficientilor A este
simetrica, adica aij = aji, si daca forma patratica corespunzatoare
n n

este pozitiv definita.


u= ∑∑ aijxix j
i =1 j =1

Teorema :
Daca ambii membri ai sistemului liniar Ax=b, cu matricea A nesingulara, sunt
inmultiti la stanga cu transpusa AT, atunci sistemul rezultant ATA x = AT b este
normal.

Prezentam in continuare, o procedura Gauss_Seidel care rezolva un sistem de


ecuatii liniare cu ajutorul metodei Gauss-Seidel.
Vom avea matricea A, vectorul b al termenilor liberi si la sfarsitul functiei vom
obtine in vectorul b solutia aproximativa si in variabila eroare eroarea relativa maxima
a componentelor solutiei.

/*
rezolvarea sistemelor de ecuatii liniare
metoda GAUSS-SEIDEL

caz particular pentru sistemul :

x1 + 0.3x2 - 0.2x3 = 1
0.4x1 + x2 + 0.1x3 =-0.9
-0.1x1 - 0.6x2 + x3 = 1.1

*/
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>

double a[10][10],x[10],b[10];
// a este matricea sistemului
// x vectorul de necunoscute ale sistemului
// b vectorul de termeni liberi
int n,m,j,i,eroare;

void gauss_seidel(double a[10][10], double x[10], int n)


{
int imax=20;
int eps=0.0000000001;
int i,j,k;
double t,tt[10];
// se genereaza elementele rezultate prin impartirea fiecarui elem. de pe linie cu
// elem. de pe diagonala principala

5
METODE NUMERICE

for(i=1;i<=n;i++)
{
t=-1.0/a[i][i];
tt[i]=b[i]/a[i][i];
for(j=1;j<=n;j++)
a[i][j]=a[i][j] * t;
}
k=0;
for(i=1;i<=n;i++) b[i]=tt[i];
do{
k++;
eroare=0.0;
for(i=1;i<=n;i++)
{
t = tt[i];
for(j=1;j<=n;j++) t = t + a[i][j] * b[j];
b[i] = b[i] + t;
if(b[i] != 0.0) t = t / b[i];
if(fabs(t)>eroare) eroare = fabs(t);
}
}while((eroare<eps) || (k==imax) );

return;
}
void main(void)
{
clrscr();
cout<<"Introduceti nr. de linii si de coloane ale matricei sistemului ";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Introduceti elementele termenului liber "<<endl;
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];
}
cout<<"Sistemul initial este :"<<endl;
for(i=1;i<=n;i++)
{
cout<<a[i][1]<<" x"<<1;
for(j=2;j<=n;j++)
cout<<" + "<<a[i][j]<<" x"<<j;
cout<<" = "<<b[i]<<endl;
}
cout<<"are solutiile :"<<endl;
gauss_seidel(a,b,n);
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]= "<<b[i]<<endl;
cout<<"Eroarea relativa maxima este "<<eroare<<endl;
getch();
}

6
METODE NUMERICE

6. Evaluarea functiilor

1. Evaluarea polinoamelor. Schema lui Horner


2. Evaluarea functiilor analitice
3. Aproximarea functiilor. Polinoame de interpolare

6.1. Evaluarea polinoamelor. Schema lui Horner

Presupunem ca avem un polinom de grad n:

P ( x ) = a0 x n + a1 x n −1 + Κ + a n −1 x + an
cu coeficienti reali ai, i=0,1,2,…,n.

Presupunem ca se cere gasirea valorii acestui polinom pentru x = .

Calculul se realizeaza cel mai convenabil punand P( ) sub forma:

P (ξ ) = (Κ (( a0ξ + a1 )ξ + a2 )ξ + Κ + a n −1 )ξ + a n
Algoritmul calculului lui P( ) conform schemi lui Horner revine la evaluarea
succesiva a numerelor

b0=a0
bi=bi-1 + ai, i=1,2,…,n

si avem P( ) = bn.

Schema lui Horner imbina simplitatea formularii algoritmice cu eficienta


calculului numeric, prin transformarea operatiilor de ridicare la putere in operatii de
inmultire, care se efectueaza mai rapid si mai precis.

Programul urmator prezinta implementarea in C++ a schemei lui Horner. Se


observa ca nu este necesarea memorarea numerelor bi in timpul calculului, intr-un
vector, si de aceea se utilizeaza o singura variabila b.

// ---------- calculul valorii unui polinom folosind SCHEMA lui HORNER----------------------

#include <iostream.h>
double a[100],x;
int n,i;
double polinom(double a[100], double x, int n)
{
double b;

1
METODE NUMERICE

int i;
b=a[0];
for(i=1;i<=n;i++)
b=b*x + a[i];
return b;
}
void main(void)
{
cout<<"dati gradul polinomului n = ";cin>>n;
for(i=0;i<=n;i++)
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
cout<<"Dati valoarea pt. care se calculeaza x= ";cin>>x;
cout<<"Valoarea polinomului in pct. "<<x<<" este: "<<polinom(a,x,n)<<endl;
}

6.2. Evaluarea functiilor analitice

O functie reala f(x) se numeste analitica in punctual . Daca intr-o vecinatate |


x- |< R a cestui punct, ea poate fi dezvoltata intr-o serie de puteri (serie Taylor)

f ' (ξ ) f '' (ξ ) ∞
f ( i ) (ξ )
f ( x ) = f (ξ ) + (x −ξ ) + (x − ξ ) + Κ = ∑
2
( x − ξ )i
1! 2! i =0 i!

Pentru =0 obtinem seria MacLaurin


f ( i ) ( 0) i
f ( x) = ∑ x
i =0 i!
Suma partiala de ordinal n a seriei Taylor se numeste polinom Taylor de ordinul
n.
n
f ( i ) (ξ ) n
Fn ( x) = ∑ ( x − ξ ) = ∑ ti ( x )
i

i =0 i! i =0

Consideram exemplul functiei exponentiale din dezvoltarea sa in serie:

x2 n
xi
e =1+ x +
x
+Κ = ∑
2! i = 0 i!

al carei interval de convergenta este (−∞,+∞). Polinomul Taylor de ordinal n este

2
METODE NUMERICE

in acest caz:

n
Fn ( x ) = ∑ ti ( x ), xi
ti ( x) =
i =0 i!

Avand in vedere relatia dintre doi termini succesivi, este convenabil sa se


efectueze calculul polinomului lui Taylor utilizand schema recurenta:

t0=1, F0=1
x
ti = t i −1 , Fi=F i-1+ti, i = 1,2,…, n,…

i
Procesul iterativ se continua pana cand eroarea relativa devine mai mica decat o
valoare prescrisa , adica

| tn / F n | .

Programul urmator prezinta implementarea in C++ a seriei Taylor aplicata


functiei exponentiale.

// ----------------- calculul seriei TAYLOR pt. functia exponentiala ----------------------------


#include <iostream.h>
#include <math.h>
double x;
const eps=1e-10;
int n,i;

double expn(double x)
{
double f=1,t=1;
int i=0;
while( fabs(t/f) > eps )
{
i++;
t = x/i * t;
f = f + t;
}
return f;
}

void main(void)
{
cout<<"dati x = ";cin>>x;
cout<<"expn("<<x<<")="<<expn(x)<<endl;
cout<<" exp("<<x<<")="<<exp(x);
}

3
METODE NUMERICE

6.3. Aproximarea functiilor. Polinoame de interpolare

Se cunoaste din materia de liceu ca putem avea urmatoarele tipuri de probleme:

1. Sa se determine functia de gradul I al carei grafic trece prin punctele de coordonate


(1,5) si (3,-1).

Solutia problemei porneste de la forma generala a ecuatiei de gradul I:

f : R → R, f ( x ) = ax + b

Apoi determinam valorile a si b astfel incat sa indeplineasca conditiile:


f(1)=5 si f(3)=-1.
Deci, obtinem:

f(1)=a*1+b=5 si f(3)=3*a+b=-1

 a+b =5
⇒
3a + b = −1
Prin rezolvarea sistemului de doua ecuatii cu doua necunoscute, obtinem: a=-3
si b=8.
Asadar, am obtinut functia de gradul I: f(x) = -3x + 8

2. Sa se determine functia de gradul II al carei grafic trece prin punctele de


coordonate: (-1,-1), (2,5) si (3,11).

Solutia problemei porneste de la forma generala a ecuatiei de gradul II:

f : R → R, f ( x ) = ax 2 + bx + c

Apoi determinam valorile a, b si c din conditiile:


f(1)= a – b + c = -1
f(2)= 4*a + 2*b + c = 5
f(3)= 9*a + 3*b + c = 11

 a − b + c = −1

⇒  4 a + 2b + c = 5
9a + 3b + c = 11

Prin rezolvarea sistemului de trei ecuatii cu trei necunoscute (adica valorile a, b

4
METODE NUMERICE

si c), obtinem a=1, b=1 si c=-1:

Asadar am obtinut functia de gradul al doilea f(x) = x2 + x - 1.

Putem generaliza cele doua probleme de mai sus, astfel:

Se dau m (m>=1) puncte din plan, (xi,yi), xi ≠ xj , ∀i ≠ j, 1 ≤ i, j ≤ m. Sa se


determine functia polinomiala, asociata unui polinom de gradul m-1, al carei
grafic sa contina punctele date.

Exemplu: Daca avem 6 puncte in plan si trebuie sa determinam un polinom de


gradul 5 al carui grafic sa contina aceste puncte.

Teorema. Fiind date m puncte (m>=1) puncte in plan, (xi,yi), i = 1, 2, …, m,


xi ≠ xj , ∀i ≠ j , exista un polinom P, unic, avand gradul cel mult m-1 si pentru care
graficul functiei polinomiale asociate contine punctele date.

Definitie: Polinomul P, a carui existenta si unicitate sunt asigurate de teorema


de mai sus, se numeste polinomul de interpolare al punctelor (xi,yi), i = 1, 2, …, m.

O situatie particulara care prezinta interes este aceea in care punctele de


interpolare sunt puncte care apartin graficului unei functii f, adica f(xi)=yi, 1 ≤ i ≤ m . In
aceasta situatie polinomul de interpolare satisface conditiile P(xi)=f(xi), 1 ≤ i ≤ m si
spunem ca polinomul interpoleaza fucntia f prin punctele (x1, f(x1)), (x2,f(x2)), …,
(xm,f(xm)).

5
METODE NUMERICE

7. Aproximarea functiilor
Polinoame de interpolare (I)

1. Polinomul LAGRANGE

Una dintre cele mai cunoscute formule de interpolare este construita de Lagrange sub
forma unui polinom de interpolare.

Sa presupunem ca in intervalul [a,b] sunt specificate n valori ale argumentului x1, x2, . . . ,
xn, si valorile corespunzatoare ale unei functii f(x)

f(xi)=yi, i=1,2,…,n

Se cere construirea unui polinom Lm(x) care ia in punctele specificate xi aceleasi valori ca si
functia f(x)

Lm(xi)=yi, i=1,2,…,n (1)

Pentru aceasta sa construim mai intai un polinom pi(x) pentru care

1, daca j = i (2)


pi ( x j ) = δij = 
0 , daca j ≠ i

Deoarece polinomul cautat, pi(x), se anuleaza in cele (n-1) puncte x1, …, xi-1, xi+1, …, xn, el
are expresia

p i ( x ) = C i ( x − x 1 ) Κ ( x − x i −1 )( x − x i +1 ) Κ ( x − x n ) = C i ∏ i( x) unde Ci este un
coefficient constant, iar

∏i( x ) = ∏ ( x − x j )
j≠i
Luind x=xi si avand in vedere ca pi(xi)=1 obtinem C i = 1 / ∏ i( x i ) . Cu acestea, gasim
pentru polinomul pi(x) care satisface conditiile (2)

pi ( x ) =
∏i(x ) (3)

Revenind acum la
∏i problema initiala a construirii polinomului L (x) care
( x i )
m
satisface conditiile (1), acesta poate fi scris sub forma

n
Lm ( x ) = ∑ pi (x )yi (4)
i =1

1
METODE NUMERICE

Intr-adevar, deoarece polinoamele pi(x), sunt de ordinul (n-1), si Lm(x) este de ordinul (n-
1) si satisface conditiile (1)

n n
L n −1 ( x j ) = ∑ pi ( x j ) y i = ∑ δijyi = y j , j = 1,2,..., n
i =1 i =1
Inlocuind expresia (3) a polinoamelor pi(x) in (4) rezulta formula de interpolare a lui
Lagrange

∏ (x − x j )
n
∏i y = j ≠ i
(x ) n
L n −1 ( x ) = ∑ i ∑ yi
i =1 ∏ i i i =1 ∏ i
( x ) ( x − x j )
j≠i
Vom crea o fucntie numita Lagrange cu cinci parametri :
ni – numarul de punctelor de interpolare
xi si yi – tablouri care contin coordonatele punctelor de interpolare
x – argumentul pentru care se calculeaza valoarea polinomului Lagrange de interpolare
y – valoarea de iesire a functiei

Programul urmator prezinta implementarea in C++ a polinomului Lagrange intr-un punct


dat x.

/*
Polinomul de interpolare Lagrange
*/
#include<iostream.h>
float xi[20], yi[20], x, y;
int ni;

float lagrange(float xi[], float yi[], int ni, float x)


{
int i, j;
float p, y;
for(i=1;i<=ni;i++)
{
p=1;
for(j=1;j<=ni;j++)
if(j!=i)
p=p*(x-xi[j])/(xi[i]-xi[j]);
y=y+p*yi[i];
}
return y;
}

void main(void)
{
cout<<" n = ";cin>>ni;
cout<<" Vector x = "<<endl;
for(int i=1;i<=ni;i++)
{
cout<<"x["<<i<<"]= ";

2
METODE NUMERICE

cin>>xi[i];
}
cout<<" Vector y = "<<endl;
for(i=1;i<=ni;i++)
{
cout<<"y["<<i<<"]= ";
cin>>yi[i];
}
cout<<"Dati valoarea punctului pt. care se calculeaza polinomul =";
cin>>x;
y=lagrange(xi,yi,ni,x);
cout<<"Valoarea pentru "<<x<<" este "<<y<<endl;
}

Executia programului :

n=4
vector x = {-2, 1, 2, 4}
vector y = {25, -8, -15, -13}
valoarea punctului pt. care se calculeaza polinomul = 3
Valoarea pentru 3 este 17.22221

2. Polinomul AITKEN

Schema de interpolare Aitken porneste de la polinomul Lagrange in mai multe puncte : x0,
x1, x2, . . . , xn.
y0 x0 − x
Se considera expresia
y1 x1 − x
L 01 ( x ) =
x1 − x 0

Acesta este un polinom de gradul intai in x.

Efectuand calculele, obtinem :

y (x − x) − y1(x0 − x) x1 − x x − x0 x − x1 x − x0
L01(x) = 0 1 = y0 + y1 = y0 + y1.
x1 − x0 x1 − x0 x1 − x0 x0 − x1 x1 − x0

care este tocmai expresia polinomului Lagrange construit pe nodurile x0, x1.

L 01 ( x 0 ) = y 0 ; L 01 ( x1 ) = y1 ;
Deoarece polinomul de gradul intai in punctele x0 si x1 ; respectiv valorile y0 si y1 este unic,

3
METODE NUMERICE

acest lucru inseamna ca L01(x) rezolva problema interpolarii pentru nodurile x0, x1 (x0 < x1).
In mod analog se construiesc polinoamele de interpolare liniare :

L12(x), L23(x), …,Ln-1,n(x)

y1 x1 − x y n −1 x n −1 − x
y2 x2 − x yn xn − x
L 12 ( x ) = L n −1,n ( x ) =
x 2 − x1 ;....; x n − x n −1
Putem considera acum

L 01 ( x ) x 0 − x
L 21 ( x ) x 2 − x
L 012 ( x ) =
x2 − x0
care este un polinom de gradul doi in x.

Se verifica imediat ca L012(x0)=y0 ; L012(x1)=y1 ; L012(x2)=y2 ;


si L012(x) este chiar polinomul de interpolare Lagrange construit pe nodurile x0 < x1 < x2, si care
are in aceste puncte valorile y0, y1, y2.

In general, avem :

L 01Κ n −1 ( x ) x 0 − x
L 21 Κ n( x ) x n − x
L 012Κ n ( x ) =
xn − x0
care va fi polinomul de interpolare Lagrange pentru nodurile x0 < x1 < . . . <xn, si care are
in aceste puncte valorile y0, y1, . . . , yn.
Se observa ca L012…n(x) se obtine din L012…n-1(x) si L12…n(x) la fel cum L01(x) s-a obtinut din
y0 si y1, dupa aceeasi schema.

Acesta schema este urmatoarea :

xi yi xi-x Li-1,i Li-2,i-1,i Li-3,i-2,i-1,i


x0 y0 x0-x
x1 y1 x1-x L01(x)
x2 y2 x2-x L12(x) L012(x)
x3 y3 x3-x L23(x) L123(x) L0123(x)
… … … … … …

Aceasta schema ramane utila si la adaugare de noi valori x si y :

xi xi-x yi Li-1,i Li-2,i-1,i Li-3,i-2,i-1,i


x0 x0-x y0 L01(x) L012(x) L0123(x)
x1 x1-x y1 L12(x) L123(x) …
x2 x2-x y2 L23(x) …
x3 x3-x y3 …
… … …

4
METODE NUMERICE

Exemplu :

x -2 1 2 4
f 25 -8 -15 -13

Se cere Ln(3) , deci a = 3.

xi xi-a yi Li-1,i Li-2,i-1,i Li-3,i-2,i-1,i


-2 -5 25 -30 -20 -17.22
1 -2 -8 -22 -16.67
2 -1 -15 -14
4 1 -13

Rezulta ca L3(3) = 17.22


Aceeasi valoare se obtine si calculand cu polinomul Lagrange :

L3(a)= . . . . = -17.22

Programul urmator prezinta implementarea in C++ a schemei Aitken intr-un punct dat x.

/*
Schema AITKEN
*/

#include<iostream.h>
float x[10], y[10], xa[10], d[10][20], a;
int n;
void citire(float z[])
{
for(int i=0;i<=n;i++) cin>>z[i];
return;
}
void tipar()
{
cout<<endl<<" Schema Aitken "<<endl;
cout<<"-------------------------------------------"<<endl;
cout<<" x x-a y I II III "<<endl;
cout<<"-------------------------------------------"<<endl;
int n1=n,j,i;
for(i=0;i<=n;i++)
{
cout<<x[i]<<" "<<xa[i]<<" ";
for(j=0;j<=n1;j++)
cout<<d[i][j]<<" ";
n1--;
cout<<endl;
}
return;
}

void aitken()
{
int i;

5
METODE NUMERICE

for(i=0;i<=n;i++) xa[i]=x[i]-a;
for(i=0;i<=n;i++) d[i][0]=y[i];
int n1,k=1,j;
for(j=1;j<=n;j++)
{
n1=n-j;
for(i=0;i<=n1;i++)
d[i][j]=(d[i][j-1] * xa[i+k] - d[i+1][j-1] * xa[i]) / (x[i+k]-x[i]);
k++;
}
return;
}
void main(void)
{
cout<<" n = ";cin>>n;
cout<<" a = ";cin>>a;
cout<<" vector x = ";
citire(x);
cout<<" vector y = ";
citire(y);
aitken();
tipar();
cout<<"valoarea pentru a este "<<d[0][n]<<endl;
}

6
METODE NUMERICE

8. Aproximarea functiilor
Polinoame de interpolare (II)

3. Polinom CEBISEV

Polinoamele Cebisev, utilizate frecvent pentru dezvoltarea unor functii, satisfac urmatoarea
relatie de recurenta:

Ti +1 ( x ) − xTi ( x ) + Ti −1 ( x ) = 0
T0 ( x ) = 1, T1 ( x ) = x

Programul urmator prezinta implementarea in C++ a polinomului Cebisev intr-un punct dat
x.

/*
Polinomul CEBISEV
*/
#include<iostream.h>
#include<conio.h>
void main(void)
{
double t0,t1,tk,x;
int n,k;
clrscr();
cout<<"Introduceti datele polinomului:"<<endl;
cout<<" x = ";
cin>>x;
cout<<"Dati gradul polinomului CEBISEV n = ";
cin>>n;
t0 = 1.0;
t1 = x;
for(k=2; k<=n; k++)
{
tk =1.0/k * (2 * x * t1 - t0 );
t0 = t1;
t1 = tk;
}
cout<<"Polinomul Cebisev este :"<<endl;
cout<<"\t\t\t"<<tk;
getch();
}

4. Polinom LAGUERRE

Polinoamele Laguerre ortogonale, cu x ∈ (0,+∞) satisfac urmatoarea relatie de recurenta:

P0 ( x ) = 1, P ( x) = 1 − x

1
METODE NUMERICE

Pk ( x ) =
1
[(2k − 1)Pk −1 ( x) − ( k − 1) Pk − 2 ( x )], pentru k = 2,3,..., n.
k
Programul urmator prezinta implementarea in C++ a polinomului Laguerre intr-un punct
dat x.

/*
Polinomul LAGUERRE
*/
#include<iostream.h>
#include<conio.h>
void main(void)
{
double p0,p1,pk,x;
int n,k;
clrscr();
cout<<"Introduceti datele polinomului:"<<endl;
cout<<" x = ";
cin>>x;
cout<<"Dati gradul polinomului n = ";
cin>>n;
p0 = 1.0;
p1 = 1 - x;
for(k=2; k<=n; k++)
{
pk =1.0/k * ( (k*2-1) * p1 - (k-1) * p0 );
p0 = p1;
p1 = pk;
}
cout<<"Valoarea polinomului LAGUERRE este : "<<endl;
cout<<"\t\t\t\t\t"<<pk<<endl;
getch();
}

Programul urmator prezinta implementarea in C++ a polinomului Laguerre intr-o multime


de valori x.

/*
Polinoamele LAGUERRE in mai multe puncte
*/
#include<iostream.h>
#include<conio.h>
void main(void)
{
double x[100], y[100];
double p0,p1,pk;
int m,n,k,i;
clrscr();
cout<<"Introduceti datele polinomului:"<<endl;
cout<<"Dati gradul polinomului LAGUERRE n = ";
cin>>n;
cout<<" In cate puncte se face calculul m = ";
cin>>m;
for(i=1;i<=m;i++)
{

2
METODE NUMERICE

cout<<"Punctul x_"<<i<<" ";


cin>>x[i-1];
}
cout<<"======== Rezultate ========"<<endl;
for(i=1;i<=m;i++)
{
p0 = 1.0;
p1 = 1 - x[i-1];
for(k=2; k<=n; k++)
{
pk =1.0/k * ( (k*2-1) * p1 - (k-1) * p0 );
p0 = p1;
p1 = pk;
}
y[i-1] = pk;
cout<<x[i-1]<<"\t\t"<<y[i-1]<<endl;
}
getch();
}

5. Polinom LEGENDRE

Polinoamele Legendre, cu x ∈ (0,+∞) satisfac urmatoarea relatie de recurenta:

P0 ( x) = 1, P( x) = x

Pk ( x ) =
1
[(2k − 1)Pk −1 ( x) − ( k − 1) Pk −2 ( x)], pentru k = 2,3,..., n.
k
Programul urmator prezinta implementarea in C++ a polinomului Legendre intr-un punct
dat x.

/*
Polinomul LEGENDRE
*/
#include<iostream.h>
#include<conio.h>
void main(void)
{
double p0,p1,pk,x;
int n,k;
clrscr();
cout<<"Introduceti datele polinomului:"<<endl;
cout<<" x = ";
cin>>x;
cout<<"Dati gradul polinomului LEGENDRE n = ";
cin>>n;
p0 = 1.0;
p1 = x;
for(k=2; k<=n; k++)

3
METODE NUMERICE

{
pk =1.0/k * ((k * 2 - 1) * x * p1 - (k - 1) * p0 );
p0 = p1;
p1 = pk;
}
cout<<"Polinomul Legendre este :"<<endl;
cout<<"\t\t\t"<<pk;
getch();
}

6. Polinom HERMITE

Polinoamele Hermite ortogonale, cu x ∈ R satisfac urmatoarea relatie de recurenta:

P0 ( x) = 1, P( x) = 2 x
Pk ( x ) = 2 xPk −1 ( x ) − 2(k − 1) Pk − 2 ( x ), pentru k = 2,3,..., n.
Programul urmator prezinta implementarea in C++ a polinomului Hermite intr-un punct dat
x.

/*
Polinomul HERMITE
*/
#include<iostream.h>
#include<conio.h>
void main(void)
{
double p0,p1,pk,x;
int n,k;
clrscr();
cout<<"Introduceti datele polinomului:"<<endl;
cout<<" x = ";
cin>>x;
cout<<"Dati gradul polinomului HERMITE n = ";
cin>>n;
p0 = 1.0;
p1 = 2 * x;
for(k=2; k<=n; k++)
{
pk = 2 * x * p1 - (k - 1) * 2 * p0 ;
p0 = p1;
p1 = pk;
}
cout<<"Polinomul Hermite este :"<<endl;
cout<<"\t\t\t"<<pk;
getch();
}

4
METODE NUMERICE

9. Integrarea numerica a functiilor

Fie o func ie f : [a ,b] → R i F(x) o primitiv a sa. Atât f(x) cât i F(x) sunt func ii
continue. Conform formulei Newton-Leibnitz:
b b

∫ f ( x )dx = F ( x ) = F( b ) − F( a )
, (9.1)
a a
În cele mai multe cazuri este foarte greu uneori chiar imposibil de determinat forma
primitivei F(x). Integrala (9.1) se poate calcula cu aproxima ie folosind metodele
numerice prin care se aproximeaz func ia f(x) definit pe intervalul [a, b] cu o func ie
g(x) astfel încât:
b b

∫ f ( x )dx ≈ ∫ g ( x )dx (9.2)


a a
Pentru aceasta se utilizeaz urm toarea schem de calcul:
1. se realizeaz o împ ire a intervalului [a, b] în n-1 subintervale cu ajutorul punctelor
de diviziune xi, i=1, 2, 3, ..., n;
2. se scrie func ia de integrat sub forma: f(x) = g(x) + r(x), (9.3)
unde g(x) este o func ie de aproximare i r(x) o func ie rest;
3. se integreaz rela ia (9.3):
b b b

∫ f ( x )dx = ∫ g( x )dx + ∫ r( x )dx (9.4)


a a a
Dac aproximarea func ie f(x) se face prin interpolare cu func ia polinomial
n
g ( x ) = ∑ ak q k ( x ) atunci formula de calcul a integralei (9.4) devine:
k =1
b b n n b n b

∫ g( x )dx = ∫ ∑ ak qk ( x ) dx = ∑ ∫ ak qk ( x ) dx = ∑ ak ∫ qk ( x ) dx
a a k =1 k =1 a k =1 a
b n b (9.5)
deci ∫ g( x )dx = ∑ ak I k , I k = ∫ q k ( x )dx
a k =1 a
b

4. se caut o posibilitate de minimizare a erorii:


δ = ∫ r( x )dx (9.6)
a

1
METODE NUMERICE

1. Formule de integrare Newton-Cotes (cu interval inchis)

Aceste formule utilizeaz i valorile func iei de la capetele intervalului de integrare:


y1=f(a) i y2=f(b) i polinomul de interpolare Lagrange.

y=f(x) Func ii
spline

yi+1
yi+1
yi

O
xi xi+1 xi+2 x

Fig.7.1.1
În general pentru aproximarea func iei f(x) se utilizeaz diferite polinoame de
interpolare (preferându-se polinoame de grad mic, de obicei func ii spline continue de
gradul I sau II - fig. 9.1) i un num r cât mai mare de subintervale.
Polinomul de interpolare Lagrange Ln(x) are expresia:

( −1 )n−i q [n+1]
n
g ( x ) = Ln ( x ) = ∑ yi (9.7)
i =0 i! ( n − i )! ( q − i )

unde: q [n +1] = q (q − 1)(q − 2 )...(q − n )


x − a x − x0 dx
q= = ⇒ dq = ; dx = hdq
h h h
(9.8)
x = x0 = a ⇒ q = 0; x = xn = b ⇒ q = n;

Integrala (9.2) se scrie:

b b b

∫ f ( x )dx ≈ ∫ g ( x )dx = ∫ Ln ( x ) dx
a a a

( −1 ) n−i q [n +1]
b n n  (9.9)
∫ f ( x )dx ≅ ∫  ∑
 y i hdq
a 0  i =0
i! ( n − i )! ( q − i ) 

2
METODE NUMERICE

Dac se noteaz : h = (b − a ) / n rezult formula Newton Cotes:

1 ( − 1 ) n −i y i q [n+1]
b n n

∫ f ( x )dx = ( b − a )∑ ∫ ( q − i )dq (9.10)


a i =0 n i! ( n − i )! 0
b n
care se mai scrie: ∫ f ( x )dx = (b − a )∑ H i yi (9.11)
a i =0
n [n +1]
( −1 ) n − i q
n ⋅ i! ( n − i )! ∫0 ( q − i )
unde:
Hi = dq (9.12)

se numesc coeficien ii Cotes.

Cazuri uzuale ale formulei Newton Cotes

Aplica iile formulei de integrare aproximativ Newton Cotes pentru diferite diviziuni
ale intervalului [a, b] sunt:

Ø pentru n=2 puncte de diviziune rela ia (9.11) se scrie:


b

∫ f ( x )dx = (b − a )[H 0 y0 + H1 y1 ] (9.14)


a
unde coeficien ii Cotes H0 i H1 au valorile:
1 1
1 q( q − 1 ) q2 1
1 ⋅ 0!⋅1! ∫0
H0 = − dq = q − =
q 2 2
0
1 1
1 q( q − 1 ) q2 1 (9.15)

1 ⋅1!⋅0! ∫0 q − 1
H1 = dq = =
2 2
0
Înlocuind în rela ia (9.14) se ob ine formula trapezelor:
b

∫ f ( x )dx =
h
[y0 + y1 ] (9.16)
a
2

3
METODE NUMERICE

Ø pentru n=3 puncte de diviziune (dou subintervale) rela ia (9.11) se scrie:


b

∫ f ( x )dx = (b − a )[H 0 y0 + H1 y1 + H 2 y2 ] (9.17)


a
unde coeficien ii Cotes H0 , H1 i H2 au valorile:
2
1  q 2 q 3 
2
1 1
2 ⋅ 0!⋅2! ∫0
H0 = ( q − 1 )( q − 2 )dq =  2q − 3 +  =
4 2 3  6
0
2
1  2 q 3 
2
1 2
H1 = − ∫
2 ⋅1!⋅1! 0
q( q − 2 )dq = −
2 
−q +
3 
=
3
0 (9.18)
2
1  q 2 q 3 
2
1 1
2 ⋅ 2!⋅0! ∫0
H2 = q( q − 1 )dq = − + =
4  2 3  6
0

Notând: b − a = 2h se ob ine formula 1/3 a lui Simpson:

∫ f ( x )dx =
h
[y0 + 4 y1 + y2 ] (9.19)
a
3

Prezentam in continuare implementarea in C++ a metodei trapezelor:


Am nota cu ls valoarea lui a si cu ld valoarea lui b.

#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>

double f(double x)
{
return (x*x+5);
}

double i_trapez(double ls,double ld,int n)


{
double h,sum;
int i;
h=(ld-ls)/n;
sum=(f(ls)+f(ld))/2;

4
METODE NUMERICE

for(i=1;i<=n-1;i++) sum=sum+h*f(ls+i*h);
return sum;
}
void main()
{
double ls,ld;
int n;
clrscr();
cout<<"Dati limita stanga ls = ";cin>>ls;
cout<<"Dati limita dreapta ld = ";cin>>ld;
cout<<"Dati numarul de puncte n = ";cin>>n;
cout<<"Valoarea integralei prin formula trapezelor este
"<<i_trapez(ls,ld,n)<<endl;
getch();
}

Prezentam in continuare implementarea in C++ a metodei lui Simpson:

#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>

double f(double x)
{
return(x*x+5);
}

double i_simpson(double ls,double ld,int n)


{
double h,sum;
int i;
h=(ld-ls)/n;
sum=h*(1/3)*(f(ls)+f(ld));
for(i=1;i<=n-1;i++)
{
if(i==1+i%2) sum=sum+(2/3)*h*f(ls+i*h);
else sum=sum+(4/3)*h*f(ls+i*h);
return sum;
}
}

void main()
{
double ls,ld,h;
int n;
clrscr();
cout<<"Dati limita stanga ls = ";cin>>ls;
cout<<"Dati limita dreapta ld = ";cin>>ld;
cout<<"Dati numarul de puncte n = ";cin>>n;
cout<<"Valoarea integralei prin formula lui Simpson este
"<<i_simpson(ls,ld,n)<<endl;
getch();
}

5
Obiective curs.
• Crearea, analiza şi implementarea de algoritmi pentru rezolvarea problemelor din matematica
continuă
• Analiza complexităţii, analiza şi propagarea erorilor, condiţionarea problemelor şi stabilitatea
numerică a algoritmilor problemelor numerice
• Prezentarea metodelor numerice clasice şi a celor moderne de rezolvare a problemelor ştiinţifice
şi inginereşti
• Alegerea celor mai potrivite metode numerice pentru o problemă dată

Conţinut curs.
• Reprezentare în virgulă mobilă. Standardul IEEE 754 pentru numere reale.
Condiţionarea problemelor şi stabilitatea numerică a algoritmilor.
• Rezolvarea sistemelor de ecuaţii liniare prin metode gaussiene.
Pivotare parţială şi totală. Factorizare LU.
• Propagarea erorilor în rezolvarea sistemelor de ecuaţii liniare.
• Metode iterative de rezolvare a sistemelor de ecuaţii liniare
• Interpolare polinomială. Polinom de interpolare Lagrange.
• Diferenţe divizate. Polinom Newton. Eroarea interpolării.
• Interpolare cu funcţii spline. Interpolare trigonometrică.
• Aproximare uniformă. Polinoame Cebâşev. Algoritmii lui Remes.
• Aproximare continuă şi discretă în sensul celor mai mici pătrate.
• Rezolvarea sistemelor în sensul celor mai mici pătrate. Factorizare QR.
• Metodele Householder, Givens, Gram-Schmidt
• Integrare numerică. Metode Newton-Cotes. Metoda Romberg.
• Integrare gaussiană. Polinoame ortogonale. Integrale improprii.
• Integrarea ecuaţiilor diferenţiale ordinare. Metode Runge-Kutta.
• Metode multipas explicite şi implicite. Predictor-corector.
• Convergenţa metodelor multipas
• Valori proprii şi vectori proprii. Metodele puterii
• Algoritmul QR cu deplasare explicită. Descompunerea valorilor singulare

1
Aplicaţii ale calculului numeric.

1. Determinarea curenţilor într-un circuitul electric în regim staţionar:

conduce prin aplicarea legilor lui Kirchhoff la un sistem de ecuaţii liniare:


⎧ I1 + I2 − I3 = 0

⎨2I1 + 4I3 = 10
⎪ 3I2 + 4I3 = 18

cu soluţia I1=1, I2=2, I3=3
2. Modelul Leontieff consideră economia formată din n sectoare independente: S1,S2,…, Sn. Fiecare
sector consumă bunuri produse de celelalte sectoare (inclusive cele produse de el însuşi). Introducem
notaţiile:
mij = numărul de unităţi produse de sectorul Si necesare sectorului Sj să producă o unitate
pi = nivelul producţiei sectorului Si
mijpj = numărul unităţilor produse de Si şi consumate de Sj
Numărul total de unităţi produs de Si este: p1mi1+p2mi2+…+pnmin
Într-un system închis (autarhic) dacă economia este echilibrată, tot ce se produce trebuie consumat, adică:

⎧ m11 p1 + m12 p 2 + L + m1n p n = p1



⎨ L
⎪m p + m p + L + m p = p
⎩ n1 1 n2 2 nn n n

Adică sistemul: M.p = p sau (I-M).p=0, care pentru soluţii nenule, conduce la o problemă de valori
şi vectori proprii.
Într-un model deschis de economie, unele sectoare îşi satisfac unele cerinţe din exterior, adică:
pi = mi1p1+mi2p2+…+minpn+di
care conduce la sistemul liniar de ecuaţii:
p = M.p + d
cu soluţia:
p = (I-M)-1.d

2
3. Coeficienţii care apar în reacţiile chimice se obţin aplicând legea conservării masei ecuaţiei de echilibru
chimic. Astfel arderea etanului:
xC2H6 + yO2 → zCO2 + tH2O
dă sistemul de ecuaţii liniare:
⎧2x = z

⎨6x = 2t
⎪2 y = 2z + t

care are o soluţie întreagă:
x=2, y=7, z= 4, t=6.
deci ecuaţia chimică este:
2C2H6 + 7O2 → 4CO2 + 6H2O.
O problemă având o natură fizică oarecare poate fi studiată experimental sau prin simulare. Aceasta
poate fi transformată, utilizând legile fundamentale ale fizicii într-o problemă de natură matematică PM .
Vom spune că problema este bine pusă dacă admite o soluţie unică.

Ca exemplu, vom considera următoarea problemă fizică:


PF: Să se studieze propagarea temperaturii într-o bară AB de lungime l cunoscând
-temperaturile la momentul iniţial în orice punct M al barei θ 0 (x ), x ∈ [0, l]
-temperaturile la cele două capete τ A (t ) şi τ B (t ) în orice moment t ∈ [0, t1]

τ A (t ) θ0 (M) τB (t)

3
Problema matematică corespunzătoare este:
PM : Să se determine funcţia:

θ : (x,t ) → θ(x,t)
[0, l ] × [0, t1] → R
care satisface următoarele condiţii:
∂ 2θ ∂θ
10 =K⋅ ecuaţia lui Fourier
∂x 2
∂t
20 θ(x, 0)= θ 0 (x) condiţiile iniţiale
3 0
θ(0, t)= τ A (t) condiţiile pe frontieră
40 θ(l, t)= τ B (t)
5 0
θ ∈S , S = spaţiul funcţiilor de 2 ori derivabile pe [0, l]× [0, t1]

În acest moment intervine analiza numerică şi furnizează metodele de calcul, care în urma unui număr
finit N(x, t, ε ) de operaţii elementare furnizează pentru soluţia θ(x, t) o aproximaţie θ′(x, t) efectiv
calculabilă, astfel că: θ(x,t) − θ′(x,t) < ε .
Prezintă interes metodele de calcul în timp finit, cu: 0 < t < t1 care furnizează aproximaţii uniforme:
N(x, t, ε ) = N(ε ) .
Problema continuă PM este transformată într-o problemă asemănătoare Ph prin discretizare.
În acest scop se selectează un număr finit de puncte (iΔx, nΔt) din domeniul compact [0, l]× [0, t1]
folosind o reţea de discretizare cu paşii:
l
Δx = ,
M
t1
Δt = .
N

şi se notează: θ in = θ(iΔx, nΔt)

Dacă se aproximează derivatele parţiale cu diferenţele finite:


∂θ θ n − θ in − 1
(iΔx,nΔt) = i
∂t Δt
∂ 2θ θ in + 1 − 2 ⋅ θ in + θ in − 1
(iΔ x, n Δ t) =
∂x 2 Δx 2
se obţine următoarea problemă discretizată: Ph:

Să se determine θ i cu 1 < i < M, 0 < n < N , care satisface condiţiile:


n

θ in − θ in −1 θ n − 2 ⋅ θ in + θin − 1
10 = K ⋅ i +1
Δt (Δx)2
20 θi0 = θ0 (iΔx)
3 0 θ n0 = τ A (nΔt)
4 0 θ nM = τ B (nΔt)

4
Δt 1
50 ≤
(Δx) 2
2⋅K

Problema discretizată Ph constă în rezolvarea succesivă a N sisteme de ecuaţii liniare tridiagonale.


Diferenţa: θ(iΔx, nΔt) − θin evaluează apropierea între soluţia problemei discretizate Ph şi a modelului
matematic PM în fiecare punct al discretizării.
Soluţia problemei discretizate Ph trebuie să tindă spre soluţia problemei continue PM dacă h → 0 ( h
reprezintă pasul de discretizare – în cazul problemei considerate avem paşii Δx → 0, Δt → 0 sau
N → ∞, M → ∞ ); vom spune că trebuie satisfacută o condiţie de consistenţă:

lim Ph = PM .
h →0

O altă condiţie importantă o reprezintă stabilitatea; aceasta impune ca soluţia θ ′ a problemei perturbate
PM (manifestată prin perturbarea parametrilor θ ′ , τ′A , τ′B , K′ ) să fie apropiată de soluţia θ a
modelului matematic PM .
Pe baza modelului matematic discretizat se va proiecta un algoritm, care va fi analizat prin prisma:
- eficienţei (resurse folosite: timp de calcul şi memorie),
- convergenţei către soluţia modelului matematic continuu,
- efectului propagării erorilor.
Etapele enumerate evidenţiază urmatoarele tipuri de erori:
- erori deproblemă (inerente) care apar la trecere de la modelul fizic PF la cel matematic PM ,
- erori de metodă introduse prin discretizarea modelului matematic,
- erori de trunchere provin din natura infinită a unor procese care descriu soluţia problemei
- erori de rotunjire specifice rezolvării problemei pe calculatorul numeric, care utilizează aritmetica în
virgulă mobilă mobilă

5
Reprezentarea în virgulă mobilă.
fl(x) = ±0.a1a2...at × βe
reprezentare normalizată
1 ≤ a1 < β şi 0 ≤ ai < β, i=2:t
L ≤ e ≤ U
• Sistemul de reprezentare în virgulă mobilă F(β, t, L, U) cuprinde:
• baza β
• precizia reprezentării t
• limitele (superioară şi inferioară ale) exponentului L şi U
• reprezentarea lui zero
Exemplu: F(10, 1, 0, 1)={ ±0.a1×10e}∪{0} cu a1∈{1:9} şi e∈{0,1}, în total 37 de
numere.
• 2(β-1)βt-1(U-L+1) valori distincte
• a1 poate lua β-1 valori distincte,
• restul de t-1 cifre poate lua fiecare β valori diferite, deci βt-1,
• exponentul ia U-L+1, şi
• semnul două).
Cel mai mare număr reprezentabil Ω, (realmax) are forma:
Ω = 0.(β-1)(β-1)...(β-1)× βU =
= [(β-1)/β1+(β-1)/β2+...+(β-1)/βt] ×βU

6
= (β-1)/β(1-β-t)/(1-β-1)×βU = βU(1-β-t)
Ω = βU(1-β-t)
• Cel mai mic număr pozitiv reprezentabil ω numit şi realmin este:
ω = 0.10...0×βL=βL/β=βL-1
ω =βL-1
Surse de erori.
Un număr real x∈F se reprezintă exact, dacă suma se termină înainte de t termeni şi exponentul este
cuprins între limite. Altfel, numărul real x se aproximează printr-o valoare fl(x)∈F
Aproximarea numărului real
x=(0.a1a2... )βe=(a1β-1+a2β-2+...+atβ-t+at+1β-t-1 +...)βe
se poate face prin trunchiere sau prin rotunjire.
• Aproximarea prin trunchiere ignoră cifrele numărului real din dreapta poziţiei t.
fl(x)=(0.a1a2...at )βe=(a1β-1+a2β-2 +... +atβ-t)βe
• Aproximarea prin rotunjire consideră:
fl(x)=(0.a1a2...at+1 )βe dacă at+1 ≥ β/2
fl(x)=(0.a1a2...at )βe dacă at+1 < β/2
O depăşire superioară apare dacă e>U.
Ea declanşează o eroare la execuţie, care conduce la întreruperea calculelor.
O depăşire inferioară apare dacă e<L;
ea duce la înlocuirea numărului prin zero.
• Epsilon maşină (notat eps în Matlab sau μ) reprezintă cel mai mic număr pozitiv cu proprietatea că:
fl(1+μ) > 1
De exemplu în F(10, 4, -3, 3) cu rotunjire prin tăiere (trunchiere):
• fl(1+0.0009)=fl(1.0009)=1
• fl(1+0.0010)=fl(1.0010)=1.001 > 1
aşadar μtr=0.001=10-3 >ω=10-4.
• Dacă se foloseşte rotunjire, atunci:
fl(1+0.0004)=fl(1.0004)=1
fl(1+0.0005)=fl(1.0005)=1.001 > 1
cu μrot=0.0005=1/2.10-3 =1/2.μtr
• Eroarea absolută la rotunjirea prin trunchiere:
ex = x-fl(x)=(a1/β1+ a2/β2+...+ at/βt+at+1/βt+1+...)βe
– (a1/β1+ a2/β2+...+ at/βt)βe
ex = (at+1/β1+ at+2/β2+...)βe-t

|ex|≤|(β-1)/β1+(β-1)/β2+...|βe-t=
(β-1)βe-t (1/β1+1/β2+...) ≤ (β-1)βe-t/(β-1)= βe-t
|ex| ≤ βe-t
Dacă se foloseşte rotunjirea atunci eroarea absolută este şi mai mică:
|ex|≤ 1/2. βe-t
• Eroarea relativă este:
εx = |ex|/|x| = |x-fl(x)|/|x| ≤ βe-t/(0.a1...at...βe)

7
εx ≤ βe-t/(0.10...0βe)= β1-t
εx ≤ β1-t la trunchiere
εx ≤ 1/2. β1-t la rotunjire
În general:
|x-fl(x)|/|x| ≤ μ
de unde deducem:
fl(x) =x(1+ε), |ε| ≤ μ=K β-t

• De exemplu F(10,4,-20,20),Ω=1020(1-10-4) =9.999×1019,



ω=10-20-1=1.0×10-21, μr=1/2.10-4+1=5×10-4
Propagarea erorilor.

• numere aproximative -operaţii exacte


• operaţii aproximative - date exacte
1.Rezultatul exact al adunării a două numere x şi y, dacă operaţiile se execută exact este x+y.
În realitate, se lucrează cu valorile inexacte x şi y, în care:
ex=|x-x| şi ey=|y-y|
x+y=x+y±ex+y =x±ex+y±ey=x+y±(ex+ey)
ex+y=ex+ey
εx+y=ex+y/|x+y|=(ex+ey)/|x+y|=(|x|εx+|y|εy)/|x+y|
εx+y=|x|/|x+y|εx+|y|/|x+y|εy=kxεx+kyεy
Pentru scădere:
x-y=x-y±ex-y=x±ex-(y±ey)=x-y±(ex+ey)
de unde:
ex-y=ex+ey
εx-y=|x|/|x-y|εx+|y|/|x-y|εy=kxεx+kyεy
În acest caz coeficienţii de ponderare:
kx=|x|/|x-y| şi ky=|y|/|x-y|
pot lua valori foarte mari dacă x≈y, deci în cazul scăderii numerelor apropiate ca ordin de mărime se pot
comite erori foarte mari
În cazul înmulţirii:
xy=xy±exy=(x±ex)(y±ey)=xy±xey±yex+exey≈xy±(xey+yex)
exy=xey+yex
εxy=εx+εy
2. Dacă operaţiile se reprezintă aproximativ, iar numerele sunt reprezentate exact, adunarea a două
numere x=fx.bex şi y=fy.bey presupune aducerea celui mai mic (fie acesta y) la exponentul celui mai
mare, producându-se o denormalizare
fl(x+y)=fl(fxbex+fyb-(ex-ey)bex)=fl[(fx+ fyb-(ex-ey )
) bex]
fl(x+y)=fl[(fx+fy(1+μ))bex]=fl[x+(1+μ)y]

8
Rezultatul operaţiei este normalizat:
fl(x+y)=[x+(1+μ)y](1+μ)
Denormalizarea unuia dintre termeni poate fi evitată dacă se păstrează rezultatul intermediar într-un
acumulator cu lungimea 2t (acumulator dublu) În acest caz numai rezultatul final va fi afectat de
trunchiere la t cifre semnificative şi normalizare, deci:
fl2(x+y)=(x+y)(1+μ)
Anularea catastrofală.
• La scăderea a două numere apropiate ca ordin de mărime, cifrele semnificative se anulează reciproc,
rezultând o eroare relativă mare.
fl(x)=0.a1a2...ap-1ap...at× βe
fl(y)=0.a1a2...ap-1bp...bt× βe
fl(y)-fl(y)=0.0 0 ...0 cp...ct× βe =0.cp...ct× βe-p

Iniţial avem o singură cifră inexactă, în poziţia t, cu eroarea relativă β1-t
• După scădere, bitul inexact trece în poziţia t-p cu eroarea relativă β1-(t-p)adică amplificată de βp
ori.
Să considerăm scăderea numerelor x=0.120 şi y=-0.119 în sistemul F(10,2,-10,10):
fl(x)=-fl(y)=0.120
ε=|((x+y)-fl(x+y))/(x+y)|=(0.001-0)/0.001=1 !
eroarea este de 100% !
Se evită scăderea numerelor apropiate ca ordin de mărime prin:
•înmulţire cu conjugatul,
•dezvoltare în serie Taylor,
•rearanjarea termenilor etc .
Prin rearanjarea termenilor evităm adunarea numerelor foarte diferite ca ordin de mărime.
Astfel în sistemul F(10, 3,-10,10) cu rotunjire suma: 1+0.002+0.002+0.002 calculată
• fl(fl(fl(1+0.002)+0.002)+0.002)=1
în timp ce asocierea:
• fl(1+fl(0.002+fl(0.002+0.002)))=1.01.
În aritmetica în virgulă mobilă, asociativitatea nu se mai păstrează. Astfel:
fl(fl(x+y)+z)≠fl(x+fl(y+z)).
De exemplu:
fl(fl(1+μ/2)+ μ/2)= fl(1+μ/2)=1,
în timp ce:
fl(1+fl(μ/2+μ/2))= fl(1+μ) > 1
Reprezentarea numerelor reale (standardul IEEE 754).
Permite reprezentarea realilor în:
1) precizie simplă F(2, 24, -126, 127), folosind 32 biţi
2) precizie dublă F(2, 53, -1022, 1023); se folosesc 64 biţi:
3) precizie extinsă F(2, 65, -16382, 16382); se folosesc 80 biţi:
Întrucât a1=1, acesta nu se mai reprezintă (este ascuns), câştigându-se astfel precizie suplimentară. Bitul
ascuns este evidenţiat în reprezentarea: fl(x)=(-1)s2e.(1.+.f)

9
Precizie simplă
• reprezentare pe 32 biţi
• baza β= 2
• precizie t= 24 biţi (numerele normalizate păstrează numai 23 biţi)
• Numărul real este păstrat prin 3 componente:
– semnul: 1 bit
– exponentul: 8 biţi
– mantisa: 23 biţi (logic24)
8
• Cei 8 biţi permit: 2 = 256 valori diferite. Domeniul [0, 255] este transformat în [-127,
128]
• La exponentul (pozitiv sau negativ) se adaugă o valoare constantă care duce la un exponent
deplasat sau caracteristică pozitivă. Factorul de deplasare pentru precizie simplă este127.
• Domeniul deplasat [0-255] reprezintă exponenţi în domeniul [-127, 128]
exponent_deplasat = exponent + 127
Valoarea numărului este: V=(-1)s.2e.(1.+.f)
• 1=(-1)0.20.(1.+.0)

0+127

0 01111111 00000000000000000000000
S e(8) f(23)
0 011 1111 1000 0000 0000 0000 0000 0000
└────┘└───┘└───┘└───┘└───┘└───┘└───┘└───┘
3 F 8 0 0 0 0 0

• -6.5=(-1)1.22.(1.+0.625)

2+127

1 10000001 10100000000000000000000
S e(8) f(23)
1 100 0000 1 101 0000 0000 0000 0000 0000
└────┘└───┘└───┘ └───┘└───┘└───┘└───┘└───┘
C 0 D 0 0 0 0 0
Un număr mai mare decât cel mai mare număr reprezentabil M (cunoscut sub numele de modulul
reprezentării) se obţine în urma unei depăşiri superioare (de regulă o împărţire prin 0: 1/0 = ∞, -
1/0 = -∞) va fi desemnat prin infinit – Inf, iar nedeterminările 0/0, ∞/∞ etc, vor fi desemnate ca NaN
(Not a Number).
Pentru toate acestea se rezervă în reprezentare cel mai mare exponent posibil 128 (adică exponentul
deplasat 255).
Precizie simplă
S E (8biti) E-127 H F (23biti) Valoare
NaN 0 11111111 128 1 ≠0
+Inf 0 11111111 128 1 000 …000 (-1)02128 0x7F800000
Ω 0 11111110 127 1 111 …111 (-1)02127(2-2-23)≈3.4E38 0x7F7FFFFF
...
1+ε 0 01111111 0 1 000 …001 (-1)020(1+2-23) 0x3F800001
ε =2-23≈1.92E-7

10
1 0 01111111 0 1 000 …000 (-1)020=1 0x3F800000
ω 0 00000001 -126 1 000 …000 (-1)02-126=2-126≈1.175E-38 0x00FFFFFF
MaxD 0 00000001 -126 0 111 …111 (-1)02-126(1-2-23)=2-126-2-149
...
MinD 0 00000001 -126 0 000 …001 (-1)02-1262-23=2-149≈1.4E-45 0x00000001
+0 0 00000000 -127 1 000 …000 (-1)02-127=2-127 0x00000000
• Cel mai mic număr normalizat ω = 2-126 ≈1.175E-38
• Cel mai mic număr denormalizat este .00…1 * 2-126 = 2-149≈1.4E-45
• Infinit rezultă din calcule precum: 1/0 = ∞, -1/0 = -∞
Se reprezintă cu exponentul deplasat 255, (nedeplasat 128), şi fracţia 0. … 0
• Cel mai mare număr Ω = 1.111…1*2127 ≈ 3.4E38
• NaN (“not a number”) apare când se încearcă o operaţie nelegală (ca sqrt dintr-un număr
negativ)
• Orice expresie care conţine un termen NaN este evaluată ca NaN
– Există cazuri în care apariţia unui NaN nu declanşează nici o întrerupere (excepţie) NaN
este “liniştit” (QNaN)
– Un NaN semnalizat (SNaN)declanşează o excepţie (de exemplu o valoare neiniţializată)
• sqrt(număr negativ)
• 0 * ∞ 0 / 0 ∞ / ∞
• x % 0 ∞ % x ∞ - ∞
Precizie dublă
S E(11b) E-1023 H f(52biti) Valoare
NaN 0 11…11 1024 1 ≠0
+Inf 0 11…11 1024 1 000 …000 (-1)021024
Ω 0 11…10 1023 1 111 …111 (-1)021023(2-2-52)≈1.8E308
1+ε 0 01…01 0 1 000 …001 (-1)020(1+2-52) ε=2-52≈1.1E-16
1 0 01…01 0 1 000 …000 (-1)020=1
ω 0 00…01 -1022 1 000 …000 (-1)02-1022=2-1022≈2.2E-308
MaxD 0 00…01 -1022 0 111 …111 (-1)02-1022(1-2-52)=2-1022-2-1074
MinD 0 0…001 -1022 0 000 …001 (-1)02-10222-52=2-1074≈5E-324
+0 0 0…000 -1023 1 000 …000 (-1)02-1023=2-1023
Condiţionarea problemelor.
• Condiţionarea unei probleme caracterizează sensibilitatea soluţiei în raport cu erorile din datele de
intrare.
• O problemă este bine condiţionată dacă erori mici în date produc de asemeni erori mici în rezultate.
• Condiţionarea este o proprietate a problemei, independentă de soluţia aleasă.
• O problemă rău condiţionată este „aproape nerezolvabilă” în practică (chiar dacă problema este
rezolvată exact, soluţia poate fi lipsită de semnificaţie).
• De exemplu, la evaluarea funcţiei y=f(x), o perturbare a datelor x+Δx produce o perturbare a
soluţiei y+Δy = f(x+Δx), în care:
• eroarea absolută Δy ≈ f' (x ) ⋅ Δx

11
Δy f′(x ) Δx
• eroarea relativă ≈ ⋅ x ⋅
y f( x ) x
f' (x )
• Problema este rău condiţionată dacă factorul Lipschitz L = ⋅ x este mare.
f(x )
Stabilitatea numerică a algoritmilor
• Stabilitatea numerică caracterizează erorile numerice introduse de algoritm, în ipoteza unor date de
intrare exacte. Se referă la precizia algoritmului.
• Un algoritm este instabil dacă erorile de rotunjire produc erori mari în rezultate.
• Un algoritm numeric stabil nu introduce o sensibilitate suplimentară la perturbaţii.
• Un algoritm stabil dă rezultate apropiate de soluţia exactă pentru o problemă bine condiţionată.
• Un algoritm stabil nu poate rezolva o problemă rău condiţionată, dar un algoritm instabil poate da
soluţii slabe chiar pentru o problemă bine condiţionată.
Dacă f: X → Y este o problemă şi f∼: X → Y este un algoritm, atunci acesta este numeric stabil
dacă pentru ∀x∈X, ∃x∼∈X, astfel încât:

f − (x ) − f(x − ) = O (ε m ) şi x − x− = O(ε m )

Algoritmul f destinat rezolvării problemei f este numeric stabil, dacă este îndeplinită una din condiţiile:
1. f∼(x)≅ f(x), adică soluţia calculată aproximează bine soluţia exactă∼
2. există x∼ apropiat de x astfel încât f∼(x)=f(x∼) – soluţia calculată de algoritm cu date de
intrare exacte este soluţia exactă cu date uşor perturbate.
Exemple de algoritmi instabili:
• inversarea de matrice folosind determinanţi
• rezolvarea sistemelor liniare prin factorizare LU fără pivotare
• utilizarea factorizării Cholesky în metoda celor mai mici pătrate (rezultate mult mai bune furnizează
factorizarea QR).
• calculul valorilor proprii ca rădăcini ale polinomului caracteristic

Bibliografie.
• V.Iorga, B.Jora “Metode Numerice”,Ed.Albastră,2005
• C.Popeea, B.Jora, B.Dumitrescu “Calcul Numeric – Algoritmi fundamentali”, Ed.ALL
• C.Moler “Numerical Computing with Matlab”
• V.Iorga, F.Pop “Metode Numerice –Îndrumar de laborator”

12
1

CURS 2
METODE NUMERICE PENTRU SISTEME DE ECUAŢII NELINIARE
------------------------------------------------------------------------------------------------------------
0. Preliminarii: Norma unui vector si norma unei matrici (rapel).
1. Sisteme de ecuaţii neliniare. Definiţii.
2. Metoda punctului fix.
3. Metoda Newton; metode cvasi-Newton.

0 Norma unui vector şi norma unei matrici


Fie V un spaţiu vectorial: în cazul de faţă, V este R n sau C n .
Norma unui vector x ∈ V este aplicaţie || . ||: V → R + , satisfăcând axiomele:
1. || x || ≥ 0, şi || x || = 0 ⇔ x = 0.

2. || λ ⋅ x || = | λ | ⋅ || x || , ∀λ = scalar ( λ ∈ R sau λ ∈ C ).

3. || x + y || ≤ || x || + || y ||

Exemple de norme ale unui vector:


|| x || ∞ = max | xi | … norma-∞ (norma maximum)
i =1, n

n
|| x ||1 = ∑ | xi | … norma-1
i =1

1/ 2
 n 
|| x ||2 =  ∑ | xi |2  … norma-2 (norma euclidiană)
 i =1 

Fie An este mulţimea matricilor n × n cu elemente scalare (reale, complexe).
Norma unei matrici A ∈ An este o aplicaţie || . ||: An → R + , care satisface axiomele
1 – 3, şi în plus, următoarele:
4. || A ⋅ B || ≤ || A || ⋅ || B ||

5. || A ⋅ x || ≤ || A || ⋅ || x ||

În axiomele 4-5, B ∈ An , iar x este un vector. Normele care satisfac 5 se zic


compatibile cu norma vectorului.

a.ch. – Octombrie 2008


2

Observaţie
Definiţia normei unei matrici, indusă de norma vectorului, este:
|| A ⋅ x ||
|| A || = sup
x ≠0 || x ||
Pentru detalii privind norma unui vector şi norma unei matrici, vezi Capitolul 4-I ■
Exemple de norme ale unei matrici:
|| A || ∞ = max ∑ | a ij | - norma liniilor
i
j

|| A ||1 = max ∑ | aij | - norma coloanelor


j
i

[
|| A ||2 = ρ ( A ∗ ⋅ A ) ] 1/ 2
- norma euclidiană,

în care: A ∗ = A T ( A – conjugat transpus); ρ = max | λ j | , unde λ j , j = 1, n sunt


j

valorile proprii ale matricii A. ρ se zice rază spectrală.

1 Definiţii
Fie sistemul de ecuaţii neliniare

f1 ( x1 , x 2 , ... , x n ) = 0
KK
f n ( x1 , x 2 , ... , x n ) = 0

Acesta se scrie vectorial

f ( x) = 0 (1)

unde f : I → R n , I ⊂ R n . Explicit:

 x1  0   f 1 ( x) 
x  0   f ( x) 
 2    2 
x =  .  , 0 =  .  , f ( x) =  .  ,
     
. .  . 
 x n  0  f n (x)

O soluţie a sistemului (1) se va nota cu α, adică: f (α ) = 0 .

a.ch. – Octombrie 2008


3

Pentru rezolvarea prin metoda punctului fix, sistemul (1) se va considera pus sub
forma:

x = g (x ) (2)

în care g : I → R n , I ⊂ R n ,

O soluţie a lui (2) se va nota α, adică: α = g(α ) .

În ceea ce urmează, se presupun cunoscute noţiunile de normă a unui vector || x || , şi


normă a unei matrici pătratice || A || . În particular, norma-∞ este:

|| x || ∞ = max | xi | ; || A || ∞ = max ∑ | a ij | .
i i
j

2 Metoda punctului fix


Ecuaţii de forma x = g (x ) .
Metoda

Metoda constă în construirea şirului:


( 0) (0) (0)
x ( 0) = [ x1 x2 ... xn ]T - aproximaţia iniţială, dată;

x ( n+1) = g(x ( n ) ), n ≥ 0

A nu se confunda indicele superior (n) (indicele iteratei) cu ordinul n al sistemului


(indice inferior al coordonatei x n(k ) ).

Convergenţa procesului iterativ este asigurată de următoarele condiţii:

(1) g este contractantă – pe o vecinătate I a rădăcinii: pentru ∀x, y ∈ I


|| g ( x ) − g( y ) || ≤ M ⋅ || x − y || , M < 1.

(2) Aproximaţia iniţială x ( 0 ) ∈ I este suficient de apropiată de rădăcina α.

Observaţie
Dacă g : C → C şi C ⊂ R n este un compact (mulțime mărginită și închisă), atunci

procesul converge pentru ∀x ( 0 ) ∈ C .

a.ch. – Octombrie 2008


4

Teorema 1

Presupunem:

1. x = g (x) are o rădăcină α.

2. g este continuă şi are derivate parţiale de ordinul 1 continue, pe I definit de:

|| x − α || ∞ ≤ ρ .

3. Derivatele satisfac condiţia:

∂g i ( x)
max ∑ ≤ λ < 1 , ∀x ∈ I .
i
j ∂x j

Atunci, ∀x ( 0 ) ∈ I :

(a) Iteratele x (n ) ∈ I .

(b) Şirul x ( n ) → α .

(c) α este unica rădăcină în I ■

x2

x
ξ
ρ y
α

x1

Intervalul I din Condiția (2).

a.ch. – Octombrie 2008


5

Sumarul demonstraţiei:

Fie x, y ∈ I: || x − α || ∞ ≤ ρ , || y − α || ∞ ≤ ρ . Din desvoltarea Taylor, se arată că avem:

|| g(x) − g(y ) || ∞ ≤ λ ⋅ || x − y || ∞

Rezultă:

|| x ( n +1) − α || ∞ = || g(x ( n ) ) − g(α ) || ∞ ≤ λ ⋅ || x ( n ) − α || ∞ ≤ λ ⋅ ρ < ρ

şi prin inducţie:

|| x ( n ) − α ||∞ ≤ λn ⋅ ρ

Cum λ < 1, rezultă λn → 0 , sau x ( n ) → α .

Concluzia (c) se demonstrează prin contradicţie ■

Observaţii
1) Matricea jacobian a funcţiei g:

Introducem jacobianul G a lui g, prin:

 ∂g1 ∂g1 ∂g 1 
 ∂x ...
∂x 2 ∂x n 
 ∂g i   1 
G ( x) =   = . . . . . . . . . . . . . . . . . . . . . 
 ∂x j  x  ∂g 
 n ∂g n ... ∂g n 
 ∂x1 ∂x 2 ∂x n  x

Cu definiţia normei || A || ∞ = max ∑ | a ij | , condiţia 3 se scrie:


i
j

3'. || G( x ) ||∞ ≤ λ < 1 , ∀x ∈ I

G(x) joacă rolul lui g ′( x ) pentru o funcţie scalară.

2) Convergenţa liniară:

În condiţiile din Teorema 1, cu λ > 0, convergenţa este liniară, conform relaţiei:

|| x ( n +1) − α || ∞ ≤ λ ⋅ || x ( n ) − α || ∞ .

a.ch. – Octombrie 2008


6

3) Convergenţa de ordinul 2 (pătratică)

Să presupunem că în rădăcina α, avem:

∂g i
G( α ) = O ⇔ = 0; i, j = 1, 2, …, n
∂x j
α

unde O este matricea nulă, şi că ∂g i / ∂x j sunt continue pe o vecinătate a lui α.

Atunci, ∃ρ > 0 astfel încât condiţia 3 sau 3' este satisfăcută. Dacă, în plus, derivatele

de ordinul 2 există şi sunt mărginite pe || x − α || ∞ ≤ ρ , adică:

∂ 2 gi
max ≤ M1 ,
i , j ,k ∂x j ∂x k

atunci din formula Taylor rezultă:


2
|| g ( x ) − g( α ) ||∞ ≤ M ⋅ || x − α ||∞ ,

1 2
unde M = ⋅ n ⋅ M1 ,
2

Cu x = x ( n ) , g(x ( n ) ) = x ( n +1) , rezultă:

2
|| x ( n +1) − α ||∞ ≤ M ⋅ || x ( n ) − α ||∞

care arată că convergenţa este de ordinul 2

2.2 Procedură explicită de punct fix

Considerăm sistemul dat sub forma f ( x) = 0 şi vrem să-l transformăm într-un sistem
echivalent de forma x = g (x) .

Fie A ( x ) = [ aij ( x )] o matrice n × n , nesingulară pe o vecinătate a lui α. Definim:

g( x ) = x − A (x ) ⋅ f (x )

Este evident că, A fiind nesingulară, avem:

a.ch. – Octombrie 2008


7

x = g(x) ⇔ f (x) = 0 .

Exemplu – 1: ‘Iterare cu matrice constantă’

A(x) = A , unde A = matrice constantă (aij = constant) şi nesingulară.

g(x) = x − A ⋅ f (x )

Se verifică imediat că, jacobianul lui g este dat de:

G (x) = I − A ⋅ F (x) ,

unde I este matricea unitate, iar F(x) este jacobianul lui f,

 ∂f j 
F ( x) =   .
 ∂x k  x

Explicit:

 ∂f 1 ∂f 1 ∂f 1 
 ∂x ∂x ... ∂x 
 ∂f   1 2 n

F ( x) =  i  = . . . . . . . . . . . . . . . . . . . . . 
 ∂x j  x  
 ∂f n ∂f n ... ∂f n 
 ∂x1 ∂x 2 ∂x n  x

Conform Teoremei 2, iteraţia va converge dacă elementele matricii G(x) sunt


suficient de mici, şi x ( 0 ) este suficient de apropiat de α.

Pentru o convergenţă mai rapidă, să cerem – v. Observaţia 3:

G( α ) = O .

Rezultă A ⋅ F (α ) = I , sau

A = [F (α ) ] .
−1
(3)

Cum α nu este cunoscut, luăm de exemplu, α ≈ x ( 0 ) , rezultă:

[
A = F(x ( 0) ) ] −1
. (4)

Iteraţia va fi definită de

a.ch. – Octombrie 2008


8

x ( n+1) = x ( n ) − A ⋅ f (x ( n ) ) , (5)

unde A este definită de (4).

Procedura se zice iterare cu matricea constantă A, şi este analoagă cu metoda coardei


pentru o funcţie scalară ■

2.3 Schema practică de iterare

Procedeul practic, care evită inversarea matricii F(x ( 0) ) , este următorul. Punem:

δx ( n +1) = x ( n +1) − x ( n ) ,

şi rezultă:

F(x ( 0)δx ( n +1) = −f (x ( n ) )


 ( n +1) n≥0 (6)
 x = x ( n ) + δx ( n +1)

Procedeul revine la determinarea corecţiei δx ( n +1) prin rezolvarea sistemului liniar din
prima ecuație (6). Iteraţia se opreşte prin testele

|| δx ( n+1) || ≤ eps , (7a)

n +1 ≤ lnit (7b)

unde toleranţa eps şi numărul limită de iteraţii lnit, sunt alese dinainte. Procedeul este
util mai ales dacă actualizăm A după un număr de paşi, conform Observaţiei 1.

Codul Fortran care implementează această schemă, cu actualizarea matricii A după 3


paşi, este dat în ANA – Fix_Sys.

Exemplu – 2: ‘Metoda Newton’


Să presupunem că, pentru a avea A = [F (α ) ]−1 , actualizăm matricea A din (4,5), la
fiecare pas. Iteraţia (5) devine:

[
x ( n+1) = x ( n ) − F(x ( n ) ) ]
−1
⋅ f (x ( n ) ) .

Aceasta reprezintă metoda Newton pentru sistemul f(x) = 0 – v. în continuare ■

a.ch. – Octombrie 2008


9

3 Metoda Newton
Ecuaţii de forma f ( x) = 0 .
Metoda

Considerăm ecuaţia echivalentă x = g (x) , unde g ( x) = x − A ( x) ⋅ f ( x) .

Căutăm A(x) , astfel ca metoda punctului fix pentru g să aibă ordinul doi. Condiţia
este – v. mai sus, G( α ) = O , sau

∂g i
=0, i, k = 1, 2, .., n .
∂x k x =α

Se verifică faptul că aceasta conduce la condiţia A (α ) = [F (α )]−1 .

Atunci, presupunem că:

- f este continuă şi cu derivate parţiale de ordinul 1 continue, pe o vecinătate a lui


rădăcinii α.

- Jacobianul lui f este nesingular în α:

det( F (α )) ≠ 0 .

Determinantul fiind funcţie continuă de elementele jacobianului, ∃ρ > 0 astfel că


pentru || x − α || ≤ ρ să avem

det( F ( x)) ≠ 0 .

Alegem atunci

A( x) = [F ( x)] ,
−1
|| x − α || ≤ ρ ,

care asigură A (α ) = [F (α )]−1 . Rezultă:

g ( x ) = x − [F( x )] ⋅ f ( x )
−1

Metoda Newton este atunci:

[
x ( n +1) = x ( n ) − F( x ( n ) ) ]
−1
⋅ f (x ( n ) ) (8)

Conform Teoremei 1 şi Observaţiei 3, rezultă următoarea

a.ch. – Octombrie 2008


10

Propoziţie
Dacă f are derivate parţiale de ordinul 2, mărginite pe || x − α || ≤ ρ , şi x ( 0 ) este
suficient de apropiat de α, atunci metoda Newton are convergenţă pătratică ■

În propoziţia de mai sus, şi în relaţiile anterioare, || . || este || . || ∞ .

Notă
Ipotezele de mai sus, în particular det( F (α )) ≠ 0 , se poate înlocui cu altele – v . Cap.
3-IV, 3.1, Teorema 3. Astfel, metoda se poate aplica şi în cazul det( F (α )) = 0 . În
acest caz, convergenţa este liniară. ■

3.2 Schema practică de iterare


Schema practică de iterare este cea de la 2.3, evitându-se inversarea matricii F(x ( n ) ) ,
şi anume:

F(x ( n ) ) ⋅ δx ( n+1) = −f (x ( n ) )
 ( n +1)
n≥0 (9)
 x = x ( n ) + δx ( n +1)

Corecţia δx ( n +1) se calculează prin rezolvarea sistemului liniar din prima ecuație (9).
Iteraţia se opreşte prin testul

|| δx ( n+1) || ≤ eps , (10a)

unde toleranţa eps este aleasă dinainte. Obişnuit, se adaugă şi testul:

Număr de iteraţii ≤ lnit, (10b)

unde lnit este numărul limită prescris de iteraţii.

Codul Fortran care implementează această schemă se dă în ANA – Newton_Sys.

3.3 Calculul numeric al derivatelor parţiale

Evaluarea jacobianului F(x ( k ) ) , la pasul k, cere evaluarea a n2 funcţii ∂f i / ∂xk . Chiar


dacă acestea se pot calcula analitic, pentru n mare efortul de calcul este mare. Alteori,
f i (x) sunt date numeric. În astfel de cazuri, derivatele se calculează numeric, prin
diferenţe divizate:

a.ch. – Octombrie 2008


11

∂f i f i ( x1 , ... , x j + h, ... , x n ) − f i ( x1 , ... , x j , ... , x n )


= ,
∂x j (k )
h x (k )
x

unde | h | este ‘mic’. Creşterea h poate constantă, sau poate fi variată de la un pas la

altul (luând h = h ( k ) ). h nu se ia excesiv de mic, pentru a nu conduce la erori de


rotunjire mari. Se arătă că, pentru a menţine convergenţa pătratică, h trebuie să
satisfacă condiţia (la pasul k):

| h | ≤ C || f (x (k ) ) || ,

unde C este o constantă pozitivă, fixată dinainte (Ralston & Rabinowitz (1978)).

3.4 Metode cvasi-Newton

Metoda Newton este metoda descrisă de formula de iterare (6), care utilizează
jacobianul evaluat la fiecare pas x (n ) (analitic, sau numeric).
Dacă jacobianul F(x (n ) ) este înlocuit cu o aproximaţie a acestuia, metodele se zic
metode Newton-modificate sau metode cvasi-Newton.

Pentru a reduce efortul de calcul se procedează la înlocuirea jacobianului F(x (k ) ) de

la pasul k, cu o aproximaţie a acestuia, fie aceasta A (k ) , după una din următoarele


scheme:

- Jacobianul nu se actualizează după fiecare pas, ci după un număr m de paşi:

A ( l ) = F(x ( k ) ) - pentru l = k , K , k + ( m − 1) .

Această schemă reduce viteza convergenţei, dar este economică la o rulare lungă.

- Aproximaţia jacobianului la pasul k+1 se generează din cea de la pasul k, fără


evaluări suplimentare de funcţii. Această schemă este mai bună decât precedenta.
Pentru modalităti de generare a lui A ( k +1) - v. Ralston & Rabinowitz (1978).

Cu modificările precedente, formula de iterare (8) devine:

x ( k +1) = x ( k ) − [ A ( k ) ] −1 ⋅ f (x ( k ) ) (9)

a.ch. – Octombrie 2008


12

Nota 1: Metoda Newton prin liniarizarea ecuaţiilor


Fie ecuaţia neliniară f ( x) = 0 , sau explicit, sistemul

f i (x) = 0, i = 1, 2, K, n

Dacă x ( 0 ) este în vecinătatea rădăcinii, considerăm desvoltarea Taylor a lui f i (x) în

jurul lui x ( 0 ) :

n
∂f i
f i ( x) = f i ( x ( 0 ) ) + ∑ ( x j − x (j0) ) + K
j =1 ∂x j
x( 0 )

unde termenii nescrişi sunt de ordin mai mare sau egal cu doi în ( x j − x (j0) ) .

Presupunem că aceştia sunt neglijabili în raport cu termenii de orinul întâi, şi avem

n
∂f i
f i ( x) ≈ f i ( x ( 0 ) ) + ∑ ( x j − x (j0) )
j =1 ∂x j
x( 0 )

∂f i
Notăm F ji = elementele jacobianului F al lui f, adică
∂x j

 ∂f 1 / ∂x1 L ∂f 1 / ∂x n   F1 L Fn 
1 1

 
F (x) =  L L L  =  L L L 
∂f n / ∂x1 L ∂f n / ∂x n   F1n L Fnn 

Desvoltarea devine
n
f i (x) ≈ f i (x ( 0 ) ) + ∑ F ji (x ( 0) )( x j − x (j0) ) ,
j =1

Sau, matriceal,

 x1 − x10 
 
 x 2 − x 20 
f i (x) = f i (x ( 0) ) + [ F1i F2i K Fni ] x( 0 ) ⋅
 M 
 0
 x n − x n 

a.ch. – Octombrie 2008


13

Ecuaţiile scrise pentru i = 1,2, K , n , dau:

f (x) ≈ f (x ( 0 ) ) + F(x ( 0) )(x − x ( 0 ) )

Rezolvăm aproximativ sistemul f ( x) = 0 , înlocuind f (x) prin expresia sa liniarizată


(în membrul doi al relaţiei precedente; punem semnul = în loc de ≈).

Rezultă:

F(x ( 0) )δx = −f (x ( 0) ) , (11)

unde s-a pus

δx = x − x ( 0) .

Relaţia (11) este formula schemei de iterare în metoda Newton.

Soluţia x (1) = x ( 0 ) + δx este o aproximaţie a rădăcinii (este soluţia sistemului


liniarizat).

Presupunând că aproximaţia x (1) este mai bună decât x ( 0 ) , atunci metoda constă în
aplicarea repetată a formulei (10), înlocuind, la pasul următor, x ( 0 ) cu x (1) .

Astfel, în general, metoda Newton este:

F(x ( k +1) )δx ( k +1) = −f (x ( k ) ), k = 0, 1, K

unde δx ( k +1) = x ( k +1) − x ( k )

Problema constă acum, în a proba că şirul x ( k ) → α .

Nota 2: Interpretare geometrică pentru cazul n = 2


Să punem z = f1 ( x, y ) , z = f 2 ( x, y ) . Acestea sunt ecuaţiile a două suprafeţe, fie

acestea S1 şi S 2 .

Ecuaţia f1 ( x, y) = 0 , revine la z = 0 , adică la intersecţia suprafeţei S1 cu planul x-y:

aceasta este o curbă C1 . Soluţia sistemului f1 ( x, y) = 0, f 2 ( x, y) = 0 , revine la

intersecţia curbelor C1 şi C2 .

a.ch. – Octombrie 2008


14

Funcţia liniarizată este:

∂f i ( x ( 0) , y ( 0) ) ∂f ( x ( 0) , y ( 0 ) )
z ≈ f i ( x (0 ) , y (0) ) + ( x j − x (j0 ) ) + i ( y j − y (j0) )
∂x ∂y

Aceasta reprezintă ecuaţia planului tangent în ( x ( 0) , y ( 0) ) , la suprafaţa S i .

Deci, metoda revine la înlocuirea suprafeţei, în vecinătatea rădăcinii, prin planul


tangent

(Analog, cu metoda Newton pentru o ecuaţie scalară f ( x ) = 0 , unde graficul se


înlocuieşte cu tangenta la grafic).

Intersecţiile planelor tangente cu planul x-y vor fi două drepte – care aproximează
curbele C1 şi C2 . Intersecţia dreptelor este aproximaţia rădăcinii.

Exemplu
Fie sistemul de două ecuaţii neliniare:

f 1 ( x, y ) ≡ x 2 + y 2 − 5 = 0 , f 2 ( x, y ) ≡ y − e x − 1 = 0 .

Aproximaţiile iniţiale se iau:

x ( 0 ) = (−2, 1) , şi x ( 0) = (0.5, 2) .

De exemplu, acestea se pot găsi analizând intersecţia graficelor curbelor

x2 + y2 = 5 , y = e x + 1.

a.ch. – Octombrie 2008


15

Matricea jacobian este:

2 ⋅ x 2 ⋅ y
F ( x, y ) =  x .
− e 1 

Luăm eps = 1E-6. Calculul este efectuat în simplă precizie. Soluţia calculată (x, y),
numărul de iteraţii, şi valorile lui f în soluţie, sunt date în tabelele de mai jos.

1) Metoda punctului fix, iterare cu matricea constantă A = F (x ( 0) ) , cu actualizare


după 3 paşi:

a.ch. – Octombrie 2008


16

x (0) Nr. iteraţii x y f1(x, y) f2(x, y)

(-2,1) 5 -1.919 684 1.146 653 -2.761 E-7 -2.995 E-8

(0.5, 2) 17 0.2043 374 2.226 712 7.210 E-8 -4.654 E-8

Observaţii
Derivatele parţiale ale funcţiilor f i sunt calculate numeric , cu h = 0.001. Numărul
de iteraţii pentru a doua rădăcină este mai mare decât cel pentru prima rădăcină,
întrucât aproximaţia iniţială (0.5, 2) este mai îndepărtată de rădăcină. Cu aproximaţia
x ( 0 ) = (0.2, 2.2), se găseşte aceeaşi soluţie în 8 iteraţii.

2) Metoda Newton:

x (0) Nr. iteraţii x y f1(x, y) f2(x, y)

(-2,1) 4 -1.919 684 1.146 653 -2.761 E-7 -2.995 E-8

(0.5, 2) 5 0.2043 374 2.226 712 5.384 E-8 8.289 E-9

Notă: Derivatele parţiale sunt calculate cu matricea jacobian F(x, y)


Exerciţiu
Să se rezolve sistemul:
 xy − z 2 = 2
 2 2
− xyz − x + y = 4
e x − e y − z = 7

Să se găsească rădăcinile din vecinătatea punctelor w0 = (2, 2, − 1) şi w0 = (1, 1, 1) .

a.ch. – Octombrie 2008

Potrebbero piacerti anche