Sunteți pe pagina 1din 4

Scopul lucrrii: 1)S se separe toate rdcinie 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 njumtirii intervalului cu o eroare mai mic dect . 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, evalurile pentru funcii i derivat. Mersul lucrrii: Pentru a putea aplica metodele sus numite este necesar determinarea intervalului pe care se gsete soluia ecuaiei date. Pentru ecuaia algebric am determinat intervalul cu ajutorul irului lui Rolle. F(x)= Construim irul lui Rolle: x -1 -2i 2i F(x) -8 5 5 De aici rezult c ecuaia dat are o singur rdcin n intervalul [-1;0] Am elaborat programul n C++ care realizeaz sarcina dat, listingul este urmtorul:
#include<iostream.h> #include<stdlib.h> #include<conio.h> #include<math.h> double fx(double x); double f1x(double x); double f2x(double x); void INPUT(void); void BISECTIA(double a,double b, double e); void APROX_SUCCESIV(double a,double b, double e); void NEWTON(double a,double b, double e); void Combinat(double a,double b, double e); double a,b,e,Nmax; void main(void) {int n; textbackground(WHITE); textcolor(BLACK); clrscr(); while(1) { cout<<"Se da ecuatia: x^3-29x-25=0\n" <<"Alegeti metoda de gasire a solutiei:\n" <<"1. Metoda Bisectiei;\n" <<"2. Metoda Aproximatiilor succesive;\n" <<"3. Metoda Newton;\n" <<"4. Metoda Combinata a coardelor si tangentelor;\n" <<"5. Toate metodele;\n" <<"0. Iesire din program;\n"; cin>>n; switch(n) { case 1:INPUT();BISECTIA(a,b,e);break;

0 5

case 2:INPUT();APROX_SUCCESIV(a,b,e);break; case 3:INPUT();NEWTON(a,b,e);break; case 4:INPUT();Combinat(a,b,e);break; case 5:INPUT();BISECTIA(a,b,0.01);APROX_SUCCESIV(a,b,e); NEWTON(a,b,e);Combinat(a,b,e);break; case 0:exit(0); } clrscr(); } } double fx(double x) { return x*x*x-29*x-25; } double f1x(double x) { return 3*x*x-29; } double f2x(double x) { return 6*x; } void BISECTIA(double a,double b, double e) { double c,k=0; do {if(a*b>0)c=a+(b-a)/2; else c=(a+b)/2; ++k; if(fx(a)*fx(c)<0)b=c; else a=c; if(fx(c)==0)break; } while((fabs(b-a)>=e)&&(k<=Nmax)); cout<<"x="<<c; cout<<"\nNumarul de iteratii :"<<k<<endl; getch(); } void APROX_SUCCESIV(double a,double b, double e) { double y,x,k=0; y=a; do { x=y; if(fx(x)==0)break; //y=((-3)*x*x-5)/12; y=(x*x*x+5)/(-12); k++; } while((fabs(y-x)>=e)&&(k<=Nmax)); cout<<"x="<<x; cout<<"\nNumarul de iteratii :"<<k<<endl; getch(); } void NEWTON(double a,double b, double e) { double d,d0=1e30,x1,x,k=0; if(fx(a)*f2x(a)>0)x=a;

else x=b; do { x1=x-fx(x)/f1x(x); if(fx(x1)==0)break; d=fabs(x1-x); if(d<e)break; if(d<d0) if(k<Nmax){ x=x1;++k;d0=d;} else {cout<<"Precizia nu poate fi atinsa dupa "<<Nmax<<" pasi"; getch();exit(0);} else {cout<<"Nu are loc convergenta catre solutia data"; getch();exit(0);} }while(d>=e); cout<<"x="<<x1; cout<<"\nNumarul de iteratii :"<<k<<endl; getch(); } void Combinat(double a,double b, double e) { double x,xt,k=0; if(fx(a)*fx(b)<0)x=a-fx(a)*(b-a)/(fx(b)-fx(a)); if(fx(a)*fx(x)<=0){xt=a; do { x=x-fx(x)*(x-a)/(fx(x)-fx(a)); xt=xt-fx(xt)/f1x(xt); ++k; } while((fabs(x-xt)>=e)&&(k<=Nmax)); } else {xt=b; do { x=x-fx(x)*(b-x)/(fx(b)-fx(x)); xt=xt-fx(xt)/f1x(xt); ++k; } while((fabs(x-xt)>=e)&&(k<=Nmax)); } cout<<"x="<<(x+xt)/2; cout<<"\nNumarul de iteratii :"<<k<<endl; getch(); } void INPUT(void) { cout<<"Introduceti [a;b] :"; cin>>a>>b; if(a>b){cout<<"INPUT EROR!";getch();exit(0);} cout<<"Introduceti eroarea absoluta :"; cin>>e; cout<<"Introduceti nr maxim de iteratii :"; cin>>Nmax; }

Rezultatele afiate de acest program sunt urmtoarele: Pentru ecuaia algebric:

Pentru ecuaia transcendent avem:

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