Sunteți pe pagina 1din 11

Ministerul Educaiei al Republicii Moldova

Raport
Lucrarea de laborator Nr.1
la Metode Numerice

A efectuat:st.gr.TI-142
A verificat:

Chisinau 2015

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 radacin real a ecuaiei date cu ajutorul metodei njumtirii intervalului
cu o eroare mai mic dect =10-2
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 , evaluarile pentru funcii i
derivat.
Ecuaiile propuse spre rezolvare :
Varianta 15 : (2-x) e
Varianta 16 :

- 0.5=0

x 3 - 12x + 9 = 0

Realizarea lucrrii :
1) Separarea rdcinilor
Pentru prima ecuaie este convenabil folosirea metodei grafice de separare a rdcinilor.
x
Scriem ecuaia (2-x) e - 0.5=0 sub forma ( x ) = ( x) i obinem:
0.5
ex =
2x ;
a) Pentru determinarea punctelor de intersecie a funciilor

y=(x) si

(x)

construim graficele :

b) Pentru a doua ecuaie folosim metoda irului lui Rolle .


2
Derivata f(x) = 3 x -12 se anuleaz pentru x=2 . Prin urmare irul lui Rolle este urmtorul :

x
y

-3
18

-2
25

2
-7

3
0

Avem doua alternante de semn si o singura radacina reala (-2, 2).

Pentru a determina celelalte rdcini folosim metoda grafic.

Astfel mai avem 2 rdcini (-4, -3) si (2,3).


2) Calculul rdcinii reale prin metoda njumt irii intervalului :
a)
#include <iostream>
#include<math.h>
using namespace std;
double f(double x) {
return (2 - x) * exp(x) - 0.5;
}
int main() {
int k = 0;
double
a = -2,
b = 2,
c = 0,
eps = 0.0001;
while ((b - a)>eps) {
k++;
c = a + (b - a) / 2;
if (f(c) == 0)
break;
if (f(a)*f(c)<0)
b = c;
else
a = c;
}
cout << " Radacina x=" << c << endl;
cout << "Numarul de iteratii: " << k;
cout << endl;
system("pause");
return 0;
}

b)
#include <iostream>
#include<math.h>
using namespace std;
double f(double x) {
return pow(x, 3) - 12 * x + 9;
}
int main() {
int k = 0;
double
a = -2,
b = 2,
c = 0,
eps = 0.0001;
while ((b - a)>eps) {
k++;
c = a + (b - a) / 2;
if (f(c) == 0)
break;
if (f(a)*f(c)<0)
b = c;
else
a = c;
}
cout << " Radacina x=" << c << endl;
cout << "Numarul de iteratii: " << k;
cout << endl;
system("pause");
return 0;
}

3). Calculul rdcinii reale prin metoda aproximaiilor succesive :


a) Pentru aplicarea metodei aproximaiilor succesive verificm condiia de convergen.
0.5
1 x
e
(x
)
Scriind ecuaia n forma x =
obinem : x = - 2e x , ' (x ) = 4
, ' (x ) >
1,
prin urmare sirul diverge.
Codul sursa :
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double fi(double x) {
return (-0.5 + 2 * exp(x)) / exp(x);
}
int main() {
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
cout << "introduceti eroarea : ";
cin >> eps;
while (1) {
x1 = fi(x0);
k++;
if (abs(x1 - x0)<eps) { cout << "Rezultatul: " << x0 << endl << "Nr de iteratii "
<< k << endl; break; }
x0 = x1;
}
cout << endl;
system("pause");
return 0;

a)
Verificm condiia de convergen :
x 3 - 12x + 9 = 0 => -12x = -9 =

1 3
x
12
' (x ) =

x 3 => x =

9
12
3 2
x
12

3 2
x
> 1 => -2 < x < 2
12
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double fi(double x) {
return (pow(x, 3) + 9) / 12;
}
int main() {
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
cout << "introduceti eroarea : ";
cin >> eps;
while (1) {
x1 = fi(x0);
k++;

x +9
12

=> x =

1 3
x
+
12

9
12

=> ( x )

if (abs(x1 - x0)<eps) { cout << "Rezultat: " << x0 << endl << "Nr de iteratii " <<
k << endl; break; }
x0 = x1;
}
cout << endl;
system("pause");
return 0;
}

4. Calculul rdcinii reale prin metoda tangentelor(Newton) :


a)

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double f(double x) {
return (2 - x) * exp(x) - 0.5;
}
double fderiv(double x) {
return -exp(x) - (2 - x)*exp(x);
}
int main() {
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
cout << "introduceti eroarea : ";
cin >> eps;
while (1) {
x1 = x0 - f(x0) / fderiv(x0);
k++;
if (abs(x1 - x0)<eps) { cout << "Rezultat " << x0 << endl << "Nr de iteratii " << k
<< endl; break; }

x0 = x1;
}
cout << endl;
system("pause");
return 0;
}

b)
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
double f(double x) {
return pow(x,3) - 12*x + 9;
}
double fderiv(double x) {
return 3 * pow(x, 2)-12;
}
int main() {
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
cout << "introduceti eroarea : ";
cin >> eps;
while (1) {
x1 = x0 - f(x0) / fderiv(x0);
k++;
if (abs(x1 - x0)<eps) { cout << "Rezultat " << x0 << endl << "Nr de iteratii " << k
<< endl; break; }
x0 = x1;
}

cout << endl;


system("pause");
return 0;
}

5). Calculul rdcinii reale prin metoda secantelor :


a)
#include <iostream>
#include <math.h>
using namespace std;
double f(double x)
{
return (2 - x) * exp(x) - 0.5;
}
int main()
{
double x2, x1, x3, y, eps = 0.000001;
int n = 0;
x3 = 0;
y = 0;
cout << "Introduceti x1: ";
cin >> x1;
cout << "Introduceti x2: ";
cin >> x2;
do {
n++;
y = x3;
x3 = x2 - (f(x2)*(x2 - x1) / (f(x2) - f(x1)));
x1 = x2;
x2 = x3;
} while (fabs(y - x3) >= eps);
cout << "Radacina x= " << x3 << endl;
cout << "Nr de iteratii : " << n << endl;

system("pause");
return 0;
}

b)

#include <iostream>
#include <math.h>
using namespace std;
double f(double x)
{
return pow(x, 3) - 12 * x + 9;
}
int main()
{
double x2, x1, x3, y, eps = 0.000001;
int n = 0;
x3 = 0;
y = 0;
cout << "Introduceti x1: ";
cin >> x1;
cout << "Introduceti x2: ";
cin >> x2;
do {
n++;
y = x3;
x3 = x2 - (f(x2)*(x2 - x1) / (f(x2) - f(x1)));
x1 = x2;
x2 = x3;
} while (fabs(y - x3) >= eps);
cout << "Radacina x= " << x3 << endl;
cout << "Nr de iteratii : " << n << endl;
system("pause");
return 0;

6) Compararea rezultatelor i concluzia


Metoda

Radacina (x0)

Nr. De iteratii

Valoarea f = (x0)

f1(x)

f(x)

f1(x)

f(x)

f1(x)

Bisectiei

0.789063

1.92969

0.0008

0.002

Apr. Succesive

0.791289

1.92722

Tangentelor

0.791288

1.92722

10

0.0000000
9
0.0000001

Secantelor

0.791288

1.92722

0.0000001

0.000000
2
0.000000
1
0.000000
3

Eroarea

f(x)
0.01
0.000001
0.000001
0.000001

Concluzie :

n urma efecturii lucrrii de laborator am realizat n practic rezolvarea numeric a ecuaiilor


algebrice i transcendente. Putem concluziona c cea mai eficient metoda este metoda
tangentelor,calculatorul efectund un numar mic de iteraii , ns numarul acestor iteraii este
dependent de aproximaia iniial aleas. Acest numr este cu att mai mic cu ct aproximaia
iniial este mai aproape de rdcina cutat.
Un minus al metodei lui Newton(tangentelor) poate fi considerat necesitatea calculului derivatei,
ceea ce n unele cazuri poate fi dificil sau practic imposibil. Pentru astfel de funcii o alegere mai
bun este metoda secantelor. In final am obtinut niste rezultate cu o precizie inalta.

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