Sei sulla pagina 1di 59

LEZIONE ICO 12-10-2009

Argomento:introduzione alla piattaforma Matlab.


Risoluzione numerica di problemi di minimo liberi e
vincolati.

Lucia Marucci
marucci@tigem.it

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: nelleditor 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
dellalgoritmo,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 loperazione di ottimizzazione
grad: ritorna il valore del gradiente di fun alla soluzione x
hessian: ritorna il valore dellhessiano 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 nellopzione LargeScale off nel
comando optimset

Trust region method, Newton method e gradiente


coniugato
large scale: se lopzione 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 lalgoritmo 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 dellalgoritmo


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 dellM-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 lM-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
dellalgoritmo

[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 lM.file:
function f= myfun(x)
f= 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
-Passiamo dallM.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
dellalgoritmo
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 dellM.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


nellintervallo [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 lasse x. Punti per cui la funzione
tocca lasse, ma non lo intercetta non sono considerati
zero. Esempio la funzione x^2 una parabola che tocca
lasse x nello zero. Non attraversando lasse x, il punto
non viene visto come soluzione.