Sunteți pe pagina 1din 4

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

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică

Departamentul Inginerie Software și Automatică

Disciplina: Metode și modele de calcul II

RAPORT
la lucrarea de laborator nr. 1

Tema: Optimizarea funcției prin intermediul gradientului și fracționarea pasului

A efectuat: st. gr. TI-183, Calancea Cătălina


A verificat: Andrievschi-Bagrin Veronica

Chişinău – 2019
`

Obiective:
-
Studierea metodelor de optimizare neliniare fără restricții
-
Definirea și utilizarea unor proceduri pentru minimizarea funcțiilor cu ajutorul
metodei gradientului și a metodelor de direcție conjugată cu eroarea mai mică de
ε = 10-5
-
Analiza rezultatelor obținute, stabilirea tipului minimului, local sau global
-
Să se compare rezultatele luând în considerare numărul de iterații, evaluării pentru
funcție și gradient
Listingul programului:
#include <iostream>
#include <math.h>
#define MAX_ITER 5
using namespace std;

float f(float x1, float x2)


{
return (pow(x1,2)+2*x1*x2+4*pow(x2,2)-2*x1-3*x2);
}

float gradientCalc(float x1, float x2, bool firstLine)


{
if (firstLine)
return (2*x1+2*x2-2);
else return(2*x1+8*x2-3);
}

int main()
{
float alpha = 1;
float beta = 0.5;
float delta = 0.06;
float eps = 0.00001;
float x[MAX_ITER][2], z[2], gradient[2], norma;
int pos = 0, pas = 0, it;

x[pos][0]=0; x[pos][1]=0;
while (pas<MAX_ITER)
{
system("CLS");
it = 1;
gradient[0] = gradientCalc(x[pos][0],x[pos][1],true);
gradient[1] = gradientCalc(x[pos][0],x[pos][1],false);
2
`

cout<<"x"<<pas<<" = ("<<x[pos][0]<<", "<<x[pos][1]<<")"<<endl;


cout<<"gradient = ("<<gradient[0]<<", "<<gradient[1]<<")"<<endl;
norma = sqrt(pow(gradient[0],2)+pow(gradient[1],2));
cout<<"norma = "<<norma<<endl;
// In caz ca norma este mai mica, egal decat epsilon atunci programul ia sfarsit
if (norma<=eps)
{
cout<<"\n-------------- Sfarsitul programului --------------"<<endl;
cout<<norma<<" <= "<<eps<<endl;
return 0;
}

while (true) {
cout<<endl<<it<<" pas"<<endl<<"\talpha = "<<alpha<<endl;
z[0]=x[pos][0]-alpha*gradient[0];
z[1]=x[pos][1]-alpha*gradient[1];
cout<<"\tz = ("<<z[0]<<", "<<z[1]<<")"<<endl;

if (f(z[0],z[1])-f(x[pos][0],x[pos][1])<=-alpha*delta*pow(norma,2))
{
cout<<"\tf(z) = "<<f(z[0],z[1])-f(x[pos][0],x[pos][1])<<" <= "<<-
alpha*delta*pow(norma,2)<<endl;
cout<<endl<<endl<<"S-a confirmat comparatia, trecem la x"<<pos+1<<endl;
pos++;
x[pos][0]=z[0];
x[pos][1]=z[1];
break;
} else {
cout<<"\tf(z) = "<<f(z[0],z[1])-f(x[pos][0],x[pos][1])<<" > "<<-
alpha*delta*pow(norma,2)<<endl;
alpha*=beta;
}
it++;
}
getchar();
pas++;
}
return 0;
}

Concluzie:

3
`

În cadrul acestei lucrări de laborator am studiat metoda de optimizare a funcției prin


intermediul gradientului. Datele problemei au fost stabilite de către profesor, și astfel am
creat funcțiile în conformitate cu varianta problemei.Datorită variabilei pas calcul[m Z,
f(Z), gradientul, norma. Prin intermediul condiției de comparare, verificăm inegalitatea și
odată ce satisface condiția, se trece la următorul X. Astfel, acest proces se execută atâta
timp, până cînd norma este mai mică sau egală cu ε. În această lucrare de laborator am
obținut practică de lucru la elaborarea algoritmilor și programelor în limbajul C++. De
asemenea am folosit biblioteca math, care facilitează rezolvarea ecuațiilor matematice. În
urma elaborării acestei lucrări de laborator, este cert faptul că punctul optim poate fi
obținut printr-un număr finit de iterații.

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