Sunteți pe pagina 1din 6

Ministerul Educației, Culturii și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică și Microelectronică

Raport la
Lucrarea de laborator Nr. 1
Disciplina: Metode si modele de calcul

Tema: ” REZOLVAREA NUMERICĂ A ECUAŢIILOR ALGEBRICE ŞI TRANSCENDENTE”

A efectuat: Pelin Bogdan

A verificat: Godonoaga Anatol

Chișinău – 2020
Scopul lucrărilor
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ăcină 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ția şi derivată.
Mersul lucrării:
Pentru a putea aplica metodele sus numite este necesară determinarea intervalului pe care se
găseşte soluţia ecuaţiei date. Pentru ecuaţia algebrică am determinat intervalul cu ajutorul
şirului lui Rolle.
F(x)=x^3-25x+2
F’(x)=3x^2-25
3x^2-25=0 => x=±2.88
Construim şirul lui Rolle:
x -3 -2.88 2.88 3
F(x) 0 -2.88 2.88 2
De aici rezultă că ecuaţia dată are o singură rădăcină în intervalul [0;2]

Am elaborat programul în C++ care realizează sarcina dată, listingul este următorul:
#include<iostream>

#include<stdlib.h>

#include<conio.h>

#include<math.h>

using namespace std;


double fx(double x);
double f1x(double x);
double f2x(double x);
void INPUT(void);
void BISECTIA(double a, double b, double e);
void APROX_SUCCESIV(double a, double b, double e);
void NEWTON(double a, double b, double e);
void Combinat(double a, double b, double e);
double a, b, e, Nmax;
int main() {
int n;

while (1) {
cout << "Se da ecuatia: x^3-25x+2=0\n" <<
"Alegeti metoda de gasire a solutiei:\n" <<
"1. Metoda Bisectiei;\n" <<
"2. Metoda Aproximatiilor succesive;\n" <<
"3. Metoda Newton;\n" <<
"4. Metoda Combinata a coardelor si tangentelor;\n" <<
"5. Toate metodele;\n" <<
"0. Iesire din program;\n";
cin >> n;
switch (n) {
case 1:
INPUT();
BISECTIA(a, b, e);
break;
case 2:
INPUT();
APROX_SUCCESIV(a, b, e);
break;
case 3:
INPUT();
NEWTON(a, b, e);
break;
case 4:
INPUT();
Combinat(a, b, e);
break;
case 5:
INPUT();
BISECTIA(a, b, 0.01);
APROX_SUCCESIV(a, b, e);
NEWTON(a, b, e);
Combinat(a, b, e);
break;
case 0:
exit(0);

}
system("CLS");
}

double fx(double x) {
return x * x * x - 25 * x + 2;
}

double f1x(double x) {
return 3 * x * x - 25;
}

double f2x(double x) {
return 6 * x;
}

void BISECTIA(double a, double b, double e) {


double c, k = 0;
do {
if (a * b > 0) c = a + (b - a) / 2;
else c = (a + b) / 2;
++k;
if (fx(a) * fx(c) < 0) b = c;
else a = c;
if (fx(c) == 0) break;
}
while ((fabs(b - a) >= e) && (k <= Nmax));
cout << "x=" << c;
cout << "\nNumarul de iteratii :" << k << endl;
getch();
}

void APROX_SUCCESIV(double a, double b, double e) {


double y, x, k = 0;
y = a;
do {
x = y;
if (fx(x) == 0) break;

y = (x * x * x + 2) / (25);
k++;
}
while ((fabs(y - x) >= e) && (k <= Nmax));
cout << "x=" << x;
cout << "\nNumarul de iteratii :" << k << endl;
getch();
}

void NEWTON(double a, double b, double e) {


double d, d0 = 1e30, x1, x, k = 0;
if (fx(a) * f2x(a) > 0) x = a;
else x = b;
do {
x1 = x - fx(x) / f1x(x);
if (fx(x1) == 0) break;
d = fabs(x1 - x);
if (d < e) break;
if (d < d0)
if (k < Nmax) {
x = x1;
++k;
d0 = d;
}
else {
cout << "Precizia nu poate fi atinsa dupa " << Nmax << " pasi";
getch();
exit(0);
} else {
cout << "Nu are loc convergenta catre solutia data";
getch();
exit(0);
}
} while (d >= e);
cout << "x=" << x1;
cout << "\nNumarul de iteratii :" << k << endl;
getch();
}

void Combinat(double a, double b, double e) {


double x, xt, k = 0;
if (fx(a) * fx(b) < 0) x = a - fx(a) * (b - a) / (fx(b) - fx(a));
if (fx(a) * fx(x) <= 0) {
xt = a;

do {
x = x - fx(x) * (x - a) / (fx(x) - fx(a));
xt = xt - fx(xt) / f1x(xt);
++k;
}
while ((fabs(x - xt) >= e) && (k <= Nmax));
} else {
xt = b;
do {
x = x - fx(x) * (b - x) / (fx(b) - fx(x));
xt = xt - fx(xt) / f1x(xt);
++k;
}
while ((fabs(x - xt) >= e) && (k <= Nmax));
}

cout << "x=" << (x + xt) / 2;


cout << "\nNumarul de iteratii :" << k << endl;
getch();
}

void INPUT(void) {
cout << "Introduceti [a;b] :";
cin >> a >> b;
if (a > b) {
cout << " EROR!";
getch();
exit(0);
}
cout << "Introduceti eroarea absoluta :";
cin >> e;
cout << "Introduceti nr maxim de iteratii :";
cin >> Nmax;
}
Rezultatele afişate de acest program sunt următoarele:
Pentru ecuaţia algebrică:

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