Sunteți pe pagina 1din 14

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Facultatea Calculatoare, Informatic i Microelectronic

Raport
Lucrarea de Laborator Nr. 1
La Metode Numerice
Tema: Rezolvarea numeric a ecuaiilor algebrice i transcendente

A efectuat:
A verificat:

Chiinu 2014
Scopul lucrrii:

1.

S se separe toat rdcinile reale ale ecuaiei f(x) = 0 unde y = f(x) este o funcie real de variabil
real.

2.

S se determine o rdcin real a ecuaiei date cu ajutorul metodei njumt irii intervalului cu o
eroare mai mic dect =102 .
3.
S se precizeze rdcina obinut cu exactitatea =106 , utiliznd:

Metoda aproximaiilor succesive;

Metoda tangentelor;

Metoda secantelor.
4.
S se compare rezultatele lund n consideraie numrul de iteraii, evalurile pentru funcii i derivat.

Breviar teoretic:
Metoda njumtirii intervalelor:
Fie ecuaia f(x)=0, unde funcia f(x) este continu pe intervalul [a, b], are o singur rdcin n acest
interval i f ( a ) f ( b )< 0.
a+b
jumtatea intervalului [a, b]. dac f ( c )=0, atunci c este chiar rdcina
2
cutat. Dac nu, atunci rdcina se gsete ntr-unul din intervalele [ a, c] sau [c, b], acolo unde funcia ia
valori de semne contrare la capetele intervalului.
Calculm

c=

Metoda aproximaiilor succesive:


Fie funcia ( x ) definit pe intervalul [a, b] i ( x ) [ a ,b ] pentru orice x [ a ,b ] . Dac
funcia ( x ) e derivabil i derivata sa ' ( x ) va satisface inegalitatea | ' ( x )| <1, oricare ar fi
x [ a ,b ] atunci ecuaia x= ( x ) are n [ a , b ] o singur rdcin real , i deci putem forma irul
de iterare x0, x1, x2, , xk,, dup regula x k+1= ( x k ) , astfel nct x k [ a ,b ] pentru k =0,1, 2, i
acest ir converge ctre rdcina . n plus, eroarea este evaluat prin relaia:
k

|x k | 1 |x k xk 1| 1
| x x |, k=1, 2,
1 0
Dac 1< ' ( x )< 0, atunci,

|x k ||x k x k 1|, k 1.

Metoda lui Newton (tangentelor):


Fie ecuaia algebric sau transcendent f ( x )=0 care admite o singur rdcin real n intervalul
[ a , b ] . presupunem n plus c derivatele f ' ( x ) i f ' ' ( x ) pstreaz un semn constant pe intervalul
[ a , b] .
Metoda lui Newton este definit de urmtoarea formul:
x k+1=x k

f ( xk )
f ' ( xk )

, k =0, 1,2,

Unde x 0 este aproximaia iniial a rdcinii din intervalul [ a , b ] . Punctul x k+1 este abscisa
punctului de intersecie a tangentei dus la curba y=f ( x ) n punctul x k cu axa Ox. De aceea aceast
metod se mai numete metoda tangentelor.
1

Metoda coardelor i metoda secantelor:


Idee metodei coardelor const n aproximarea funciei
f ( x )=0 are o rdcin izolat printr-o dreapt.

f (x)

pe intervalul

Algoritmul metodei coardelor const n calculul iterativ din formulele:


x
f (|k ) f ( a ) ( x k a ) , k=0, 1, , x 0=b ;

x k+1= x k

f ( xk )
f ( xk )
xk
( b x k ) , k =0,1, , x 0=a ;

f ( b) f ( xk )

Prima formul se utilizeaz n cazul, n care f ( a )> 0, f ' ' ( a ) > 0 sau
f ( a )< 0, f ' ' ( a ) < 0 , n timp ce a doua cnd f ( b )> 0, f ' ' ( b ) > 0 sau
f ( a )< 0, f ' ' ( a ) < 0 .

Ecuaiile propuse spre rezolvare :


Ecuaia 1 :

x+ ln x 2=0

Ecuaia 2 : x 3 29 x +34=0

Mersul lucrrii:
Separm rdcinile ecuaiilor utiliznd metoda grafic:
1.

x+ ln x 2=0
f(x) = 0 (x) = g(x);
ln x= x +2

[ a , b ] , n care ecuaia

Soluia:

Din grafic observm c rdcina real a ecuaiei se afl n intervalul:


r (- 1 ,2 )

2.

-29x+34=0

f(x) = 0 (x) = g(x);


x 3 =29x-34

Soluiile:

Utiliznd metoda irul lui Rolle , am determinat intervalul pentru o solutie a ecuaiei :
f(x) =

x 3 -29x+34

f(x) = 3 x2 -29
3

x=

x
f(x)

-4

29
3

29
3

29
3

86 94,109
-26,109
-18
+
+
O rdcina real a ecuaiei se afl n intervalul:
r (-

29 29
)
,
3
3

Pentru celelalte 3 metode n calitate de aproximaie iniial am ales:


1. x0 = -1.4
2. x0 = -1
deoarece satisface condiia f(x0) * f (x0) > 0.
Listingul Programului :

#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
#include <math.h>
using namespace std;
float f1(float x)
{
return x + log(x) - 2;
}
float D1(float x)
{
return 1 + (1/x);
}
float f2(float x)
{
return pow(x,3) -(29* x )+ 34;
}
float D2(float x)
{
return 3*pow(x,2) -29;
4

}
float f3(float x)
{
return 2-log(x);
}
float f4(float x)
{
return (pow(x,3) + 34) /29 ;
}
float injum1(float a, float b, float eps)
{
int k;
float c, d, x;
c = a;
if (f1(a) < 0) c = b;
d = a + b - c;
k = 0;
do
{
x = c + (d - c) / 2;
k++;
if (f1(x) == 0) break;
if (f1(x) > 0) c = x;
else d = x;
} while (fabs(c - d) > eps);
return x;
}
float injum2(float a, float b, float eps)
{
int k;
float c, d, x;
c = a;
if (f2(a) < 0) c = b;
d = a + b - c;
k = 0;
do
{
x = c + (d - c) / 2;
k++;
if (f2(x) == 0) break;
if (f2(x) > 0) c = x;
else d = x;
} while (fabs(c - d) > eps);
return x;
5

}
float aprox1(float y, float eps)
{
float x=0;
do
{
x = y;
y = pow((30 * x + 40), 1 / 3);
cout << "x=" << x << endl;
cout << "y=" << y << endl;
} while (fabs(y - x) > eps);
return x;
}
float aprox2(float y, float eps)
{
float x;
do
{
x = y;
y = f4(x);
cout << "x=" << x << endl;
cout << "y=" << y << endl;
} while (fabs(y - x) > eps);
return x;
}
float Newton1(float x0, float eps, int Nmax)
{
float d0 = 1e30, x1, x, d1;
int k, Ier;
x = x0;
k = 0;
Et:
x1 = x - f1(x) / D1(x);
d1 = fabs(x1 - x);
if (d1 < eps){
Ier = 0;
}
else{
if (d1 < d0){
if (k > Nmax){
6

Ier = 2;
}
else
k++;
x = x1;
d0 = d1;
goto Et;
}
else{
Ier = 1;
}
}
cout << Ier << endl;
return x;
}
float Newton2(float x0, float eps, int Nmax)
{
float d0 = 1e30, x1, x, d1;
int k, Ier;
x = x0;
k = 0;
Et:
x1 = x - f2(x) / D2(x);
d1 = fabs(x1 - x);
if (d1 < eps){
Ier = 0;
}
else{
if (d1 < d0){
if (k > Nmax){
Ier = 2;
}
else
k++;
x = x1;
d0 = d1;
goto Et;
}
else{
Ier = 1;
}
}
cout << Ier << endl;
return x;
7

}
float sec1(float A, float B,float eps,float Nmax)
{
float FA, FB, FX, x, xt;
int Num = 0;
FA = f1(A);
FB = f1(B);
x = A - (B - A)*FA / (FB - FA); //calculul solutiei initiale
FX = f1(x);
if (FA*FX <= 0){
xt = A;
do{
x = x - (x - A)*FX / (FX - FA); // calculul dupa form coardelor
FX = f1(x);
xt = xt - f1(xt) / D1(xt); // calc dupa form tangentelor
Num++;
} while (fabs(x - xt)>eps && Num < Nmax);
}
else{
xt = B;
do{
x = x - (B - x)*FX / (FB - FX); // dupa form Coardelor
FX = f1(x);
xt = xt - f1(xt) / D1(xt); //dupa form Tangentelor
Num++;
} while (fabs(x - xt)<eps&&Num<Nmax);
}
cout << "Numarul de iteratii =" << Num << endl;
return x;
}
float sec2(float A, float B, float eps, float Nmax)
{
float FA, FB, FX, x, xt;
int Num = 0;
FA = f2(A);
FB = f2(B);
x = A - (B - A)*FA / (FB - FA); //calculul solutiei initiale
FX = f2(x);
if (FA*FX <= 0){
xt = A;
do{
x = x - (x - A)*FX / (FX - FA); // calculul dupa form coardelor
FX = f2(x);
xt = xt - f2(xt) / D2(xt); // calc dupa form tangentelor
8

Num++;
} while (fabs(x - xt)>eps && Num < Nmax);
}
else{
xt = B;
do{
x = x - (B - x)*FX / (FB - FX); // dupa form Coardelor
FX = f2(x);
xt = xt - f2(xt) / D2(xt); //dupa form Tangentelor
Num++;
} while (fabs(x - xt)<eps&&Num<Nmax);
}
cout << "Numarul de iteratii =" << Num << endl;
cout << x << endl;
return x;
}
int main()
{
int menu,Nmax;
float a, b, c, eps, x0;
init:
system("cls");
cout << endl << endl;
cout << "\t\tMeniu: Selectati optiunea dorita " << endl;
cout << "1. Prima ecuatie :" << endl;
cout << "2. A doua ecuatie :" << endl;
cin >> menu;
switch (menu)
{
case 1:
{
int optiunea1;
system("cls");
cout << endl;
cout << "Ecuatia I:" << endl << endl;
cout << "1. Metoda Aproximatiei :" << endl;
cout << "2. Metoda Newton:" << endl;
cout << "3. Metoda Injumatatirii intervalelor:" << endl;
cout << "4. Metoda Secantelor:" << endl;
cout << "0. Meniul principal" << endl;
9

cin >> optiunea1;


switch (optiunea1)
{
case 1:
{
system("cls");
cout << "Da-ti valoarea initiala " << endl;
cin >> x0;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
c = aprox1(x0, eps);
cout << c << endl;
getch();
goto init;
}
break;
case 2:
{
system("cls");
cout << "Da-ti valoarea initiala :" << endl;
cin >> x0;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii:"<<endl;
cin >> Nmax;
c = Newton1(x0, eps, Nmax);
cout << c;
getch();
goto init;
}
break;
case 3:
{
system("cls");
cout << "Da-ti prima limita a intervalului:" << endl;
cin >> a;
cout << "Da-ti a 2-a limita a intervalului" << endl;
cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
c = injum1(a, b, eps);
cout << c << endl;
getch();
goto init;
10

}
break;
case 4:
{
system("cls");
cout << "Da-ti prima limita a inervalului :" << endl;
cin >> a;
cout << "Da-ti a 2-a limita a intervalului" << endl;
cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii :" << endl;
cin >> Nmax;
c = sec1(a, b, eps, Nmax);
cout << c << endl;
getch();
goto init;
}
break;
case 0:
goto init;
}
}
break;
case 2:
{
int optiunea2;
system("cls");
cout << endl;
cout << "Ecuatia II" << endl << endl;
cout << "1. Metoda Aproximatiei :" << endl;
cout << "2. Metoda Newton:" << endl;
cout << "3. Metoda Injumatatirii intervalelor:" << endl;
cout << "4. Metoda Secantelor:" << endl;
cout << "0. Meniul principal" << endl;
cin >> optiunea2;
switch (optiunea2)
{
case 1:
{
system("cls");
cout << "Valoarea initiala a radacinii:" << endl;
cin >> x0;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
11

c = aprox2(x0, eps);
cout << c << endl;
getch();
goto init;
}
break;
case 2:
{
system("cls");
cout << "Valoarea initiala a radacinii:" << endl;
cin >> x0;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii:" << endl;
cin >> Nmax;
c = Newton2(x0, eps, Nmax);
cout << c;
getch();
goto init;
}
break;
case 3:
{
system("cls");
cout << "Dati prima limita a intervalului:" << endl;
cin >> a;
cout << "Dati a 2-a limita a intervalului" << endl;
cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
c = injum2(a, b, eps);
cout << c << endl;
getch();
goto init;
}
case 4:
{
system("cls");
cout << "Dati prima limita a intervalului:" << endl;
cin >> a;
cout << "Dati a 2-a limita a intervalului" << endl;
cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii :" << endl;
cin >> Nmax;
12

c = sec2(a, b, eps, Nmax);


//cout << c << endl;
getch();
goto init;
}
break;
}
}
}
}

Concluzii:
Elabornd aceast lucrare de laborator m-am familiarizat cu metodele de rezolvare numeric a
ecuaiilor transcendente, rezolvarea algebric ale crora poate fi complicat sau chiar imposibil. Pentru
determinarea unei rdcini reale a ecuaiei am implementat, in programul creat, metodele: njumt irea
intervalului, Newton i Metoda secantelor. Obinnd rezultatele, am observat c exactitatea ultimilor dou
metode prevaleaz celelalte ,ins corectidudinea rezultatelor depinde radical de aproximarea iniiala aleas.

13

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