Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrarea de Laborator Nr. 1
La Metode Numerice
Tema: Rezolvarea numeric a ecuaiilor algebrice i transcendente
A efectuat:
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
eroare mai mic dect =102 .
3.
S se precizeze rdcina obinut cu exactitatea =106 , utiliznd:
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
2
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.
Calculm
c=
|x k | 1 |x k xk 1| 1
| x x |, k=1, 2,
1 0
Dac 1< ' ( x )< 0, atunci,
|x k ||x k x k 1|, k 1.
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.
1
f (x)
pe intervalul
x k+1= x k
f ( xk )
f ( xk )
xk
( b x k ) , k =0,1, , x 0=a ;
f ( b) f ( xk )
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 .
x+ ln x 2=0
Ecuaia 2 : x 3 29 x +34=0
Mersul lucrrii:
Separm rdcinile ecuaiilor utiliznd metoda grafic:
1.
x+ ln x 2=0
f(x) = 0 (x) = g(x);
ln x= x +2
[ a , b ] , n care ecuaia
Soluia:
2.
-29x+34=0
Soluiile:
Utiliznd metoda irul lui Rolle , am determinat intervalul pentru o solutie a ecuaiei :
f(x) =
x 3 -29x+34
f(x) = 3 x2 -29
3
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
#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;
4
}
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;
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;
5
}
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){
6
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;
7
}
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
8
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;
9
}
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;
11
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;
12
Concluzii:
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.
13