Sunteți pe pagina 1din 12

Universitatea Tehnic a Moldovei

Facultatea Calculatoare, Informatic i Microelectronic

Raport
Lucrarea de Laborator Nr. 1
La Metode Numerice
Tema: Rezolvarea numeric a ecuaiilor algebrice i transcendente

St. grupei TI-143


Fiodor Alexandru

A efectuat:

A verificat:

Galina Marusic

Chiinu 2015

Scopul lucrrii:
1.

S se separe toat 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 njumt irii intervalului cu o eroare
mai mic dect =102 .
3.
S se precizeze rdcina obinut cu exactitatea =106 , utiliznd:

Metoda aproximaiilor succesive;

Metoda tangentelor;

Metoda secantelor.
4.
S se compare rezultatele lund n consideraie numrul de iteraii, evalurile pentru funcii i derivat.

Breviar teoretic:
Metoda njumtirii intervalelor:
Fie ecuaia f(x)=0, unde funcia f(x) este continu pe intervalul [a, b], are o singur rdcin n acest
interval i f ( a ) f ( b )< 0.
a+b
jumtatea intervalului [a, b]. dac f ( c )=0, atunci c este chiar rdcina cutat.
2
Dac nu, atunci rdcina se gsete ntr-unul din intervalele [ a, c] sau [c, b], acolo unde funcia ia valori de
semne contrare la capetele intervalului.
Calculm c=

Metoda aproximaiilor succesive:


Fie funcia ( x ) definit pe intervalul [a, b] i ( x ) [ a ,b ] pentru orice x [ a ,b ] . Dac
funcia ( x ) e derivabil i derivata sa ' ( x ) va satisface inegalitatea | ' ( x )| <1, oricare ar fi
x [ a ,b ] atunci ecuaia x= ( x ) are n [ a , b ] o singur rdcin real , i deci putem forma irul de
iterare x0, x1, x2, , xk,, dup regula x k+1= ( x k ) , astfel nct x k [ a ,b ] pentru k =0,1,2, i acest
ir converge ctre rdcina . n plus, eroarea este evaluat prin relaia:
k

|x k | 1
| x k x k1| 1
|x 1x 0|, k=1,2,
Dac 1< ' ( x ) <0, atunci,

|x k ||x k x k1| , k 1.

Metoda lui Newton (tangentelor):


Fie ecuaia algebric sau transcendent f ( x )=0 care admite o singur rdcin real n intervalul
[ a , b ] . presupunem n plus c derivatele f ' ( x ) if ' ' ( x ) pstreaz un semn constant pe intervalul [ a , b ] .
Metoda lui Newton este definit de urmtoarea formul:
x k+1=x k

f ( xk )
'

f ( xk )

, k=0,1,2,

Unde x 0 este aproximaia iniial a rdcinii din intervalul [ a , b ] . Punctul x k+1 este abscisa
punctului de intersecie a tangentei dus la curba y=f ( x ) n punctul x k cu axa Ox. De aceea aceast
metod se mai numete metoda tangentelor.
Metoda coardelor i metoda secantelor:

Idee metodei coardelor const n aproximarea funciei


f ( x )=0 are o rdcin izolat printr-o dreapt.

f (x)

pe intervalul

[ a , b ] , n care ecuaia

Algoritmul metodei coardelor const n calculul iterativ din formulele:


x
f (|k )f ( a ) ( x k a ) , k=0,1, , x 0=b ;

x k+1= x k

f ( xk )
f ( xk )
xk
( bx k ) , k=0,1, , x 0=a ;

f ( b )f ( x k )

Prima formul se utilizeaz n cazul, n care f ( a )> 0, f ' ' ( a ) > 0 sau
''
''
f ( a )< 0, f ( a ) < 0 , n timp ce a doua cnd f ( b )> 0, f ( b ) > 0 sau

f ( a )< 0, f ' ' ( a ) < 0 .

Ecuaiile propuse spre rezolvare :


Ecuaia 1 :

2 x e =0

Ecuaia 2 : x 326 x+ 43=0

Mersul lucrrii:
Realizarea lucrrii :
1) Separarea rdcinilor
Pentru prima ecuaie este convenabil folosirea metodei grafice de separare a
rdcinilor.
Scriem ecuatia 2x- ex =0 sub forma (x)=g(x) si obtinem:
2x= ex .
a) Pentru determinarea punctelor de intersectie a functiilor y= (x) si y=g(x)construim graficele:

Astfel ecuatia are o radacina reala


b)Pentru a doua ecuatie folosim metoda sirului lui Rolle.
26
Derivata f(x)=3 x 226 se anuleaz pentru x=
.
3
urmtorul:

Prin urmare irul lui Rolle este

Avem o alternan de semn i respectiv o singur rdcin real (Pentru a determina celelalte rdcini folosim metoda grafic.

Astfel mai avem 2 rdcini ( -6 , -5 ) i ( 3, 4 )


Listingul Programului :
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
#include <math.h>
using namespace std;
float f1(float x)
{
return 2 * x - exp(-x);
}
float D1(float x)
{
return exp(-x) + 2;
}
float f2(float x)
{
return pow(x, 3) - 26 * x + 43;
}
float D2(float x)
{
return 3 * pow(x, 2) - 26;
}
float f3(float x)

26
26
,
3
3

).

{
return exp(-x)/2;
}
float f4(float x)
{
return (pow(x, 3) + 43) / 26;
}
float injum1(float a, float b, float eps)
{
int k;
float c, d, x;
c = a;
if (f1(a) < 0) c = b;
d = a + b - c;
k = 0;
do
{
x = c + (d - c) / 2;
k++;
if (f1(x) == 0) break;
if (f1(x) > 0) c = x;
else d = x;
} while (fabs(c - d) > eps);
return x;
}
float injum2(float a, float b, float eps)
{
int k;
float c, d, x;
c = a;
if (f2(a) < 0) c = b;
d = a + b - c;
k = 0;
do
{
x = c + (d - c) / 2;
k++;
if (f2(x) == 0) break;
if (f2(x) > 0) c = x;
else d = x;
} while (fabs(c - d) > eps);
return x;
}
float aprox1(float y, float eps)
{
float x = 0;
do
{
x = y;
y = pow((30 * x + 40), 1 / 3);

cout << "x=" << x << endl;


cout << "y=" << y << endl;
} while (fabs(y - x) > eps);
return x;
}
float aprox2(float y, float eps)
{
float x;
do
{
x = y;
y = f4(x);
cout << "x=" << x << endl;
cout << "y=" << y << endl;
} while (fabs(y - x) > eps);
return x;
}
float Newton1(float x0, float eps, int Nmax)
{
float d0 = 1e30, x1, x, d1;
int k, Ier;
x = x0;
k = 0;
Et:
x1 = x - f1(x) / D1(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;
}
}
cout << Ier << endl;
return x;
}
float Newton2(float x0, float eps, int Nmax)

{
float d0 = 1e30, x1, x, d1;
int k, Ier;
x = x0;
k = 0;
Et:
x1 = x - f2(x) / D2(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;
}
}
cout << Ier << endl;
return x;
}
float sec1(float A, float B, float eps, float Nmax)
{
float FA, FB, FX, x, xt;
int Num = 0;
FA = f1(A);
FB = f1(B);
x = A - (B - A)*FA / (FB - FA); //calculul solutiei initiale
FX = f1(x);
if (FA*FX <= 0){
xt = A;
do{
x = x - (x - A)*FX / (FX - FA); // calculul dupa form coardelor
FX = f1(x);
xt = xt - f1(xt) / D1(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 = f1(x);
xt = xt - f1(xt) / D1(xt); //dupa form Tangentelor
Num++;
} while (fabs(x - xt)<eps&&Num<Nmax);

}
cout << "Numarul de iteratii =" << Num << endl;
return x;
}
float sec2(float A, float B, float eps, float Nmax)
{
float FA, FB, FX, x, xt;
int Num = 0;
FA = f2(A);
FB = f2(B);
x = A - (B - A)*FA / (FB - FA); //calculul solutiei initiale
FX = f2(x);
if (FA*FX <= 0){
xt = A;
do{
x = x - (x - A)*FX / (FX - FA); // calculul dupa form coardelor
FX = f2(x);
xt = xt - f2(xt) / D2(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 = f2(x);
xt = xt - f2(xt) / D2(xt); //dupa form Tangentelor
Num++;
} while (fabs(x - xt)<eps&&Num<Nmax);
}
cout << "Numarul de iteratii =" << Num << endl;
cout << x << endl;
return x;
}
int main()
{
int menu, Nmax;
float a, b, c, eps, x0;
init:
system("cls");
cout << endl << endl;
cout << "\t\tMeniu: Selectati optiunea dorita " << endl;
cout << "1. Prima ecuatie :" << endl;
cout << "2. A doua ecuatie :" << endl;
cin >> menu;

switch (menu)
{
case 1:
{
int optiunea1;
system("cls");
cout << endl;
cout << "Ecuatia I:" << endl << endl;
cout << "1. Metoda Aproximatiei :" << endl;
cout << "2. Metoda Newton:" << endl;
cout << "3. Metoda Injumatatirii intervalelor:" << endl;
cout << "4. Metoda Secantelor:" << endl;
cout << "0. Meniul principal" << endl;
cin >> optiunea1;
switch (optiunea1)
{
case 1:
{
system("cls");
cout << "Da-ti valoarea initiala " << endl;
cin >> x0;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
c = aprox1(x0, eps);
cout << c << endl;
_getch();
goto init;
}
break;
case 2:
{
system("cls");
cout << "Da-ti valoarea initiala :" << endl;
cin >> x0;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii:" << endl;
cin >> Nmax;
c = Newton1(x0, eps, Nmax);
cout << c;
_getch();
goto init;
}
break;
case 3:
{
system("cls");
cout << "Da-ti prima limita a intervalului:" <<
endl;
cin >> a;
cout << "Da-ti a 2-a limita a intervalului" <<
endl;

cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
c = injum1(a, b, eps);
cout << c << endl;
_getch();
goto init;
}
break;
case 4:
{
system("cls");
cout << "Da-ti prima limita a inervalului :" <<
endl;
cin >> a;
cout << "Da-ti a 2-a limita a intervalului" <<
endl;
cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii :" << endl;
cin >> Nmax;
c = sec1(a, b, eps, Nmax);
cout << c << endl;
_getch();
goto init;
}
break;
case 0:
goto init;
}
}
break;
case 2:
{
int optiunea2;
system("cls");
cout << endl;
cout << "Ecuatia II" << endl << endl;
cout << "1. Metoda Aproximatiei :" << endl;
cout << "2. Metoda Newton:" << endl;
cout << "3. Metoda Injumatatirii intervalelor:" << endl;
cout << "4. Metoda Secantelor:" << endl;
cout << "0. Meniul principal" << endl;
cin >> optiunea2;
switch (optiunea2)
{
case 1:
{
system("cls");
cout << "Valoarea initiala a radacinii:" <<
endl;

cin >> x0;


cout << "Eroarea de calcul:" << endl;
cin >> eps;
c = aprox2(x0, eps);
cout << c << endl;
_getch();
goto init;
}
break;
case 2:
{
system("cls");
cout << "Valoarea initiala a radacinii:" <<
endl;
cin >> x0;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii:" << endl;
cin >> Nmax;
c = Newton2(x0, eps, Nmax);
cout << c;
_getch();
goto init;
}
break;
case 3:
{
system("cls");
cout << "Dati prima limita a intervalului:" <<
endl;
cin >> a;
cout << "Dati a 2-a limita a intervalului" <<
endl;
cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
c = injum2(a, b, eps);
cout << c << endl;
_getch();
goto init;
}
case 4:
{
system("cls");
cout << "Dati prima limita a intervalului:" <<
endl;
cin >> a;
cout << "Dati a 2-a limita a intervalului" <<
endl;
cin >> b;
cout << "Eroarea de calcul:" << endl;
cin >> eps;
cout << "Numarul de iteratii :" << endl;
cin >> Nmax;

c = sec2(a, b, eps, Nmax);


//cout << c << endl;
_getch();
goto init;
}
break;
}
}
}
}

Concluzii:

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 minim de itera ii , 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. La fel
se observ din tabel c metoda Newton converge ctre soluie cu vitez ptratic
,aceasta fiind un caz particular a metodei aproxima iilor succesive. O alt
vulnerabilitate a acestei metode este necesitatea calculului derivatei, ceea ce n unele
cazuri poate fi dificil sau practic imposibil. Pentru astfel de func ii o alegere mai bun
este metoda secantelor. La fel putem afirma rezultatul obinut pe baza acestei metode
are o precizie destul de mare.

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