Documente Academic
Documente Profesional
Documente Cultură
Lab MN 1oleg
Lab MN 1oleg
Raport
Lucrarea de Laborator Nr. 1
La Metode Numerice
Tema: Rezolvarea numeric a ecuaiilor algebrice i transcendente
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.
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
f ( c )=0,
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 )
e derivabil i derivata sa
atunci ecuaia
x=( x)
' (x )
are n
( x ) [a , b]
pentru orice
va satisface inegalitatea
[a ,b ]
x [ a ,b ] .
Dac
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.
f ( x )=0
[ a , b] .
1
Unde
f ( xk )
'
f ( xk )
x0
, k=0, 1, 2,
y=f ( x)
n punctul
xk
x k+1
este abscisa
f (x)
pe intervalul
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 .
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
[ a , b ] , n care ecuaia
ln x=x+2
Soluia:
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 )
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
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
14