Separarea Radacinilor

5
Scopul lucrării: 1)Să se separe toate rădăcinişe reale ale ecuaţiei f(x)=0 unde y=f(x) este o funcţie reală de variabilă reală. 2) Să se determine o rădăcină reală a ecuaţiei date cu ajutorul metodei înjumătăţirii intervalului cu o eroare mai mică decât . 3) Să se precizeze rădăcina obţinută cu exactitatea , utilizând: * metoda aproximaţiilor succesive * metoda tangentelor(Newton) * metoda secantelor 4) Să se compare rezultatele luând în consideraţie numărul de iteraţii, evaluările pentru funcţii şi derivată. Mersul lucrării: Pentru a putea aplica metodele sus numite este necesară determinarea intervalului pe care se găseşte soluţia ecuaţiei date. Pentru ecuaţia algebrică am determinat intervalul cu ajutorul şirului lui Rolle. F’(x)= Construim şirul lui Rolle: x -1 -2i 2i 0 F(x) -8 5 5 5 De aici rezultă că ecuaţia dată are o singură rădăcină în intervalul [-1;0] Am elaborat programul în C++ care realizează sarcina dată, listingul este următorul: #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;

Transcript of Separarea Radacinilor

Page 1: Separarea Radacinilor

Scopul lucrării:1)Să se separe toate rădăcinişe reale ale ecuaţiei f(x)=0 unde y=f(x) este o funcţie reală de variabilă reală.2) Să se determine o rădăcină reală a ecuaţiei date cu ajutorul metodei înjumătăţirii intervalului cu o eroare mai mică decât .3) Să se precizeze rădăcina obţinută cu exactitatea , utilizând: * metoda aproximaţiilor succesive * metoda tangentelor(Newton) * metoda secantelor4) Să se compare rezultatele luând în consideraţie numărul de iteraţii, evaluările pentru funcţii şi derivată.Mersul lucrării:Pentru a putea aplica metodele sus numite este necesară determinarea intervalului pe care se găseşte soluţia ecuaţiei date. Pentru ecuaţia algebrică am determinat intervalul cu ajutorul şirului lui Rolle.

F’(x)=

Construim şirul lui Rolle:x -1 -2i 2i 0F(x) -8 5 5 5De aici rezultă că ecuaţia dată are o singură rădăcină în intervalul [-1;0]

Am elaborat programul în C++ care realizează sarcina dată, listingul este următorul:#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;

Page 2: Separarea Radacinilor

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;

Page 3: Separarea Radacinilor

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 afişate de acest program sunt următoarele:Pentru ecuaţia algebrică:

Page 4: Separarea Radacinilor

Pentru ecuaţia transcendentă avem: