You are on page 1of 14

6

EVALUAREA FUNCŢIILOR

6.1 Evaluarea polinoamelor. Schema lui Horner


Polinom de grad n :

P (x) = a0 xn + a1 xn−1 + · · · + an−1 x + an .

Valoarea pentru x = ξ:

P (ξ) = (· · · ((a0 ξ + a1 )ξ + a2 )ξ + · · · + an−1 )ξ + an .

Schema lui Horner:



p0 = a0
pi = pi−1 ξ + ai , i = 1, 2, . . . , n

P (ξ) = pn .

Orice fracţie raţională, R(x) = P (x)/Q(x), poate fi evaluată utilizând schema lui Horner.

/*=========================================================================*/
float Polinom(float x, float a[], int n)
/*---------------------------------------------------------------------------
Evalueaza un polinom de ordinul n cu coeficienti reali a[] in punctul x
---------------------------------------------------------------------------*/
{
float p;
int i;
p = a[0];
for (i=1; i<=n; i++) p = p*x + a[i];
return p;
}
6.2 Evaluarea funcţiilor analitice
f (x) – analitică în ξ dacă într-o vecinătate |x − ξ| < R

f ′ (ξ) f ′′ (ξ)
f (x) = f (ξ) + (x − ξ) + (x − ξ)2 + · · ·
1! 2!
Suma parţială (polinomul Taylor) de ordinul n:
n
 n

f (i) (ξ) i
Fn (x) = (x − ξ) = ti (x).
i=0
i! i=0

Estimări practice pentru eroarea absolută ∆(n) şi cea relativă δ (n) :
 
(n) (n)
 tn (x) 
∆ = |tn (x)|, δ =  .
Fn (x) 

Exemplu – funcţia exponenţială:


 xi ∞
x x2
e =1+x+ + ··· = ,
2! i=0
i!

Polinomul Taylor de ordinul n:


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

Schemă recurentă:
t0 = 1, F0 = 1
ti = (x/i) ti−1 , Fi = Fi−1 + ti , i = 1, 2, . . . , n, . . .

Criteriu de oprire:
|tn /Fn | ≤ ε sau |tn | ≤ ε|Fn |.
/*=========================================================================*/
float Exp0(float x)
/*---------------------------------------------------------------------------
Evalueaza exponentiala in punctul x din dezvoltarea ei in serie
---------------------------------------------------------------------------*/
{
const float eps = 1e-6;
float f, t;
int i;
i = 1;
f = t = 1.0;
while (fabs(t/f) > eps) {
t *= x/(i++);
f += t;
}
return f;
}

2
Pt. x < 0 termenii seriei alternativ pozitivi şi negativi → acumulare de erori prin scădere.
Definiţie convenabilă:  |x|
x e dacă x ≥ 0
e = ,
1/e |x|
dacă x < 0

/*=========================================================================*/
float Exp(float x)
/*---------------------------------------------------------------------------
Evalueaza exponentiala in punctul x din dezvoltarea ei in serie
---------------------------------------------------------------------------*/
{
const float eps = 1e-6;
float absx, f, t;
int i;
i = 1;
f = t = 1.0;
absx = fabs(x);
while (fabs(t/f) > eps) {
t *= absx/(i++);
f += t;
}
return (x >= 0.0 ? f : 1.0/f);
}

3
6.3 Fracţii continue
 
b1 b1 b2 bi
a0 + ≡ a0 ; , , . . . , , . . .
b2 a1 a2 ai
a1 +
a2 + · · ·
ai şi bi – numere reale, complexe, sau funcţii.

Convergenţii fracţiei continue:


b1 b1
R1 = a0 + , R2 = a0 + ,...
a1 b2
a1 +
a2
Fracţia continuă este convergentă dacă există limita

A = lim Ri .
i→∞

Teorema 6.1 (Legea formării convergenţilor) Numerele

Pi = ai Pi−1 + bi Pi−2 , i = 1, 2, . . .
Qi = ai Qi−1 + bi Qi−2 ,

cu
P0 = a0 , P−1 = 1
Q0 = 1, Q−1 = 0
sunt respectiv numărătorii şi numitorii convergenţilor Ri ai fracţiei continue
Pi
Ri = , i = 1, 2, 3, . . .
Qi

Demonstraţie (metoda inducţiei). Pentru i = 1:

P1 a1 P0 + b1 P−1 b1
R1 = = = a0 +
Q1 a1 Q0 + b1 Q−1 a1
Din ipoteză:
Pi ai Pi−1 + bi Pi−2
Ri = = .
Qi ai Qi−1 + bi Qi−2
Ri+1 rezultă din Ri înlocuind ai → ai + bi+1 /ai+1 :

ai+1 Pi + bi+1 Pi−1 Pi+1


Ri+1 = =
ai+1 Qi + bi+1 Qi−1 Qi+1

Fracţiile continue – mai rapid convergente decât orice reprezentare infinită a funcţiilor.

4
Exemplu:  
x −x2 −x2 −x2
tan x = 0; , , ,..., ,... .
1 3 5 2i − 1
Elementele fracţiei:
a0 = 0, a1 = 1, ai = ai−1 + 2
b1 = x, bi = −x2 , i = 2, 3, . . .
Valorile iniţiale:
P0 = 0, P1 = x, a1 = 1
Q0 = 1, Q1 = 1, b = −x2 .
Relaţii de recurenţă:

ai = ai−1 + 2, i = 2, 3, . . .
Pi = ai Pi−1 + bPi−2
Qi = ai Qi−1 + bQi−2 .

Condiţie de convergenţă:
   
 Ri−1   Pi−1 Qi 
1 −  = 1 −  ≤ ε.
 Ri   Qi−1 Pi 

/*=========================================================================*/
float Tan(float x)
/*---------------------------------------------------------------------------
Evalueaza tangenta in punctul x utilizand reprezentarea cu fractii continue
---------------------------------------------------------------------------*/
{
const float eps = 1e-6;
float a, b, p, pm, pp, q, qm, qp;
if (x == 0.0) return 0.0;
pm = 0.0; p = x ; a = 1.0;
qm = 1.0; q = 1.0; b = -x*x;
while (fabs(1.0 - (pm*q)/(p*qm)) > eps) {
a += 2.0;
pp = a*p + b*pm; pm = p; p = pp;
qp = a*q + b*qm; qm = q; q = qp;
}
return p/q;
}

5
6.4 Polinoame ortogonale
{fn (x)} – sistem ortogonal pe [a, b] în raport cu funcţia de pondere w(x) > 0 dacă
 b
w(x)fn (x)fm (x)dx = Nn δ nm (n, m = 0, 1, 2, . . .).
a

Relaţii generale

• ecuaţia diferenţială de ordinul doi:

g2 (x)fn′′ (x) + g1 (x)fn′ (x) + hn fn (x) = 0.

• relaţia de recurenţă în raport cu ordinul n:

an fn (x) = (bn + cn x)fn−1 (x) − dn fn−2 (x).

• prima derivată:
g2 (x)fn′ (x) = g1 (x)fn (x) + g0 (x)fn−1 (x).

TABELUL 6.1.
fn (x) nume a b w(x)  Nn
Cebîşev π dacă n = 0
Tn (x) −1 1 (1 − x2 )−1/2
de speţa I π/2 dacă n = 0
Pn (x) Legendre −1 1 1 2/(2n + 1)
Ln (x) Laguerre 0 ∞ e −x
1
2 √ n
Hn (x) Hermite −∞ ∞ e−x π2 n!

TABELUL 6.2.
fn (x) an bn cn dn f0 (x) f1 (x)
Tn (x) 1 0 2 1 1 x
Pn (x) n 0 2n − 1 n−1 1 x
Ln (x) n 2n − 1 −1 n−1 1 1−x
Hn (x) 1 0 2 2(n − 1) 1 2x

TABELUL 6.3.
fn (x) g2 (x) g1 (x) g0 (x)
Tn (x) 1 − x2 −nx n
Pn (x) 1 − x2 −nx n
Ln (x) x n −n
Hn (x) 1 0 2n

6
Evaluarea polinomului ortogonal fn (x) pentru x = ξ:
1. se evaluează f0 (ξ) şi f1 (ξ)
2. se aplică pentru i = 2, 3, . . . , n relaţia de recurenţă
1
fi (ξ) = [(bi + ci ξ)fi−1 (ξ) − di fi−2 (ξ)].
ai

Polinoamele Cebîşev de speţa întâia


Convergenţă rapidă a dezvoltărilor în serie pe [−1, 1].
Relaţii de recurenţă:
Ti (x) = 2xTi−1 (x) − Ti−2 (x), i = 2, 3, . . . , n
Tn′ (x) = n [xTn (x) − Tn−1 (x)] /(x2 − 1),
T0 (x) = 1, T1 (x) = x
/*=========================================================================*/
float Cebisev(int n, float x, float *d)
/*---------------------------------------------------------------------------
Evalueaza polinomul Cebisev de ordinul n in punctul x, returnand derivata
in *d
---------------------------------------------------------------------------*/
{
float f, fm1, fm2, x2;
int i;
if (n == 0) {
f = 1.0; *d = 0.0;
} else {
f = x; fm1 = 1.0; x2 = 2*x;
for (i=2; i<=n; i++) {
fm2 = fm1; fm1 = f;
f = x2*fm1 - fm2;
}
*d = (x*x-1.0) ? n*(x*f-fm1)/(x*x-1.0) : n*n*f/x;
}
return f;
}

1.0

T1
0.5

T2
Tn(x)

0.0

T3

-0.5
T4

-1.0
-1.0 -0.5 0.0 0.5 1.0

FIGURA 6.1.

7
/*=========================================================================*/
float Legendre(int n, float x, float *d)
/*-------------------------------------------------------------------------*/
{
float f, fm1, fm2;
int i;
if (n == 0) {
f = 1.0; *d = 0.0;
} else {
f = x; fm1 = 1.0;
for (i=2; i<=n; i++) {
fm2 = fm1; fm1 = f;
f = ((2*i-1)*x*fm1 - (i-1)*fm2)/i;
}
*d = (x*x-1.0) ? n*(x*f-fm1)/(x*x-1.0) : 0.5*n*(n+1)*f/x;
}
return f;
}
/*=========================================================================*/
float Laguerre(int n, float x, float *d)
/*-------------------------------------------------------------------------*/
{
float f, fm1, fm2;
int i;
if (n == 0) {
f = 1.0; *d = 0.0;
} else {
f = 1.0 - x; fm1 = 1.0;
for (i=2; i<=n; i++) {
fm2 = fm1; fm1 = f;
f = ((2*i-1-x)*fm1 - (i-1)*fm2)/i;
}
*d = x ? n*(f-fm1)/x : -n*f;
}
return f;
}
/*=========================================================================*/
float Hermite(int n, float x, float *d)
/*-------------------------------------------------------------------------*/
{
float f, fm1, fm2, x2;
int i;
if (n == 0) {
f = 1.0; *d = 0.0;
} else {
f = 2*x; fm1 = 1.0; x2 = 2*x;
for (i=2; i<=n; i++) {
fm2 = fm1; fm1 = f;
f = x2*fm1 - 2*(i-1)*fm2;
}
*d = 2*n*fm1;
}
return f;
}

8
Armonice sferice. Funcţii Legendre asociate
Metoda separării variabilelor în coordonate sferice pentru anumite ecuaţii diferenţiale:
ecuaţia undelor, ecuaţia lui Schrödinger, ecuaţia lui Laplace.

Ecuaţia armonicelor sferice:


 
1 ∂ ∂Ylm 1 ∂ 2 Ylm
sin θ + + l(l + 1)Ylm = 0,
sin θ ∂θ ∂θ sin2 θ ∂ϕ2
l = 0, 1, 2, . . . , −l ≤ m ≤ l

Armonicele sferice:

2l + 1 (l − m)! m
Ylm (θ, ϕ) = P (cos θ)eimϕ
4π (l + m)! l
Yl,−m (θ, ϕ) = (−1)m Ylm

(θ, ϕ), m≥0

Relaţia de ortonormare:
 2π  π
dϕ Yl∗′ m′ (θ, ϕ)Ylm (θ, ϕ) sin θdθ = δ l′ l δ m′ m
0 0

{Ylm (θ, ϕ)} – sistem ortonormat complet pe sfera de rază unitate L2 (S1 ).
Orice f ∈ L2 (S1 ) – dezvoltare unică în serie Fourier:
∞ 
 l
f (θ, ϕ) = alm Ylm (θ, ϕ)
l=0 m=−l

Ecuaţia funcţiilor Legendre asociate:


 
2d2 Plm dPlm m2
(1 − x ) − 2x + l(l + 1) − Pm = 0
dx2 dx 1 − x2 l

Funcţiile Legendre asociate (Pl (x) – polinoame Legendre):

dm
Plm (x) m
= (−1) (1 − x ) 2 m/2
Pl (x).
dxm
Relaţia de ortonormare:
 1
2 (l + m)!
Plm m
′ (x)Pl (x)dx = δ l′ l .
−1 (2l + 1) (l − m)!

′ (x)} – sistem ortonormat complet pe L2 [−1, 1]


{Plm
Orice f ∈ L2 [−1, 1] – dezvoltare unică în serie Fourier:
∞ 
 l
f (x) = alm Plm (x).
l=0 m=−l

9
10

P0
0
Pl (x) P1
-5
m

P2

-10

P3
-15

-20
-1.0 -0.5 0.0 0.5 1.0

FIGURA 6.2. Funcţiile Legendre asociate P30 (x), P31 (x), P32 (x) şi P33 (x) calculate cu ajutorul
rutinei FLegendre.

Relaţia de recurenţă în raport cu ordinul inferior:


(i − m)Pim (x) = (2i − 1)xPi−1
m m
(x) − (i + m − 1)Pi−2 (x),
i = m + 1, . . . , l
Valori de pornire:
m
Pm−1 = 0
Pmm (x) = (−1)m (2m − 1)!!(1 − x2 )m/2

m √ 
= (2i − 1) − 1 − x2
i=1

/*=========================================================================*/
float FLegendre(int l, int m, float x)
/*---------------------------------------------------------------------------
Evalueaza functia Legendre asociata de ordine l si m in punctul x
---------------------------------------------------------------------------*/
{
float p, pm1, pm2, sqx;
int i;
if (l < m) return 0.0;
p = 1.0; pm1 = 0.0; /* P(m,m,x), P(m-1,m,x) */
if (m) {
sqx = -sqrt(1.0-x*x);
for (i=1; i<=m; i++) p *= (2*i-1) * sqx;
}
for (i=m+1; i<=l; i++) { /* recurenta */
pm2 = pm1; pm1 = p;
p = ((2*i-1)*x*pm1 - (i+m-1)*pm2)/(i-m);
}
return p;
}

10
Funcţiile Bessel sferice
Soluţii ale ecuaţiei cuantice radiale a împrăştierii.

Ecuaţia funcţiilor Bessel sferice:


 
x2 fn′′ (x) + 2xfn′ (x) + x2 − n(n + 1) fn (x) = 0, n = 0, ±1, ±2, . . .

Soluţia regulată – funcţia Bessel sferică jn (x)


Soluţia neregulată – funcţia Neumann sferică yn (x).

Relaţia de recurenţă:
2i − 1
fi (x) = fi−1 (x) − fi−2 (x)
x
Funcţiile Neumann sferice yn (x) – recurenţă ascendentă stabilă:
cos x 1
y0 (x) = − , y1 (x) = [y0 (x) − sin x]
x x
/*=========================================================================*/
float SBessy(int n, float x)
/*---------------------------------------------------------------------------
Evalueaza functia Neumann sferica y_n(x) de ordinul n in punctul x
---------------------------------------------------------------------------*/
{
float y, y0, y1;
int i;
y0 = -cos(x)/x; if (n == 0) return y0;
y1 = (y0 - sin(x))/x; if (n == 1) return y1;
for (i=2; i<=n; i++) {
y = (2*i-1)/x*y1 - y0;
y0 = y1; y1 = y;
}
return y;
}

0.4

0.3

0.2
y0

0.1
y1
yn(x)

0.0
y2
-0.1
y3
-0.2

-0.3

-0.4
0 2 4 6 8 10 12 14

FIGURA 6.3. Funcţiile Neumann sferice yn (x) pentru ordinele n = 0, 1, 2 şi 3, calculate cu
ajutorul rutinei SBessy.

11
Funcţiile Bessel sferice jn (x) – recurenţă ascendentă condiţional stabilă.
Dacă n > |x| se acumulează erorile de trunchiere la recurenţa ascendentă.

Algoritmului lui Miller – recurenţă descendentă cu valori de pornire arbitrare:


2i + 3
ji (x) = ji+1 (x) − ji+2 (x)
x
j̃N+2 = 0, j̃N+1 = 1, N > n

Rezultă funcţiile corecte înmulţite cu un factor necunoscut

j̃n = kjn

Factorul se determină din:


k = j̃0 /j0
Funcţia Bessel sferică jn :
jn = (j0 /j̃0 ) j̃n

Recurenţa ascendentă este întotdeauna stabilă pentru n < |x|.


În ce condiţii trebuie aplicată recurenţa descendentă?
Care este ordinul N de la care trebuie începută recurenţa?
Pentru n > |x| – se reţine doar primul termen în relaţia de recurenţă
2i − 1
ji (x) ≃ ji−1 (x), i = n, n + 1, . . . , N
x
Factorul net de creştere a funcţiei jN faţă de jn :
N

2i − 1
f=
i=n
x

Dacă f > 108 – recurenţa ascendentă este instabilă – se aplică recurenţa descendentă.

1.0

0.8
j0
0.6
j1
0.4
j2
jn(x)

j3
0.2

0.0

-0.2

-0.4
0 2 4 6 8 10 12 14

FIGURA 6.4. Funcţiile Bessel sferice jn (x) pentru ordinele n = 0, 1, 2 şi 3, calculate cu ajutorul
rutinei SBessj.

12
/*=========================================================================*/
float SBessj(int n, float x)
/*---------------------------------------------------------------------------
Evalueaza functia Bessel sferica j_n(x) de ordinul n in punctul x
---------------------------------------------------------------------------*/
{
float j, j0, j1, j2, jn;
int i, nmax;
if (x == 0.0) return (n == 0 ? 1.0 : 0.0);
j0 = sin(x)/x; if (n == 0) return j0;
j1 = (j0 - cos(x))/x; if (n == 1) return j1;
nmax = 0; /* determina sensul recurentei stabile */
if ((float)n >= fabs(x)) {
jn = 1.;
for (i=n; i<=(n+50); i++) {
jn *= (2*i-1)/x; /* factorul net de crestere */
if (jn >= 1e8) {nmax = i + 10; break;}
}
}
if (nmax == 0) { /* recurenta ascendenta */
for (i=2; i<=n; i++) {
j = (2*i-1)/x*j1 - j0;
j0 = j1; j1 = j;
}
return j;
} else { /* recurenta descendenta */
j2 = 0.; j1 = 1e-20;
for (i=nmax; i>=0; i--) {
j = (2*i+3)/x*j1 - j2;
j2 = j1; j1 = j;
if (i == n) jn = j; /* memoreaza jn nenormat */
}
return (j0/j)*jn; /* normeaza jn */
}
}

13
Bibliography

[1] M. Abramowitz şi I. Stegun, Handbook of Mathematical Functions (Dover Publica-


tions, New York, 1972).

[2] D.E. Knuth, The Art of Computer Programming, vol. 2: Seminumerical Algorithms
(Addison-Wesley, Reading, MA, 1981).

[3] F.S. Acton, Numerical Methods That Work (Mathematical Association of America,
Washington, 1990).

You might also like