Documente Academic
Documente Profesional
Documente Cultură
Lab 1 Fiodormn
Lab 1 Fiodormn
Raport
Lucrarea de Laborator Nr. 1
La Metode Numerice
Tema: Rezolvarea numeric a ecuaiilor algebrice i transcendente
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 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=
|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.
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:
f (x)
pe intervalul
[ a , b ] , n care ecuaia
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
2 x e =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:
Avem o alternan de semn i respectiv o singur rdcin real (Pentru a determina celelalte rdcini folosim metoda grafic.
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);
{
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;
Concluzii: