Sunteți pe pagina 1din 13

Capitoul 3 .

CALCULE NUMERICE

Atunci cand vorbim despre miscare, aducem in discutie diferentierea si integrarea.


In acest capitol vom introduce cateva metode de calcul de baz folosind diferentierea numeric,
integrarea, i scheme numerice pentru cautarea si identificarea radacinilor unei ecuatii si extremelor unei
functii.

3.1 Diferentierea numerica


O notiune de baza folosita foarte des este dezvoltarea in serie Taylor a unei functii f(x) in jurul unui
punct x0:
2

( xx 0)
f (x) = f (x0) + (x x0) f(x0) +
2!

( xx 0) (n)
f
(x0) + .
n!

f(x0) + +

(3.1)
Expresia de mai sus poate fi generalizata pentru a descrie o functie cu mai multe variabile f (x,y,) in
jurul unui punct (x0,y0, . ):
f (x,y,) = f (x0,y0,) + (x x0) fx (x0, y0, )
2
( xx 0)
+(y y0) fy (x0, y0, . . . ) +
2!
2

( y y 0)
2!

fxx (x0, y0, )


2

fyy (x0, y0, ) + +

2( xx 0) ( y y 0)
2!

fxy (x0, y0, ) + .


(3.2)

Dac se folosete definiia derivatei ntr-un punct, expresia :

f ( xi ) lim

h 0

f ( xi h) f ( xi )
h

,
(3.3)

f (x)
reprezint derivata funciei

raportul
adic:

f ( xi h ) f ( xi )
h

n punctul

xi

, cu condiia ca limita funciei s existe. n acest sens,

f (x)
,

constituie o aproximaie a derivatei funciei

f ( xi )

f ( xi h ) f ( xi )
h

n punctul

xi

(3.4)
unde h este distana dintre dou noduri.

Desigur, raportul

f (x)
n punctul

xi

f ( xi h) f ( xi )
h
f ( xi )

, adic:

reprezint o alt aproximaie a derivatei funciei

f ( xi h ) f ( xi )
h

(3.5)

unde

s-a considerat pozitiv.

O aproximaie mai bun a derivatei funciei n punctul


n punctul de abscis

xi

xi

f (x)
se obtine daca derivata funciei

, poate fi aproximat de raportul :

f ( x i h ) f ( xi h )
2h

care reprezint media celor dou fracii (3.4) i (3.5), adic:

f ( xi )

f ( x i h ) f ( xi h )
2h

(3.6)

f (x)
Dezvoltarea n serie Taylor a funciei

, n punctul de abscis x, situat n jurul lui

( x xi )
( x xi ) 2
f ( x ) f ( xi )
f ( xi )
f ( xi )
1!
2!

xi

, este:

.
(3.7)

Dac se fac nlocuirile:

x xi h

x xi h

, se obin relaiile:

f ( xi h ) f ( x i )

h
h2
f ( xi )
f ( xi )
1!
2!

(3.8)

f ( xi h ) f ( x i )

h
h2
f ( xi )
f ( xi )
1!
2!

.
(3.9)

Prin scderea parte cu parte a celor dou relaii (3.8) i (3.9), se obine:

f ( xi )

f ( x i h ) f ( xi h )
2h

,
(3.10)

iar prin adunare:

f ( xi )

f ( xi h) 2 f ( xi ) f ( xi h)
h2

.
(3.11)

Relaiile (3.10) i (3.11) reprezint formulele pentru calculul aproximativ al derivatelor de


ordinul unu i doi ale funciei

f (x) xi 1 xi h xi xi 1 xi h
(

).

n practic, de cele mai multe ori funcia este cunoscut numeric. De aceea, nainte de a se trece la
derivarea propriu-zis, se recomand o analiz mai atent a datelor numerice (obinute din experimentri
sau dintr-un grafic), eliminarea punctelor care nu se ncadreaz ntr-o anumit distribuie sau efectuarea
unei uniformizri a datelor prin media a trei valori consecutive. De asemenea, pentru obinerea derivatei
de ordinul doi, se recomand folosirea formulelor corespunztoare derivatei de ordinul unu, aplicate la
valorile derivatei de ordinul unu, dup ce acestea au fost uniformizate
Folosind dezvoltarea in serie Taylor, si combinatia de f i +1 si f i 1 , obtinem :
h2i1 f +h2ih h 2i1

= f i h2i f i1
hi hi1 (hi + hi1)

i+ 1

(3.12)
Aceasta este formula derivatei de ordinul intai cu trei puncte pentru valorile neuniformizate ale
derivatei.

3.2 Integrarea numerica

y f (x)

Fie
o funcie definit i integrabil pe intervalul
determinat o primitiv, F, a integralei definite

[ a, b ]

. De cele mai multe ori este greu de

S f ( x)dx
a

(3.13)

sau dac aceast primitiv exist, dar are o expresie analitic foarte complicat, folosirea n calculele
ulterioare este foarte greoaie. De aceea, pentru calculul integralei (9.3.1) se stabilesc formule
aproximative simple i uor de folosit pe orice calculator.
Formula:

b
a

f ( x) dx f ( x)
i 0

, poarta numele de cuadratura numerica.


(3.14)

S
Formula :

h n1
( f i f i 1 ) 0(h 2 )

2 i 1

, reprezinta regula trapezelor de cuadratura numerica, iar O(

h vine de la eroarea in interpolarea liniara a functiei.

(3.15)
Putem optine o cuadratura cu o precizie mai mare, daca aplicam Interpolarea Lagrange functiei
f(x) in regiunea [xi1, xi+1], avem :

( xx i+1 )
f(x) =

( xx i+1 )

( xx i )

h3 )
( xx i ) + ( xx i1 ) + ( xx i1 ) + O(

(3.16)
Daca vom efectua integrala pentru fiecare pereche, impreuna cu integral data de ecuatia de mai
sus, obtinem regula lui Simpson :
5

h n / 21
( f 2 j 4 f 2 j 1 f 2 j 2 ) 0(h 4 )

3 i 0

(3.17)

3.3 Radacinile unei ecuatii


In fizica, intalnim adesea situatii in care trebuie sa calculam valoarea lui x a functiei f(x)=0, unde f(x)
poate fi o functie explicita sau implicita a lui x. In cazul in care exista o astfel de valoare, o numim
radacina.

METODA BISECTIEI

Fie o functie f : [a, b], functia f fiind continua pe intervalul [a, b]. Presupunem ca exista x =

xr

apartinand intervalului [a, b], astfel incat f(x) = 0. Deoarece nu exista o radacina in intervalul [a, b],
f(a)f(b) < 0. Se poate imparti intervalul in doua parti egale cu x 0 = (a+b) / 2. Apoi avem f(a) f( x 0 )
< 0 sau f( x 0 ) f(b) < 0. Daca f(a) f( x 0 ) < 0,

x 1 = (a + x 0 ) / 2, astfel incat

x 1 = ( x 0+ b ) /

2.

METODA NEWTON
Aceast metod propus de ctre Isaac Newton n anul 1669 i apoi revzut de ctre Joseph Raphson n
1690 i mai apoi de ctre Thomas Simpson n 1740 este o metod iterativ de calcul a rdcinilor
ecuaiilor algebrice sau transcendente. Ea este una dintre cele mai rspndite metode folosite n acest
scop i n plus, algoritmul bazat pe aceast metod poate fi folosit i la determinarea minimului sau
maximului unei funcii prin determinarea zeroului primei derivate a funciei, n metode de optimizare.
Metoda Newton-Raphson folosete primii doi termeni ai dezvoltrii n serie Taylor a
unei funcii f(x) n vecintatea unui zero al funciei.
Dezvoltnd funcia f(x) n serie Taylor n vecintatea unui punct x = x r obinem:
f ( x r ) f (x) + ( x r x) f `(x)+ = 0,

(3.18)
unde x poate fi considerat o valoare de incercare pentru radacina

xk

Valoarea aproximativa la pasul urmator

x k+1 poate fi derivata din :

f ( x k+1 ) = f ( x k ) + ( x k+1

) f`( x k ) 0,

(3.19)
care este :
x k+1 = x k

xk

xk

xk

fk / f

(3.20)
cu k = 0, 1, . Noi am folosit notatia f k =f k+1 .
Aceasta schema este cunoscuta ca metoda lui Newton.

x
Pentru a vedea cum functioneaza aceasta metoda intr-un program, luam functia f (x) = e

2
ln x x

ca exemplu. Urmatorul program este o implementare a metodei lui Newton :


METODA SECANTEI
In unele cazuri, o expresie analitica pentru derivata de ordinul intai necesara metodei lui Newton nu
exista sau este foarte dificil de obtinut. Trebuie sa gasim o schema alternativa caruia sa-I atribuim un
algoritm similar. O modalitate pentru a realiza acest lucru este sa
Inlocuim f k din ecuatia 3.20 cu formula derivatei de ordinul intai cu doua puncte :
x k+1 =

xk

x k x k1
fk
) f k / - f k1 .

(3.21)
Aceasta reprezinta metoda secantei, sau metoda discreta a lui Newton.

EXEMPLE DE IMPLEMENTARI ALGORITMI :


1. DIFERENTIEREA NUMERICA
1.1 Un exemplu de evaluare a derivatelor prin 3 puncte pentru f(x)=sin (x)
Include java.lang.*;
public class Deriv {
static final int n = 100, m = 5;
public static void main(String argv[]) {
double[] x = new double[n+1];
double[] f = new double[n+1];
double[] f1 = new double[n+1];
double[] f2 = new double[n+1];
// Atribui constant, puncte si functia
int k = 2;
double h = Math.PI/(2*n);
for (int i=0; i<=n; ++i) {
x[i] = h*i;
f[i] = Math.sin(x[i]);
}
// Calcularea derivatelor de ordinul intai si de ordinul doi
f1 = firstOrderDerivative(h, f, k);
f2 = secondOrderDerivative(h, f, k);
for (int i=0; i<=n; i+=m) {
double df1 = f1[i]-Math.cos(x[i]);
double df2 = f2[i]+Math.sin(x[i]);
System.out.println("x = " + x[i]);
System.out.println("f'(x) = " + f1[i]);
System.out.println("Error in f'(x): " + df1);
System.out.println("f''(x) = " + f2[i]);
System.out.println("Error in f''(x): " + df2);
System.out.println();
}
}
// Metoda pentru derivate de ordinul intai cu trei puncte. Extrapolarile sunt facute la limite
public static doubl [ ] firstOrderDerivative(double h,
double f[ ], int k) {
int n = f.length-1;
8

double[ ] y = new double[n+1];


double[ ] xl = new double[k+1];
double[ ] fl = new double[k+1];
double[ ] fr = new double[k+1];
// Evaluarea derivatelor la puncte de non-limita
for (int i=1; i<n; ++i)
y[i] = (f[i+1]-f[i-1])/(2*h);
for (int i=1; i<=(k+1); ++i) {
xl[i-1] = h*i;
fl[i-1] = y[i];
fr[i-1] = y[n-i];
}
y[0] = aitken(0, xl, fl);
y[n] = aitken(0, xl, fr);
return y;
}
Metoda pentru derivate a doua cu trei puncte. Extrapolarea este facuta la limite
public static double[] secondOrderDerivative(double h,
double[] f, int k) {
int n = f.length-1;
double[] y = new double[n+1];
double[] xl = new double[k+1];
double[] fl = new double[k+1];
double[] fr = new double[k+1];
// Evaluarea derivatelor la puncte de non-limita
for (int i=1; i<n; ++i) {
y[i] = (f[i+1]-2*f[i]+f[i-1])/(h*h);
}
for (int i=1; i<=(k+1); ++i) {
xl[i-1] = h*i;
fl[i-1] = y[i];
fr[i-1] = y[n-i];
}
y[0] = aitken(0, xl, fl);
y[n] = aitken(0, xl, fr);
return y;
}
public static double aitken(double x, double xi[],
double fi[]) {...}

1.2 Metoda de calculare a derivatei de ordinul intai cu trei puncte pentru valorile neuniformizate ale
derivatei.
public static double[] firstOrderDerivative2
(double x[], double f[], int k) {
int n = x.length-1;
double[] y = new double[n+1];
double[] xl = new double[k+1];
double[] fl = new double[k+1];
double[] xr = new double[k+1];
double[] fr = new double[k+1];
// Calculate the derivative at the field points
double h0 = x[1]-x[0];
double a0 = h0*h0;
for (int i=1; i<n; ++i) {
double h = x[i+1]-x[i];
double a = h*h;
double b = a-a0;
double c = h*h0*(h+h0);
y[i] = (a0*f[i+1]+b*f[i]-a*f[i-1])/c;
h0 = h;
a0 = a;
}
for (int i=1; i<=(k+1); ++i) {
xl[i-1] = x[i]-x[0];
fl[i-1] = y[i];
xr[i-1] = x[n]-x[n-i];
fr[i-1] = y[n-i];
}
y[0] = aitken(0, xl, fl);
y[n] = aitken(0, xr, fr);
return y;
}
public static double aitken(double x, double xi[],
double fi[]) {...}
2. INTEGRAREA NUMERICA
2.1 Un exemplu de evaluare a integralei cu metoda Simpson pentru f(x)=sin(x).
Include java.lang.*;
public class Integral {
static final int n = 8;
public static void main(String argv[]) {
10

double f[] = new double[n+1];


double h = Math.PI/(2.0*n);
for (int i=0; i<=n; ++i) {
double x = h*i;
f[i] = Math.sin(x);
}
double s = simpson(f, h);
System.out.println("The integral is: " + s);
}
// Method to achieve the evenly spaced Simpson rule.
public static double simpson(double y[], double h) {
int n = y.length-1;
double s0 = 0, s1 = 0, s2 = 0;
for (int i=1; i<n; i+=2) {
s0 += y[i];
s1 += y[i-1];
s2 += y[i+1];
}
double s = (s1+4*s0+s2)/3;
// Add the last slice separately for an even n+1
if ((n+1)%2 == 0)
return h*(s+(5*y[n]+8*y[n-1]-y[n-2])/12);
else
return h*s;
}
}
3. RADACINILE UNEI ECUATII
3.1 Un exemplu de determinare a radacinii prin metoda bisectiei pentru f(x)=exp(x)*ln(x)-x*x=0.
include java.lang.*;
public class Bisect {
public static void main(String argv[]) {
double x = 0, del = 1e-6, a = 1, b = 2;
double dx = b-a;
int k = 0;
while (Math.abs(dx) > del) {
x = (a+b)/2;
if ((f(a)*f(x)) < 0) {
b = x;
dx = b-a;
11

}
else {
a = x;
dx = b-a;
}
k++;
}
System.out.println("Iteration number: " + k);
System.out.println("Root obtained: " + x);
System.out.println("Estimated error: " + dx);
}
// Metoda pentru a furniza functia f(x)=exp(x)*log(x)-x*x.
public static double f(double x) {
return Math.exp(x)*Math.log(x)-x*x;
}
}
3.2 Un exemplu de determinare a radacinii prin metoda lui Newton pentru f(x)=exp(x)*ln(x)-x*x=0.
include java.lang.*;
public class Newton {
public static void main(String argv[]) {
double del = 1e-6, a = 1, b = 2;
double dx = b-a, x=(a+b)/2;
int k = 0;
while (Math.abs(dx) > del) {
dx = f(x)/d(x);
x -= dx;
k++;
}
System.out.println("Iteration number: " + k);
System.out.println("Root obtained: " + x);
System.out.println("Estimated error: " + dx);
}
public static double f(double x) {...}
// Metoda de a furniza derivata f'(x).
public static double d(double x) {
return Math.exp(x)*(Math.log(x)+1/x)-2*x;
}
}

12

3.2 Un exemplu de determinare a radacinii prin metoda secantei pentru f(x)=exp(x)*ln(x)-x*x=0.


include java.lang.*;
public class Root {
public static void main(String argv[]) {
double del = 1e-6, a = 1, b = 2;
double dx = (b-a)/10, x = (a+b)/2;
int n = 6;
x = secant(n, del, x, dx);
System.out.println("Root obtained: " + x);
}
// Metoda pentru a efectua cautarea secantei
public static double secant(int n, double del,
double x, double dx) {
int k = 0;
double x1 = x+dx;
while ((Math.abs(dx)>del) && (k<n)) {
double d = f(x1)-f(x);
double x2 = x1-f(x1)*(x1-x)/d;
x = x1;
x1 = x2;
dx = x1-x;
k++;
}
if (k==n) System.out.println("Convergence not" +
" found after " + n + " iterations");
return x1;
}
public static double f(double x) {...}

13

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