Documente Academic
Documente Profesional
Documente Cultură
5. fminsearch
Scop: procedura determina minimul pentru o functie multivariabila fara constringeri
unde
este un vector iar f(x) o functie care retuneaza un scalar
Sintaxa:
x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
x = fminsearch(fun,x0,options,P1,P2,...)
[x,fval] = fminsearch(...)
[x,fval,exitflag] = fminsearch(...)
[x,fval,exitflag,output] = fminsearch(...)
Descriere: procedura fminsearch , asa cum a fost definita anterior, rezolva problemele
de optimizre de tip neliniar si fara constringeri.
1
Argumente de intrare :
fun functie de minimizat. fun accepta un vector x si returneaza un scalar f, ce
reprezinta functia obiectiv evaluata in x. Functia fun se scrie::
x = fminsearch(@myfun,x0,A,b) unde myfun este o functie MATLAB :
function f = myfun(x)
f = ... % calculeaza faloarea functiei in x
fun poate fi de asemenea si un obiect in-line:
x = fminsearch(inline('norm(x)^2'),x0,A,b);
Argumente de iesire:
exitflag descrie conditiile de iesire
>0 functia converge catre solutia x
0 numarul maxim de functii evaluate prin algoritm a fost depasit
<0 functia nu converge catre o solutie
output contine informatii despre optimizare, avind structura:
iterations numarul de iteratii considerate
funcCount numarul evaluarilor functiei.
algorithm algoritm folosit
Optiuni:
Display tipurile afisarii 'off' nu se afiseaza iesirea; 'iter' se afiseaza iesirea dupa fiecare
iteratie; 'final' se afiseaza doar iesirea finala.
MaxFunEvals numarul maxim permis pentru evaluarile functiei
MaxIter numarul maxim permis pentru iteratii
TolFun limita tolerantei pentru valorile functiei
TolX limita tolerantei pentru x
2
Penrtru a minimiza functia f(x) = sin(x) + 3 folosind un obiect inline:
f = inline('sin(x)+3');
x = fminsearch(f,2);
Procedura fminsearch utilizeaza metoda de cautare simplex. Aceasta metoda este o
forma directa de cautare care nu utilizeaza gradinti, sub forma nalaitica ori numarica,
asa cum se procedeaza la celelalte proceduri prezentate. Procedura fminsearch poate
agata discontinuitati, mai ales daca ea nu este lansata, ca punct de start, din apropierea
solutiei. De asemenea, ea poate opera doar cu functii reale.In cazul functiilor
complexa, este nevoie ca functia sa fie despartita in cele doua componente.
6. fminunc
Scop: procedura determina minimul pentru o functie multivariabila avind constringeri
unde
este un vector iar f(x) o functie care retuneaza un scalar
Sintaxa:
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
x = fminunc(fun,x0,options,P1,P2,...)
[x,fval] = fminunc(...)
[x,fval,exitflag] = fminunc(...)
[x,fval,exitflag,output] = fminunc(...)
[x,fval,exitflag,output,grad] = fminunc(...)
[x,fval,exitflag,output,grad,hessian] = fminunc(...)
3
x = fminunc(fun,x0,options,P1,P2,...) transfera problema dependenta de parametrii
P1, P2, etc., direct functiei fun. Se seteaza options = [] in situatia in care nu sunt
optiuni setate.
[x,fval] = fminunc(...)returneaza in fval valoarea functiei obiectiv fun in x
[x,fval,exitflag] = fminunc(...)returneaza o valoare exitflag valoare ce descrie
conditiile de iesire din procedura fminsearch.
[x,fval,exitflag,output] = fminunc(...) returneaza o structura output, ce contine
informatii despre optimizare
[x,fval,exitflag,output,grad] = fminunc(...) returneaza in grad valoarea gradientului
lui fun calculata la solutia x.
[x,fval,exitflag,output,grad,hessian] = fminunc(...)returneaza hessian valoarea
hessianului functiei obiectiv fun calculata la solutia x.
Argumente de intrare :
fun functia minimizta prin procedura. fun accepta un vector x si returneaza scalarul f,
respectiv functia obiectiv calculata in x. Functia fun se poate scrie:c
x = fminunc(@myfun,x0), unde myfun este o functie MATLAB, astefel:
function f = myfun(x)
f = ... % calculeaza valoarea functiei in x x
De asemenea functia fun poate fi ca obiect inline:
x = fminunc(inline('norm(x)^2'),x0);
daca gradientul lui fun poate fi calculat si parametrul functiei GradObj este setat 'on',
prin options = optimset('GradObj','on') , atunci functia fun trebuie sa returneze in al
doilea parametru de iesire valoarea gradientului g, care este un vector, calculat in x.
Prin verificarea valorii lui nargout functia poate evita calculul lui g cind fun este
apelata cu doar un singur parametru de iesire, caz in care problema de optimizare are
nevoie doar de f dar nu si de g.
function [f,g] = myfun(x)
f = ... % ca;culeaza valoarea functiei in x
if nargout > 1 % fun apelata cu 2 argumente de iesire
g = ... % calculeaza gradientul g in x
end
Gradientul reprezinta derivatele partiale ale lui f in punctul x. Astel, componenta i a
lui g este derivata partiala a lui f dupa componenta i a lui x.
4
Daca matricea hessenian poate fi calculata si parametrul functiei Hessian este setat pe
'on', prin optiunea options = optimset('Hessian','on'), atunci functia fun trebuie sa
returneze valoarea hessianului H, care este o matrice patratica, prin al treilea argument
de iesire a lui x. Prin verificarea valorii lui nargout functia poate evita calculul lui H
cind fun este apelata cu doar un singur parametru de iesire sau cu doi parametri, caz
in care problema de optimizare are nevoie doar de f , g dar nu si de H.
function [f,g,H] = myfun(x)
f = ... % calculeaza valoarea functiei obiectiv in x
if nargout > 1 % fun apelata cu doua argumente de iesire
g = ... % gradientul; functiei calculat in x
if nargout > 2
H = ... % hessianul calculat in x
end
Matricea hessian este matricea derivatelor partiale de ordinul doi ale functiei f in
punctul x. Astfel, daca componenta (i,j) a lui H derivata partiala de ordin doi a lui f in
acord xi si xj, . Prin definitie, matricea hessian este o matrice simetrica.
Argumente de iesire:
exitflag descrie conditiile de iesire
>0 functia converge catre solutia x
0 numarul maxim de functii evaluate prin algoritm a fost depasit
<0 functia nu converge catre o solutie
output contine informatii despre optimizare, avind structura:
iterations numarul de iteratii considerate
funcCount numarul evaluarilor functiei.
algorithm algoritm folosit
cgiterations numarul de iteratii PCG –doar pentru algoritmii tip large scale
stepsize masuara pasului final-doar pentru algoritmii mediun scale
firstorderopt masura normei optimale de ordin prim pentru gradient la x.
5
Parametrii pentru algoritmi large-scale si medium-scale. Parametrii urmatori se
folosesc la ambele tipuri de algoritmi:
Diagnostics tipareste informatii tip diagnostic despre functia optimizata
Display tipurile afisarii 'off' nu se afiseaza iesirea; 'iter' se afiseaza iesirea dupa fiecare
iteratie; 'final' se afiseaza doar iesirea finala..
GradObj gardientul pentru functia obiectiv definite de utilizator. Se foloseste la
aplicatiile de tip large scale si este optionala folosirea la cele standard, medium scale
MaxFunEvals numarul maxim permis pentru evaluarile functiei
MaxIter numarul maxim permis pentru iteratii
TolFun limita tolerantei pentru valorile functiei
TolX limita tolerantei pentru x
6
MaxPCGIter numarul maxim de iteratii tip PCG (preconditioned conjugate gradient)
PrecondBandWidth limita superioara a domeniului preconditionat pentru PCG. Pentru
unele probleme marirea domeniului reduce numarul de itaratii PCG..
TolPCG limita abaterii pentru oteratiile PCG
TypicalX valorile tipice ale lui x .
7
De asemenea se indica faptul ca valoarea gradientului este o data valabila prin
crearea structurii optionale de optimizare GradObj al carei parametru se seteaza pe on
folosinf functia optimset:
options = optimset('GradObj','on');
x0 = [1,1];
[x,fval] = fminunc(@myfun,x0,options)
Rezultatele obtinute dupa mai multe iteratii sunt:
x=
1.0e-015 *
0.1110 -0.8882
fval2 =
6.2862e-031
Observatii :
Procedura fminunc nu este recomandata pentru rezolvarea problemelor de optimizare
care au forma «suma de patrate » :
7. fseminf
Scop: procedura determina minimul pentru o functie multivariabila, neliniara, avind
un set de constringeri semi-infinit:
avind restrictiile:
A x b
Aeq x beq
8
…
unde:
x, b, beq, lb, si ub sunt vectori,
A si Aeq sunt matrici,
c(x) and ceq(x) sunt functii care returneaza vectori,
f(x) functie care returneaza scalar.
f(x), c(x), ceq(x) pot fi functii neliniare
sunt vectori sau matrici ce reprezinta functii continue cu variabile x, plus
un numar suplimentar variabile . Functiile acestea returneaza vectori.
Sintaxa:
x = fseminf(fun,x0,ntheta,seminfcon)
x = fseminf(fun,x0,ntheta,seminfcon,A,b)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,...
lb,ub,options,P1,P2,...)
[x,fval] = fseminf(...)
[x,fval,exitflag] = fseminf(...)
[x,fval,exitflag,output] = fseminf(...)
[x,fval,exitflag,output,lambda] = fseminf(...)
Descriere: procedura fseminf determina minimul unei functii scalare supusa unui set
de restrictii de tip functii multivariabile. Scopul este minimizarea functiei f(x) si in
acelasi timp de a tine seama de toate variabilele
x = fseminf(fun,x0,ntheta,seminfcon) porneste procedura in punctul x0 si determina
minimul functiei fun sub constringerea ntheta de tip semi-infinit, constringere
continuta in functia seminfcon.
9
x = fseminf(fun,x0,ntheta,seminfcon,A,b) rezolva restrictiile de tip inecuatii liniare
A*x <= b.
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq) rezolva si restrictiile de tip ecuatii
liniare Aeq*x = beq. Daca nu exista restrictii tip inecuatii, se seteaza A=[] , b=[] .
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub) definesc limitele pentru
variabila de optimizare x, de forma lb <= x <= ub.
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options) minimizarea tine
seama de parametrii de optimizare din structura options. Setarea optiunii se face prin
optimset.
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options,
P1,P2,...) Transfera problema de tip dependenta de parametrii P1, P2, etc., direct
functiilor fun si seminfcon. Se folosesc matrici goale si placeholderi daca din
problema lipsesc, in sensul ca nu sunt necesari A, b, Aeq, beq, lb, ub, options.
[x,fval] = fseminf(...) returneaza faloarea functiei obiectiv fun calculata in x.
[x,fval,exitflag] = fseminf(...) returneaza valoarea parametrului exitflag care descrie
conditiile de parasire a procedurii
[x,fval,exitflag,output] = fseminf(...) returneaza structura output care ofera informatii
aspra optimizarii
[x,fval,exitflag,output,lambda] = fseminf(...)returneaza lambda care contine
multiplicatorul lagrange calculat in punctul x.
10
end
w1 = ...% calculeaza setul de esantioane
w2 = ...% calculeaza setul de esantioane
...
wntheta = ... % calculeaza setul de esantioane
K1 = ... % prima constringere semi-infinita in x si w
K2 = ... % a doua constringere semi-infinita in x si w
...
Kntheta = ...% ultima constringere semi-infinita in x si w
c = ... % calculeaza inecuatiile neliniare in x
ceq = ... % calculeaza ecuatiile neliniare in x
S este intervalul de esantionare recomandat care poat fi sau nu utilizat.
Exemple:
1.cazul unidimensional :
sa se minimizeze functia
unde :
11
Se scrie M-file-ul care calculeaza functia obiectiv :
function f = myfun(x,s)
% functia obiectiv
f = sum((x-0.5).^2);
Se scrie M-file-ul mycon.m care calculeaza constringerile de tip ecuatii, inecuatii si
constringerile de tip semi-infint :
function [c,ceq,K1,K2,s] = mycon(X,s)
% internalul initial de esantionare
if isnan(s(1,1)),
s = [0.2 0; 0.2 0];
end
% setul de esantioanere
w1 = 1:s(1,1):100;
w2 = 1:s(2,1):100;
% constringerile semi-infinite
K1 = sin(w1*X(1)).*cos(w1*X(2)) - 1/1000*(w1-50).^2 -...
sin(w1*X(3))-X(3)-1;
K2 = sin(w2*X(2)).*cos(w2*X(1)) - 1/1000*(w2-50).^2 -...
sin(w2*X(3))-X(3)-1;
% nu exista constringeri finite neliniare
c = []; ceq=[];
% traseaza graficul constringerilor semi-infinite
plot(w1,K1,'-',w2,K2,':'),title('constringeri semi-infinite')
drawnow
12
max(K2)
ans =
-0.0845
Graficul constringerilor semi-infinite este:
unde :
13
function [c,ceq,K1,s] = mycon(X,s)
% intervalul initial de esantionare
if isnan(s(1,1)),
s = [2 2];
end
% setul de esantioane
w1x = 1:s(1,1):100;
w1y = 1:s(1,2):100;
[wx,wy] = meshgrid(w1x,w1y);
% constringerile semi-infinite
K1 = sin(wx*X(1)).*cos(wx*X(2))-1/1000*(wx-50).^2 -...
sin(wx*X(3))-X(3)+sin(wy*X(2)).*cos(wx*X(1))-...
1/1000*(wy-50).^2-sin(wy*X(3))-X(3)-1.5;
% nu exista constringeri neliniare finite
c = []; ceq=[];
% Mesh plot
m = surf(wx,wy,K1,'edgecolor','none','facecolor','interp');
camlight headlight
title('constringeri semi-infinite')
drawnow
1 w1 100 ≤≤
1 w2 100 ≤≤
x 0.25 0.25 0.25 =
Se apeleaza acum procedura de optimizare:
x0 = [0.25, 0.25, 0.25]; % punctul de start
[x,fval] = fseminf(@myfun,x0,1,@mycon)
Dupa noua iteratii se obtin rezultatele:
x=
0.2926 0.1874 0.2202
fval =
0.0091
Graficul obtinut pentru constringere este:
14
8. linprog
Scop: procedura rezolva problemele de programare liniara de tipul:
in conditiile:
15
x = linprog(f,A,b) rezolva min f'*x asa incit A*x <= b.
x = linprog(f,A,b,Aeq,beq) rezolva acelasi tip de problema la care adauga si
constringeri de tip ecuatii Aeq*x = beq. Se seteaza A=[] si b=[] in cazul in care nu
exista inecuatii in cadrul constringerilor
x = linprog(f,A,b,Aeq,beq,lb,ub) definesc setul de limite superioare si inferioare
pentru variavila de optimizar lb <= x <= ub. Set seteaza Aeq=[], beq=[] daca nu exista
ecuatii in constringeri
x = linprog(f,A,b,Aeq,beq,lb,ub,x0) seteaza punctul de start in x0. Optiunea este
valabila pentru algoritmii de tip madium-scale.
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options) minimizeaza prin structura de parametrii
de optimizare din options. Se seteaza prin functia optimset
[x,fval] = linprog(...) returneaza valoarea functiei obiectiv fun in punctul solutiei
x: fval = f'*x.
[x,lambda,exitflag] = linprog(...) returneaza valoarea exitflag care descrie conditiile de
iesire din procedura
[x,lambda,exitflag,output] = linprog(...) returneaza structura output care contine
informatii despre optimizare
[x,fval,exitflag,output,lambda] = linprog(...) returneaza o structura lambda care
contine lagrangeanul multiplicator pentru solutia x.
16
A = [1 -1 1
324
3 2 0];
b = [20; 42; 30];
lb = zeros(3,1);
Se apeleaza procedura de programare liniara:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);
Marimile inregistrate in procedura x, lambda.ineqlin, lambda.lower au valorile
x=
0.0000
15.0000
3.0000
lambda.ineqlin =
0
1.5000
0.5000
lambda.lower =
1.0000
0
0
9. quadprog
Scop: procedura rezolva problemele de programare patratica de tipul:
in conditiile:
17
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options,p1,p2,...)
[x,fval] = quadprog(...)
[x,fval,exitflag] = quadprog(...)
[x,fval,exitflag,output] = quadprog(...)
[x,fval,exitflag,output,lambda] = quadprog(...)
18
Argumente de iesire: exitflag, lambda, output:au fost prezentate anterior
, avind restrictiile
19
3.1111
0.4444
0
lambda.lower
ans =
0
0
Obsevatii: procedura de programare patratica determina solutia locala in afara cazului
in care problemele sunt strict convexe. Rezultate numerice mai bune se obtin daca se
restrictiile de tip ecuatii sunt specificate explicit prin functiile Aeq, beq folosind si
limitele de interval lb, ub.
20