Sunteți pe pagina 1din 6

Universitatea Tehnica din Moldova

Facultatea Calculatoare, Informatică şi Microelectronică

Raport
La Metode și Modele de Calcul

Rezolvarea ecuațiilor neliniare si transcendente.

A efectuat Doloscan Dumitru


st.gr.TI -162

A verificat: Tutunaru Eleonora


dr. Conf. Univ.

Chişinău 2017
Scopul lucrarii:
Insusirea metodelor de separare a radacinilor patrate ale ecuatiei f(x)=0 si
determinarea lor cu exacitatea E.

Sarcina 1:
Sa se separe prin metoda analitică și grafică toare rădăcinile reale ale ecuațiilor
a) x3+0.2x2+0.5x-1.2=0
b) x3-3x2+2.5=0

Spararea radaciniilor prin metoda grafică:


x3=3x2-2.5

Graficul:
f(2)*f(4)<0
După realizarea graficului observăm că ecuația aleasă are o singură
rădacină reală pe intervalul [2;4]

Separam radacinile reale ale ecuatiei prin metoda analitica:

1) 𝑥 3 + 0,2𝑥 2 + 0,5𝑥 − 1,2 = 0

1,2
𝑘 =1+ 1
= 2,2 𝑘𝜖[−1,2; 1,2]

𝑓 ′ (𝑥) = 3𝑥 2 + 0,4𝑥 + 0,5


3𝑥 2 + 0,4𝑥 + 0,5 = 0
∆= 0,16 − 6 < 0

Alcatuim tabelul de semn al functiei:


X -1.2 0 1.2 w
Sgn f(x) - - + 1

Ecuația are 1 rădăcină reală pe segmentul : [ 0 ; 1.2 ]


Sarcina 2:
Sa se determine toate radacinile reale ale unei ecuatii cu exactitatea 10 -4 utilizind
metodele:
1. Coardelor
2. Mixta

Listing-ul programului:
#include <iostream>
#include <cmath>
#include <conio.h>

using namespace std;

float f(float x) // Functia propriuzisa


{
return (pow(x, 3) + 0.2 * x * x + 0.5 * x - 1.2);
}

float fd1(float x) // Derivata de ordinul I


{
return (3 * pow(x, 2) + 0.4 * x + 0.5);
}

float fd2(float x) // Derivata de ordinul II


{
return (6 * x + 0.4);
}

int metCoardelor(float a, float b, float eps)


{
float x0;
float xF;
float x1;
int iter = 0;

cout << "Metoda Coardelor:" << endl;


if (f(a) * f(b) > 0 || fd1(a) * fd1(b) < 0 || fd2(a) * fd2(b) < 0)
{
cout << "Nu exista o solutie pe intervalul [" << a << " " << b <<
"]\n";
return 0;
}
if (f(a) * fd2(a) > 0)
{
x0 = b;
xF = a;
}
else
{
x0 = a;
xF = b;
}
x1 = x0;
do
{
x0 = x1;
x1 = x0 - ((xF - x0) * f(x0) / (f(xF) - f(x0)));
iter++;
}
while (abs(x1 - x0) >= eps);
cout << "Solutia este x = " << x1 << endl;
cout << "F(x) = " << f(x1) << endl;
cout << "Nr. de pasi: " << iter << endl << endl;
return (iter);
}

int metMixt(float a, float b, float eps)


{
float x0;
float x1;
float t0;
float t1;
int iter = 0;

cout << "Metoda Mixta:" << endl;


if (f(a) * f(b) > 0 || fd1(a) * fd1(b) < 0 || fd2(a) * fd2(b) < 0)
{
cout << "Nu exista o solutie pe intervalul [" << a << " " << b <<
"]\n";
return 0;
}
if (f(a) * fd2(a) < 0)
{
x0 = a;
t0 = b;
}
else
{
x0 = b;
t0 = a;
}
do
{
x1 = x0 - (t0 - x0) * f(x0) / (f(t0) - f(x0));
t1 = t0 - f(t0) / fd1(t0);
iter++;
x0 = x1;
t0 = t1;
}
while (abs(t1 - x1) >= eps);
cout << "Solutia este x = " << (t1 + x1) / 2 << endl;
cout << "F(x) = " << f((t1 + x1) / 2) << endl;
cout << "Nr. de pasi: " << iter << endl << endl;
return (iter);
}

int main()
{
float a;
float b;
float eps = pow(10, -4);
int iteratii_coard;
int iteratii_mixt;

while (1)
{
cout << "Dati a, b" << endl;
cin >> a >> b;
iteratii_coard = metCoardelor(a, b, eps);
iteratii_mixt = metMixt(a, b, eps);
if (iteratii_coard == iteratii_mixt)
cout << "Ambele metode sunt eficiente, numarul de iteratii
coincide";
else
{

cout << "Metoda " << (iteratii_coard < iteratii_mixt ?


"Coardelor" : "Mixta");
cout << " este mai eficienta";
}
cout << endl << endl;
cout << "Apasati orice tasta...";
getch();
cout << endl << endl;
}
return 0;
}

Rezultatul executiei:

Concluzie:
Realizând acestă lucrare de laborator am aplicat în practică metodele de rezolvare
numerica a ecuatiior neliniare prin metoda grafică și analitică, dar si prin metoda mixtă
și coardelor, la care am primit rezultat aproximativ egal. Am determinat rezultatul si
numarul de iteratii pentru fiecare metodă în parte si am aflat care metădă este mai
eficientă.