Sunteți pe pagina 1din 15

Ministerul Educaiei al Republicii Moldova

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. gr. SI-131


Negru O.

A efectuat:

lect. sup.
Marusic G.

A verificat:

Chiinu 2014

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
2
eroare mai mic dect =10 .

3.

6
S se precizeze rdcina obinut cu exactitatea =10 , utiliznd:

4.

Metoda aproximaiilor succesive;


Metoda tangentelor;
Metoda secantelor.
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.
c=

Calculm

a+b
2

jumtatea intervalului [a, b]. dac

f ( c )=0,

atunci c este chiar rdcina

cutat. 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.
Metoda aproximaiilor succesive:
Fie funcia
funcia

( x )

x [ a ,b ]

( x )

definit pe intervalul [a, b] i

e derivabil i derivata sa

atunci ecuaia

x=( x)

' (x )

are n

de iterare x0, x1, x2, , xk,, dup regula

( x ) [a , b]

pentru orice

va satisface inegalitatea

[a ,b ]

x [ a ,b ] .

Dac

| ' ( x)| <1, oricare ar fi

o singur rdcin real , i deci putem forma irul

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

[ a , b ] . presupunem n plus c derivatele

f ( x )=0

care admite o singur rdcin real n intervalul

f ' ( x ) i f ' ' (x )

[ a , b] .
1

pstreaz un semn constant pe intervalul

Metoda lui Newton este definit de urmtoarea formul:


x k+1=x k

Unde

f ( xk )
'

f ( xk )

x0

, k=0, 1, 2,

este aproximaia iniial a rdcinii din intervalul [a ,b ] . Punctul

punctului de intersecie a tangentei dus la curba

y=f ( x)

n punctul

xk

x k+1

este abscisa

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

f (x)

pe intervalul

are o rdcin izolat printr-o dreapt.

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 )
x
bx k ) , k=0,1, , x0 =a ;
k 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 :

x+ ln x2=0
3

Ecuaia 2 : x 29 x+34=0

Mersul lucrrii:
Separm rdcinile ecuaiilor utiliznd metoda grafic:
1.

x+ ln x2=0

f(x) = 0 (x) = g(x);


2

[ a , b ] , n care ecuaia

ln x=x+2

Soluia:

Din grafic observm c rdcina real a ecuaiei se afl n intervalul:


r (- 1 ,2 )

2.

x 3 -29x+34=0
f(x) = 0 (x) = g(x);
x 3 =29x-34

Soluiile:

Utiliznd metoda irul lui Rolle , am determinat intervalul pentru o solutie a ecuaiei :
f(x) =

-29x+34

2
f(x) = 3 x -29

x=

x
f(x)

-4

29
3

29
3

29
3

86 94,109
-26,109
-18
+
+
O rdcina real a ecuaiei se afl n intervalul:
r (-

29 29
,
3
3 )

Pentru celelalte 3 metode n calitate de aproximaie iniial am ales:


1. x0 = -1.4
2. x0 = -1
deoarece satisface condiia f(x0) * f (x0) > 0.
4

Listingul Programului :

#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
#include <math.h>
using namespace std;
float f1(float x)
{
return x + log(x) - 2;
}
float D1(float x)
{
return 1 + (1/x);
}
float f2(float x)
{
return pow(x,3) -(29* x )+ 34;
}
float D2(float x)
{
return 3*pow(x,2) -29;
}
float f3(float x)
{
return 2-log(x);
}
float f4(float x)
{
return (pow(x,3) + 34) /29 ;
}
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;
5

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

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

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

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:
{
10

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;
11

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;
12

}
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:
13

Elabornd aceast lucrare de laborator m-am familiarizat cu metodele de rezolvare numeric a


ecuaiilor transcendente, rezolvarea algebric ale crora poate fi complicat sau chiar imposibil. Pentru
determinarea unei rdcini reale a ecuaiei am implementat, in programul creat, metodele: njumt irea
intervalului, Newton i Metoda secantelor. Obinnd rezultatele, am observat c exactitatea ultimilor dou
metode prevaleaz celelalte ,ins corectidudinea rezultatelor depinde radical de aproximarea iniiala aleas.

14

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