MINISTERUL EDUCAŢIEI ŞI ŞTIINŢEI AL REPUBLICII MOLDOVA UNIVERSITATEA TEHNICĂ A MOLDOVEI CATEDRA: Tehnologii Informationale
La disciplina Cercetari Operationale Lucrarea de laborator Nr-1 TEMA: Optimizarea neconditionata
ELABORAT: Studentul gr. TI-033
Prodan Serghei
VERIFICAT: Catruc Mariana
Chişinău
2005
1. Scopul lucrării: Studiul metodelor de optimizare nelineară fără restricţii Definirea şi utilizarea unor proceduri pentru minimizarea funcţiilor cu ajutorul metodei gradientului şi a metodelor de direcţii conjugate cu o eroare mai mica ca ε = 10 Analiza rezultatelor obţinute, inclusiv stabilirea tipului minimului: local sau global. Compararea rezultatelor, luînd în considerare numărul de iteraţii, evaluările pentru funcţii şi gradient. −5
descrierea algoritmilor utilizaţi: metoda gradientului : Se alege o constantă arbitrară
α
•
x
( k +1)
= x
( k )
f ( x − α k ∇
( k )
, şi se determină
z = x ( k )
f ( x −α ∇
( k )
)
, şi
)
f ( x ) Dacă condiţia f ( z ) f ( x ) , δ ∈(0,1) , este indeplinită, atunci şi procedura stopează. Altfel se fracţionează α prin înmulţirea cu un număr arbitrar pozitiv şi γ <1 , α α γ a.î. să fie asigurată descreşterea funcţiei conform condiţiei de la 2, şi începem iarăşi cu pasul 2. algoritmul Hestenes-Stiefel : f ( x f ( x ) =0 , atunci x ( 0 ) ) . Dacă ∇ Se alege arbitrar x ( 0 ) R şi se determină ∇ este o soluţie optimă, STOP. În caz contrar se consideră d = −∇ ( f ( x )), k = 0 şi se trece la pasul următor. Se determină lungimea pasului α de-a lungul direcţiei d ( k ) , care pleacă din x ( k ) , ceea ce revine la minimizarea în raport cu parametrul scalar α al funcţiei: ϕ (α ) = f ( x + α d ) . Determinarea lui α poate fi efectuată prin formula: ( k )
−
•
2
( k )
≤− δ α ∇
α k = α
•
k
•
∈
(0)
n
⋅
(0)
(0)
•
=
(0)
k
( k )
( k )
k
α k
=−
f ( x (∇
( k ) k
), d
( k )
)
k
( Ad ( ) , d ( ) )
sau printr-o procedură de aproximare a punctelor de extrem pentru
funcţiile de o singură variabilă. Se construieşte o aproximaţie nouă: f ( x f ( x ) . Dacă ∇ x = x + α d şi se calculează f ( x ) şi ∇ = x este o soluţie optimă. STOP. Altfel se trece la pasul următor: Se construieşte direcţia d ( k 1) conform relaţiei: •
( k +1)
( k )
( k )
( k + 1)
( k +1)
k
*
)
=0
, atunci x
( k +1)
+
•
d
( k + 1)
( k +1)
=− ∇ f ( x
( k +1)
)+
f ( x (∇
( k +1)
f ( x (∇
( k )
f ( x ,∇
( k +1)
f ( x ), ∇
( k )
))
))
d
( k )
după care se reia pasul 2 cu k++.
2. Codul sursă: //--------------------------------------------------------------------------#include #include #include //--------------------------------------------------------------------------double a,b;//Parametri pentru fiecare varianta int nMax;//Numarul maxim de iteratii double eps;//Valoarea aproximatiei //--------------------------------------------------------------------------double f(double X[]){//Returneaza valoarea functiei in punctul x,y return a*X[0]*X[0] + 2*X[0]*X[1] + b*X[1]*X[1] - 2*X[0] - 3*X[1]; } void grad(const double *x,double *y){//Calculeaza valoarea gradientului y[0] = 2*a*x[0] + 2*x[1] - 2; y[1] = 2*x[0] + 2*b*x[1] - 3; } int metGradient(double *x){//Metoda Gradientului
double y[2]; //Valoarea Gradientului double dir[2]; // Directia de minimizare double alfa,z[2]; // Alfa double norma,t1,t2; int n=0; // Numarul de iteratii do{ grad(x,y); dir[0] = -y[0];dir[1] = -y[1]; alfa = 5; int m=0; do{ z[0] = x[0] + alfa*dir[0]; z[1] = x[1] + alfa*dir[1]; norma = y[0]*y[0] + y[1]*y[1]; if(f(z)-f(x)<=-0.5*alfa*norma)m=1; else alfa/=5; }while(!m); x[0] = x[0] + alfa*dir[0]; x[1] = x[1] + alfa*dir[1]; grad(x,y); n++; }while(sqrt(neps)); return n; } double scalar(const double *x,const double *y,int n){//Inmultirea scalara a 2 vectori double s=0; for(int i=0;i
cout<<"Se determina minimul global al functiei"; cout<<"f(x,y)=(a*x*x)+2*x*y+(b*y*y)-2*x-3*y"<>a>>b; cout<<"Introduci valorile initiale:"; cin>>x[0]>>x[1]; x1[0] = x[0]; x1[1] = x[1]; cout<<"Introduceti aproximatia:"; cin>>eps; cout<<"Introduceti numarul maxim de iteratii:"; cin>>nMax; cout<<"Metoda Gradientului:"<
EXEMPLU DE CALCUL: Se determina minimul global al functieif(x,y)=(a*x*x)+2*x*y+(b*y*y)-2*x-3*y Introduceti valorile paramerilor a,b:1 3 Introduci valorile initiale:1 1 Introduceti aproximatia:0.0001 Introduceti numarul maxim de iteratii:21 Metoda Gradientului: x[0]=0.744927 x[1]=0.252118 n=21 f==-1.124982 Metoda Hestenes-Steifel: x[0]=0.75 x[1]=0.25 n=2 f==-1.125
3. Concluzii: In aceasta lucrare de laborator am programat algoritmi de optimizare neconditionata, in special: metoda gradientului si o metoda de directii conjugate – Hestenes-Steifel. Cea din urma este particulara pentru rezolvarea functiilor patratice (si rezolvarea unui sistem de ecuatii liniare cu matricea pozitiv definita). In general aceste metode se deosebesc prin alegerea directia de deplasare si pasul acesteia in pro cesul de minimizare a functiei.