Sunteți pe pagina 1din 4

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

RAPORT
Lucrarea de laborator nr.1
la Metode si modele de calcul

A efectuat:
st. gr. TI-162
Rbac Dumitru

A verificat:
Veronica Andrievschi-Bagrin

Chiinu - 2017
Lucrarea de laborator nr.1

Tema: Puncte de minim si maxim ale functiei

Scopul lucrrii : Acumularea deprinderilor practice de elaborare i programare a


metodelor de calcul matematica in limbaje de programare si implementarea
acestora
Condiia problemei (sarcina de lucru) : Aflarea punctului minim sau maxim al
functiei, utilizand metoda gradientului prin fractionarea pasului

Varianta 3:

a = 1; b = 4;

f(x1x2) = pow(x1,2)+(2*x1*x2)+(4*pow(x2,2))-(2*x1)-(3*x2)

Mersul lucrrii:

Pasii algoritmului:
1) Alegem un punct arbitrar initial cu coordonatele : x1 , x2;
2) Aflam derivata functiei in punctul x1 , x2;

Comparam cu = 0.00001 care reprezinta exactitatea rezultatului


- Daca urmareste conditia : am gasit punctul minim(maxim)
- In caz contrar :
a. Aflam punctul urmator in directia cresterii gradientului :
X[i]+=-(alph*Da[i]);
b. Verificam conditia : yx-ya <= sig*alph*pow(da,2);
- Daca urmareste conditia : am gasit un posibil punct de minim;
- In caz contrar :
c. Are loc injumatatirea pasului si calculam un alt potential punct de
minim;

Analiza datelor:

a) date de intrare: X[2] vector ce contine doua elemente : x1, x2;

b) date de ieire: X[0], X[1] coordonatele atribuite nou vectorului X in urma


calculelor;

c) date intermediare: A[2] vectorul ce stocheaza punctul precedent celui aflat


in urma miscarii in directia gradientului;
1
D[2] derivata punctului curent;
Da[2] derivata punctului precedent;
alph pasul;
bet, eps constante matematice;

Codul (textul) programului in limbajul C++:

#include <iostream>
#include<stdio.h>
#include <conio.h>
#include <math.h>
using namespace std;
int main (void)
{
float a,b;
float eps=0.00001, bet, sig=0.006;
float X[2], D[2], alph=1, A[2], Da[2];
int i;
float yx, ya, dx, da;
cout << "\tCalcularea punctului de minim al functiei\n\n\tMetoda gradientului
prin fractionarea pasului\n\n";
cout << "Alegem un punct 0 :" << endl;
for(i=0;i<2;i++)
{
cout << "\nX" << i+1 << " : ";
cin >> X[i];
}
cout << "\nAlegeti fractionarea pasului (<1) : ";
cin >> bet;
while(1)
{
D[0]= (2*X[0]) + (2*X[1]) - 2;
D[1]= (2*X[0]) + (8*X[1]) - 3;
dx=sqrt(pow(D[0],2)+pow(D[1],2));
if(dx<=eps)
{
cout << "\nPunctul de minim este : " << endl;
for(i=0;i<2;i++)
{
cout << "X" << i << "=" << X[i] << endl;
}
break;
}
while(2)
{
2
cout << "Calcularea urmatorului punct :" << endl;
for(i=0;i<2;i++)
{
A[i]=X[i];
}
Da[0]= (10*A[0]) + (2*A[1]) - 2;
Da[1]= (2*A[0]) + (6*A[1]) - 3;
da=sqrt(pow(Da[0],2)+pow(Da[1],2));
for(i=0;i<2;i++)
{
X[i]+=-(alph*Da[i]);
cout << "X" << i << "=" << X[i] << endl;
}
yx=pow(X[0],2)+(2*X[0]*X[1])+(4*pow(X[1],2))-(2*X[0])-(3*X[1]);
ya=pow(A[0],2)+(2*A[0]*A[1])+(4*pow(A[1],2))-(2*A[0])-(3*A[1]);

if(yx-ya<=sig*alph*pow(da,2))
{
cout << "\nAm gasit un posibil punct de minim." << endl;
break;
}
alph*=bet;
cout << "S-a indeplinit fractionarea pasului.\n\nAlfa = " << alph << endl;
}
}
return 0;
}

Rezultatele obtinute:
x1 = 0.8(3) , x2 = 0.1(6)

1. Verificarea ne arat c rezultatele obinute sunt corecte i programul lucreaz


corecte.
2. Au fost obinute primele deprinderi pentru scrierea unui program ce
implementeaza metode matematice de calculare in limbaj de programare.

Metoda gradientului prin fractionarea pasului s-a dovedit a fi eficienta datorita


posibilitatii de modificare a coeficientului de fractionare a pasului, afland in n pasi
punctul de minim sau maxim al functiei.

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