Sunteți pe pagina 1din 5

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnica a Moldovei


Facultatea Calculatoare Informatica si Microelectronica

Lucrare de laborator Nr.1


la Cercetari Operationale

Tema: Structura mecanism de abstractizare

A efectuat st.gr TI-131:


A verificat:

Ppu Vitalie
Bagrin V.

Chiinu 2015

Scopul lucrrii:
Studiul metodelor de optimizare nelinear fr restricii
Definirea i utilizarea unor proceduri pentru minimizarea funciilor cu ajutorul metodei
gradientului i a metodelor de direcii conjugate cu o eroare mai mica ca 10 5
Analiza rezultatelor obinute, inclusiv stabilirea tipului minimului: local sau global.
Compararea rezultatelor, lund n considerare numrul de iteraii, evalurile pentru funcii
i gradient.
Descrierea algoritmilor utilizai:
metoda gradientului:
Se
x

alege

( k 1)

(k )

constant

k f ( x

(k )

arbitrar

, i se determin

z x ( k ) f ( x ( k ) ) ,

Dac condiia f ( z ) f ( x ) f ( x ) , (0,1) , este indeplinit, atunci k i


procedura stopeaz.
Altfel se fracioneaz prin nmulirea cu un numr arbitrar pozitiv i 1 , k a..
s fie asigurat descreterea funciei conform condiiei de la 2, i ncepem iari cu pasul
2.
(k )

f(x,y)=ax12+2x1x2+bx12-2x1-3x2
f(x,y)=3*x12+2x1x2+x22-2x1-3x2

(k )

a=3;
b=5;

Metoda Gradientului:

Textul programului in limbajul C++


#include<iostream>
#include<math.h>
using namespace std;
double func(double a, double b, double x1, double x2){
double f;
//a*x1^2 + 2*x1*x2 + b*x2^2 - 2*x1 - 3*x2
f = a*x1*x1 + 2 * x1*x2 + b*x2*x2 - 2 * x1 - 3 * x2;
return f;
}
double gx1(double a, double b, double x1, double x2){
double gx1;
//2*a*x1 + 2*x2 - 2
gx1 = 2*a*x1+2*x2-2;
return gx1;
}
double gx2(double a, double b, double x1, double x2){
double gx2;
//2*x1 + 2*b*x2 - 3
gx2 = 2*x1+2*b*x2-3;
return gx2;
}
double norm(double grx1, double grx2){
double norm;

norm = sqrt((grx1*grx1 + grx2*grx2));//*(grx1*grx1+grx2*grx2));


return norm;
}
double Z1(double x1, double grx1, double alfa){

double z1;
z1 = x1 - alfa*grx1;
return z1;

double Z2(double x2, double grx2, double alfa){


double z2;
z2 = x2 - alfa*grx2;
return z2;
}
double *rez(double a, double b, double x1, double x2, double alfa, double ro){
double
double
double
double
double
double

f = func(a, b, x1, x2);


grx1 = gx1(a, b, x1, x2);
grx2 = gx2(a, b, x1, x2);
norma = norm(grx1, grx2);
z1 = Z1(x1, grx1, alfa);
z2 = Z2(x2, grx2, alfa);

bool Cond = true;


while (Cond){
if (func(a, b, z1, z2) - func(a, b, x1, x2) <= (-ro)*alfa*norma*norma){
Cond = false;
double *v = new double[3];
v[0] = z1;
v[1] = z2;
v[2] = norma;
return v;
break;
}

Cond = true;
alfa = alfa / 2;
z1 = Z1(x1, grx1, alfa);
z2 = Z2(x2, grx2, alfa);

}
int main(){
double a, b, x1, x2;
int iteratii = 0;
x1 = 1;
x2 = 1;
double alfa ;
cout << "ALFA = ";
cin >> alfa;
double eror ;
cout << "EROR = ";
cin >> eror;
double ro ;
cout << "RO = ";
cin >> ro;
double *rz = new double[3];
cout << "Introduceti valoarea lui a -> ";
cin >> a;
cout << "Introduceti valoarea lui b -> ";
cin >> b;
cout << endl << endl;
cout << "#Valorile in punctul initial x0 : " << endl << endl;
for (int i = 0; i<3; i++){
}

rz = rez(a, b, x1, x2, alfa, ro);

for (int i = 0; i<3; i++){


cout << "\t" << rz[i] << " ";
}
cout << endl << endl << endl;
cout << "#Valorile in punctele recaclculate : " << endl << endl;
bool COND = true;
double n = 10;
while (COND){
if (rz[2] <= eror){
COND = false;
cout << endl << endl;
cout << "\t" << "x1 = " << x1 << "\tx2 = " << x2 << "\tNorma2 = " << rz[2] << endl <<
endl;

cout << "Minimul functiei = " << func(a, b, x1, x2) << endl;
cout << "Numarul de iteratii = " << iteratii + 1 << endl;
}

break;

COND = true;
x1 = rz[0];
x2 = rz[1];
for (int i = 0; i<1; i++){

rz = rez(a, b, x1, x2, alfa, ro);


cout << "x1 = " << x1 << "\tx2 = " << x2 << "\tNorma2 = " << rz[2] << endl;
iteratii++;

}
cout << endl << endl;
system("pause");
}

Rezultatul la execuie

Concluzie:
Efectuand acest laborator am studiat i am aplicat n practic noiunile elementare de
optimizare neliniara, metoda gradientului pentru rezolvarea exerciiului propus primul
program prin Metoda gradientului care pornete de la o aproximatie iniial x(0) i se
genereaz iruri de vectori. Paii algoritmului const n : 1)alegerea valorii arbitrare alfa 2)se
verific condiia 3)dac este ndeplinit condiia atunci valoarea care o are alfa este
acceptat.