Sunteți pe pagina 1din 64

Universitatea din Bacu

Facultatea de tiine

METODE NUMERICE
Note de seminar
pentru studenii Facultii de Inginerie

Conf. univ.dr. Mihai TALMACIU


Asist. univ. drd. Alina Mihaela PATRICIU

Cuprins
Introducere

Capitolul 1
Rezolvarea numeric a ecuaiilor algebrice neliniare

Capitolul 2
Rezolvarea numeric a sistemelor de ecuaii algebrice liniare prin metode directe

15

Capitolul 3
Rezolvarea numeric a sistemelor de ecuaii algebrice liniare prin metode iterative 23
Capitolul 4
Determinarea rdcinilor unui polinom

35

Capitolul 5
Rezolvarea numeric a problemelor algebrice de valori i vectori proprii

41

Capitolul 6
Polinomul de interpolare Lagrange
51
Capitolul 7
Diferene divizate

57

Capitolul 8
Polinomul de interpolare Newton

61

Capitolul 9
Interpolarea prin polinoame trigonometrice

67

Capitolul 10
Diferene finite

73

Capitolul 11
Formule de interpolare pe noduri echidistante

77

Capitolul 12
Formule de derivare numeric pe noduri echidistante

87

Bibliografie

97

Introducere
Drumul parcurs pentru rezolvarea unei probleme dintr-un domeniu oarecare cu
ajutorul calculatorului const n: stabilirea unui model matematic al problemei concrete
(model ce se poate ncadra ntr-o categorie cum ar fi: o ecuaie neliniar, un sistem de
ecuaii liniare sau neliniare), care fiind de multe ori de natur continu trebuie
discretizat; soluia problemei discretizate trebuie s fie consistent i stabil (robust);
modelul discretizat trebuie transpus ntr-un algoritm, descris de obicei ntr-un limbaj
de programare.
Pentru parcurgerea i utilizarea unui asemenea material, cititorul are nevoie de
cunotine de matematic i de programare n limbajele de programare Pascal i C la
ndemna studenilor care au promovat primul an de studiu al oricrei faculti cu profil
tehnic, matematico-informatic sau economic.
Materialul cuprins n aceast carte i are originea deopotriv n experiena de
programare (la C.T.C.E. Bacu) i n seminariile/laboratoarele de analiz numeric,
calcul numeric i metode numerice inute la seciile Facultii de Inginerie i la secia de
Matematic-Fizic a Facultii de tiine a Universitii din Bacu.
Ca limbaje de programare au fost alese limbajul Pascal i C, datorit, pe de o
parte, faptului c prin modernitatea structurilor implementate permit abordarea
sistematic a noiunilor de programare, iar pe de alt parte, au fost alese ambele limbaje
deoarece se predau n anii anteriori n facultile mai sus menionate.
Implementarea algoritmilor a urmrit evidenierea specificului metodelor
numerice i a implicat un compromis ntre claritatea programelor (n ideea formrii unui
stil de programare) i performanele (complexitatea) acestora. Din acest motiv, soluiile
de implementare nu sunt totdeauna cele optime.
Prezentarea metodelor, algoritmilor, programelor este nsoit de exemple
numerice, menite pe de o parte s clarifice modul de comunicare a datelor i de
interpretare a rezultatelor sau s evideneize o anumit comportare specific a soluiei,
iar pe de alt parte s faciliteze nelegerea algoritmilor.
Lucrarea are dousprezece capitole, fiecare cuprinznd tema, metoda, exemplu,
algoritmul (n pseudocod), programul surs Pascal, programul surs C i exerciii.

CAPITOLUL 1
Rezolvarea numeric a ecuaiilor
algebrice neliniare
1.1.

Tema
Rezolvarea numeric a ecuaiilor algebrice neliniare sau transcendente prin
metoda de pri proporionale i metoda tangentei.
Fie f : R R o funcie dat. Forma general a unei ecuaii algebrice neliniare
sau transcendente este f ( x) 0 .
1.2.

Metoda
Fie [ a, b] un interval unde ecuaia f ( x) 0 are o soluie.
Relaia de recuren n metoda de pri proporionale este:
xn a
x n 1 a
f (a ) ,
f ( xn ) f (a )
n timp ce pentru metoda tangentei, relaia de recuren este:
f ( xn )
xn 1 xn
.
f ' ( xn )
Utilizm verificarea condiiei xn 1 xn pentru convergena irului.
1.3.

Exemplu
S se parcurg primii trei pai din metoda lui Newton pentru rezolvarea ecuaiei
x 2 x 3 0 , x [ 2,3] .
Rezolvare.
Cum f (2) 1 i f (3) 3 rezult c f (2) f (3) 3 0 , adic ecuaia dat
are soluie n intervalul [2,3].
Alegem x0 3 . Cum f ' ( x) 2 x 1 rezult

f ( x0 )
2,4,
f ' ( x0 )
f ( x1 )
x2 x1
2,305,
f ' ( x1 )
x1 x0

adic soluia cutat este


x3 x2
1.4.

f ( x2 )
2,302.
f ' ( x2 )

Algoritmul
Algoritmul asociat metodei de pri proporionale este
Intrri: f = funcia din metod
a, b = capetele intervalului unde ecuaia are o soluie
= precizia
y = aproximaia iniial a soluiei
Ieiri: x = soluia aproximativ
{

d +1
k 0
ct timp d
{

a y
f ( y)
f (a ) f ( y )

d
y
k

|xy|
x
k+1

}
}
Algoritmul asociat metodei tangentei este
Intrri: f, fd = funcia, derivata, din metod
a, b = capetele intervalului unde ecuaia are o soluie
= precizia
y = aproximaia iniial a soluiei
Ieiri: x = soluia aproximativ
{
d +1
ct timp d
{
f ( y)
fd ( y )

d
y

|xy|
x

}
}
1.5.
Programul surs Pascal
PROGRAM METODA_DE_PARTI_PROPORTIONALE;
VAR A,B,D,EPS,X,Y:REAL;
K:INTEGER;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=EXP(T)-3;
END;
BEGIN
WRITE('DATI EPS: ');
READLN(EPS);
WRITE('DATI A: ');
READLN(A);
WRITE('DATI B: ');
READLN(B);
WRITE('DATI X: ');
READLN(Y);
D:=EPS+1;
K:=0;
WHILE (D>=EPS) DO

BEGIN
X:=Y-(F(Y))/((F(A)-F(Y))/(A-Y));
D:=ABS(X-Y);
Y:=X;
K:=K+1;
END;
WRITELN;
WRITELN('DUPA ',K,' ETAPE ',' X= ',X:12:10);
READLN;
END.
PROGRAM NEWTON_ECUATIE;
VAR A,B,EPS,X,Y,D:REAL;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=EXP(T)-2;
END;
FUNCTION FD(U:REAL):REAL;
BEGIN
FD:=EXP(U);
END;
BEGIN
WRITE('A=');
READLN(A);
WRITE('B=');
READLN(B);
WRITE('EROARE=');
READLN(EPS);
WRITE('X=');
READLN(Y);
D:=EPS+1;
WHILE D>=EPS DO
BEGIN
X:=Y-F(Y)/FD(Y);
D:=ABS(X-Y);
Y:=X;
END;
WRITELN('SOLUTIA ESTE:',X:15:12);
END.
1.6.
Programul surs C
// Metoda de parti proportionale
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float t)

{
float f;
f=t*t-3*t+1;
return f;
}
void main (void)
{
float a,b,eps,x,y,d;
int k;
clrscr();
cout << "dati a " << endl;
cin >> a;
cout << "dati b " << endl;
cin >> b;
cout << "dati eroarea " << endl;
cin >> eps;
cout << "dati x" << endl;
cin >> y;
d=eps+1;
k=0;
while (d>=eps)
{
x=y-(funct(y))/((funct(a)-funct(y))/(a-y));
d=abs(x-y);
y=x;
k=k+1;
}
cout << "Dupa " << k << " etape solutia este " << x << endl;
getche();
}
// Metoda tangentei
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float t)
{
float f;
f=t*t-3*t+1;
return f;
}
float funct_der(float t)
{
float fd;
fd=2*t-3;
return fd;

}
void main (void)
{
float a,b,eps,x,y,d;
int k;
clrscr();
cout << "dati a " << endl;
cin >> a;
cout << "dati b " << endl;
cin >> b;
cout << "dati eroarea " << endl;
cin >> eps;
cout << "dati x" << endl;
cin >> y;
d=eps+1;
k=0;
while (d>=eps)
{
x=y-(funct(y))/funct_der(y);
d=abs(x-y);
y=x;
k=k+1;
}
cout << "Dupa " << k << " etape solutia este " << x << endl;
getche();
}
1.7.
Exerciii
1.
Pentru ecuaia e x 2 0 s se determine cel puin trei aproximaii utiliznd
metodele: falsei poziii, njumtirii intervalului.
2.
S se elaboreze programele n limbajele de programare Pascal i C pentru
metodele Aitken, Steffensen, falsei poziii i njumtirii intervalului.

CAPITOLUL 2
Rezolvarea numeric a sistemelor de ecuaii algebrice liniare prin
metode directe
2.1.

Tema
Rezolvarea numeric a sistemelor algebrice liniare prin metoda de eliminare a
lui Gauss.
Un sistem de n ecuaii liniare cu n necunoscute are forma Ax b , unde A este o
matrice ptrat, nesingular, de dimensiune n n , iar x i b sunt vectori coloan de
dimensiune n.
2.2.

Metoda
Notm, iniial, A(1) A, b (1) b , indicele superior reprezentnd etapa.
Relaiile de recuren n metoda de eliminare a lui Gauss sunt:

a (k ) ,

ik

ij

aij(k 1)

0,

(k ) (k )

i k, j k

(k ) aik akj
aij (k ) , i k , j k ,
akk

b (k ) ,

k 1,..., n 1 .

ik
i

(k ) (k )
bi(k 1) (k ) aik bk
bi (k ) , i k , i, j 1,..., n,
akk

Sistemul se rezolv prin metoda substituiei inverse conform relaiilor

bn(n)

x n ( n)

ann

x 1 b (i) a (i) x , i n 1, ..., 1.


i a (i) i j i 1 ij j

ii

2.3.

Exemplu
S se aplice metoda de eliminare a lui Gauss pentru rezolvarea sistemul

3x1 x2 x3 2
4 x2 x3 1
x1 x2 5x3 4
Rezolvare.

3 1 1
4 1 , iar vectorul
1 1 5

Matricea asociat sistemului (n etapa 1) este A 0

termenilor liberi este b 1 .

k=1
( 2)
(1)
( 2)
(1)
( 2)
(1)
a11
a11
3, a12
a12
1, a13
a13
1,
(1) (1)
(1) (1)
( 2)
( 2)
(1) a 21 a12
( 2)
(1) a 21 a13
a 21 0, a 22 a22
4, a23 a23
1,
(1)
(1)
a11
a11

(1) (1)
(1) (1)
4 ( 2)
14
( 2)
( 2)
(1) a31 a12
(1) a31 a13
a31
0, a32
a32

, a33
a33

,
(1)
(1)
3
3
a11
a11

(1) (1)
(1) (1)
14
( 2)
(1)
( 2)
(1) a 21 b1
( 2)
(1) a31 b1
b1 b1 2, b2 b2
1, b3 b3
.
(1)
(1)
3
a11
a11

k=2
(3)
( 2)
(3)
( 2)
(3)
( 2)
a11
a11
3, a12
a12
1, a13
a13
1,
(3)
( 2)
(3)
( 2)
(3)
( 2)
a21 a 21 0, a 22 a22 4, a23 a 23 1,
(3)
a31

(3)
a32

0,

b1(3)

b1( 2)

0,

(3)
a33

2, b2(3)

( 2)
a33

b2( 2)

( 2) ( 2)
a32
a 23
( 2)
a 22

1, b3(3)

b3(2)

Soluiile sunt:
x3

b3(3)
(3)
a33

1,

x2

1 ( 2) 3 ( 2)
b a2 j x j 0 ,
( 2) 2

j 3
a22

x1

1 (1)
b a1(1j) x j 1 ,
(1) 1

j 2
a11

adic soluia sistemului este

1
x 0 .
1

13
,
3

( 2) ( 2)
a32
b2
( 2)
a 22

13
.
3

2.4.

Algoritmul
Algoritmul asociat metodei Gauss este
Intrri: n = numrul de ecuaii i necunoscute ale sistemului
A = matricea sistemului
b = vectorul termenilor liberi
Ieiri: x = vectorul soluie
{
pentru k 1 : n 1
{
pentru i 1 : n
pentru j 1 : n
dac i k atunci aijk 1 aijk
altfel
dac j k atunci aijk 1 0
( k 1)

(k )

(k ) ( k )

aij aik a kj
altfel aij
pentru i 1 : n
dac i k atunci bik 1 bik
k
altfel bik 1 bik aikk bkk / akk

}
n
xn bnn / a nn

pentru i
{

n1:1

s0
pentru j

i+1:n

s s aiji x j

xi (bii s ) / aiii

}
}
2.5.
Programul surs Pascal
PROGRAM GAUSS;
VAR A:ARRAY[1..10,1..10,1..10] OF REAL;
B:ARRAY[1..10,1..10] OF REAL;
X:ARRAY[1..10] OF REAL;
S:REAL;
N,I,J,K:INTEGER;
BEGIN
WRITE ('N=');
READ(N);
FOR I:=1 TO N DO
FOR J:=1 TO N DO
BEGIN
WRITE('A[',I,',',J,']=');
READ(A[I,J,1]);
END;

10

(k )
/ a kk

FOR I:=1 TO N DO
BEGIN
WRITE('B[',I,']=');
READ (B[I,1]);
END;
FOR K:=1 TO N-1 DO
BEGIN
FOR I:=1 TO N DO
FOR J:=1 TO N DO
IF(I<=K) THEN A[I,J,K+1]:=A[I,J,K]
ELSE IF (J<=K) THEN A[I,J,K+1]:=0
ELSE A[I,J,K+1]:=A[I,J,K]-A[I,K,K]*A[K,J,K]/A[K,K,K];
FOR I:=1 TO N DO
IF (I<=K) THEN B[I,K+1]:=B[I,K]
ELSE B[I,K+1]:=B[I,K]-A[I,K,K]*B[K,K]/A[K,K,K];
END;
X[N]:=B[N,N]/A[N,N,N];
FOR I:=N-1 DOWNTO 1 DO
BEGIN
S:=0;
FOR J:=I+1 TO N DO
S:=S+A[I,J,I]*X[J];
X[I]:=(B[I,I]-S)/A[I,I,I];
END;
FOR I:=1 TO N DO
WRITELN(X[I]);
READLN;
END.
2.6.
Programul surs C
// Metoda Gauss de eliminare
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 15
void main (void)
{
float s;
float a[max+1][max+1][max+1],b[max+1][max+1],x[max+1];
int n,i,j,k;
clrscr();
cout << "dati dimensiunea matricii" << endl;
cin >> n;
cout << "dati matricea sistemului " << endl;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{

11

cout << "a[" << i << j << "]=";


cin >> a[i][j][1];
}
cout << endl;
cout << "dati vectorul termenilor liberi " << endl;
for (i=1;i<=n;i++)
{
cout << "b[" << i << "]=";
cin >> b[i][1];
}
cout << endl;
for (k=1;k<=n-1;k++)
{
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (i<=k)a[i][j][k+1]=a[i][j][k];
else if (j<=k)a[i][j][k+1]=0;
else a[i][j][k+1]=a[i][j][k]-a[i][k][k]*a[k][j][k]/a[k][k][k];
}
for (i=1;i<=n;i++)
if (i<=k)b[i][k+1]=b[i][k];
else b[i][k+1]=b[i][k]-a[i][k][k]*b[k][k]/a[k][k][k];
}
x[n]=b[n][n]/a[n][n][n];
for (i=n-1;i>=1;i--)
{s=0;
for (j=i+1;j<=n;j++)
s=s+a[i][j][i]*x[j];
x[i]=(b[i][i]-s)/a[i][i][i];
}
cout << "Solutia aproximativa este:" << endl;
for (i=1;i<=n;i++)
cout << x[i] << ' ';
cout << endl;
getche();
}
2.7.
1.

Exerciii
S se aplice metoda Cholesky pentru a rezolva sistemul liniar

1
1
1
0

1
2
1
2

1
1
5
2

0
2
2
6

x1 4
x

2 3 .
x3 16
x 8
4

2.
S se elaboreze programele n limbajele de programare Pascal i C pentru
metoda eliminrii Gauss cu pivotare parial.

12

CAPITOLUL 3
Rezolvarea numeric a sistemelor de ecuaii algebrice liniare prin
metode iterative
3.1.

Tema
Rezolvarea numeric a sistemelor algebrice liniare prin metodele Jacobi i
Gauss-Seidel.
Un sistem de n ecuaii liniare cu n necunoscute are forma Ax b , unde A este o
matrice ptrat, nesingular, de dimensiune n n , iar x i b sunt vectori coloan de
dimensiune n.
3.2.

Metoda
Considerm aproximaia iniial x (0) ( x1(0) ,..., xn(0) ) un element din R n , unde
indicele superior reprezint etapa.
Construim irul x ( k ) ( x1( k ) ,..., xn( k ) ) definit prin formulele de recuren:
n metoda Jacobi:
n aij
b
xi(k 1) x (jk ) i i 1, n
;
aii ,
j 1 aii
j i

n metoda Gauss-Seidel:
i 1 aij ( k 1)
xj
j 1 aii

xi(k 1)

aij ( k ) bi
xj
,
aii
j i 1 aii
n

i 1, n

( k 1)
xi( k ) pentru convergena irului.
Utilizm verificarea condiiei xi
i 1

3.3.

Exemplu

a)

3x1 x2 x3 2
S se rezolve, folosind metoda iterativ Jacobi, sistemul
4 x2 x3 1 .
x1 x2 5x3 4
Rezolvare.

13

Matricea asociat

termenilor liberi este b

3 1 1
0 4 1 iar vectorul
A

sistemului (n etapa 1) este


1 1 5

2
1 .
4

irul de recurene pentru soluie este

(k 1)
x1

1 (k ) 1 ( k ) 2
x x
3 2 33 3
1
1
x2(k 1)
x3(k )
4
4
1
1
4
x3(k 1) x1(k ) x2(k )
5
5
5

(0)
Iniializm x 0 i alctuim tabelul

Etapa
0
1
2
3
4

x1

x2

x3

2
3
51

60
170

180
3517

3600

1
4
1
20
7
240
233
960

4
5
53
60
288
300
3459
3600

x1 1
Se obine astfel soluia aproximativ x 0 .
2
x3 1
b)

2 x1 x2 x3 1
S se rezolve, folosind metoda Gauss-Seidel, sistemul x 3 x x 3 .
1 2 3
x1 x2 2 x3 1
Rezolvare.

14

3 a1 j (0)
b
1
xj 1 ,
a11
2
j 2 a11
1 a 2 j (1)
3 a 2 j ( 0)
b
7
x 2(1)
xj
xj 2 ,
a22 6
j 1 a 22
j 3 a 22

x1(1)

a3 j (1) b3 1
xj
,
a33 3
j 1 a33
3 a1 j (1)
b
1
x1( 2)
xj 1 ,
a11
12
j 2 a11
1
3
a
a
41
2 j ( 2)
2 j (1) b2
x2( 2)
xj
xj
,
a22 36
j 1 a 22
j 3 a 22
2 a3 j ( 2 ) b
14
x3( 2)
xj 3
,
a33 144
j 1 a33
3 a1 j ( 2) b
8
x1(3)
xj 1
,
a11 288
j 2 a11
1 a 2 j (3)
3 a 2 j ( 2) b
880
x2(3)
xj
xj 2
,
a
a
a
864
j 1 22
j 3 22
22
2 a3 j (3) b
8
(3)
x3
xj 3
.
a
a33
1728
j 1 33
2

x3(1)

Tabelul soluiilor este


Etapa
0
1
2
3

x1

x2

x3

1
2
1

12
8
288

7
6
41
36
880
864

1
3
14
144
8

1728

x1 0
Se obine astfel soluia aproximativ x 1 .
2
x3 0
3.4.

Algoritmul
Algoritmul asociat metodei Jacobi este
Intrri: n = numrul de ecuaii i necunoscute ale sistemului
A = matricea sistemului
b = vectorul termenilor liberi

15

y = aproximaia anterioar a soluiei


= precizia
Ieiri: x = aproximaia soluiei
{
repet
{
pentru i 1 : n
{
s1 0
pentru j 1 : n
dac j i atunci

s1 s1 aij y j

xi (bi s1) / aii

s0

pentru i

1:n

pentru i

1:n

s s | xi yi |
y i xi

}
pn cnd ( s )
}
Algoritmul asociat metodei Gauss-Seidel este
Intrri: n = numrul de ecuaii i necunoscute ale sistemului
A = matricea sistemului
b = vectorul termenilor liberi
y = aproximaia anterioar a soluiei
= precizia
Ieiri: x = aproximaia soluiei
{
pentru i

1:n

y i xi

s 1

ct timp s
{
pentru i 1 : n
{
s1 0
pentru j 1 : n
dac j i atunci

s1 s1 aij x j

xi (bi s1) / aii

s0

pentru i

1:n

16

s s | xi yi |

pentru i

1:n

y i xi

}
3.5.
Programul surs Pascal
PROGRAM JACOBI_SISTEM;
VAR A:ARRAY[1..10,1..10] OF REAL;
X,Y,B:ARRAY[1..10] OF REAL;
EPS,S,S1:REAL;
N,I,J:INTEGER;
BEGIN
WRITE('DATI N:=');READLN(N);
WRITE('DATI EPS:=');READLN(EPS);
FOR I:=1 TO N DO
FOR J:=1 TO N DO
BEGIN
WRITE('A[',I,',',J,']=');
READLN(A[I,J]);
END;
FOR I:=1 TO N DO
BEGIN
WRITE('B[',I,']=');
READLN(B[I]);
END;
FOR I:= 1 TO N DO
BEGIN
WRITE('Y[',I,']=');
READLN(Y[I]);
END;
REPEAT
FOR I:=1 TO N DO
BEGIN
S1:=0;
FOR J:=1 TO N DO
IF (I<>J) THEN
S1:=S1+A[I,J]*Y[J];
X[I]:=(B[I]-S1)/A[I,I];
END;
S:=0;
FOR I:=1 TO N DO
S:=S+ABS(X[I]-Y[I]);
FOR I:=1 TO N DO
Y[I]:=X[I];
UNTIL (S<EPS);
FOR I:=1 TO N DO
WRITELN(X[I]:14:12);
READLN;

17

READLN;
END.
PROGRAM GAUSS_SEIDEL;
VAR A:ARRAY[1..10,1..10] OF REAL;
B,X,Y:ARRAY[1..10] OF REAL;
EPS,S:REAL;
N,I,J:INTEGER;
BEGIN
WRITE('N='); READLN(N);
FOR I:=1 TO N DO
FOR J:=1 TO N DO
BEGIN
WRITE('A[',I,',',J,']=');
READLN(A[I,J]);
END;
FOR I:=1 TO N DO
BEGIN
WRITE('B[',I,']=');
READLN(B[I]);
END;
FOR I:=1 TO N DO
BEGIN
WRITE('X[',I,']=');
READLN(X[I]);
END;
WRITE('EPS=');READLN(EPS);
FOR I:=1 TO N DO
Y[I]:=X[I];
S:=EPS+1;
WHILE S>=EPS DO
BEGIN
FOR I:=1 TO N DO
BEGIN
X[I]:=B[I]/A[I,I];
FOR J:=1 TO N DO
IF J<>I THEN X[I]:=X[I]-(A[I,J]/A[I,I])*X[J];
END;
S:=0;
FOR I:=1 TO N DO
S:=S+ABS(X[I]-Y[I]);
FOR I:=1 TO N DO
Y[I]:=X[I];
END;
FOR I:=1 TO N DO
WRITELN(X[I]);
END.

18

3.6.
Programul surs C
// Metoda Jacobi pentru rezolvarea sistemelor
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
void main (void)
{
float s,s1,eps;
float a[max+1][max+1],b[max+1],x[max+1],y[max+1];
int n,i,j;
clrscr();
cout << "dati numarul de ecuatii si necunoscute " << endl;
cin >> n;
cout << "dati matricea sistemului " << endl;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
cout << "a[" << i << j << "]=";
cin >> a[i][j];
}
cout << endl;
cout << "dati vectorul termenilor liberi " << endl;
for (i=1;i<=n;i++)
{
cout << "b[" << i << "]=";
cin >> b[i];
}
cout << endl;
cout << "dati aproximatia initiala a solutiei " << endl;
for (i=1;i<=n;i++)
{
cout << "x[" << i << "]=";
cin >> y[i];
}
cout << endl;
cout << "dati eroarea " << endl; cin >> eps; cout << endl;
s=eps+1;
while (s>=eps)
{
for (i=1;i<=n;i++)
{
s1=0;
for (j=1;j<=n;j++)
if (j!=i)s1=s1+a[i][j]*y[j]; x[i]=(b[i]-s1)/a[i][i];
}
s=0;

19

for (i=1;i<=n;i++)
s=s+abs(x[i]-y[i]);
for (i=1;i<=n;i++)
y[i]=x[i];
}
cout << "Solutia aproximativa este " << endl;
for (i=1;i<=n;i++)
cout << x[i] << endl;
getche();
}
// Metoda Gauss_Seidel pentru rezolvarea sistemelor
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
void main (void)
{
float s,s1,eps;
float a[max+1][max+1],b[max+1],x[max+1],y[max+1];
int n,i,j;
clrscr();
cout << "dati numarul de ecuatii si necunoscute " << endl; cin >> n;
cout << "dati matricea sistemului " << endl;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
cout << "a[" << i << j << "]="; cin >> a[i][j];
}
cout << endl;
cout << "dati vectorul termenilor liberi " << endl;
for (i=1;i<=n;i++)
{
cout << "b[" << i << "]="; cin >> b[i];
}
cout << endl;
cout << "dati aproximatia initiala a solutiei " << endl;
for (i=1;i<=n;i++)
{
cout << "x[" << i << "]="; cin >> x[i]; y[i]=x[i];
}
cout << endl;
cout << "dati eroarea " << endl;
cin >> eps;
cout << endl;
s=eps+1;
while (s>=eps)

20

{
for (i=1;i<=n;i++)
{
s1=0;
for (j=1;j<=n;j++)
if (j!=i)s1=s1+a[i][j]*x[j]; x[i]=(b[i]-s1)/a[i][i];
}
s=0;
for (i=1;i<=n;i++)
s=s+abs(x[i]-y[i]);
for (i=1;i<=n;i++)
y[i]=x[i];
}
cout << "Solutia aproximativa este " << endl;
for (i=1;i<=n;i++)
cout << x[i] << endl;
getche();
}
3.7.

Exerciii
S se elaboreze programele n limbajele de programare Pascal i C pentru
metoda relaxrii.

CAPITOLUL 4
Determinarea rdcinilor unui polinom
4.1.

Tema
Determinarea rdcinilor unui polinom prin metoda Lobacevski. Presupunem c
rdcinile ecuaiei
a0 x n a1 x n 1 ... a n 0, ai R , a0 0 ,
sunt distincte n modul i le notm cu
x1 x 2 ... xn .
4.2.

Metoda
Notm ai(0) ai , i 0,1,..., n
Relaiile de recuren sunt ( k N ):
a0( k 1) (a0( k ) ) 2 ,

ai( k 1) (ai( k ) ) 2 2 ( 1) j ai(k )j ai(k )j ,


j 1

cu a s 0 dac s 0 ori s n .
Soluiile sunt date de:
xi 2 p

4.3.

ai( k 1)
ai(k11)

Exemplu
S se aproximeze rdcinile ecuaiei

21

, i 1,..., n .

x 4 15 x 3 70 x 2 120 x 64 0

utiliznd metoda Lobacevski cu o dispersare (p = 1).


Rezolvare.
Cum
a0(0) 1, a1( 0) 15, a 2(0) 70, a3(0) 120, a 4(0) 64 ,

folosind relaiile de recuren avem:

a0(1) (a0(0) ) 2 1,

a1(1) (a1(0) ) 2 2 (1) j a1(0)j a1(0)j 225 2 1 70 85,


j 1
2

a 2(1) (a 2(0) ) 2 2 (1) j a 2(0) j a 2(0) j 4900 2 (15) 120 2 1 64 8628,


j 1
3

a3(1) (a3(0) ) 2 2 (1) j a3(0) j a3(0) j 14400 2 70 64 5440,


a 4(1)

(a 4(0) ) 2

j 1
4

2 (1) j a 4(0) j a 4(0) j 4096.


j 1

Soluiile sunt date de:


x1
x3

a1(1)
a0(1)
a3(1)
a 2(1)

85
9.22,
1

x2

5440
0.79,
8628

x4

a 2(1)
a1(1)
a 4(1)
a3(1)

8628
10.07,
85

4096
0.86.
5440

Dac P( xk ) P ( y k ) atunci componenta k a soluiei este xk altfel y k , unde


xk este componenta k nenegativ iar y k cea negativ, k 1, 2, ..., n .
4.4.

Algoritmul
Algoritmul asociat metodei Lobacevski este
Intrri: n = gradul polinomului
a = vectorul coeficienilor polinomului
Ieiri: x = vectorul soluie cu componentele nenegative
y = vectorul soluie cu componentele negative
{
b0 a02

pentru k
{

1:n

bk ak2

suma 0
pentru i 1 : n
dac ( k i ) i ( k i n ) atunci
dac i este par atunci suma suma ak i ak i
altfel suma suma a k i a k i
bk bk 2 suma

}
pentru k 1 : n

22

{
xk bk / bk 1

; y k xk

}
pentru k 1 : n
{

px a0

pentru i 1 : n

px px x k ai ; px | px | ; py a0

pentru i 1 : n

py py y k ai ; py | py |
dac px py atunci z k xk
altfel z k y k

}
}
4.5.
Programul surs Pascal
PROGRAM LOBACEVSKI;
VAR A,B,X,Y,Z:ARRAY[0..100] OF REAL;
SUMA,PX,PY:REAL;
I,K,N:INTEGER;
BEGIN
WRITE('DATI N=');READLN(N);
FOR I:=0 TO N DO
BEGIN
WRITE('A[',I,']=');
READLN(A[I]);
END;
B[0] := A[0] *A[0];
FOR K:=1 TO N DO
BEGIN
B[K]:=A[K]*A[K];
SUMA:=0;
FOR I:=1 TO K DO
IF (K-I>=0) AND (K+I<=N) THEN
IF (I MOD 2=0) THEN SUMA:=SUMA+A[K-I]*A[K+I]
ELSE SUMA:=SUMA-A[K-I]*A[K+I];
B[K]:=B[K]+2*SUMA;
END;
FOR K:=1 TO N DO
BEGIN
X[K]:=SQRT(B[K]/B[K-1]);
Y[K]:=-X[K];
END;
FOR K:=1 TO N DO
BEGIN
PX:=A[0];
FOR I:=1 TO N DO
PX:=PX*X[K]+A[I];

23

PX:=ABS(PX);
PY:=A[0];
FOR I:=1 TO N DO
PY:=PY*Y[K]+A[I];
PY:=ABS(PY);
IF (PX<PY) THEN Z[K]:= X[K]
ELSE Z[K]:= Y[K]
WRITELN(Z[K]:10:10);
END;
READLN;
END.

4.6.
Programul surs C
// Metoda Lobacevscki
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
void main (void)
{
float suma,px,py;
float a[max+1],b[max+1],x[max+1],y[max+1];
int n,i,k;
clrscr();
cout << "dati n " << endl;
cin >> n;
for (i=0;i<=n;i++)
{
cout << "a[" << i << "]="; cin >> a[i];
}
cout << endl;
b[0]=a[0]*a[0];
for (k=1;k<=n;k++)
{
b[k]=a[k]*a[k];
suma=0;
for (i=1;i<=k;i++)
if ((k-i>=0) && (k+i<=n))
if (i % 2==0) suma=suma+a[k-i]*a[k+i];
suma=suma-a[k-i]*a[k+i];
b[k]=b[k]+2*suma;
}
for (k=1;k<=n;k++)
{

24

x[k]=sqrt(b[k]/b[k-1]); y[k]=-x[k];
}
for (k=1;k<=n;k++)
{
px=a[0];
for (i=1;i<=n;i++)
px=px*x[k]+a[i]; px=abs(px); py=a[0];
for (i=1;i<=n;i++)
py=py*y[k]+a[i];
py=abs(py);
if (px<py) cout << x[k] << endl;
else cout << y[k] << endl;
}
getche();
}
4.7.

Exerciii
S se aproximeze rdcinile ecuaiei
x 4 13 x 3 59 x 2 107 x 60 0

utiliznd metoda Lobacevski cu cel puin dou dispersri ( p = 2).

25

CAPITOLUL 5
Rezolvarea numeric a problemelor algebrice de valori i vectori
proprii
5.1.

Tema
Determinarea valorilor i vectorilor proprii ale unei matrici reale i simetrice
prin metoda Jacobi. O problem algebric de valori i vectori proprii se exprim prin
relaia:
Ax x ,
unde A este o matrice ptratic de ordin n, x un vector (nenul) care se numete vector
propriu (la dreapta) iar un numr care se numete valoare proprie.
5.2.

Metoda
Fie aij(0) aij , i, j 1,..., n , indicele superior reprezentnd etapa.
Relaiile de recuren sunt:

a (ppk 1) a (ppk ) cos 2 aqq(k ) sin 2 2a (pqk ) sin cos ,


(k 1) (k ) 2 (k ) 2
(k )
aqq a pp sin a qq cos 2a pq sin cos ,

a (k 1) a (k 1) a (k ) a (k ) sin cos cos 2 sin 2 a (k ) ,


qp
qq pp
pq
pq
(k 1) (k 1) (k )
(k )
i p, q
aip a pi aip cos aiq sin ,
a (k 1)


a a

(k 1)
iq
qi
(k 1) (k )
aij aij ,
unde

| a pq |

max | aij( k ) |

1 i j n

(k )
(k )
ip sin aiq cos ,

i p, q

i, j p, q
k 1)
a (pq
0

cu
n

.
4

(k )
a
Utilizm verificarea condiiei i 1 j 1 ij
j i

26

pentru convergena irului.

5.3.

Exemplu
S se determine valorile i vectorii proprii pentru matricea

1 1 1
A 1 1 1
1 1 1

folosind metoda lui Jacobi.


Rezolvare.
Lum, de exemplu,
Atunci:
tg 2

Cum | |

rezult
4

p2

2 1 2

2 m, m Z .
1 1 0
2

adic

i q 1 .

.
4

m 0 2 ,
2
2

i p, q i 3 :

( 2) ( 2)
2
2
a32 a 23 1 1 2
2
2

a (2) a (2) 1 2 1
13
31
2
2

a ( 2) 1 2 1 2
2
2
22

2
0
2

2 1

2 2
2
2 2

2
2
( 2)
2 2

11
2
2 2 1 2 2 0

2
2

2
2
2
2
(
2
)
(
2
)
a a (1 1)


2 1 0
2 2 2
21 12

i p, q i 3 a ( 2 ) 1
j p, q j 3 3

Astfel,

0
A( 2) 0
0

0
2
2

27

0
2 .
1

n momentul ndeplinirii condiiei de oprire n algoritm, valorile proprii sunt


elementele de pe diagonala principal i vectorii proprii sunt coloanele matricei.
5.4.

Algoritmul
Algoritmul asociat metodei Jacobi este
Intrri: n = ordinul matricei sistemului
A = matricea sistemului
= precizia
Ieiri: B = matricea ce are pe diagonala principal valorile proprii i
ale crei coloane sunt vectorii proprii
{
s1 1
ct timp s1

max a12
p 1
q2

pentru i 1 : n
pentru j 1 : n
dac ( j i ) atunci
dac | aij | max atunci
{
max | aij |

pi
q j

dac
{

a pp a qq

}
atunci

c 2 /2

sc

}
altfel
{

c cos(arctan(2a pq /( a pp aqq )) / 2
s sin(arctan( 2a pq /( a pp aqq )) / 2

}
b pp a pp c 2 aqq s 2 2a pq sc
bqq a pp s 2 aqq c 2 2a pq sc
b pq ( aqq a pp ) sc (c 2 s 2 )a pq
bqp b pq

pentru i 1 : n
dac ( i p ) i ( i q ) atunci
{

28

bip aip c aiq s


b pi bip
biq aip s aiq c
bqi biq

pentru j 1 : n
dac ( j p ) i ( j q ) atunci
{
bij aij
b ji bij
}

}
pentru i 1 : n
pentru j 1 : n
aij bij

s1 0

pentru i 1 : n
pentru j 1 : n
dac j i atunci
2
s1 s1 aij

}
}
5.5.
Programul surs Pascal
PROGRAM JACOBI_V_V_P;
VAR A,B:ARRAY[1..10,1..10] OF REAL;
EPS,S1,MAX,S,C:REAL;
I,J,N,P,Q:INTEGER;
BEGIN
WRITE('DATI N:');READLN(N);
FOR I:=1 TO N DO
FOR J:=1 TO N DO
BEGIN
WRITE('A[',I,',',J,']=');
READLN(A[I,J]);
END;
WRITE('EROARE=');READLN(EPS);
S1:=EPS+1;
WHILE S1>=EPS DO
BEGIN
MAX:=ABS(A[1,2]);
P:=1;Q:=2;
FOR I:=1 TO N DO
FOR J:=1 TO N DO
IF J<>I THEN
IF ABS(A[I,J])>MAX THEN
BEGIN
MAX:=ABS(A[I,J]);
P:=I;

29

Q:=J;
END;
IF A[P,P]=A[Q,Q] THEN
BEGIN
C:=SQRT(2)/2;
S:=C;
END
ELSE
BEGIN
C:=COS(ARCTAN(2*A[P,Q]/(A[P,P]- A[Q,Q]))/2);
S:=SIN(ARCTAN(2*A[P,Q]/(A[P,P]-A[Q,Q]))/2);
END;
B[P,P]:=A[P,P]*C*C+A[Q,Q]*S*S+2*A[P,Q]*S*C;
B[Q,Q]:=A[P,P]*S*S+A[Q,Q]*C*C-2*A[P,Q]*S*C;
B[P,Q]:=(A[Q,Q]-A[P,P])*S*C+(C*C-S*S)*A[P,Q];
B[Q,P]:=B[P,Q];
FOR I:=1 TO N DO
IF (I<>P) AND (I<>Q) THEN
BEGIN
B[I,P]:=A[I,P]*C+A[I,Q]*S;
B[P,I]:=B[I,P];
B[I,Q]:=-A[I,P]*S+A[I,Q]*C;
B[Q,I]:=B[I,Q];
FOR J:=1 TO N DO
IF (J<>P) AND (J<>Q) THEN
BEGIN
B[I,J]:=A[I,J];
B[J,I]:=B[I,J];
END;
END;
FOR I:=1 TO N DO
FOR J:=1 TO N DO
A[I,J]:=B[I,J];
S1:=0;
FOR I:=1 TO N DO
FOR J:=1 TO N DO
IF J<>I THEN
S1:=S1+A[I,J]*A[I,J];
END;
FOR I:=1 TO N DO
WRITELN('VALOAREA PROPRIE',I,' ESTE',A[I,I]:14:12);
FOR J:=1 TO N DO
BEGIN
WRITELN('VECTORUL PROPRIU',J,' ESTE');
FOR I:=1 TO N DO
WRITELN(A[I,J]:14:12, ' ');
END;
READLN;

30

END.
5.6.
Programul surs C
// Valori si vectori proprii - Jacobi
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
void main (void)
{
float s,max1,t,eps;
float a[max+1][max+1],b[max+1][max+1];
int n,i,j,p,q;
clrscr();
cout << "dati dimensiunea matricii"<<endl;cin>> n; cout <<"dati matricea"<< endl;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
cout << "a[" << i << j << "]="; cin >> a[i][j];
}
cout << endl;
cout << "dati eroarea in forma: 1.0e-k, unde k este natural fara 0";
cin >> eps;
cout << endl;
s=eps;
while (s>=eps)
{
for (i=1;i<=n;i++)
for (j=1;j<=n;j++) b[i][j]=a[i][j];
max1=abs(b[1][2]);
p=1;
q=2;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (i != j)
if (abs(b[i][j])>max1)
{
max1=abs(b[i][j]);
p=i; q=j;
}
}
t=0.5* atan(2*b[p][q]/(b[p][p]-b[q][q]));
a[p][p]=b[p][p]*cos(t)*cos(t) + b[q][q]*sin(t)*sin(t) + 2*b[p][q]*sin(t)*cos(t);
a[q][q]=b[p][p]*sin(t)*sin(t) + b[q][q]*cos(t)*cos(t) - 2*b[p][q]*sin(t)*cos(t);
a[p][q]=0;

31

a[q][p]=0;
for (i=1;i<=n;i++)
{
if ((i!= p) && (i != q))
{
a[i][p]=b[i][p]*cos(t) + b[i][q]*sin(t);
a[i][q]=-b[i][p]*sin(t) + b[i][q]*cos(t);
a[p][i]=a[i][p];
a[q][i]=a[i][q];
for (j=1;j<=n;j++)
{
if ((j != p) && (j != q))
{
a[i][j]=b[i][j];
a[j][i]=a[i][j];
}
}
}
}
s=0;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (j != i)
s = s + a[i][j]*a[i][j];
}
cout << "Val. proprii sunt:" << endl;
for (i=1;i<=n;i++)
cout << a[i][i] << ' ';
cout << endl;
cout << "Vect. proprii sunt:" << endl;
for (j=1;j<=n;j++)
{
cout << "Vect. propriu " << j << " este ";
for (i=1;i<=n;i++)
cout << a[i][j] << ' ';
cout << endl;
}
getche();
}
5.7.

Exerciii
S se determine valorile i vectorii proprii pentru matricea

2 1 0 0
1 2 1 0
0 1 2 1 .
0 0 1 2

32

CAPITOLUL 6
Polinomul de interpolare Lagrange
6.1.

Tema
Determinarea valorii polinomului Lagrange ntr-un punct care aproximeaz o
funcie pe noduri de interpolare date.
6.2.

Metoda
Polinomul de interpolare Lagrange pentru funcia
x1 , x2 ,..., x n este
n

n x xj

i 1

j 1 xi x j
j i

Ln (x) f ( xi )

f (x )

pe nodurile

6.3.

Exemplu
S se gseasc polinomul de interpolare Lagrange pentru funcia f ( x)
nodurile x1 1, x2 3, x3 5 .
Rezolvare.
n xxj
n
Ln ( x ) f ( xi )
i 1
j 1 xi x j
j i
x x 2 x x3
x x1 x x3
x x1 x x2
f ( x1 )
f ( x2 )
f ( x3 )
.
x1 x2 x1 x3
x2 x1 x2 x3
x3 x1 x3 x2
Astfel,

33

x3

L3 ( x )

de unde

( x 3)( x 5)
( x 1)( x 5)
( x 1)( x 3)
1
27
243 ,
8
4
8
L3 ( x)

6.4.

95 2
237
x 82 x
.
4
4

Algoritmul
Algoritmul pentru determinarea valorii polinomului Lagrange este
Intrri: n = numrul nodurilor de interpolare
a = punctul n care se calculeaz valoarea polinomului
x = vectorul cu nodurile de interpolare
f = funcia din metod
Ieiri: = valoarea polinomului Lagrange n a
{
0
pentru i 1 : n
{
p 1
pentru j 1 : n
dac j i atunci
p p ( a x j ) /( xi x j )

p f ( xi )

}
}
6.5.
Programul surs Pascal
PROGRAM POLINOM_LAGRANGE;
VAR X:ARRAY[1..10] OF REAL;
P,L,A:REAL;
I,J,N:INTEGER;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=EXP(T);
END;
BEGIN
WRITE('DATI N:');READLN(N);
FOR I:=1 TO N DO
BEGIN
WRITE('X[',I,']=');
READ(X[I]);
END;
WRITE('A=');READLN(A);
L:=0;
FOR I:=1 TO N DO
BEGIN
P:=1;
FOR J:=1 TO N DO

34

IF (J<>I)THEN
P:=P*(A-X[J])/(X[I]-X[J]);
L:=L+P*F(X[I]);
END;
WRITELN('L=',L:14:12);
READLN;
END.
6.6.
Programul surs C
// Polinomul de interpolare Lagrange
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define max 10
float funct(float t)
{
float f;
f=t*t+t+1;
return f;
}
void main (void)
{
float l,p,a;
float x[max+1];
int n,i,j;
clrscr();
cout << "dati valoarea in care se doreste aproximarea functiei" << endl;
cin >> a; cout << "dati numarul de noduri" << endl;
cin >> n; cout << "dati nodurile" << endl;
for (i=1;i<=n;i++)
{
cout << "x[" << i << "]=";
cin >> x[i];
}
cout << endl;
l=0;
for (i=1;i<=n;i++)
{
p=1;
for (j=1;j<=n;j++)
if (j !=i)
p=p*(a-x[j])/(x[i]-x[j]);
l=l+funct(x[i])*p;
}
cout << "Val. pol. in " << a << " este " << l << endl;
getche();
}

35

6.7.

Exerciii
Scriei polinomul de interpolare Lagrange pentru funcia

nodurile

2
f ( x) e x

pe

3
1
1
3
, 1 , , 0,
, 1,
.
2
2
2
2

CAPITOLUL 7
Diferene divizate
7.1.

Tema
Determinarea diferenei divizate pentru o funcie i noduri de interpolare date.

7.2.

Metoda
Diferena divizat pentru funcia f (x ) pe nodurile x1 , x 2 ,..., x k ( k 2) este:
k
f ( xi )
[ x1 , x2 ,..., xk ] f
k
i 1
( xi x j ) .
j 1
j i

7.3.

Exemplu
S se determine diferena divizat de ordinul 3 pentru funcia
nodurile de interpolare 1, 3, 4, 9.
Rezolvare.

f ( x) x 2 x 1

4
f ( xi )
[ x1 , x2 , x3 , x4 ] f
4
i 1
( xi x j )
j 1
j i

de unde rezult

f ( x1 )
f ( x2 )

( x1 x 2 )( x1 x3 )( x1 x4 ) ( x2 x1 )( x2 x3 )( x2 x4 )
f ( x3 )
f ( x4 )

( x3 x1 )( x3 x2 )( x3 x 4 ) ( x 4 x1 )( x4 x2 )( x 4 x3 )
3 13
21 91

0
48 12
15 240

[ x1 , x2 , x3 , x 4 ] f

36

7.4.

Algoritmul
Algoritmul pentru determinarea diferenelor divizate este
Intrri: k = numrul nodurilor de interpolare
x = vectorul cu nodurile de interpolare
f = funcia din metod
Ieiri: dd = diferena divizat
{
dd 0
pentru i 1 : k
{
p 1
pentru j 1 : k
dac j i atunci p p ( xi x j ) ; dd dd f ( xi ) / p
}
}

7.5.
Programul surs Pascal
PROGRAM DIF;
VAR X: ARRAY[1..10] OF REAL;
K,I,J:INTEGER;
DD,P:REAL;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=SIN(T);
END;
BEGIN
WRITE('DATI K= ');
READLN(K);
FOR I:=1 TO K DO
BEGIN
WRITE('DATI X[',I,']= ');
READLN(X[I]);
END;
DD:=0;
FOR I:=1 TO K DO
BEGIN
P:=1;
FOR J:=1 TO K DO
IF (J<>I) THEN
P:=P*(X[I]-X[J]);
DD:=DD+F(X[I])/P;
END;
WRITELN;
WRITELN('DIFERENTA DIVIZATA: ',DD:14:12);
READLN;
END.

37

7.6.
Programul surs C
// Diferenta divizata
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define max 10
float funct(float t)
{
float f;
f=t*t+t+1;
return f;
}
void main (void)
{
float dd,p;
float x[max+1];
int k,i,j;
clrscr();
cout << "dati ordinul diferentei divizate" << endl; cin >> k;
cout << "dati nodurile" << endl;
for (i=1;i<=k;i++)
{
cout << "x[" << i << "]="; cin >> x[i];
}
cout << endl;
dd=0;
for (i=1;i<=k;i++)
{
p=1;
for (j=1;j<=k;j++)
if (j !=i)
p=p*(x[i]-x[j]);
dd=dd+funct(x[i])/p;
}
cout << "Diferente divizata de ordinul " << k << " este " << dd << endl;
getche();
}
7.7.

Exerciii
S se elaboreze programele n limbajele de programare Pascal i C pentru
determinarea diferenei divizate prin recuren.

38

CAPITOLUL 8
Polinomul de interpolare Newton
8.1.

Tema
Determinarea valorii polinomului Newton ntr-un punct care aproximeaz o
funcie pe noduri de interpolare date.
8.2.

Metoda
Polinomul de interpolare Newton pentru funcia
x1 , x2 ,..., x n este
n

k 1

k 2

f (x )

pe nodurile

P ( x ) f ( x1 ) [ x1 , x 2 ,..., x k ] f ( x x ) .

8.3.

Exemplu
S se scrie polinomul de interpolare Newton pentru funcia
nodurile de interpolare 1, 2, 5.
Rezolvare.
Polinomul de interpolare Newton este
3

k 1

k 2

f ( x) x 2 x 1

P( x) f ( x1 ) [ x1 , x2 ,..., xk ] f ( x x ) .

Astfel
P( x)

( x1 )

[ x1 ,

i 1

j 1
j i

j 1
j 1

j 1
j 1

x2 ]

( xi

( x1

1
2

3
)( x
1

[ x1 ,

x )

x1 )

)
f

( x

( x

( x1 )

( x1 )

( x1

( xi

j 1
j 2

j 1
j 2

1
)

( x2 )

( x2

1
2

3
1

x3 ]

( xi

( xi

) ( x

( x

( x

x1 )

f
2

j 1
j 3

( x3 )

( x3

21
)( x
8

) ( x
x

1
)( x

)
2)

5
41
( x 1)
( x 1)( x 2) .
2
8

39

x )

x1 )( x

x2 )

de unde rezult
P ( x) 1

f
3

j 1
j i

( x2 )

( x2

x2 ,

i 1

x1 )( x

x2 )

8.4.

Algoritmul
Algoritmul asociat metodei Newton este
Intrri: n = numrul nodurilor de interpolare
a = numrul n care se calculeaz valoarea polinomului
x = vectorul cu nodurile de interpolare
f = funcia din metod
Ieiri: 1 = valoarea polinomului Newton n a
{
s2 0
pentru k 2 : n
{
p1 1
pentru 1 : k 1
t t p f ( xi )

s1 0
pentru i 1 : k
{
p2 1
pentru j 1 : k
dac j i atunci

p 2 p 2 ( xi x j )

s1 s1 f ( xi ) / p 2

s 2 s 2 s1 p 2

}
1 f ( x1 ) s 2
}
8.5.
Programul surs Pascal
PROGRAM INTERPOLARE_NEWTON;
VAR X:ARRAY[1..20] OF REAL;
L1,S1,S2,P1,P2,A:REAL;
I,J,K,L,N:INTEGER;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=T-1;
END;
BEGIN
WRITE('DATI N=');READLN(N);
WRITE('DATI A=');READLN(A);
FOR I:=1 TO N DO
BEGIN
WRITE('X[',I,']=');READLN(X[I]);
END;
S2:=0;
FOR K:=2 TO N DO BEGIN

40

P1:=1;
FOR L:=1 TO K-1 DO
P1:=P1*(A-X[L]);
S1:=0;
FOR I:=1 TO K DO BEGIN
P2:=1;
FOR J:=1 TO K DO
IF J<>I THEN P2:=P2*(X[I]-X[J]);
S1:=S1+F(X[I])/P2;
END;
S2:=S2+S1*P1;
END;
L1:=F(X[1])+S2;
WRITELN('L=',L1:14:12);
READLN;
END.
8.6.
Programul surs C
// Polinomul de interpolare Newton
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define max 10
float funct(float t)
{
float f;
f=t*t+t+1;
return f;
}
void main (void)
{
float l,s,p,p1,a;
float x[max+1];
int n,i,j,k,m;
clrscr();
cout << "dati numarul de noduri" << endl;
cin >> n;
cout << "dati nodurile" << endl;
for (i=1;i<=n;i++)
{
cout << "x[" << i << "]=";
cin >> x[i];
}
cout << endl;
cout << "dati valoarea in care se aproximeaza functia" << endl;
cin >> a;
l=funct(x[1]);
for (k=2;k<=n;k++)

41

{
s=0;
for (i=1;i<=k;i++)
{
p=1;
for (j=1;j<=k;j++)
if (j !=i)
p=p*(x[i]-x[j]);
s=s+funct(x[i])/p;
}
p1=1;
for (m=1;m<=k-1;m++)
p1=p1*(a-x[m]);
l=l+s*p1;
}
cout << "Val. pol. in " << a << " este " << l << endl;
getche();
}
8.7.

Exerciii
S se elaboreze programele pentru calcularea valorii polinomului Newton ntr-un
punct pentru o funcie pe noduri de interpolare date folosind proceduri/funcii n Pascal,
funcii n C.

42

CAPITOLUL 9
Interpolarea prin polinoame trigonometrice
9.1.

Tema
Determinarea valorii polinomului trigonometric ntr-un punct care aproximeaz
o funcie pe noduri de interpolare date.
9.2.

Metoda
Polinomul trigonometric de interpolare pentru funcia
x0 , x1 ,..., x2n este
sin

pe nodurile

x xj

2n

2n

i 0

j 0 xi x j
j i sin

Tn ( x) f ( xi )

f (x )

9.3.

Exemplu
4
S se scrie polinomul trigonometric de interpolare pentru funcia f ( x) x n

ln x

nodurile de interpolare 2, 3, 4, 5 i s se calculeze valoarea polinomului n 4.5.


Precizare:
x
2 3 4
5
Valoarea aproximativ a lui 23 74 185 388
f (x )

Rezolvare.
Polinomul trigonometric de interpolare pentru funcia f ( x)
2, 3, 4, 5 este
Tn ( x )

i 0

f ( xi )

sin

j 0
j i

sin

x4
pe nodurile
ln x

x x j
2
x j

xi

2
x x j
x x j
sin
3
2
2
f ( x1 )

x
x1 x j
0
j
j 0
j 0
sin
sin
j 0
j 1
2
2
x x j
x x j
sin
sin
3
3
2
2
f ( x2 )
f ( x3 )
x2 x j
x3 x j
j 0
j 0
j 2 sin
j 3 sin
2
2
x x1
x x2
x x3

sin
sin
sin

2
2
2

f ( x 0 )

x 0 x1
x0 x 2
x 0 x3

sin
sin
sin

2
2
2

sin

f ( x0 )

43

x x0
x x3
x x2
sin
sin
sin

2
2
2


f ( x1 )

x
x

x
x

1 0 sin 1 2 sin 1 3
sin

2
2
2

x x0
x x3
x x1

sin
sin
sin

2
2
2


f ( x2 )

x
x

x
x

2
0 sin 2 1 sin 2 3
sin

2
2
2

x x0
x x1
x x2

sin
sin
sin

2
2
2

f ( x3 )

x3 x 0
x3 x1
x3 x 2

sin
sin
sin

2
2
2

de unde rezult expresia


x 3
x4
x 5
x2
x4
x 5
23 sin
sin
sin
sin
sin
sin
2
2
2 74
2
2
2
T3 ( x)
1
2
3
1
1
2
sin sin sin
sin sin sin
2
2
2
2
2
2
x2
x3
x 5
x2
x 3
x4
sin
sin
sin
sin
sin
sin
2
2
2 388
2
2
2
185
2
1
1
3
2
1
sin sin sin
sin sin sin
2
2
2
2
2
2
Valoarea polinomului n 4.5 este
1.5
0.5
0.5
2.5
0.5
0.5
23 sin
sin
sin
sin
sin
sin
2
2
2 74
2
2
2
T3 (4.5)
1
2
3
1
1
2
sin sin sin
sin sin sin
2
2
2
2
2
2
2.5
1.5
0.5
2.5
1.5
0,5
sin
sin
sin
sin
sin
sin
2
2
2 388
2
2
2
185
2
1
1
3
2
1
sin sin sin
sin sin sin
2
2
2
2
2
2
adic, T3 (4.5) 284 .
9.4.

Algoritmul
Algoritmul pentru determinarea valorii polinomului trigonometric
interpolare este
Intrri: 2n + 1 = numrul nodurilor de interpolare
a = numrul n care se calculeaz valoarea polinomului
x = vectorul cu nodurile de interpolare
f = funcia din metod
Ieiri: t = valoarea polinomului trigonometric de interpolare n a
{

t 0
pentru i

0 : 2n

44

de

p 1
pentru j 0 : 2n
dac j i atunci

p p sin(( a x j ) / 2) / sin(( xi x j ) / 2)

t t p f ( xi )

}
}
9.5.
Programul surs Pascal
PROGRAM POLINOMUL_TRIGONOMETRIC_DE_INTERPOLARE;
VAR X:ARRAY[0..20] OF REAL;
P,T,A:REAL;
I,J,N:INTEGER;
FUNCTION F(U:REAL):REAL;
BEGIN
F:=EXP(U);
END;
BEGIN
WRITE('DATI N:');READLN(N);
FOR I:=0 TO 2*N DO
BEGIN
WRITE('X[',I,']=');
READ(X[I]);
END;
WRITE('A=');READLN(A);
T:=0;
FOR I:=0 TO 2*N DO
BEGIN
P:=1;
FOR J:=0 TO 2*N DO
IF (J<>I)THEN
P:=P*SIN((A-X[J])/2)/SIN((X[I]-X[J])/2);
T:=T+P*F(X[I]);
END;
WRITELN('T=',T:14:12);
READLN;
END.
9.6.
Programul surs C
// Polinomul trigonometric de interpolare
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float u)
{

45

float f;
f=u*u+u+1;
return f;
}
void main (void)
{
float t,p,a;
float x[max+1];
int n,m,i,j;
clrscr();
cout << "dati valoarea in care se doreste aproximarea functiei" << endl;
cin >> a;
cout << "dati numarul de noduri (impar)" << endl;
cin >> m;
n=(m-1)/2;
cout << "n= " << n << endl;
cout << "dati nodurile" << endl;
for (i=0;i<=2*n;i++)
{
cout << "x[" << i << "]=";
cin >> x[i];
}
cout << endl;
t=0;
for (i=0;i<=2*n;i++)
{
p=1;
for (j=0;j<=2*n;j++)
if (j !=i)
p=p*sin((a-x[j])/2)/sin((x[i]-x[j])/2);
t=t+funct(x[i])*p;
}
cout << "Val. pol. in " << a << " este " << t << endl;
getche();
}
9.7.

Exerciii
S se testeze programele n limbajele de programare Pascal i C pentru:
sin x
n nodurile: 1; 2; 3; 4; 5;
1 sin x
x
b) funcia f ( x) 2 cos
n nodurile: 0; 0.1; 0.2; 0.3; 0.4; 0.5.
4

a) funcia f ( x)

46

CAPITOLUL 10
Diferene finite
10.1.

Tema
Determinarea diferenei finite pentru o funcie i noduri de interpolare date.

10.2.

Metoda
Diferena finit pentru funcia f (x ) pe nodurile echidistante x1 , x2 ,..., xn (
xi x1 (i 1)h, i 1,2,..., n ) este
k

k f ( x ) (1) k j C kj f ( x jh) .
j 0

10.3.

Exemplu
S se determine diferena finit de ordinul 3 pentru funcia
nodurile de interpolare 1, 2, 3, 4 n primul nod.
Rezolvare.
3

f ( x) x 3 x 1

3 f ( x) (1) 3 j C 3 f ( x j )
j

j 0

(1) 3 C 30 f ( x) (1) 2 C 31 f ( x 1) (1)1 C 32 f ( x 2) (1) 0 C 33 f ( x 3)

de unde
10.4.

3 f (1) 198 .

Algoritmul
Algoritmul pentru determinarea diferenelor finite este
Intrri: n = numrul nodurilor de interpolare
k = ordinul diferenei finite
x = vectorul cu nodurile de interpolare
h = pasul
Ieiri: df = diferena finit
{
dac k este par atunci df f ( x1 )
altfel df f ( x1 )
pentru j 1 : k
{
c 1
pentru 1 : j
c c(k 1) /
dac ( k j ) este par atunci

df
altfel
df

df c f ( x1 jh)

df c f ( x1 jh)

}
}
10.5.

Programul surs Pascal

47

PROGRAM DIF_FINITA;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=EXP(-(T*T));
END;
VAR X:ARRAY[1..20] OF REAL;
H,C,D,DF:REAL;
L,I,J,K,N:INTEGER;
BEGIN
WRITE('DATI N=');READLN(N);
WRITE('DATI H=');READLN(H);
WRITE('DATI X[1]=');READLN(X[1]);
FOR I:=2 TO N DO
X[I]:=X[1]+(I-1)*H;
WRITE('K=');READLN(K);
IF (K MOD 2=0) THEN DF:=F(X[1])
ELSE DF:=-F(X[1]);
FOR J:=1 TO K DO BEGIN
C:=1;
FOR L:=1 TO J DO
C:=C*(K-L+1)/L;
IF (K-J) MOD 2=0 THEN DF:=DF+C*F(X[1]+J*H)
ELSE DF:=DF-C*F(X[1]+J*H);
END;
WRITE('DF=',DF:14:12);
READLN;
END.
10.6. Programul surs C
// Diferente finite
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float t)
{
float f;
f=exp(-(t*t));
return f;
}
void main (void)
{
float df,c,h;
float x[max+1];
int n,k,i,j,l;
clrscr();
cout << "dati ordinul diferentei finite" << endl;

48

cin >> k;
cout << "dati numarul de noduri" << endl;
cin >> n;
cout << "dati pasul" << endl;
cin >> h;
cout << "dati primul nod" << endl;
cin >> x[1];
for (i=2;i<=n;i++)
{
x[i]=x[1]+(i-1)*h;
}
cout << endl;
if (k%2==0)df=funct(x[1]);
else df=-funct(x[1]);
for (j=1;i<=k;j++)
{
c=1;
for (l=1;l<=j;l++)
c=c*(k-l+1)/l;
if ((k-j)%2==0)df=df+c*funct(x[1]+j*h);
else df=df-c*funct(x[1]+j*h);
}
cout << "Diferenta finita de ordinul " << k << " este " <<
getche();

df << endl;

}
10.7.

Exerciii
S se scrie programele Pascal i C pentru calculul diferenei finite utiliznd
funcii n limbajele de programare amintite.

CAPITOLUL 11
Formule de interpolare pe noduri echidistante

49

11.1.

Tema
Determinarea valorii polinomului Newton pe noduri echidistante n primul i
respectiv ultimul nod.
11.2.

Metoda
Fie funcia

f (x ) i nodurile de interpolare echidistante


xi x1 (i 1)h, i 1,2,..., n ).

x1 , x2 ,..., x n

Formula lui Newton progresiv este:


n 1 k

Ln ( x1 th) f ( x1 )

k 1

f ( x1 ) k
(t 1)
k!
1

n timp ce formula lui Newton regresiv este:


n 1 k

Ln ( x n th) f ( x n )

k 1

f ( xn k ) k
(t 1) .
k!
1

11.3.

Exemplu
S se scrie polinomul Newton (varianta progresiv i regresiv) pentru funcia
f ( x ) e x i nodurile 1, 3, 5, 7.
Rezolvare.
Polinomul lui Newton progresiv este:
3 k f (1)

L4 (1 2t ) f (1)
1

k 1

k!

(t 1)
1

f (1)
2 f (1) 2
3 f (1) 3
e
(t 1)
(t 1)
(t 1)
1! 1
2! 1
3! 1
1
1 2
e (1)1 j C1j f (1 2 j ) t (1) 2 j C 2j f (1 2 j ) t (t 1)
2! j 0
j 0
3
1
(1) 3 j C3j f (1 2 j ) t (t 1)(t 2)
3! j 0
1

de unde se obine
1
Ln (1 2t ) e (e e 3 )t (e 2e 3 e 5 )t (t 1)
2
1
3
( e 3e 3e 5 e 7 ) t (t 1)(t 2)
6
n timp ce polinomul lui Newton regresiv este:

k f ( x4 k ) k
Ln (7 2t ) f (7)
(t 1)
k!
k 1
1
1
1

f
(
5
)
2 f (3) 2
3 f (1) 3
e7
(t 1)
(t 1)
(t 1)
1! 1
2! 1
3! 1
1
1 2
e 7 (1)1 j C1j f (5 2 j ) t (1) 2 j C 2j f (3 2 j ) t (t 1)
2! j 0
j 0
3
1
(1) 3 j C3j f (1 2 j ) t (t 1)(t 2)
3! j 0
3

de unde

50

1
Ln (7 2t ) e 7 ( e 5 e 7 )t (e 3 2e 5 e 7 )t (t 1)
2
1
3
5
( e 3e 3e e 7 )t (t 1)(t 2).
6
11.4. Algoritmul
Algoritmul pentru determinarea valorii polinomului Newton pe noduri
echidistante n primul nod este
Intrri: n = numrul nodurilor de interpolare
x = vectorul cu nodurile de interpolare
h = pasul
a = numrul n care se calculeaz valoarea polinomului
Ieiri: 1 = valoarea polinomului n a
{
1 f ( x1 )
pentru k 1 : n 1
{
p 1
pentru 1 : k
p p ( a 1)
fc 1

pentru 1 : k
fc fc

dac k este par atunci s1 f ( x1 )


altfel s1 f ( x1 )

pentru j
1:k
{
c 1
pentru s 1 : j

c c (k s 1) / s
dac ( k j ) este par atunci s1 s1 cf ( x1 jh)

altfel s1 s1 cf ( x1 jh)

1 1 s1 p / fc

}
}
Algoritmul pentru determinarea valorii polinomului Newton pe noduri
echidistante n ultimul nod este
Intrri: n = numrul nodurilor de interpolare
x = vectorul cu nodurile de interpolare
h = pasul
a = numrul n care se calculeaz valoarea polinomului
Ieiri: n = valoarea polinomului n a
{
n f ( x n )
pentru k 1 : n 1
{
p 1

51

pentru 1 : k

p p (a 1)
fc 1

pentru 1 : k
fc fc

dac k este par atunci


s1 f ( x n k )
altfel
s1 f ( xn k )
pentru j 1 : k
{
c 1

pentru s 1 : j

c c (k s 1) / s
dac ( k j ) este par atunci s1 s1 cf ( xn k jh)

altfel s1 s1 cf ( x n k jh)

n n s1 p / fc

}
}
11.5. Programul surs Pascal
PROGRAM NEWTON_PROGRESIV;
VAR X:ARRAY[1..10] OF REAL;
H,A,L1,P,FC,S1,C:REAL;
N,J,K,L,S:INTEGER;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=T+2;
END;
BEGIN
WRITE('N=');READLN(N);
WRITE('X=');READLN(X[1]);
WRITE('H=');READLN(H);
WRITE('A=');READLN(A);
FOR J:=1 TO N DO
X[J]:=X[1]+(J-1)*H;
L1:=F(X[1]);
FOR K:=1 TO N-1 DO
BEGIN
P:=1;
FOR L:=1 TO K DO
P:=P*(A-L+1);
FC:=1;
FOR L:=1 TO K DO
FC:=FC*L;

52

IF K MOD 2=0 THEN


S1:=F(X[1])
ELSE
S1:=-F(X[1]);
FOR J:=1 TO K DO
BEGIN
C:=1;
FOR S:=1 TO J DO
C:=C*(K-S+1)/S;
IF (K-J) MOD 2=0 THEN
S1:=S1+C*F(X[1]+J*H)
ELSE
S1:=S1-C*F(X[1]+J*H);
END;
L1:=L1+S1*P/FC;
END;
WRITELN('L1',L1:14:12);
END.
PROGRAM NEWTON_REGRESIV;
VAR X:ARRAY[1..10] OF REAL;
H,A,LN,P,FC,S1,C:REAL;
N,J,K,L,S:INTEGER;
FUNCTION F(T:REAL):REAL;
BEGIN
F:=T-2;
END;
BEGIN
WRITE('N=');READLN(N);
WRITE('X=');READLN(X[1]);
WRITE('H=');READLN(H);
WRITE('A=');READLN(A);
FOR J:=1 TO N DO
X[J]:=X[1]+(J-1)*H;
LN:=F(X[N]);
FOR K:=1 TO N-1 DO
BEGIN
P:=1;
FOR L:=1 TO K DO
P:=P*(A+L-1);
FC:=1;
FOR L:=1 TO K DO
FC:=FC*L;
IF K MOD 2=0 THEN
S1:=F(X[N-K])
ELSE
S1:=-F(X[N-K]);
FOR J:=1 TO K DO

53

BEGIN
C:=1;
FOR S:=1 TO J DO
C:=C*(K-S+1)/S;
IF (K-J) MOD 2=0 THEN
S1:=S1+C*F(X[N-K]+J*H)
ELSE
S1:=S1-C*F(X[N-K]+J*H);
END;
LN:=LN+S1*P/FC;
END;
WRITELN('LN',LN:14:12);
END.
11.6. Programul surs C
// Polinomul de interpolare Newton-progresiv
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float t)
{
float f;
f=exp(-(t*t));
return f;
}
void main (void)
{
float np,df,c,h,p,fc,a;
float x[max+1];
int n,k,i,j,l;
clrscr();
cout << "dati valoarea unde se aproximeaza functia" << endl;
cin >> a;
cout << "dati numarul de noduri" << endl;
cin >> n;
cout << "dati pasul" << endl;
cin >> h;
cout << "dati primul nod" << endl;
cin >> x[1];
for (i=2;i<=n;i++)
{
x[i]=x[1]+(i-1)*h;
}
cout << endl;
np=funct(x[1]);
for (k=1;k<=n-1;k++)

54

{
fc=1;
for (l=1;l<=k;l++)
fc=fc*l;
p=1;
for (l=1;l<=k;l++)
p=p*(a-l+1);
if (k%2==0)df=funct(x[1]);
else df=-funct(x[1]);
for (j=1;i<=k;j++)
{
c=1;
for (l=1;l<=k;l++)
c=c*(k-l+1)/l;
if ((k-j)%2==0)df=df+c*funct(x[1]+j*h);
else df=df-c*funct(x[1]+j*h);
}
np=np+p*df/fc;
}
cout << "Valoarea polinomului in " << a << " este " << np << endl;
getche();
}
// Polinomul de interpolare Newton-regresiv
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float t)
{
float f;
f=exp(-(t*t));
return f;
}
void main (void)
{
float np,df,c,h,p,fc,a;
float x[max+1];
int n,k,i,j,l;
clrscr();
cout << "dati valoarea unde se aproximeaza functia" << endl;
cin >> a;
cout << "dati numarul de noduri" << endl;
cin >> n;
cout << "dati pasul" << endl;
cin >> h;

55

cout << "dati primul nod" << endl;


cin >> x[1];
for (i=2;i<=n;i++)
{
x[i]=x[1]+(i-1)*h;
}
cout << endl;
np=funct(x[n]);
for (k=1;k<=n-1;k++)
{
fc=1;
for (l=1;l<=k;l++)
fc=fc*l;
p=1;
for (l=1;l<=k;l++)
p=p*(a+l-1);
if (k%2==0)df=funct(x[n-k]);
else df=-funct(x[n-k]);
for (j=1;i<=k;j++)
{
c=1;
for (l=1;l<=k;l++)
c=c*(k-l+1)/l;
if ((k-j)%2==0)df=df+c*funct(x[n-k]+j*h);
else df=df-c*funct(x[n-k]+j*h);
}
np=np+p*df/fc;
}
cout << "Valoarea polinomului in " << a << " este " << np << endl;
getche();
}
11.7.

Exerciii
S se scrie programele Pascal i C pentru calculul valorii polinoamelor Newton
progresiv i regresiv ntr-un punct utiliznd funcii n limbajele de programare amintite.

CAPITOLUL 12
Formule de derivare numeric pe noduri echidistante
12.1.

Tema
Determinarea derivatei nti a unei funcii pe noduri de interpolare date derivnd
formula lui Newton progresiv i regresiv.
12.2.

Metoda
Derivata nti pentru funcia f (x ) pe nodurile echidistante x1 , x2 ,..., xn (
xi x1 (i 1)h, i 1,2,..., n ) este:
f ' ( x1 )

j
1 n 1
j 1 f ( x1 )
(

1
)
R1n ( x) (varianta progresiv),

h j 1
j

56

f ' ( xn )

12.3.

j
1 n 1 f ( x n j )
Rn2 ( x)

h j 1
j

(varianta regresiv).

Exemplu

S se calculeze derivata polinomului Newton n primul i ultimul nod, polinom


ce aproximeaz funcia f ( x ) e x pe nodurile 2 , 1 , 0 , 1, 2.
Rezolvare.
Polinomul Newton progresiv este:

k f ( x1 )
k
k 1
2
f (2) 3 f (2) 4 f (2)
1
f (2)

2
3
4
1
1 2
1 j j
2 j j
(1) C1 f (2 j ) (1) C 2 f (2 j )
2 j 0
j 0
3
1
1 4
j
j
(1) 3 j C3 f (2 j ) (1) 4 j C 4 f (2 j )
3 j 0
4 j 0
4

L'5 (2) (1) k 1

de unde se obine
1
1
L'5 (2) (e e 2 ) (e 2 2e 1) (e 2 3e 3 e 1 )
2
3
1 2
1
2
(e 4e 6 4e e ),
4
n timp ce polinomul lui Newton regresiv este:
k f ( x5k )
2 f ( x3 ) 3 f ( x 2 ) 4 f ( x1 )
1 f ( x 4 )

,
k
2
3
4
k 1
4

L ' 5 ( 2)

de unde, prin nlocuire, se obine


1
1
L'5 (2) (1 e 1 ) (1 2e 1 e 2 ) (e 2 3e 1 3 e)
2
3
1 2
1
2
(e 4e 6 4e e ).
4
12.4. Algoritmul
Algoritmul pentru aproximarea derivatei nti n primul nod este
Intrri: n = numrul nodurilor de interpolare
x = vectorul cu nodurile de interpolare
h = pasul
f = funcia din metod
Ieiri: d1 = derivata (aproximativ) n primul nod
{
d1 0
pentru k 1 : n 1
{
dac k este par atunci
df f ( x1 )
altfel

57

df f ( x1 )
pentru j 1 : k
{
c 1
pentru 1 : j

c c (k 1) /
dac ( k j ) este par atunci df df cf ( x1 jh)

altfel df df cf ( x1 jh)

}
dac ( k 1 ) este par atunci d1 d1 df / k
altfel d1 d1 df / k
}

d1 d1 / h

}
Algoritmul pentru aproximarea derivatei nti n ultimul nod este
Intrri: n = numrul nodurilor de interpolare
x = vectorul cu nodurile de interpolare
h = pasul
f = funcia din metod
Ieiri: dn = derivata (aproximativ) n ultimul nod
{
dn 0
pentru k 1 : n 1
{
dac k este par atunci
d f ( xn )
altfel
d f ( xn )
pentru j 1 : k
{
c 1

pentru 1 : j

c c (k 1) /
dac ( k j ) este par atunci d d cf ( x n k jh)
altfel d d cf ( xn k jh)

}
dn dn d / k
}

dn dn / h

}
12.5. Programul surs Pascal
PROGRAM DERIVATA_NEWTON_PROGRESIV ;
VAR X:ARRAY[1..100] OF REAL;
H,D1,DF,C:REAL;
I,J,K,L,N:INTEGER;

58

FUNCTION F(T:REAL):REAL;
BEGIN
F:=T*T+1;
END;
BEGIN
WRITE('N=');READLN(N);
WRITE('X1=');READLN(X[1]);
WRITE('H=');READLN(H);
FOR I:=1 TO N DO
X[I]:=X[1]+(I-1)*H;
D1:=0;
FOR K:=1 TO N-1 DO
BEGIN
IF K MOD 2=0 THEN DF:=F(X[1])
ELSE DF:=-F(X[1]);
FOR J:=1 TO K DO
BEGIN
C:=1;
FOR L:=1 TO J DO
C:=C*(K-L+1)/L;
IF (K-J) MOD 2=0 THEN DF:=DF+C*F(X[1]+J*H)
ELSE DF:=DF-C*F(X[1]+J*H);
END;
IF (K-1) MOD 2=0 THEN D1:=D1+DF/K
ELSE D1:=D1-DF/K;
END;
D1:=D1/H;
WRITELN('D1=',D1:14:12);
READLN;
END.
PROGRAM DERIV_NEWTON_REGRESIV;
VAR X:ARRAY[1..10] OF REAL;
H,DN,D,C:REAL;
N,J,K,L:INTEGER;
FUNCTION F (T:REAL):REAL;
BEGIN
F:= T*T+1;
END;
BEGIN
WRITE('N='); READLN(N);
WRITE('H='); READLN(H);
WRITE ('X[1]='); READLN (X[1]);
FOR J:= 1 TO N DO
X[J]:= X[1]+ (J-1)*H;
DN:= 0;
FOR K:= 1 TO N-1 DO

59

BEGIN
IF K MOD 2 = 0 THEN
D:= F(X[N-K])
ELSE
D:= -F(X[N-K]);
FOR J:= 1 TO K DO
BEGIN
C:= 1;
FOR L:= 1 TO J DO
C:= C*(K-L+1)/L;
IF (K-J) MOD 2= 0 THEN
D:= D + C*F(X[N-K]+J*H)
ELSE
D:= D-C*F(X[N-K]+J*H);
END;
DN:=DN+D/K;
END;
DN:=DN/H;
WRITELN('DERIVATA ESTE:',DN:14:12);
END.
12.6. Programul surs C
// Derivata polinomul Newton-progresiv (in primul nod)
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float t)
{
float f;
f=exp(-(t*t));
return f;
}
void main (void)
{
float dnp,df,c,h;
float x[max+1];
int n,k,i,j,l;
clrscr();
cout << "dati numarul de noduri" << endl;
cin >> n;
cout << "dati pasul" << endl;
cin >> h;
cout << "dati primul nod" << endl;
cin >> x[1];
for (i=2;i<=n;i++)
{

60

x[i]=x[1]+(i-1)*h;
}
cout << endl;
dnp=0;
for (k=1;k<=n-1;k++)
{
if (k%2==0)df=funct(x[1]);
else df=-funct(x[1]);
for (j=1;i<=k;j++)
{
c=1;
for (l=1;l<=j;l++)
c=c*(k-l+1)/l;
if ((k-j)%2==0)df=df+c*funct(x[1]+j*h);
else df=df-c*funct(x[1]+j*h);
}
if ((k-1)%2==0)dnp=dnp+df/k;
else dnp=dnp-df/k;
}
dnp=dnp/h;
cout << "Derivata polinomului in primul nod este " << dnp << endl;
getche();
}
// Derivata polinomul Newton-regresiv (in ultimul nod)
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define max 10
float funct(float t)
{
float f;
f=exp(-(t*t));
return f;
}
void main (void)
{
float dnp,df,c,h;
float x[max+1];
int n,k,i,j,l;
clrscr();
cout << "dati numarul de noduri" << endl;
cin >> n;
cout << "dati pasul" << endl;
cin >> h;
cout << "dati primul nod" << endl;
cin >> x[1];

61

for (i=2;i<=n;i++)
{
x[i]=x[1]+(i-1)*h;
}
cout << endl;
dnp=0;
for (k=1;k<=n-1;k++)
{
if (k%2==0)df=funct(x[n-k]);
else df=-funct(x[n-k]);
for (j=1;i<=k;j++)
{
c=1;
for (l=1;l<=j;l++)
c=c*(k-l+1)/l;
if ((k-j)%2==0)df=df+c*funct(x[n-k]+j*h);
else df=df-c*funct(x[n-k]+j*h);
}
dnp=dnp+df/k;
}
dnp=dnp/h;
cout << "Derivata polinomului in ultimul nod este " << dnp << endl;
getche();
}
12.7.

Exerciii
S se scrie programele Pascal i C pentru calculul derivatei utiliznd funcii n
limbajele de programare specificate.

BIBLIOGRAFIE
[1] Bucur, C.M., Metode numerice, Ed. Facla, Timioara, 1973.
[2] Coman, G., Analiz numeric, Ed. Libris, Cluj, 1995.
[3] Demidovici, B.P., Maron,I., Elements de calcul numerique, Ed. Mir de Mosou,
1973.
[4] Dodescu, Gh., Toma, M., Metode de calcul numeric, E. D. P., Bucureti, 1976.
[5] Dodescu, Gh., Metode numerice n algebr, Ed. tehnic, Bucureti, 1979.
[6] Ichim, I., Marinescu, G., Metode de aproximare numeric, Ed. Academiei R. S.
R., Bucureti, 1986.
[7]
Ignat, C., Ilioi, C., Jucan, T., Elemente de informatic i calcul numeric,
Universitatea Al. I. Cuza, Iai, Facultatea de Matematic, 1989.
[8]
Juan Antonio Infante del Rio, Jose Maria Rey Cabezas, Metodos
Numericas, Teoria, problemas y practicas con MATLAB, Ed. Piramide, 2002.
[9]
Knut, D.E., Sortare i cutare, vol. 3, Tratat de programarea
calculatoarelor, Ed. Tehnic, Bucureti, 1976.

62

[10] Lucanu, D., Bazele proiectrii programelor i algoritmilor, volume 1,2,3.


Curs multiplicat la Editura Universitii Al. I. Cuza, Iai, Romnia, 1996.
[11]
Mihu, C., Metode numerice n algebra liniar, Ed. Tehnic, Bucureti,
1977.
[12]
Press, W.H., Teuklosky, S.A., Vetterling, W.T., Flannery, B.P., Numerical
Recipes in C: The Art of scientific Computing, Second Edition (Cambridge
University Press, Cambridge, 1992).
[13]
Scheiber, E., Metode numerice, Universitatea Transilvania din Braov,
Facultatea de Matematic Informatic (electronic).
[14]
Talmaciu, M., Metode numerice Volumul I, Editura Tehnica Info, Chiinu,
2005.
[15]
Toma, M., Odgescu, I., Metode numerice i subrutine, Ed. Tehnic,
Bucureti, 1980.
[16]
Vraciu, G., Popa, A., Metode numerice cu aplicaii n tehnica de calcul,
Scrisul romnesc, Craiova, 1982.
[17]
***, Borland International, Inc. Borland C++, Programming Guide
(Borland International, Scotts wally, CA, 1992).

63