Sunteți pe pagina 1din 12

Universitatea Tehnic a Moldovei

Catedra Informatic Aplicat

RAPORT
la Metode Numerice
Lucrarea de laborator Nr.1
Tema : Rezolvarea numeric a ecuaiilor algebrice i transcendente
Varianta 11,14

A efectuat :
A verificat :

st.gr.TI-142 A. Cuitaru
lect.sup G. Marusic

Chiinu 2015

Scopul lucrrii:
S se separe toate rdcinile reale ale ecuaiei f(x)=0 unde y=f(x)este o funcie real
de variabil real.
S se determine o rdcin real a ecuaiei date cu ajutorul metodei njumtirii
intervalului cu o eroare mai mic dect =10-2.
S se aprecieze rdcina obinut cu exactitatea =10-6, utiliznd :
Metoda aproximrii succesive ;
Metoda tangentelor(Newton);
Metoda secantelor;
S se compare rezultatele lund n consideraie numrul de iteraii , evalurile pentru
funcii i derivat.
Sarcina problemei:
S se gseasc rdcinile ecuaiei : 2x-e^(-x)=0 si x3-25x-37=0.
1) Separarea rdcinilor
Pentru prima ecuaie este convenabil folosirea metodei grafice de separare a
rdcinilor.
x
Scriem ecuaia 2 x e =0 sub forma ( x )=g( x ) i obinem:
2 x =ex .
a) Pentru determinarea punctelor de intersecie a funciilor
construim graficele :

Astfel ecuaia are o rdcin real (0,1).

y= ( x ) i

y=g ( x )

b) Pentru a doua ecuaie folosim metoda irului lui Rolle .


2
Derivata f ' ( x )=3 x 25 se anuleaz pentru x=

26
3

. Prin urmare irul lui

Rolle este urmtorul :


x

-3

85

25
3 =-2.88

85.11

-11.11

Avem o alternan de semn i respectiv o singur rdcin real (

-11

25
3 ,

Pentru a determina celelalte rdcini folosim metoda grafic.

Astfel mai avem 2 rdcini (4,3)(5,6)

2) Calculul rdcinii reale prin metoda njumtirii intervalului


a)
#include <iostream>
#include<math.h>
using namespace std;
double f(double x){
return 2*x-exp(-x);
}
int main(){
int k=0;
double
a = -3,
b = 3,
c = 0,
eps = 0.0001;
while( (b-a)>eps ){

25
3 =2.88

25
3 ).

k++;
c = a+(b-a)/2;
if (f(c)==0)
break;
if (f(a)*f(c)<0)
b = c;
else
a = c;
}
cout << " Radacina x=" << c<<endl;
cout<<"Numarul de iteratii: "<<k;
return 0;
}

b)
#include <iostream>
#include<math.h>
using namespace std;
double f(double x){
return pow(x,3)-25*x-37;
}
int main(){
int k=0;
double
a = -3,
b = 3,
c = 0,
eps = 0.0001;
while( (b-a)>eps ){
k++;
c = a+(b-a)/2;
if (f(c)==0)
break;
if (f(a)*f(c)<0)
b = c;
else
a = c;
}
cout << " Radacina x=" << c<<endl;
cout<<"Numarul de iteratii: "<<k;
return 0;
}

3) Calculul rdcinii reale prin metoda aproximaiilor succesive


a) Pentru aplicarea metodei aproximaiilor succesive verificm condi ia de convergen .
Scriind ecuaia n forma
'

( x) =

x= ( x ) obinem :

x=

ex
2

1 x
e
2

'(x )<1
Prin urmare irul converge.
Codul surs
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double fi(double x){
return exp(-x)/2;
}
main(){
int k=0;
double x0,x1,eps;
cout<<"Introduceti valoare initiala x0= ";
cin>>x0;
cout<<"introduceti eroarea : ";
cin>>eps;
while(1){
x1=fi(x0);
k++;
if(abs(x1-x0)<eps){cout<<"Rez: "<<x0<<endl<<"nr de iteratii
"<<k<<endl;break;}
x0=x1;
}
}

b) Verificm condiia de convergen :


3

2 5 x=37x
' ( x ) =

=>

x=

x 3 37
25

=>

x=

1 3 37
x
25
25

=>

( x )=

1 3 37
x
25
25

3 2
x
25

3 2
x <1
25

=>

25
25
<x<
3
3

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double fi(double x){
return (pow(x,3)-37)/25;
}
main(){
int k=0;
double x0,x1,eps;
cout<<"Introduceti valoare initiala x0= ";
cin>>x0;
cout<<"introduceti eroarea : ";
cin>>eps;
while(1){
x1=fi(x0);
k++;
if(abs(x1-x0)<eps){cout<<"Rez: "<<x0<<endl<<"nr de iteratii
"<<k<<endl;break;}
x0=x1;

=>

}
}

4) Calculul rdcinii reale prin metoda tangentelor(Newton)


a)
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double f(double x){
return 2*x-exp(-x);
}
double fderiv(double x){
return exp(-x)+2;
}
main(){
int k=0;
double x0,x1,eps;
cout<<"Introduceti valoare initiala x0= ";
cin>>x0;
cout<<"introduceti eroarea : ";
cin>>eps;
while(1){
x1=x0-f(x0)/fderiv(x0);
k++;
if(abs(x1-x0)<eps){cout<<"Rez: "<<x0<<endl<<"nr de iteratii "<<k<<endl;break;}
x0=x1;
}

b)
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double f(double x){
return pow(x,3)-25*x-37;
}
double fderiv(double x){
return 3*pow(x,2)-25;
}
main(){
int k=0;
double x0,x1,eps;
cout<<"Introduceti valoare initiala x0= ";
cin>>x0;
cout<<"introduceti eroarea : ";
cin>>eps;
while(1){
x1=x0-f(x0)/fderiv(x0);
k++;
if(abs(x1-x0)<eps){cout<<"Rez: "<<x0<<endl<<"nr de iteratii "<<k<<endl;break;}
x0=x1;
}
}

5) Calculul rdcinii reale prin metoda secantelor


a)
#include <iostream>
#include <math.h>
using namespace std;
double f(double x)
{
return 2*x-exp(-x);
}
main()
{
double x2,x1,x3,y,eps=0.000001;
int n=0;
cout<<"Introduceti x1: ";
cin>>x1;
cout<<"Introduceti x2: ";
cin>>x2;
do{
n++;
y=x3;
x3=x2-(f(x2)*(x2-x1)/(f(x2)-f(x1)));
x1=x2;
x2=x3;
}while (fabs(y-x3)>=eps);
cout<<"Radacina x= "<<x3<<endl;
cout<<"Nr de iteratii : "<<n<<endl;
}

b)
#include <iostream>
#include <math.h>
using namespace std;
double f(double x)
{
return pow(x,3)-25*x-37;
}
main()
{
double x2,x1,x3,y,eps=0.000001;
int n=0;
cout<<"Introduceti x1: ";
cin>>x1;
cout<<"Introduceti x2: ";
cin>>x2;
do{
n++;
y=x3;
x3=x2-(f(x2)*(x2-x1)/(f(x2)-f(x1)));
x1=x2;
x2=x3;
}while (fabs(y-x3)>=eps);
cout<<"Radacina x= "<<x3<<endl;
cout<<"Nr de iteratii : "<<n<<endl;
}

6) Compararea rezultatelor i concluzia


Rdcina ( x 0 )

Nr. de iteraii

f 1( x )

f (x)

f 1(x )

f ( x)

Biseciei

0.3516
54

16

16

0.0001

Apr.
succesive

0.3517
33

14

13

0.000001

Tangentelor

0.3517
34

0.000001

Secantelor

0.3517
34

1.6645
2
1.6644
4
1.6644
5
1.6644
5

0.000001

Metoda

Eroarea

Concluzie :
n urma efecturii lucrrii de laborator am realizat n practic rezolvarea numeric a ecua iilor
algebrice i transcendente. Putem concluziona c cea mai eficient metoda este metoda
tangentelor,calculatorul efectund un numar minim de itera ii , ns numarul acestor itera ii este
dependent de aproximaia iniial aleas. Acest numr este cu att mai mic cu ct aproxima ia ini ial
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.