LEZIONE ICO 12-10-2009
Argomento: introduzione alla piattaforma Matlab. Risoluzione numerica di problemi di minimo liberi e vincolati.
Lucia Marucci
[email protected]
http://www.mathworks.com/access/helpdesk/help/toolbo
x/optim/optim.shtml
Definizione funzione obiettivo in Matlab
Definizione della funzione obiettivo :
creazione di una MATLAB function:
• Input
• Output
• Modi di scrivere la funzione obiettivo:
1. Creare una funzione anonima nella riga di comando
2. Scrivere un M-file
3. Utilizzo del comando “Inline”
1.Creare una funzione anonima
nella riga di comando
esempio
>>f = @(x) 2*x^2-3*x+4;
>>f(3)
ans = 13
>>f = @(x,y) 2*x*y;
>>f(2,2)
ans = 8
Si utilizza quando la f è semplice o
quando non si userà in una
successiva sessione di MATLAB
2.
Usando il comando inline
• Utilizzando il comando inline:
– Crea una funzione nella linea di comando:
Sintassi: f = inline(‘expr’,’n’) con
>f = inline('2*x^2-3*x+4','x');
>>f(3)
ans = 13
>> f = inline('2*x*y', 'x', 'y');
>> f(2,2)
ans = 8
3.
Scrivere un M-file
Bisogna aprire un file di Matlab editor
function [out1, out2, ...] = funname(in1,in2, ...)
esempio: nell’editor square.m
function f = square(x)
f = x.^2;
Nella command window si richiama la funzione
@ square per creare una funzione handle per
square. Si può usare questo metodo quando la f(x)
è complicata o se si intende riutilizzare la funzione.
NOTA BENE attenzione ai path!
MINIMIZZAZIONE NON VINCOLATA:
fminunc
• Scopo: trovare il minimo di una funzione
multivariabile non vincolata:
– x è un vettore ed f(x) è una funzione che ritorna uno
scalare
• Sintassi:
[x,fval,exitflag,output,grad,hessian] =
fminunc(fun,x0,options)
INPUT
• x0 è punto iniziale di ricerca, scalare, vettore o matrice
• fun è la funzione obiettivo
• options: crea attraverso il comando optmiset parametri di
ottimizzazione (numero di iterazioni, tolleranza
dell’algoritmo,ecc..)
OUTPUT
• fval valore della funzione obiettivo nel punto di minimo
• Exitflag: descrive le condizioni di uscita
• Output: genera una struttura di uscita che riporta informazioni
circa l’operazione di ottimizzazione
• grad: ritorna il valore del gradiente di fun alla soluzione x
• hessian: ritorna il valore dell’hessiano di fun alla soluzione x
Input
>>x = fminunc (myfun,x0)
x0=scelta iniziale;
myfun è una Matlab function, ovvero:
x = fminunc(@myfun,x0)
function f = myfun(x)
f = ...
Input
>>x = fminunc (myfun,x0,options)
Options:
Sintassi:
options=optimset('param1',value1,'param2',value2,...)
Algoritmi utilizzati da fminunc
• Per default fminunc utilizza algoritmi :
– Quasi Newton method con BFGS, steepest
discendent
medium scale: se poniamo nell’opzione LargeScale ‘off’ nel
comando optimset
– Trust region method, Newton method e gradiente
coniugato
large scale: se l’opzione GradObj è ‘on’ nel comando
optimset
Output
• x: valore ottimo (soluzione del problema)
• fval: valore della funzione nel punto ottimo
• exitflag: descrive le condizioni di uscita:
» se>0 la funzione converge ad una soluzione x
» se=0 l’algoritmo non è in grado di ottenere una
soluzione nel numero di iterazioni stabilite
» se <0 la funzione non converge alla soluzione x
• output: informazioni circa il processo di ottimizzazione
»
»
»
»
»
Iterations: numero di iterazione dell’algoritmo
funcCount : numero di valutazioni della funzione
Algorithm: algoritmo usato
Step-size
Firstorderopt: norma del gradiente nella soluzione
Esempio 1: Unconstrained Minimization
• Problema di minimizzazione della
funzione:
• Passi da effettuare:
– Generare un M-file che ritorni il valore della
funzione
– Invocare la routine di risoluzione fminunc
Step 1: scrittura dell’M-file myfun.m
Step 2: nella command window chiamo
fminunc
>>x0=[1 1];
>>[x,fval] = fminunc(@myfun,x0)
Quasi_Newton
• Minimizziamo con un altro algoritmo:
•
Modifichiamo l’M-file:myfun.m fornendo gradiente
• Creazione di una struttura options
trust-region Newton
Limiti dell’ fminunc
• La funzione da minimizzare deve essere
continua
• Potrebbe determinare soluzioni locali
• Ottimizzazione di funzioni di variabili reali: x
deve essere una variabile reale
MINIMIZZAZIONE NON VINCOLATA
fminsearch
• Trova il minimo di una funzione obiettivo multivariabile in
assenza di vincoli SENZA CALCOLARE GRADIENTE
ALGORITMO: Nelder-Mead simplex direct search
• Sintassi:
– x= fminsearch (fun,x0), partendo da un punto di
ricerca iniziale tenta di trovare il minimo di fun
– fun è una funzione descritta nella linea di
comando, dal comando inline o da un M.file
– x= fminsearch (fun,x0,options), tenta la
minimizzazione usando il parametro options.
Usare optimset per stabilire le opzioni
dell’algoritmo
• [x,fval]=fminsearch(…) , riporta in fval il valore il
valore della funzione obiettivo fun nel valore x
• [x,fval,exitflag]=fminsearch(…), riporta un valore
exitflag che descrive le condizioni di uscita di
fminsearch
• [x,fval,exitflag,output]=fminsearch(…), riporta in
output le informazioni inerenti il processo di
ottimizzazione.
• [x,fval,exitflag,output]=fminsearch(…P1,P2…),
dove P1… Pn sono parametri della funzione
obiettivo
Input arguments
• fun: funzione da minimizzare
– fun può essere:
• M.file:
con myfun Matlab function
• Funzione anonima nella linea di comando
• Options: valgono le stesse considerazioni
per fminunc….. ma i più usati sono:
Options
Output Arguments
Esempio 1
Minimizzazione della funzione di Rosenbrock:
x0=[-1.2, 1]
Presenta minimo (1,1) ed fval=0
-Scriviamo l’M.file:
function f= myfun(x)
f= 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
-Passiamo dall’M.file alla routine di ottimizzazione:
[x,fval] = fminsearch (f , [-1.2, 1] )
OPPURE
La definiamo nella command window
Esempio 2
• Se la funzione obiettivo è parametrica:
>>f= inline('100*(x(2)-x(1)^2)^2+(a-x(1))^2','x','a')
>>a=2;
>>options= optimset ('Display','iter','TolX',1e-8);
>>[x,fval]= fminsearch (f,[1 2],options,a)
Vantaggi e limiti
• Vantaggi:
– se f(x) è discontinua, fminsearch è un
comando robusto
• Svantaggi:
– è in genere meno efficiente di fminunc per
problemi di ottimizzazione di ordine maggiore
di 2
– Ottimizzazione di funzioni di variabili reali: x
deve essere una variabile reale
MINIMIZZAZIONE VINCOLATA
fmincon
dove x; b; beq; lb; ub sono vettori, A; Aeq sono matrici; c(x) e
ceq(x) sono funzioni vettoriali (cioe’ ad ogni vettore x associano un
vettore) e f e’ una funzione scalare (cioe’ ad ogni vettore x associa
un numero reale). Le funzioni f(x), c(x) e ceq(x) possono essere
non lineari.
min F(x) vincoli: A*x <= b, Aeq*x= beq
C(x) <= 0, Ceq(x) = 0
LB <= x<= UB
sintassi input
x=fmincon(fun,x0,A,b)
partendo da x0 cerca il minimo x della funzione fun
sotto i vincoli lineari A*x <= b .
x0 può essere uno scalare, un vettore o una matrice.
x=fmincon(fun,x0,A,b,Aeq,beq)
vincoli lineari Aeq*x = beq e anche A*x <= b.
(A=[ ] and B=[ ] se non ci sono disuguaglianze)
min F(x) vincoli: A*x <= b, Aeq*x= beq
C(x) <= 0, Ceq(x) = 0
LB <= x<= UB
x=fmincon(fun,x0,A,b,Aeq,beq,LB,UB)
Definisce un set di lower e upper per la variabile x,
di modo che la soluzione sia trovata nel range
LB <= x <= UB.
Porre LB(i) = -Inf se x(i) é illimitata inferiormente;
porre UB(i) = Inf se x(i) é illimitata superiormente.
x = fmincon(fun,x0,A,b,Aeq,beq,LB,Ub,nonlcon,options)
se ci sono anche dei vincoli non lineari definiti in
nonlcon e delle opzioni specificate con optimset.
sintassi output
[x,fval] = fmincon(...) ritorna il valore della funzione
Obiettivo raggiunto
[x,fval,exitflag] = fmincon(...)
[x,fval,exitflag,output] = fmincon(...)
[x,fval,exitflag,output,lambda] = fmincon(...)
Ritorna una struttura lambda i cui campi contengono
I moltiplicatori di Lagrange alla soluzione x
[x,fval,exitflag,output,lambda,grad,hessian]
=fmincon(...)
ALGORITMI
-active-set (DEFAULT)
-interior-point
-trust-region-reflective SE SPECIFICATO
MA BISOGNA DARE IL JACOBIANO
Esempio 1
Minimizzare f(x)=-x1x2x3
x0 = [10; 10; 10]
Vincolo: 0 ≤ x1 + 2 x 2 + 2 x 3 ≤ 72
1. Scrivo m file myfun_vin.m
function f = myfun_vin(x)
f = -x(1) * x(2) * x(3);
2. Riscrivo il vincolo riportandolo a due
minorazioni
0 ≤ x1 + 2x2 + 2x3 ≤ 72
− x1 − 2x2 − 2x3 ≤ 0
x1 + 2x2 + 2x3 ≤ 72
In questo modo posso formulare i due vincoli,
entrambi lineari, come
A*X <= b
A=[-1 -2 -2; 1 2 2];
b=[0;72];
min F(x) vincoli: A*x <= b, Aeq*x= beq
C(x) <= 0, Ceq(x) = 0
LB <= x<= UB
3 . Chiamo routine fmincon dalla command window
>> A=[-1 -2 -2;1 2 2];
>> b=[0;72];
>> x0 = [10; 10; 10]; % Starting guess at the solution
>> [x,fval] = fmincon(@myfun_vin,x0,A,b)
Esempio 2
C=10; V=6; X0=[1 1 1];
Mfile nlcon.m per il vincolo non lineare
function [C,Ceq]=nlcon(x)
C=[ ];
Ceq=[x(1)*x(2)*x(3)-6];
min F(x) vincoli: A*x <= b, Aeq*x= beq
C(x) <= 0, Ceq(x) = 0
LB <= x<= UB
>>[x,fval,exitflag,output,lambda,grad,hessian]=
fmincon(inline('2*10*(x(1)*x(2)+x(1)*x(3)+x(2)*x(3))‘,’x’),[
1;1;1],[ ],[ ],[ ],[ ],[-Inf;-Inf;-Inf],[Inf;Inf;Inf],@nlcon)
Esempio 3
M-files:
Command
window
Risoluzione di sistemi di equazioni
• fsolve e fzero:
fsolve : risoluzione di sistemi non lineari di
equazioni:
con x vettore e F(X) che
ritorna un valore vettoriale (determinazione delle
radici (zero) di un sistema non lineare di
equazioni)
Sintassi
Input Argument
• fun: sistema di equazioni non lineari da risolvere:
accetta un vettore x e ritorna un vettore F, equazioni
non lineari valutate in x. fun può essere richiamata
da :
• M.file:
• funzione anonima:
• Jacobiano:
– in tal modo la funzione fun richiama in un secondo output il valore
della matrice J in x.
Output Arguments
• exitflag:
Caratteristiche
dell’algoritmo
utilizzato
• Output:
Informazioni circa
il processo di
ottimizzazione
Algoritmo
• Per default viene utilizzato Trust-region dogleg.
• Alternativamente, si puo’ scegliere Levenberg-Marquardt
oppure Gauss-Newton.
Esempio 1
• Sistema di equazioni in 2 incognite:
x0=[-5,-5]
• Risolviamo in x:
– Scriviamo un M.file:
– Routine di ottimizzazione:
Esempio 2
• Trovare una matrice X tale che:
con x0=[1,1;1,1] (matrice)
• Scrittura dell’M.file:
• Invochiamo la routine di ottimizzazione:
x=
exitflag=1
fval=
Limiti
• Le funzioni del sistema devono essere
continue
• Le variabili devono essere reali
• Fsolve potrebbe convergere ad un punto
che non e’ uno stazionario; in tal caso
converrebbe variare le condizioni iniziali.
fzero
• Soluzioni di una funzione continua di una
variabile
• Sintassi:
• Descrizione:
– x=fzero(fun,xo), determina lo zero di fun vicino ad xo,
se xo è uno scalare. fun è una funzione descritta da
M.file o da una funzione anonima. Il valore x
determinato da fzero è vicino al punto per cui la
funzione fun cambia segno, o NaN se la ricerca non
ammette risultato.
Input arguments
• fun: funzione da risolvere
– M.file richiamata nella routine dal comando @
con
– Attraverso una funzione anonima:
– Options: cambiando i valori attraverso il
comando optimiset…. Ovvero:
Options
Output arguments
Esempi
• Calcolare il valore di π determinando lo zero
della funzione seno vicino al punto 3
• Trovare lo zero della funzione coseno
nell’intervallo [1 2]
ƒTrovare lo zero della funzione:
• Scriviamo un M.file:
• Per calcolare lo zero vicino a 2 :
• Dal momento che questa è una funzione
polinomiale, è possibile usare il comando roots ([1 0
-2 5]), che determina lo stesso zero reale e coppie di
zero coniugate
Limiti
• Il comando è in grado di trovare un punto dove la
funzione cambia segno.
• Se la funzione è continua, tale punto è anche un punto
per cui la funzione si avvicina al suo zero
• Se la funzione non è continua, il comando trova punti di
discontinuità invece cha la soluzione.
• Inoltre, la funzione determina lo zero come punto di
intersezione di fun con l’asse x. Punti per cui la funzione
tocca l’asse, ma non lo intercetta non sono considerati
zero. Esempio la funzione x^2 è una parabola che tocca
l’asse x nello zero. Non attraversando l’asse x, il punto
non viene visto come soluzione.