Professional Documents
Culture Documents
EVALUAREA FUNCŢIILOR
Valoarea pentru x = ξ:
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)
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.
A = lim Ri .
i→∞
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
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 :
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
• 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
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.
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
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)!
9
10
P0
0
Pl (x) P1
-5
m
P2
-10
P3
-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.
/*=========================================================================*/
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.
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ă.
j̃n = kjn
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
[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).