Documente Academic
Documente Profesional
Documente Cultură
Pelin Bogdan SI-191 lab nr 1 - копия
Pelin Bogdan SI-191 lab nr 1 - копия
Raport la
Lucrarea de laborator Nr. 1
Disciplina: Metode si modele de calcul
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>
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;
}
y = (x * x * x + 2) / (25);
k++;
}
while ((fabs(y - x) >= e) && (k <= Nmax));
cout << "x=" << x;
cout << "\nNumarul de iteratii :" << k << endl;
getch();
}
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));
}
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ă: