Sunteți pe pagina 1din 12

Universitatea Tehnic a Moldovei

Facultatea Calculatoare, Informatic i Microelectronic


Catedra Automatic i Tehnologii Informaionale

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

Varianta(9-10)

St. grupei TI

A efectuat:

A verificat:

Lector universitar
Galina Marusic

Chiinu 2015

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 func ii 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 cutat.
2
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:

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

k
x
x

|
|
|x x |, k=1,2,
1 k k1 1 1 0

|x k ||x k x k1| , 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 ) if ' ' ( 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.
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

[ a , b ] , n care ecuaia

Algoritmul metodei coardelor const n calculul iterativ din formulele:

x k

f ( xk )

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

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 :

xln x2=0

Ecuaia 2 : x 329 x+34=0

Mersul lucrrii:
Separarea rdcinilor
Pentru prima ecuaie este convenabil folosirea metodei grafice de separare a
rdcinilor.
Scriem ecuaia sub forma (x)=g(x) si obinem:
ln x=2x .
a) Pentru determinarea punctelor de intersecie a funciilor y= (x) si y=g(x)construim graficele:

Astfel ecuaia are o rdcina reala


b)Pentru a doua ecuaie folosim metoda irului lui Rolle.
Derivata f ' ( x )=3 x 229 se anuleaz pentru

x=

Rolle este urmtorul:

29
3

-4

89

94.11

29
3.11
3
29
3

-26.11

Avem o alternan de semn i respectiv o singur rdcin real (Pentru a determina celelalte rdcini folosim metoda grafic.

Astfel mai avem 3 rdcini ( -7 , -5 ) i ( 1, 5 )


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;
}

Prin urmare irul lui

4
-18
23
23
,
3
3

).

float f2(float x)
{
return pow(x, 3) - 29 * x +34;
}
float D2(float x)
{
return 3 * pow(x, 2) - 29;
}
float f3(float x)
{
return exp(x)/3;
}
float f4(float x)
{
return (pow(29*x-34,1/3) );
}
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;
}
float aprox1(float y, float eps)
{
float x = 0;
int k=0;
do
{
x = y;
y = 2-log(x);
cout << "x=" << x << endl;
cout << "y=" << y << endl;
k=k+1;
} while (fabs(y - x) > eps);
cout<<"numarul de iteratii:"<< k <<endl;
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;
cout<<"Solutia a fost gasita cu precizia Eps!!"<<endl;
}
else{
if (d1 < d0){

if (k > Nmax){
Ier = 2;
cout<<"Nu are loc convergenta cattre solutie!!"<<endl;
}
else
k++;
x = x1;
d0 = d1;
goto Et;
}
else{
Ier = 1;
cout<<"Precizia precisa nu poate fi atinsa dupa numarul de pasi!!"<<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;
cout<<"Solutia a fost gasita cu precizia Eps!!"<<endl;
}
else{
if (d1 < d0){
if (k > Nmax){
Ier = 2;
cout<<"Nu are loc convergenta cattre solutie!!"<<endl;
}
else
k++;
x = x1;
d0 = d1;
goto Et;
}
else{
Ier = 1;
cout<<"Precizia precisa nu poate fi atinsa dupa numarul de pasi!!"<<endl;
}
}
return x;
}
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
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;
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 <<"valoarea aproximativa:"<< 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:";
cin >> Nmax;
c = Newton1(x0, eps, Nmax);
cout << "valoarea apoximativa a solutiei ecuatiei:
"<<c<<endl;
_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;
}
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;
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;
c = sec2(a, b, eps, Nmax);
//cout << c << endl;
_getch();
goto init;
}
break;
}
}
}
}

Concluzii:

n urma efecturii lucrrii de laborator am realizat n practic rezolvarea


numeric a ecuaiilor algebrice i transcendente. Putem concluziona c cea
mai eficient metoda este metoda tangentelor, calculatorul efectund un
numr minim de iteraii , ns numrul acestor iteraii este dependent de
aproximaia iniial aleas. Acest numr este cu att mai mic cu ct
aproximaia iniial este mai aproape de rdcina cutat. La fel se observ
din tabel c metoda Newton converge ctre soluie cu vitez ptratic,
aceasta fiind un caz particular a metodei aproxima iilor succesive. O alt
vulnerabilitate a acestei metode este necesitatea calculului derivatei, ceea ce
n unele cazuri poate fi dificil sau practic imposibil. Pentru astfel de func ii o
alegere mai bun este metoda secantelor. La fel putem afirma rezultatul
obinut pe baza acestei metode are o precizie destul de mare.