Sunteți pe pagina 1din 7

Metode numerice

Tema: Rezolvarea numeric a ecuaiilor algebrice i transcendente.

Scopul lucrrii: 1) S se separe toate 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 njumtirii intervaluluicu o eroare mai mic dect = 10+6. 3) S se precizeze rdcina obinut cu exactitatea = 10+6, 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. V 25 x3 - 15x - x2 + 19 = 0 Consideraii teoretice: 1. Calculul rdcinii reale prin metoda njumtirii intervalului S considerm ecuaia f(x)=0,unde funcia f(x) este continu pe intervalul [a,b],are o singur rdcin real n acest interval i f(a)*f(b)<0. Calculm c=(a+b)/2 jumtatea intervalului [a,b]. Dac f(c)=0, atunci c este chiar rdcina cautat, dac nu, atunci rdcina real se gsete ntr-unul din intervalele [a,c] sau [c,b], acolo unde funcia capt valori de semne contrare la capetele intervalului (dac f(a)*f(c)>0, atunci a=c, altfel b=c, att ct |a-b|>eps, unde eps - o eroare precizat). 2. Metoda aproximaiilor succesive: Fie f(x)=0, sub forma x=(x). Aceast reprezentare se mai numete funcia iteraional. Plecnd de la o valoare iniial arbitrar x0 generm irul {xk} (funcie generic) dup regula : xk+1=(xk), k=0,1,2,, pn cnd |xk+1-xk| < eps, unde eps o eroare precizat. 3. Metoda lui Newton(metoda tangentelor) Fie o ecuaie algebric sau transcendent f(x)=0 care admite o singur rdcin real n intervalul [a,b]. Metoda lui Newton este definit dup urmtoarea formul: xk+1=xk-f(xk) / f(xk), k=1,2,, unde punctul xk+1 este abscisa punctului de intersecie a tangentei dus la curba y=f(x) n punctul xk cu axa ox. De aceea metoda aceasta se numete metoda tangentelor. Valoarea xk+1 se calculeaz pn cnd |xk+1-xk|<eps, unde eps o eroare precizat. 4.Metoda secantelor Aceasta metoda const n aproximarea funciei f(x) pe intervalul [a,b], n care ecuaia f(x)=0 are o rdcin izolat printr-o dreapt. Algoritmul metodei secantelor const n calculul iterativ dup formulele:

Am separat radacina prin metaoda grafica, deoarece prin metoda lui Rolle cind am incercat sa gasesc radacinile derivatei am ajuns la inexistenta solutiilor. Metoda grafica fiind deci o alternative la cea a lui Rolle. Asa deci dind valori am abtinut un grafic si am gasit intervalul [-10,10]. f `(x) = 3x2 -15-x

Listingul programului: #include<iostream.h> #include<stdlib.h> #include<dos.h> #include<math.h> #include<conio.h> #define eps1 0.01 #define eps2 0.01 #include<iostream.h> #include<conio.h> #include<STDLIB.H> #include<math.h> float f(float a,float b,float c,float d,float x) { float f; f=a*x*x*x+b*x*x+c*x+d; return f; } float F1(float a,float b,float c,float d,float x) // derivata lui F { float f; f=a*x*x+b*x+c; return f; } void Binary (float A,float B,float eps,float a,float b, float c,float d) { float S,D,fx,x; int k; S=A; if (f(a,b,c,d,A)<0) S=B; D=A+B-S; k=0; do { x=S+(D-S)/2; k++; fx=f(a,b,c,d,x); if (fx==0) exit(1); if (fx>0) S=x; else D=x; } while((fabs(S-D))>eps); gotoxy(4,11); cout<<"Met Injumatatirii Intervalului"; cout<<" Solutia= "; cout<<x<<endl; gotoxy(42,12); cout<<"Nr de iteratii= "; cout<<k; }

float radical(float x) { float r=(float)1/3; float p=x*x+15*x-19; return exp(r*log(p)); } void Aprox_succesive(float x0,float eps,int Nmax,float a,float b,float c,float d) { float x1,y,x,h; double u; int k=0; u=1/3; y=x0; do { x=y; h=x*x+15*x-19; y=pow(h,u); k++; } while(fabs(y-x)>eps&&k<Nmax); x1=x; gotoxy(4,15); cout<<"Met. Aproximatiilor succesive"; cout<<" Solutia = "; gotoxy(42,16); cout<<"Nr de iteratii= "<<k; gotoxy(52,15); cout<<x1<<endl; } void Newton(float x0,float eps,int Nmax,float a,float b,float c,float d) { float x1,x,y,d0=1e30,d1; int k,Ier; x=x0; k=0; Et: ; x1=x-f(a,b,c,d,x)/F1(a,b,c,d,x); d1=fabs(x1-x); if (d1<eps) { Ier=0; } else { if (d1<d0) { if (k>Nmax) { Ier=2; } else k++; x=x1; d0=d1; goto Et; } else { Ier=1; } } gotoxy(4,19); cout<<"Met. Newton: "; cout<<" Solutia= "<<x; gotoxy(42,20); cout<<"Ier= "<<Ier; } void Tang_Secant(float A,float B,float eps,int Nmax,float a,float b,float c,float d) {

float FA,FB,FX,x,xt; int Num=0; FA=f(a,b,c,d,A); FB=f(a,b,c,d,B); x=A-(B-A)*FA/(FB-FA); //calculul solutiei initiale FX=f(a,b,c,d,x); if (FA*FX<=0) { xt=A; do { x=x-(x-A)*FX/(FX-FA); // calculul dupa form coardelor FX=f(a,b,c,d,x); xt=xt-f(a,b,c,d,xt)/F1(a,b,c,d,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=f(a,b,c,d,x); xt=xt-f(a,b,c,d,xt)/F1(a,b,c,d,xt); //dupa form Tangentelor Num++; } while(fabs(x-xt)<eps&&Num<Nmax); } gotoxy(4,23); cout<<"Met. Coardelor si Secantelor:"; cout<<" Solutia= "<<x; gotoxy(34,24); cout<<" Nr de iteratii= "<<Num; } void main (void) { float A,B,eps,x,a,b,c,d; int Nmax,temp; clrscr(); gotoxy(20,1); cout<<"Introduceti coeficientii ecuatiei"; gotoxy(10,2); cout<<"a=1"<<endl; a=1; gotoxy(10,3); cout<<"b=-1"<<endl; b=-1; gotoxy(10,4); cout<<"c=-15"<<endl; c=-15; gotoxy(10,5); cout<<"d=19"<<endl; d=19; cout<<"introduceti intervalul [A,B] = [0,1]"<<endl; A=0; B=1; cout<<"introduceti eps= 0.01 "; eps=0.000001; cout<<endl<<"introduceti Nmax de iteratii= 99"; Nmax=99;

cout<<endl<<" "; Binary(A,B,eps,a,b,c,d); Aprox_succesive(A,eps,Nmax,a,b,c,d); Newton(A,eps,Nmax,a,b,c,d); Tang_Secant(A,B,eps,Nmax,a,b,c,d); getch(); } Rezultatul programului: Introducei coeficienii ecuaiei: a= 1 b= -1 c=-15 d= 19 introduceti intervalul [A,B] = [0,1] introduceti eps= 0.01 introduceti Nmax de iteratii= 99 Met Injumatatirii Intervalului Met. Aproximatiilor succesive Met. Newton: Met. Coardelor si Secantelor: Solutia= 0.999999 Nr de iteratii= 20 Solutia = 1 Nr de iteratii= 2 Solutia= 0.999998 Ier= 0 Solutia= 0.999997 Nr de iteratii= 1

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