Sunteți pe pagina 1din 5

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();
}

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