Documente Academic
Documente Profesional
Documente Cultură
.
3) S se precizeze rdcina obinut cu exactitatea =
,utiliznd:
metoda aproximaiilor succesive ;
metoda tangentelor (Newton);
metoda secantelor .
4) S se compare rezultatele lund n consideraie numrul de iteraii , evaluarile pentru
funcii i derivat.
Ecuaiile propuse spre rezolvare
Realizarea lucrrii
1) Separarea rdcinilor
Pentru prima ecuaie este convenabil folosirea metodei grafice de separare a
rdcinilor.
Scriem ecuaia
a) Pentru determinarea punctelor de intersecie a funciilor () i ()
construim graficele :
Astfel ecuaia are o rdcin real (0,1).
b) Pentru a doua ecuaie folosim metoda irului lui Rolle .
Derivata ()
se anuleaz pentru x=
3
y 94 94,04 -8,04 -8
Avem o alternan de semn i respectiv o singur rdcin real (
).
Pentru a determina celelalte rdcini folosim metoda grafic.
Astfel mai avem 2 rdcini (,) i ()
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 ){
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)-26*x+43;
}
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 condiia de convergen.
Scriind ecuaia n forma () obinem :
()
()
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;
}
}
a)
Verificm condiia de convergen :
=>
=>
=> ()
=>
()
=>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double fi(double x){
return (pow(x,3)+43)/26;
}
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)-26*x+43;
}
double fderiv(double x){
return 3*pow(x,2)-26;
}
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)-26*x+43;
}
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
Metoda Rdcina (
) Eroarea
() () () () () ()
Biseciei 0.351654 1.93057 16 16 0.0002 0.0006 0.0001
Apr. succesive 0.351733 1.93061 14 16 0.000002 0.000016 0.000001
Tangentelor 0.351734 1.93061 4 4 0.0000008 0.000016 0.000001
Secantelor 0.351734 1.93061 5 9 0.0000008 0.000016 0.000001
Concluzie :
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 numar minim de iteraii , ns numarul 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 aproximaiilor 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 funcii o
alegere mai bun este metoda secantelor. La fel putem afirma rezultatul obinut pe baza acestei metode
are o precizie destul de mare.