Documente Academic
Documente Profesional
Documente Cultură
INTEGRAREA FUNCŢIILOR
11.1 Introducere
Dacă pt. f (x) continuă pe [a, b] este cunoscută primitiva F (x) – formula Newton-Leibnitz:
Z b
I= f (x)dx = F (b) − F (a).
a
Aproximăm funcţia f (x) prin polinomul de interpolare Lagrange (fi ≡ f (xi )):
Xn Qn
(x − xj )
Pn−1 (x) = Qnj6=i fi .
i=1 j6=i (xi − xj )
Y
n Y
n Y
i−1 Y
n
n−1 n−i n−1
(xi − xj ) = h (i − j) = (−1) h (i − j) (j − i) = (−1)n−i hn−1 (i − 1)!(n − i)!
j6=i j6=i j=1 j=i+1
Polinomul Lagrange:
Qn
X
n
j6=i [q − (j − 1)]
Pn−1 (x) = fi
i=1
(−1)n−i (i − 1)!(n − i)!
Aproximaţie a integralei:
Z b Z b X
n
f (x)dx ≈ Pn−1 (x)dx = Ai fi ,
a a i=1
Z Qn R n−1 Qn
b
j6=i [q − (j − 1)]dx h 0 j6=i [q − (j − 1)]dq
Ai = = .
a (−1)n−i (i − 1)!(n − i)! (−1)n−i (i − 1)!(n − i)!
Punem Ai = (b − a)Hi → formula de cuadratură Newton-Cotes:
Z b X
n
f (x)dx ≈ (b − a) Hi fi ,
a i=1
Coeficienţii Cotes:
R n−1 Qn
0
− (j − 1)]dq
j6=i [q
Hi = , i = 1, 2, . . . , n.
(−1)n−i (i − 1)!(n − i)!(n − 1)
Proprietăţi:
X
n
Hi = 1, Hi = Hn−i+1 .
i=1
2
11.3 Formula trapezelor
Coeficienţii Cotes pt. n = 2:
Z 1 Z 1
1 1
H1 = − (q − 1)dq = , H2 = qdq = .
0 2 0 2
Formula trapezului: Z x2
h
f (x)dx ≈ (f1 + f2 ).
x1 2
y = f(x)
y = P1(x)
f2
f1
h
x1 x2 x
FIGURA 11.1. Formula trapezului aproximează funcţia prin dreapta care trece prin punctele
(x1 , f1 ) şi (x2 , f2 ).
3
Generalizare – formulă de interes practic.
Utilizăm aditivitatea integralei faţă de intervalul de integrare.
fi
fn
f1
h h h
x1 x2 x3 xi xn x
FIGURA 11.2. Formula trapezelor aproximează integrandul cu linia poligonală definită de ab-
scisele echidistante şi valorile corespunzătoare ale funcţiei.
xi = a + (i − 1)h, i = 1, 2, . . . , n.
h = (b − a)/(n − 1)
Aplicăm formula trapezului fiecărui subinterval [x1 , x2 ],..., [xn−1 , xn ]:
Z b
h h h
f (x)dx ≈ (f1 + f2 ) + (f2 + f3 ) + . . . + (fn−1 + fn ).
a 2 2 2
Formula trapezelor:
Z " #
f1 X
b n−1
fn
f (x)dx ≈ h + fi + .
a 2 i=2
2
Restul:
(n − 1)h3 00 (b − a)h2 00
R=− f (ξ) = − f (ξ), ξ ∈ [a, b].
12 12
/*=========================================================================*/
float Trapez(float Func(float), float a, float b, int n)
/*---------------------------------------------------------------------------
Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formula
trapezelor cu n puncte de integrare
---------------------------------------------------------------------------*/
{
float h, s;
int i;
4
h = (b-a)/(n-1);
s = 0.5*(Func(a) + Func(b));
for (i=1; i<=(n-2); i++) s += Func(a+i*h);
return h*s;
}
5
Controlul automat al preciziei de integrare.
a h0 b
n0 =1
h1
n1 =2
h2
n2 =4
h3
n3 =8
Proces recurent:
h0
T0 = [f (a) + f (b)], h0 = b − a, n0 = 1
2" #
nk−1
1 X
Tk = Tk−1 + hk−1 f (a + (i − 1/2)hk−1 ) ,
2 i=1
hk = hk−1 /2, nk = 2nk−1 , k = 1, 2, . . .
Criteriu de convergenţă:
|Tk − Tk−1 | ≤ ε |Tk | .
6
/*=========================================================================*/
float TrapezControl(float Func(float), float a, float b)
/*---------------------------------------------------------------------------
Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formula
trapezelor cu controlul automat al pasului de integrare
---------------------------------------------------------------------------*/
{
const float eps = 1e-6; /* precizia relativa a integralei */
const int kmax = 30; /* numar maxim de injumatatiri */
float h, sum, t, t0;
long i, n;
int k;
h = b-a; n = 1;
t0 = 0.5*h*(Func(a) + Func(b)); /* aproximatie initiala */
for (k=1; k<=kmax; k++) { /* ciclul injumatatirii pasului */
sum = 0.0;
for (i=1; i<=n; i++) sum += Func(a+(i-0.5)*h);
t = 0.5*(t0 + h*sum); /* noua aproximatie */
if (fabs(t - t0) <= eps*fabs(t)) break; /* testeaza convergenta */
h *= 0.5; n *= 2; /* injumatateste pasul */
t0 = t;
}
if (k >= kmax) printf("TrapezControl: nr. maxim de iteratii depasit !\n");
return t;
}
7
11.4 Formula lui Simpson
Coeficienţii Cotes pentru n = 3:
Z 2
1 1
H1 = (q − 1)(q − 2)dq = ,
4 0 6
Z 2
1 2
H2 = − q(q − 2)dq = ,
2 3
Z 20
1 1
H3 = q(q − 1)dq = .
4 0 6
Formula lui Simpson (x3 − x1 = 2h):
Z x3
h
f (x)dx ≈ (f1 + 4f2 + f3 ).
x1 3
Înlocuirea curbei y = f (x) cu parabola y = P2 (x) definită de (x1 , f1 ), (x2 , f2 ) şi (x3 , f3 ).
Restul:
h5 (4)
R=− f (ξ), ξ ∈ [a, b]
90
xi = a + (i − 1)h, i = 1, 2, . . . , n,
b−a b−a
h= = ,
n−1 2m
Aplicăm formula trapezului fiecărui subinterval [x1 , x2 ],..., [xn−1 , xn ]:
Z b
h h h
f (x)dx ≈ (f1 + 4f2 + f3 ) + (f3 + 4f4 + f5 ) + . . . + (fn−2 + 4fn−1 + fn ).
a 3 3 3
8
/*=========================================================================*/
float Simpson0(float Func(float), float a, float b, int n)
/*---------------------------------------------------------------------------
Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formula lui
Simpson cu n puncte de integrare
---------------------------------------------------------------------------*/
{
float h, s1, s2;
int i, par = 0;
if ((n/2)*2 == n) n++; /* incrementeaza n daca este par */
h = (b-a)/(n-1);
s1 = s2 = 0.0;
for (i=1; i<=(n-2); i++) {
if (par) s1 += Func(a+i*h); else s2 += Func(a+i*h);
par = ~par; /* paritatea urmatorului termen */
}
return (h/3)*(Func(a) + 4*s2 + 2*s1 + Func(b));
}
/*=========================================================================*/
float Simpson(float Func(float), float a, float b, int n)
/*---------------------------------------------------------------------------
Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formula lui
Simpson cu n puncte de integrare
---------------------------------------------------------------------------*/
{
float h, h2, s1, s2, x;
int i;
if ((n/2)*2 == n) n++; /* incrementeaza n daca este par */
h = (b-a)/(n-1); h2 = 2*h;
s1 = 0.0; s2 = Func(a+h);
for (i=1; i<=(n-3)/2; i++) {
x = a + i*h2;
s1 += Func(x); s2 += Func(x+h);
}
return (h/3)*(Func(a) + 4*s2 + 2*s1 + Func(b));
}
9
Controlul automat al preciziei de integrare.
Primele aproximaţii ale formulei lui Simpson:
h1 4T1 − T0
S1 = [f (a) + 4f (a + h1 ) + f (b)] =
3 3
h2 4T2 − T1
S2 = [f (a) + 4f (a + h2 ) + 2f (a + 2h2 ) + 4f (a + 3h2 ) + f (b)] =
3 3
························
Generalizând:
4Tk − Tk−1
Sk = .
3
Proces recurent:
h0
T0 = [f (a) + f (b)], h0 = b − a, n0 = 1
2" #
nk−1
1 X
Tk = Tk−1 + hk−1 f (a + (i − 1/2)hk−1 ) , k = 1, 2, . . .
2 i=1
4Tk − Tk−1
Sk = , hk = hk−1 /2, nk = 2nk−1 .
3
Criteriu de convergenţă:
|Sk − Sk−1 | ≤ ε |Sk | .
/*=========================================================================*/
float SimpsonControl(float Func(float), float a, float b)
/*---------------------------------------------------------------------------
Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formula lui
Simpson cu controlul automat al pasului de integrare
---------------------------------------------------------------------------*/
{
const float eps = 1e-6; /* precizia relativa a integralei */
const int kmax = 30; /* numar maxim de injumatatiri */
float h, s, s0, sum, t, t0;
long i, n;
int k;
h = b-a; n = 1;
s0 = t0 = 0.5*h*(Func(a) + Func(b)); /* aproximatie initiala */
for (k=1; k<=kmax; k++) { /* ciclul injumatatirii pasului */
sum = 0.0;
for (i=1; i<=n; i++) sum += Func(a+(i-0.5)*h);
t = 0.5*(t0 + h*sum);
s = (4*t - t0)/3; /* noua aproximatie */
if (fabs(s - s0) <= eps*fabs(s)) break; /* testeaza convergenta */
h *= 0.5; n *= 2; /* injumatateste pasul */
s0 = s; t0 = t;
}
if (k >= kmax) printf("SimpsonControl: nr. maxim de iteratii depasit!\n");
return s;
}
10
11.8 Integrale multidimensionale
Complicaţii:
Integrală bidimensională:
Z xmax Z ymax (x) Z xmax Z ymax (x)
f (x, y)dxdy = Fx (x)dx, Fx (x) = f (x, y)dy,
xmin ymin (x) xmin ymin (x)
y
ymax(xi)
ymin(xi)
xmin xi xmax x
11
Exemplu:
Z p
1 Z √
1−x2
π
I= 1 − x2 − y 2 dy = ≈ 0.523599.
dx
0 0 6
Domeniul de integrare – primul cadran al cercului de rază 1.
Rezultatul – volumul primului octant al sferei de rază 1.
#include <stdio.h>
#include <math.h>
float xconst;
/*=========================================================================*/
float func(float x, float y)
{
return sqrt(fabs(1. - x*x - y*y));
}
/*=========================================================================*/
float ymin(float x) { return 0.0; }
/*=========================================================================*/
float ymax(float x) { return sqrt(1. - x*x); }
/*=========================================================================*/
float SimpsonControl(float Func(float), float a, float b)
{
. . . . . . . . . .
}
/*=========================================================================*/
float Fy(float y) /* functie interfata de o variabila */
{ /* pt. functia utilizator func(x,y) */
return func(xconst,y); /* xconst este variabila globala */
}
/*=========================================================================*/
float Fx(float x)
{
xconst = x;
return SimpsonControl(Fy,ymin(x),ymax(x));
}
/*=========================================================================*/
void main()
{
float xmin = 0.0, xmax = 1.0;
printf("Integrala = %f\n",SimpsonControl(Fx,xmin,xmax));
}
Pt. a fi integrată în raport cu y, func este apelată prin funcţia ”interfaţă” Fy.
Parametrul global xconst îşi primeşte valoarea în funcţia Fx.
Integrală triplă:
Z xmax Z ymax (x) Z zmax (x,y) Z xmax
f (x, y, z)dxdydz = Fx (x)dx,
xmin ymin (x) zmin (x,y) xmin
Z ymax (x) Z zmax (x,y)
Fx (x) = Fy (x, y)dy, Fy (x, y) = f (x, y, z)dz.
ymin (x) zmin (x,y)
12
Exemplu:
Z 1 Z √
1−x2 Z √1−x2 −y2
π
I= dx dy dz = ≈ 0.523599,
0 0 0 6
#include <stdio.h>
#include <math.h>
float xconst, yconst;
/*=========================================================================*/
float func(float x, float y, float z)
{
return 1.0;
}
/*=========================================================================*/
float ymin(float x) { return 0.0; }
/*=========================================================================*/
float ymax(float x) { return sqrt(1. - x*x); }
/*=========================================================================*/
float zmin(float x, float y) { return 0.0; }
/*=========================================================================*/
float zmax(float x, float y) { return sqrt(fabs(1. - x*x - y*y)); }
/*=========================================================================*/
float SimpsonControl(float Func(float), float a, float b)
{
. . . . . . . . . .
}
/*=========================================================================*/
float Fz(float z) /* functie interfata de o variabila */
{ /* pt. functia utilizator func(x,y,z) */
return func(xconst,yconst,z); /* xconst, yconst - variabile globale */
}
/*=========================================================================*/
float Fy(float y)
{
yconst = y;
return SimpsonControl(Fz,zmin(xconst,y),zmax(xconst,y));
}
/*=========================================================================*/
float Fx(float x)
{
xconst = x;
return SimpsonControl(Fy,ymin(x),ymax(x));
}
/*=========================================================================*/
void main()
{
float xmin = 0.0, xmax = 1.0;
printf("Integrala = %f\n",SimpsonControl(Fx,xmin,xmax));
}
Pt. a fi integrată în raport cu z, func este apelată prin funcţia ”interfaţă” Fz.
Parametrii globali xconst şi yconst îşi primesc valorile în funcţia Fx, respectiv Fy.
13
Bibliography
[2] A.H. Stroud şi D. Secrest, Gaussian Cuadrature Formulas (Prentice-Hall, Englewood
Cliffs, 1966).
[5] B.P. Demidovich şi I.A. Maron, Computational Mathematics (MIR Publishers,
Moskow, 1981).
[6] R.L. Burden şi J.D. Faires, Numerical Analysis, Third Edition (Prindle, Weber &
Schmidt, Boston, 1985).
[7] W.H. Press, S.A. Teukolsky, W.T. Vetterling şi B.P. Flannery, Numerical Recipes in
C: The Art of Scientific Computing, Second Edition (Cambridge University Press,
Cambridge, 1992).