rezolvarea numerica a ecuatiilor algebrice si transcendente

9
Metode numerice Tema: Rezolvarea numerică a ecuaţiilor algebrice şi transcendente.

Upload: oana-elena

Post on 28-Nov-2015

17 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Rezolvarea Numerica a Ecuatiilor Algebrice Si Transcendente

Metode numerice

Tema: Rezolvarea numerică a ecuaţiilor algebriceşi transcendente.

Page 2: Rezolvarea Numerica a Ecuatiilor Algebrice Si Transcendente

Scopul lucr ă rii: 1) Să se separe toate rădăcinile 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 intervaluluicu o eroare mai mică decît ε = 10+6.3) Să se precizeze rădăcina obţinută cu exactitatea ε = 10+6, 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ă.

V – 25x3 - 15x - x2 + 19 = 0

Consideraţii teoretice :

1. Calculul rădăcinii reale prin metoda înjumătăţirii intervalului Să considerăm ecuaţia f(x)=0,unde funcţia f(x) este continuă pe intervalul [a,b],are o singură rădăcină reală în acest interval şi f(a)*f(b)<0. Calculăm c=(a+b)/2 – jumătatea intervalului [a,b]. Dacă f(c)=0, atunci c este chiar rădăcina cautată, dacă nu, atunci rădăcina reală se găseşte într-unul din intervalele [a,c] sau [c,b], acolo unde funcţia capătă valori de semne contrare la capetele intervalului (dacă f(a)*f(c)>0, atunci a=c, altfel b=c, atît cît |a-b|>eps, unde eps - o eroare precizată).2. Metoda aproximaţiilor succesive: Fie f(x)=0, sub forma x=(x). Această reprezentare se mai numeşte funcţia iteraţională. Plecînd de la o valoare iniţială arbitrară x0 generăm şirul {xk} (funcţie generică) după regula : xk+1=(xk), k=0,1,2,…, pînă cînd |xk+1-xk| < eps, unde eps – o eroare precizată. 3. Metoda lui Newton(metoda tangentelor) Fie o ecuaţie algebrică sau transcendentă f(x)=0 care admite o singură rădăcină reală în intervalul [a,b]. Metoda lui Newton este definită după următoarea formulă: xk+1=xk-f(xk) / f’(xk), k=1,2,…, unde punctul xk+1 este abscisa punctului de intersecţie a tangentei dusă la curba y=f(x) în punctul xk cu axa ox. De aceea metoda aceasta se numeşte metoda tangentelor. Valoarea xk+1 se calculează pînă cînd |xk+1-xk|<eps, unde eps – o eroare precizată.4.Metoda secantelor

Aceasta metoda constă în aproximarea funcţiei f(x) pe intervalul [a,b], în care ecuaţia f(x)=0 are o rădăcină izolată printr-o dreaptă. Algoritmul metodei secantelor constă în calculul iterativ după formulele:

Page 3: Rezolvarea Numerica a Ecuatiilor Algebrice Si Transcendente

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

Page 4: Rezolvarea Numerica a Ecuatiilor Algebrice Si Transcendente

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;

}

Page 5: Rezolvarea Numerica a Ecuatiilor Algebrice Si Transcendente

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) {

Page 6: Rezolvarea Numerica a Ecuatiilor Algebrice Si Transcendente

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;

Page 7: Rezolvarea Numerica a Ecuatiilor Algebrice Si Transcendente

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:

Introduceţi coeficienţii ecuaţiei: a= 1 b= -1 c=-15 d= 19introduceti intervalul [A,B] = [0,1]introduceti eps= 0.01introduceti Nmax de iteratii= 99

Met Injumatatirii Intervalului Solutia= 0.999999 Nr de iteratii= 20 Met. Aproximatiilor succesive Solutia = 1 Nr de iteratii= 2 Met. Newton: Solutia= 0.999998 Ier= 0 Met. Coardelor si Secantelor: Solutia= 0.999997 Nr de iteratii= 1