RAPORT
la lucrarea de laborator nr. 3
la disciplina
Cercetări Operaționale
Tema: Metoda gradientului conjugat Polak - Ribiere
Varianta 13
Să se determine minimul global al funcției:
2 2
F(x,y) = e−(x +y ) ∗ (𝑎𝑥 2 + 𝑏𝑦 2 )
a=3
b=1
Listing–ul programului:
#include <iostream>
#include <math.h>
int a = 3;
int b = 1;
int A[4];//= {2 * a, 2, 2, 2 * b};
float eps = pow(10, -6);
//e^(-(x^2 + y^2)) * (3 * x^2 + 1* y^2)
float f(float x1, float x2)
{
float s;
s = exp(- x1 * x1 - x2 * x2) * (- 2 * x1 * a * x1 * x1 + b * x2 * x2 + 2 *
x1 * a);
return s;
}
s = exp(- x1 * x1 - x2 * x2) * (- 2 * x2 * a * x1 * x1 + b * x2 * x2 + 2 *
x2 * b);
return s;
}
s = sqrt(pow(x1,2) + pow(x2,2));
return s;
}
int count = 0;
Hesiana(x_1,x_2);
gr1 = gradient1(x_1, x_2);
gr2 = gradient2(x_1, x_2);
mod_x = modulo2(gr1, gr2);
d_1 = - gr1;
d_2 = - gr2;
while(mod_x > eps)
{
A_d[0] = (A[0] * d_1 + A[1] * d_2);
A_d[1] = (A[2] * d_1 + A[3] * d_2);
gr_d = (gr1 * d_1) + (gr2 * d_2);
Ad_d = (A_d[0] * d_1) + (A_d[1] * d_2);
alpha = - (gr_d/Ad_d);
x_1 = x_1 + alpha * d_1;
x_2 = x_2 + alpha * d_2;
gr1_1 = gradient1(x_1, x_2);
gr1_2= gradient2(x_1, x_2);
mod_x = modulo2(gr1_1, gr1_2);
beta = ((gr1_1 * (gr1_1 - gr1)) + (gr1_2 * (gr1_2 - gr2)))/(mod_x *
mod_x);
d_1 = -gr1_1 + beta * d_1;//-
d_2 = -gr1_2 + beta * d_2;
gr1 = gr1_1;
gr2 = gr1_2;
count++;
}
system("clear");
cout << "Numărul de iterații efectuate " << count << endl;
cout << "x1 = " << x_1 << endl;
cout << "x2 = " << x_2 << endl;
cout << "f(x) = " << f(x_1, x_2) << endl;
system ("read -n1 -p '' key");
}
int main()
{
Polak_Ribiere(0,0);
}
Efectuînd această lucrare de laborator am studiat metoda gradientului conjugat propusă de Polak și Ribiere. Cu
ajutorul acestei metode am creat un program pentru minimizarea funcției. În cazul variantei propuse, avind punctele
inițiale de pornire (0,0) algoritmul Polak – Ribiere nu a efectuat nici o iterațiie, deoarece condiția de stopare era inițial
satisfăcută. Pentru verificarea rezultatelor, putem compara datele obținute în urma execuției programului(Fig. 1) cu
datele obținute prin intemediul Wolfram Alpha(Fig. 2).
În cazul funcțiilor pătratice, algoritmul Polak – Ribiere și algoritmul Fletcher – Reevs, pentru calcularea
coeficientilor 𝛽 coincid. În cazul minimizării funcțiilor convexe nepătratice, algoritmul propus de Fletcher și Reevs are
proprietăți de convergență mai slabe, de aceea în acest caz este recomandat algoritmul lui Polak și Ribiere.