Sunteți pe pagina 1din 11

Ministerul Educatiei din Republica Moldova

Facultatea Calculatoare Informatica si Microelectronica


Catedra Informatica Aplicata
La disciplina Cercetari operationale
Lucrare de Laborator Nr:1
TEMA: Optimizarea necondi ionat. Minimizarea
func iilor cu ajutorul metodei gradientului cu
frac ionarea pasului.
A efectuat: st.gr.MI-101 Ursu Ion

A verificat: lector superior Catruc Mariana


Chiinu 2012
Sarcina 12
S se determine minimul global al func iei p tratice
cu autorul metodei gradientului cu frac ionarea pasului cu preci!ia .
"olorile initiale : a#$ b#%.
Descrierea algoritmului metodei gradientului cu frac ionarea
pasului
1. Se alege o valoare arbitrar & 'una i aceea i la fiecare itera ie() se
determin punctul i se calculea! f'!(*
%. Se verific condi ia unde + este o
constant arbitrar ,n intervalul '0)1(*
$. -ac este ,ndeplinit inegalitatea de mai sus) atunci valoarea & este
acceptat i se va lua . .n ca! contrar se frac ionea! & prin
,nmul irea lui & cu un numr arbitrar po!itiv i . /rocesul continu
p,n c,nd este satisfcut inegalitatea de mai sus.
0. Se calculea! .
1ste de dorit s continum procesul) p,n c,nd .
-ac re!olvm manual aceast problem prin metoda gradientului ob inem solu ia
optim . Avem nevoie de acest re!ultat pentru a verifica corectitudinea
calculelor efectuate de ctre program.
Codul sursa :
//---------------------------------------------------------------------------
#include<iostream.h>
#include<math.h>
#include<conio.h>
//---------------------------------------------------------------------------
double a,b;
%
//Parametri pentru fiecare varianta
int nMax;
//Numarul maxim de iteratii
double eps;
//aloarea aproximatiei
//---------------------------------------------------------------------------
double f!double "#$%
&
//'eturnea(a valoarea functiei in punctul x,)
return a*"#+$*"#+$ , -*"#+$*"#.$ , b*"#.$*"#.$ - -*"#+$ - /*"#.$;
0
void 1rad!const double *x,double *)%
&//2alculea(a valoarea 1radientului
)#+$ 3 -*a*x#+$ , -*x#.$ - -;)#.$ 3 -*x#+$ , -*b*x#.$ - /;
0
int met4radient!double *x%
&
//Metoda 4radientului
double )#-$; //aloarea 4radientului
double dir#-$; // 5irectia de minimi(are
double alfa,(#-$; // 6lfa
double norma,t.,t-;
int n3+; // Numarul de iteratii
do
&
1rad!x,)%;
dir#+$ 3 -)#+$;
dir#.$ 3 -)#.$;
alfa 3 7;
int m3+;
do
&
(#+$ 3 x#+$ , alfa*dir#+$;
(#.$ 3 x#.$ , alfa*dir#.$;
norma 3 )#+$*)#+$ , )#.$*)#.$;
if!f!(%-f!x%<3-+.7*alfa*norma%m3.;
else alfa/37;
0
8hile!9m%;
x#+$ 3 x#+$ , alfa*dir#+$;
x#.$ 3 x#.$ , alfa*dir#.$;
1rad!x,)%;
n,,;
0
8hile!s:rt!n<nMax%;;!s:rt!)#.$*)#.$,)#+$*)#+$%>eps%%;
return n;
0
double scalar!const double *x,const double *),int n%
$
&//<nmultirea scalara a - vectori
double s3+;
for!int i3+;i<n;i,,%s ,3 x#i$*)#i$;
return s;
0
//---------------------------------------------------------------------------
int main!%
&
double x#-$,x.#-$;
int n;
textbac=1round!>%;
clrscr!%;

cout<<?@e determina minimul 1lobal al functiei?;
cout<<?f!x,)%3!a*x*x%,-*x*),!b*)*)%--*x-/*)?<<endl;
cout<<?<ntroduceti valorile paramerilor a,bA?;
cin>>a>>b;
cout<<?<ntroduci valorile initialeA?;
cin>>x#+$>>x#.$;
x.#+$ 3 x#+$;
x.#.$ 3 x#.$;
cout<<?<ntroduceti aproximatiaA?;
cin>>eps;
cout<<?<ntroduceti numarul maxim de iteratiiA?;
cin>>nMax;
cout<<?Metoda 4radientuluiA?<<endl<<endl;
n3met4radient!x%;
cout<<?x#+$3?<<x#+$;
cout<<endl<<?x#.$3?<<x#.$;
cout<<endl<<?n3?<<n;
cout<<endl<<?f33?<<f!x%;
cin.1et!%;
cin.1et!%;
return +;
0
Exemplu de calcul:
Fig1.valorile initiale (0 0)
0
Fig2.valorile initiale (1 1)
Fig3.valorile initiale (10 10)
In aceasta lucrare de laborator am programat algoritmi de optimi!are
neconditionata) in special: metoda gradientului si o metoda de directii conugate 2 3estenes-
Steifel. Cea dinurma este particulara pentru re!olvarea functiilor patratice 'si
re!olvarea unui sistem deecuat ii liniare cu matricea po!itiv definita(. In general
aceste metode se deosebesc prinalegerea directia de deplasare si pasul acesteia in pro cesul
de minimi!are a functiei
4
Ministerul Educatiei din Republica Moldova
Facultatea Calculatoare Informatica si Microelectronica
Catedra Informatica Aplicata
La disciplina Cercetari operationale
Lucrare de Laborator Nr:2
TEMA: Optimizarea necondi ionat. Minimizarea
func iilor cu ajutorul metodei Hestenes-Stiefel.
Compararea metodei Hestenes-Stiefel i metodei
gradientului cu frac ionarea pasului.
5
A efectuat: st.gr.MI-101 Ursu Ion

A verificat: lector superior Catruc Mariana


Chiinu 2012
Sarcina 12
S se determine minimul global al func iei p tratice
cu autorul metodei 3estenes-Stiefel. S se compare eficien a algoritmului
3estenes-Stiefel i algoritmului metodei gradientului cu frac ionarea pasului.
"olorile initiale : a#$ b#%.
Descrierea algoritmului metodei Hestenes-Stiefel
1. Se alege arbitrar i se determin . -ac )
atunci este solu ie optim. S67/. .n ca! contrar se consider
) i se trece la pasul urmtor*
%. Se determin lungimea pasului de-a lungul direc iei ) care pleac din
) ceea ce revine la minimi!area ,n raport cu parametrul scalar & al
func iei . -eterminarea lui poate fi efectuat prin
formula: *
$. Se construie te o apro8ima ie nou: ) dac
atunci am aflat solu ia optim) S67/. Altfel trecem la
pasul urmtor*
9
0. Se construie te direc ia )
dup care se reia pasul %.
Algoritmul 3estenes-Stiefel garantea! c dup un numr finit de itera ii ce nu
dep e te n s ob inem solu ia e8act a problemei.
-ac re!olvm manual aceast problem prin metoda gradientului ob inem solu ia
optim . Avem nevoie de acest re!ultat pentru a verifica corectitudinea
calculelor efectuate de ctre program.
Codul sursa :
//---------------------------------------------------------------------------
#include<iostream.h>
#include<math.h>
#include<conio.h>
//---------------------------------------------------------------------------
double a,b;
//Parametri pentru fiecare varianta
int nMax;
//Numarul maxim de iteratii
double eps;
//aloarea aproximatiei
//---------------------------------------------------------------------------
double f!double "#$%
&
//'eturnea(a valoarea functiei in punctul x,)
return a*"#+$*"#+$ , -*"#+$*"#.$ , b*"#.$*"#.$ - -*"#+$ - /*"#.$;
0
void 1rad!const double *x,double *)%
&//2alculea(a valoarea 1radientului
)#+$ 3 -*a*x#+$ , -*x#.$ - -;)#.$ 3 -*x#+$ , -*b*x#.$ - /;
0
double scalar!const double *x,const double *),int n%
&//<nmultirea scalara a - vectori
double s3+;
for!int i3+;i<n;i,,%s ,3 x#i$*)#i$;
return s;
0
int met2onB!double *x%
& //Metoda Cestenes - @tiefel
double x.#-$;
double )#-$,).#-$;// aloarea 4radientului
double dir#-$; // 5irectia
double alfa,(#-$;
double norma;
:
double 6#-$#-$ 3 &&-*a,-0,&-,-*b00; //Matricea 6
int n3+; //Numarul de iteratii
1rad!x,)%;
dir#+$ 3 -)#+$;
dir#.$ 3 -)#.$;
do
&
double (m(#-$;
(m(#+$ 3 scalar!6#+$,dir,-%;
(m(#.$ 3 scalar!6#.$,dir,-%;
1rad!x,)%;
alfa 3 -scalar!),dir,-%/scalar!(m(,dir,-%;
x.#+$ 3 x#+$ , alfa*dir#+$;
x.#.$ 3 x#.$ , alfa*dir#.$;
1rad!x.,).%;
x#+$ 3 x.#+$;
x#.$ 3 x.#.$;
if!s:rt!).#.$*).#.$,).#+$*).#+$%<eps%
&
n,,;
return n;
0
double temp#-$,beta;
beta 3 scalar!).,).,-%/scalar!),),-%;
dir#+$ 3 -).#+$ , beta*dir#+$;
dir#.$ 3 -).#.$ , beta*dir#.$;
n,,;
0
8hile!!n<nMax%%;
0
//---------------------------------------------------------------------------
int main!%
&
double x#-$,x.#-$;
int n;
textbac=1round!>%;
clrscr!%;

cout<<?@e determina minimul 1lobal al functiei?;
cout<<?f!x,)%3!a*x*x%,-*x*),!b*)*)%--*x-/*)?<<endl;
cout<<?<ntroduceti valorile paramerilor a,bA?;
cin>>a>>b;
cout<<?<ntroduci valorile initialeA?;
cin>>x#+$>>x#.$;
x.#+$ 3 x#+$;
x.#.$ 3 x#.$;
cout<<?<ntroduceti aproximatiaA?;
cin>>eps;
cout<<?<ntroduceti numarul maxim de iteratiiA?;
cin>>nMax;
cout<<endl<<endl<<?Metoda Cestenes-@teifelA?<<endl;
;
n3met2onB!x.%;
cout<<endl<<?x#+$3?<<x.#+$<<endl<<?x#.$3?<<x.#.$;
cout<<endl<<?n3?<<n;
cout<<endl<<?f33?<<f!x.%;
cin.1et!%;
cin.1et!%;
return +;
0
Exemplu de calcul:
Fig1.valorile initiale (0 0)
Fig2.valorile initiale (1 1)
Fig3.valorile initiale (2 2)
10
Fig4.valorile initiale (5 5)
11

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