Documente Academic
Documente Profesional
Documente Cultură
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:
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
(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
x 3 x +12 x12=0
[-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>
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.