Sunteți pe pagina 1din 12

Universitatea Tehnică a Moldovei

Departamentul Informatica si Ingeneria Sistemelor

RAPORT
la Metode Numerice

Lucrarea de laborator Nr.1

Tema : Rezolvarea numerică a ecuațiilor algebrice și transcendente

Varianta 25, 26

A efectuat : st.gr.IA-201 Topală Ion

A verificat : V. Moraru

Chișinău 2021
Scopul lucrării :

1. Să se separe toate rădăcinile reale ale ecuației f(x)=0 unde y=f(x) este o funcție reală de
variabilă reală.
2. Să se determine o rădăcina reală a ecuației date cu ajutorul metodei înjumătățirii
intervalului cu o eroare mai mică decît ε= 10−2 .
3. Să se precizeze rădăcina obținută cu exactitatea ε= 10−6 , utilizând:
• metoda aproximațiilor succesive ;
• metoda tangentelor (Newton);
• metoda secantelor .
4. Să se compare rezultatele luând în considerație numărul de iterații , evaluările pentru funcții
și derivată.

Ecuațiile propuse spre rezolvare


3 2
x −15 x−x + 19=0
cos x +2 x−15=0

Realizarea lucrării

1) Separarea rădăcinilor
Pentru prima ecuație folosim metoda șirului lui Rolle .
Derivata f ' (x )=3 x 2−15−x se anuleaza pentru x1 = -1.92744, x2 = 2.59411

x -5 -1.9 2.6 7
y -56 37 -9.1 208

Radacina este in punctele (-5 ; -1.9)


Radacina este in punctele (-1.9 ; 2.6)
Radacina este in punctele (2.6 ; 7)
Codul:
#include <iostream>
#include <cmath>
#include <iomanip>
#include <string>

using namespace std;

int main()
{
double x1, x2, val;
int sir, i;
float array[20];
string arrayCH[30];

cout << "\nEcuatia este:\nx^3 - 15*x - x^2 + 19.\nf'(x) = 3*x^2 - 15 -


2*x.";

x1 = (1 - sqrt(46)) / 3;
x2 = (1 + sqrt(46)) / 3;

cout << "\n\nx1 = " << x1 << endl


<< "x2 = " << x2 << endl;

cout << "\n\nEcuatia se anuleaza in punctele:\n";


x1 = pow(x1, 3);
x2 = pow(x2, 3);
cout << "x1= " << x1 << endl
<< "x2= " << x2 << endl;

cout << "\nIntroduceti sirul de elemente pe care doriti sa il controlati:


";
cin >> sir;

for (i = 0; i < sir; i++)


{
cout << "[" << i + 1 << "] = ";
cin >> val;
array[i] = val;
val = pow(val,3) - 15 * val - pow(val,2) + 19;
if (val > 0)
{
arrayCH[i] = "+";
}
else if (val < 0)
{
arrayCH[i] = "-";
}
val = 0;
}

cout << "\n\n";


for (i = 0; i < sir; i++)
{
cout << array[i] << "(" << arrayCH[i] << ")"
<< "\t";
}

cout << "\n\n";


for (i = 0; i < sir; i++)
{
if (arrayCH[i + 1] == "\0")
{
break;
}
if (arrayCH[i + 1] != arrayCH[i])
{
cout << "Radacina este in punctele (" << array[i] << " ; " <<
array[i + 1] << ")" << endl;
}
}

cout << "\n\n";


system("pause");
return 0;
}

2) Calculul rădăcinii reale prin metoda înjumătățirii intervalului


Codul:
a) cos x +2 x−15=0
#include <iostream>
#include <math.h>

using namespace std;

double f(double x)
{
return cos(x) + 2 * x +5;
}
int main()
{
int k = 0;
double
a = -5,
b = 7,
c = 0,
eps = 0.0001;
while ((b - a) > eps)
{
k++;
c = a + (b - a) / 2;
if (f(c) == 0)
break;
if (f(a) * f(c) < 0)
b = c;
else
a = c;
}
cout << " Radacina x=" << c << endl;
cout << "Numarul de iteratii: " << k;
return 0;
}

b) x 3−15 x−x 2+ 19=0

Codul:
#include <iostream>
#include <math.h>

using namespace std;

double f(double x)
{
return pow(x,3) - 15 * x - pow(x,2) + 19;
}
int main()
{
int k = 0;
double
a = -5,
b = 7,
c = 0,
eps = 0.0001;
while ((b - a) > eps)
{
k++;
c = a + (b - a) / 2;
if (f(c) == 0)
break;
if (f(a) * f(c) < 0)
b = c;
else
a = c;
}
cout << " Radacina x=" << c << endl;
cout << "Numarul de iteratii: " << k;
return 0;
}

3) Calculul rădăcinii reale prin metoda aproximațiilor succesive

a ¿ cos x +2 x−15=0
Codul:

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
double fi(double x)
{
return (- cos(x) + 15) / 2;
}
main()
{
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
eps = 0.0000001;
while (1)
{
x1 = fi(x0);
k++;
if (fabs(x1 - x0) < eps)
{
cout << "Rez: " << x0 << endl
<< "nr de iteratii " << k << endl;
break;
}
x0 = x1;
}
}

3 2
b ¿ x −15 x−x + 19=0
Codul:

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
double fi(double x)
{
return (pow(x,3) - pow(x,2) + 19) / 15;
}
main()
{
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
eps = 0.0000001;
while (1)
{
x1 = fi(x0);
k++;
if (fabs(x1 - x0) < eps)
{
cout << "Rez: " << x0 << endl
<< "nr de iteratii " << k << endl;
break;
}
x0 = x1;
}
}

4) Calculul rădăcinii reale prin metoda tangentelor(Newton)

a) cos x +2 x−15=0

Codul:
#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

double f(double x)
{
return cos(x) + 2*x -15;
}
double fderiv(double x)
{
return -sin(x) + 2;
}
main()
{
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
eps = 0.0000001;
while (1)
{
x1 = x0 - f(x0) / fderiv(x0);
k++;
if (fabs(x1 - x0) < eps)
{
cout << "Rez: " << x0 << endl
<< "nr de iteratii " << k << endl;
break;
}
x0 = x1;
}
}

3 2
b ¿ x −15 x−x + 19=0
Codul:

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

double f(double x)
{
return pow(x,3) - 15 * x - pow(x,2) + 19;
}
double fderiv(double x)
{
return 3 * pow(x,2) - 15 - 2 * x;
}
main()
{
int k = 0;
double x0, x1, eps;
cout << "Introduceti valoare initiala x0= ";
cin >> x0;
eps = 0.0000001;
while (1)
{
x1 = x0 - f(x0) / fderiv(x0);
k++;
if (fabs(x1 - x0) < eps)
{
cout << "Rez: " << x0 << endl
<< "nr de iteratii " << k << endl;
break;
}
x0 = x1;
}
}

5) Calculul rădăcinii reale prin metoda secantelor

a ¿ cos x +2 x−15=0
Codul:

#include <iostream>
#include <math.h>
using namespace std;
double f(double x)
{
return cos(x) + 2*x -15;
}
main()
{
double x2, x1, x3, y, eps = 0.000001;
int n = 0;
cout << "Introduceti x1: ";
cin >> x1;
cout << "Introduceti x2: ";
cin >> x2;
do
{
n++;
y = x3;
x3 = x2 - (f(x2) * (x2 - x1) / (f(x2) - f(x1)));
x1 = x2;
x2 = x3;
} while (fabs(y - x3) >= eps);
cout << "Radacina x= " << x3 << endl;
cout << "Nr de iteratii : " << n << endl;
}
3 2
b ¿ x −15 x−x + 19=0

Codul:

#include <iostream>
#include <math.h>
using namespace std;
double f(double x)
{
return pow(x,3) - 15 * x - pow(x,2) + 19;
}
main()
{
double x2, x1, x3, y, eps = 0.000001;
int n = 0;
cout << "Introduceti x1: ";
cin >> x1;
cout << "Introduceti x2: ";
cin >> x2;
do
{
n++;
y = x3;
x3 = x2 - (f(x2) * (x2 - x1) / (f(x2) - f(x1)));
x1 = x2;
x2 = x3;
} while (fabs(y - x3) >= eps);
cout << "Radacina x= " << x3 << endl;
cout << "Nr de iteratii : " << n << endl;
}
Concluzie :

În urma efectuării lucrării de laborator am efectuat în practică rezolvarea a ecuațiilor algebrice și


transcendente. Am înțeles mai eficient metoda tangentelor, efectuând un număr minim de iterații, însă
numărul acestor iterații este dependent de aproximația aleasă.

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