Sunteți pe pagina 1din 7

UNIVERSITATEA TEHNIC A MOLDOVEI

FCIM
CATEDRA CALCULATOARE

REFERAT
LA METODE NUMERICE
LUCRAREA DE LABORATOR Nr.1
TEMA: Rezolvarea numeric a ecuaiilor algebrice i
transcendente
Varianta 15

A efectuat:
A verificat:

st. gr. C-131 Cotofana V.


conf. univ. Tutunaru E.

Chiinu 2014
Sarcina lucrrii:
S se separe toate rdcinile reale ale ecuaiei f(x)=0 unde y=f(x) este o
funcie real de variabil real, prin metoda analitic i grafic.
Ecuaiile:
3

1. x +3 x 3=0

2. x 3 x +12 x 12=0

Pentru o ecuaie s se determine toate rdcinele cu precizia =10-6 ,utiliznd


metoda tangentei

(Newton) i a secantei.
Rezolvare:

1. Separarea rdcinilor.
a. Separarea grafic a rdcinilor ecuaiei 1:
1) Pentru a construi graficul funciei f(x) am parcurs urmtoarii pai: y= x
hiperbol care trece prin O(0,0) prin cadranul I i III.
reprezint o parabola.
Caut 2 puncte prin care s trasez graficul funciei f(x):
X=0 -> y=3
X=-1 -> y=0

- graficul reprezint o

x 3=3 x 2 +3 ; Y= 3 x 2 +3

-> graficul

Solutiile se afla pe intervalele: [-3;-2] , [-2;-1] si [0;1]


b. Separarea analitic a rdcinilor ecuaiei 2:

x 3 x +12 x12=0

f ' ( x )=3 x2 6 x+12


2

f'(x) = 0=> 3 x 6 x+12 =0


2
= b -4*a*c = 36-4*3*12 = -108.

[-k;k] k=(1+a)/|a0|
a=max{a1,,an}=12
a0=1
k=1+12=13
[-13;13]
Deci prin aceasta metoda avem numai o solutie.
Din cauza ca intervalul este mare il injumatatim si primim ca solutia se afla pe intervalul [0;1]

Listingul
#include <string>
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;


float x,a,b,Eps;
void Meniu();
float f(float x);
void Newton (float a,float b,float Eps);
void Secante(float a, float b, float Eps);
void eps();
bool Intervalf();
float f0(float x) {
return pow(x,3)+3*pow(x,2)-3; // ecuatia
}
float f1(float x) {
return 3*pow(x,2)+6*x; // derivata de ord I
}
float f2(float x) {
return 6*x+6;
// ord II
}
int main()
{char var;
while(true)
{
Meniu();
cin>>var;
switch(var)
{
case '1': Intervalf(); break;
case '2': eps(); break;
case '3': Newton(a,b,Eps); break;
case '4': Secante(a,b,Eps); break;
case '0': exit(0);break;
}
}
cout<<endl;
return 0;
}
// functia meniu
void Meniu()
{ cout<<"
cout<<endl<< "
cout<<endl<< "
cout<<endl<< "
cout<<endl<< "
cout<<endl<< "
cout<<endl<<"==";

MENIUL";
1-Dati intervalul";
2-Dati Epsilon";
3-Metoda Tangentelor";
4-Metoda Secantelor";
0-Iesire";

}
bool Intervalf()
{
cout << "Scriu intervalul: ";
cin>>a>>b;
if ((f(a) * f(b))<=0)
{
cout<<"Intervalul este corect"<<endl;
return true;
}
else
if ( (f(a) * f(b)>0) ){
cout<<"Intervalul nu este corect "<<endl;
return false;
}
}
void eps()
{
cout<<endl<<"Precizia=10^";
cin>>Eps;
Eps=pow(10,Eps);
cout<<"Epsilon="<<Eps<<endl;
}
void Newton(float a,float b,float Eps)
{
int n=0; // iteratii
float c;
if(f0(a)*f2(a)>0) c=a;
else c=b;
do {
c=c-f0(c)/f1(c); // formula Newton
n+=1;
}
while (fabs(f0(c))>=Eps); // conditia de oprire a calculelor
cout<<"Solutia este= "<<c<<";"<<"y= "<<fixed<<setprecision(5)<<f0(c)<<"\t"<<"Nr. de
iteratii: n="<<n<<"\n";
}
void Secante(float a, float b, float Eps)
{
float x1,x2,x3,c;
int k=0;
cout<<endl<<"Metoda secantelor: "<<endl;
if((f(c)*f(a))>0)
{
x1=a;
x2=a+(b-a)*1./2;

}
else
{
x1=b;
x2=b-(b-a)*1./2;
}
do
{
k++;
x3=x2-f(x2)*(x2-x1)*1./(f(x2)-f(x1));
cout<<endl<< k<< " Solutia este: x= "<< x3<<" y= "<<fixed<<setprecision(5)<<f(x3);
x1=x2;
x2=x3;
}while(fabs(x2-x1)>=Eps);
cout<<endl;
}
float f(float x)
{
float y=pow(x,3)+3*pow(x,2)-3;
return y;
}

Concluzie:

Aplicnd aceste metode noi obtinem rezultatele reale cu eroarea prestabilita, n dependena de numarul de
iteratii difera viteza de execuie a metodei.

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