Sunteți pe pagina 1din 10

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

Universitatea Tehnică a Moldovei

Departamentul Ingierie Software și Automatică

Raport
Disciplina Metode și Modele de Calcul
Tema: Rezolvarea ecuațiilor neliniare și transcendente

A îndeplinit: st.gr. TI-182 Movileanu Dorin

A controlat: conf. univ. Tutunaru Eleonora

Chișinău-2018
Cuprins:

1. Scopul și sarcina lucrării………………………….………………………………3

2. Realizarea.....................………………………………….………………………..4

3. Interpretarea rezultatelor..........……………………………………….…………..7

4. Concluzie…………………….……………………………………………………8

Anexa A……………………….…………………………………………………..9
1. Scopul și sarcina lucrării

1. Să se separe analitic și grafic toate rădăcinile reale ale ecuațiilor.


2. Să se calculeze toate rădăcinile reale ale ec. cu eroarea epsilon = 10 -4 utilizând metoda
coardelor și metoda mixtă.
3. Să se compare rezultatele obținute.

Ecuațiile:
1. Pentru rezolvarea grafică:
x3+3x2-3=0
2. Pentru rezolvarea analitică:
x3+3x2-12x-12=0
1. Rezolvarea grafică

x3+3x2-3=0
x3 = -3x2+3

y = x3
x -2 -1 0 1 2
y -8 -1 0 1 8

y = -3x2+3
x -2 -1 0 1 2
y -9 0 3 0 9

După cum se observă pe grafic se obțin 3 rădăcini reale: [1, 1], [-1.347, -2.446] și [-2.532, -16.234].

2. Rezolvarea ecuației prin metoda analitică:


x3+3x2-12x-12=0
𝑎
k = 1+|𝑎0|
12
k = 1+ 1 = 13

Se va cerceta intervalul: [-13, 13]


f'(x) = 3x2-6x+12 |:3 => f(x) = x2-2x+4
x2-2x+4 = 0
Δ = 4 - 16 = -12 => nu are rădăcini
x -13 0 13 n
semn - + - 1
f(x)

Analizând tabelul observăm că semnul funcției se schimbă o singură dată. Anume pe acel interval se
găsește soluția reală a funției.
Deci, în program se va cerceta intervalul [0, 13] prin:
a) metoda coardelor
b) metoda mixtă
a) Metoda coardelor

Secvența de program care rezolvă problema conform metodei coardelor:

re = a - (b-a)*f(a) / (f(b) - f(a));

while (abs(f(re)) > eps)

re = a - (b-a)*f(a) / (f(b) - f(a));

if (f(a)*f(re) <= 0)

b = re;

else a = re;

i++;

}
Rezulatele metodei coardelor:

b) Metoda mixtă:

Secvența de program care rezolvă problema conform metodei coardelor:

c = a - f(a) / (f(b)-f(a)) * (b-a);

if (f(c)*f(a) > 0)

z = b; x = a; k++;

else

z = a; x = b;

k++;

cout << endl;

while (abs(z-x) > eps)

{ z = z - f(z) / fd(z);

x = x - f(x) / (f(z)-f(x)) * (z-x);

cout << "z = " << z << ", f(z) = " << f(z) << ",x = " << x << ",f(x) = " << f(x) << endl; k++; }
Rezulatele metodei mixte:

Interpretarea rezultatelor:

În urma aplicării algoritmilor observăm că metoda mixtă găsește soluția ecuației executând un număr
mai mic de iterații decât metoda coardelor.

Metoda mixtă a ajuns la rezultat executând 8 iterații, în timp ce metoda coardelor a făcut 228 de iterații.
Rezultatele calculate de ambele metode diferă cu miimi: prin metoda coardelor soluția reală este 1.2102,
dar cu metoda mixtă 1.22104.
Concluzie

În cadrul acestei lucrări de laborator au fost rezolvate ecuații algebrice liniare și transcendente prin
metoda analitică și grafică. Mulțimea soluțiilor găsite la ecuația rezolvată prin metoda analitică a fost
cercetată prin metoda coardelor și metoda mixtă.
Am determinat că mai efectiv este să se folosească metoda mixtă pentru că aceasta determină soluția
executând un număr minim de iterații.
Anexa A
Listingul deplin al programului

#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

float a, b, c, z, x;
float re, eps;
int i = 0, l = 1, k = 0;

float f (float x)
{
return (pow(x, 3) - 3 * pow(x, 2) + 12*x - 12);
}

float fd (float x)
{
return(3*pow(x, 2) - 6*x + 12);
}

void meniuPr()
{
int s;

cout << endl << "Enter a, b, eps: " << endl;


cin >> a >> b >> eps;

cout << endl << endl << " Meniu " << endl;
cout << " 1. Metoda I" << endl;
cout << " 2. Metoda II" << endl;
cout << " 0. Exit " << endl;

cin >> s;

switch (s) {

case 1:

re = a - (b-a)*f(a) / (f(b) - f(a));


while (abs(f(re)) > eps)
{
re = a - (b-a)*f(a) / (f(b) - f(a));
if (f(a)*f(re) <= 0)
b = re;
else a = re;
i++;
}
cout << endl << "f(x) = " << f(re) << endl << "x = " << re << endl << "Nr of iterations: " << i;
meniuPr();
return;

case 2:

c = a - f(a) / (f(b)-f(a)) * (b-a);


if (f(c)*f(a) > 0)
{
z = b; x = a;
k++;
}
else
{
z = a; x = b;
k++;
}
cout << endl;
while (abs(z-x) > eps)
{
z = z - f(z) / fd(z);
x = x - f(x) / (f(z)-f(x)) * (z-x);
cout << "z = " << z << ", f(z) = " << f(z) << ",x = " << x << ",f(x) = " << f(x) << endl;
k++;
}
cout << "Final solution: " << (z+x)/2 << endl;
cout << "Nr. of interations: " << k;

meniuPr();
return;

case 0:
system("cls");
cout << "You exited the program.";
return;

default:
system("cls");
cout << "No such option. Try another one.";
meniuPr();
}
}

int main()
{
meniuPr();
}

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