metodi numerici - modulo di ottimizzazione soluzioni temi d’esame · 2019-12-09 · metodi...

20
Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano Gualandi

Upload: others

Post on 15-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

Metodi Numerici - Modulo di OttimizzazioneSoluzioni temi d’esame

Andrea Codegoni, Stefano Gualandi

Page 2: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

Soluzione 1

Ottimizzazione, Appello 1 Marzo 2019

1.1 Parte A: OttimizzazioneSi consideri la funzione obiettivo, con parametri a, b, c ∈ R:

f(x) = f([x, y]) = a x2 + b y2 − c log (x+ y), x ∈ R2 (1.1)

Si completi lo script Matlab chiamato script_ott.m implementando i seguenti punti:

a) Riportare di seguito il gradiente e l’hessiana della funzione obiettivo f(x, y):

RISPOSTA

∇f(x) =

2ax− c 1(x+ y)

2by − c 1(x+ y)

, ∇2f(x) =

2a+ c

1(x+ y)2 c

1(x+ y)2

c1

(x+ y)2 2b+ c1

(x+ y)2

b) Usando i parametri a = −1, b = −2 e c = −2, completare il file F.m in modo che la function calcolif(x), ∇f(x) e ∇2f(x). Riportare di seguito i valori di f(xi), ∇f(xi) e ∇2f(xi) nei punti x1 = [0, 50]Te x2 = [1, 1]T :

RISPOSTA

Per questo punto andiamo a sostituire in (1.1) i valori a = −1, b = −2, c = −2 ottenendo:

f(x, y) = −x2 − 2y2 + 2 log(x+ y)

e scriviamo, in un file di nome Fa.m, la function MATLAB che dato un vettore x ∈ R2 calcola ilvalore in quel punto del gradiente e dell’hessiana di f(x). Lo script completo contenente la funzioneFa.m viene riportata nella Figura 1.1.Per calcolare il valore della funzione nei punti x1 = [0, 50]T e x2 = [1, 1]T , utilizziamo la funzioneappena scritta Fa.m, aggiungendo le righe seguenti al file script_ott.m:X1 = [0,50];[F1, G1, H1] = Fa(X1)

X2 = [1,1];[F2, G2, H2] = Fa(X2)

A questo punto, eseguendo lo script script_ott.m dovreste ottenere:F1 =

-4.9922e+03

G1 =0.0400-199.9600

H1 =

1

Page 3: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

1 % Funzione salvata in un file di nome Fa.m2 function [z, G, H] = Fa(X)3 x = X(1);4 y = X(2);5 % NOTA: ricordarsi di mettere il ";" alla fine di ogni riga (!)6 a = -1; b = -2; c = -2;78 phi = 1/(x+y);9 z = (a*x^2 + b*y^2 - c*log(x+y));

1011 if nargout > 112 % Gradiente13 G(1) = 2*a*x - c*phi;14 G(2) = 2*b*y - c*phi;15 if nargout > 216 % Hessiana17 H(1,1) = 2*a+c*phi^2;18 H(2,2) = 2*b+c*phi^2;19 H(1,2) = c*phi^2;20 H2,1) = c*phi^2;21 end22 end23 end

Figure 1.1: Contenuto del file Fa.m che implementa la funzione (1.1).

-2.0008 -0.0008-0.0008 -4.0008

F2 =-1.6137

G2 =-1-3

H2 =-2.5000 -0.5000-0.5000 -4.5000

Alla prova d’esame, si riportino i valori precedenti nell’apposito riquadro sul foglio del tema d’esame.

c) Tracciare un grafico qualitativo di f(x, y) e delle sue curve di livello, scegliendo in modo opportunol’intervallo di valori in cui visualizzare le curve di livello. Quanti punti stazionari osservate? Quali?

RISPOSTA

Per quanto riguarda i plot, non esiste una “ricetta universale” per centrare la mesh e decidere ivalori della funzione obiettivo da usare per le curve di livello da plottare. Tuttavia, partire con delleconsiderazioni sulla funzione obiettivo, considerazioni che consistono nell’individuare per quali puntix = [x, y] ha senso definire la mesh. Per esempio, nella funzione data in questo esercizio, appareil termine log(x + y), e siccome la nostra funzione è a valori reali, dobbiamo imporre la condizionesul dominio della funzione, ovvero che x + y > 0. Inoltre, se appare subito evidente che il gradientesi annulla in un dato punto, dobbiamo fare in modo di includere quel punto all’interno della nostramesh. Se non si riescono a fare delle considerazioni di questo tipo, si può sempre procedere con iltema d’esame con il punto successivo, e a posteriori, si cerca di centrare la mesh nell’intorno del puntotrovato utilizzando la fminunc.ATTENZIONE: Per la funzione logaritmo, Matlab restituisce sempre un valore, anche quandol’argomento è negativo. In questo caso, il risultato del logaritmo è un numero complesso. Se infattiproviamo a plottare la nostra funzione non restringendo il dominio della funzione ai suoi valore reali,scrivendo nel file script_ott.m quanto segue:

% Definisco la meshgrid[X, Y] = meshgrid(-1.0:0.025:1, -1.0:0.025:1);% Prendo le dimensioni della matrice creata[n, m] = size(X);

2

Page 4: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

% Prepara una matrice per i valori della funzione obiettivo FZ = zeros(n, m);% Calcola punto per punto il valore di Ffor i = 1:nfor j = 1:mZ(i,j) = Fa([X(i,j), Y(i,j)]);

endendfigure(1);subplot(1,2,1);surf(X, Y, Z);subplot(1,2,2);contour(X, Y, Z, -[0.5:0.01:1.]);colorbar;title(’Grafico qualitativo di f(x,y)’);

otteniamo nella command shell di Matlab il messaggio di errore seguente:Error using surf (line 71)X, Y, Z, and C cannot be complex.

Error in script_ott_a (line 44)surf(X, Y, Z);

che ci dice che nella riga 44 dello script script_ott_a, che è lo script in cui stiamo svolgendoil compito, chiamiamo la funzione surf, la quale produce un errore al suo interno alla riga 71, acausa dell’uso di numeri complessi. Si noti invece il riferimento alla matrice C, che non è definita nelcodice scritta da noi. Controllando la matrice Z, si verifica subito che i suoi elementi sono dei numericomplessi.NOTA: Si impari a leggere e riconoscere i messaggi d’errore di Matlab.Potremmo ora fare altre osservazioni di tipo euristico sulla funzione per centrare meglio il plot, o inalternativa scegliere una mesh inizialmente con un dominio molto ampio, e poi procedere in modoiterativo restringendo il dominio fino a trovare un intervallo in cui si evidenziano in modo chiaro deipunti stazionari. In questo tema d’esame, una buona scelta potrebbe essere:

% Definizione della "mesh" da sostiuire alla precedente[X, Y] = meshgrid(0.01:0.025:1.5, 0.01:0.025:1.5);

% ... il resto dello script non si modifica ...

% Definizione di "contour" da sostiuire alla precedentecontour(X, Y, Z, [-0.3:-0.01:-1.]);

che produce il plot di Figure 1.2. Dal plot, possiamo concludere che (all’incirca) il punto x = [x, y] '(0.8± ε, 0.4± ε) abbiamo un punto stazionario che è un punto di massimo locale.NOTA 1: Si consiglia di provare anche i seguenti valori per la mesh, in modo da capire come nondeve essere definita una mesh (in quanto non si evidenziano in modo chiaro nessun punto stazionario):% prima prova: mesh troppo piccola[X, Y] = meshgrid(0.01:0.025:0.25, 0.01:0.025:0.25);

% second prova: mesh troppo grande[X, Y] = meshgrid(0.01:0.025:10, 0.01:0.025:10);

NOTA 2: Ricordarsi sempre che il plot fa utilizzato anche per validare visivamente il risultatoottenuto dalla soluzione del punto seguente.

d) Implementando un’opportuna funzione, si utilizzi la funzione di Matlab fminunc per cercare un eventualepunto di massimo a partire dal punto iniziale x1 = (0, 50)T , applicando il metodo di quasi Newton BFGSe utilizzando le opzioni seguenti:

• Si utilizzi il gradiente implementato in F.m, ovvero si attivi l’opzione GradObj.• Si assegni 80 come numero massimo di valutazioni di f(x) e 60 come numero massimo di iterazioni.

Si dichiari il problema di tipo non LargeScale. Si assegnino le tolleranze: TolFun=1e-12 eTolX=1e-12.

(a) Si riportino i valori dell’ultimo punto trovato dall’algoritmo partendo da x1: è un punto stazionario?Se è un punto stazionario, è un punto di minimo, di massimo, o di sella?GIUSTIFICARE LA RISPOSTA.

3

Page 5: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

Figure 1.2: Grafico e curve di livello della funzione (1.1).

(b) Riportare gli autovalori della matrice hessiana valutata nell’ultimo punto trovato.(c) Per l’iterata numero 0, numero 1, e per l’ultima, si riportino i seguenti dati:

iteration Func-Count f(x) step-size first-order condition

RISPOSTA

Per svolgere questo punto, tenendo conto che la funzione fminunc implementa dei metodi numericidi ricerca dei punti di minimo di una funzione, possiamo utilizzare la strategia seguente:

(a) Ricordandoci che vale la relazione seguente (si veda il Capitolo 1 delle dispense del corso):

max f(x) = −min−f(x)

implementiamo una function, che chiameremo ad esempio FaMax.m, in cui scriviamo lafunzione −f(x) in maniera analoga a quanto fatto per Fa.m, ma con gli opportuni cambiamentidi segno.

(b) Usiamo la funzione fminunc dandogli in input FaMax.m, in modo da trovare un punto stazionarioper la funzione −f(x). Chiamiamo xstar il punto (si spera) stazionario trovato dal metodo.

(c) Passiamo il vettore xstar alla funzione Fa.m per calcolare il valore della funzione, del gradiente,dell’hessiana nel punto trovato. Utilizziamo questi valori per classificare il punto xstar comepunto stazionario e/o come punto di massimo.

Se aggiungiamo le righe seguenti nello script script_ott.m:% Settaggio delle opzioni richiesteoptions = optimset( ’MaxFunEval’, 80, ...

’MaxIter’, 60, ...’TolFun’, 1e-12, ...’TolX’, 1e-12, ...’Display’, ’iter’, ...’LargeScale’,’off’, ...’GradObj’,’on’, ...’HessUpdate’, ’bfgs’ );

% Soluzione con la funzione del Toolbox "fminunc"[xstar, fstar] = fminunc(@FaMax, X1, options);% Stampa a video il punto trovatoxstar% Calcola la funzione data (quella di partenza) nel punto trovato[fs, gs, hs] = Fa(xstar)

4

Page 6: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

% Calcola gli autovalori della matrice hessiana, solo se il% punto e’ un punto stazionario (!)autovalori = eig(hs)

A questo punto, eseguendo lo script otteniamo:Iteration Func-count f(x) Step-size First-order-optimality0 1 4992.18 2001 3 3192.62 0.05001 1602 4 5.9944 1 403 7 0.719574 0.0955342 1.134 8 0.638577 1 0.5585 9 0.627915 1 0.4226 10 0.616483 1 0.3717 11 0.601474 1 0.1938 12 0.595648 1 0.07079 13 0.594576 1 0.020610 14 0.594535 1 0.001411 15 0.594535 1 5.57e-0512 16 0.594535 1 7.41e-0713 17 0.594535 1 1.49e-08

Local minimum possible.

fminunc stopped because it cannot decrease the objective functionalong the current search direction.

<stopping criteria details>

xstar =0.8165 0.4082

fs =-0.5945

gs =1.0e-07 *

-0.0054-0.1492

hs =-3.3333 -1.3333-1.3333 -5.3333

autovalori =-6.0000-2.6667

Poiché il gradiente gs della funzione ha la norma infinito dell’ordine di 10−8 (colonna First-order-optimality), possiamo dichiarare che il punto xstar, trovato alla iterata k = 13, è un puntostazionario.Inoltre gli autovalori della matrice hessiana di f(x) calcolati nel punto xstar, sono entrambi stret-tamente negativi, e quindi, per le condizioni necessarie e sufficienti del primo e del secondo ordine (sivedano le dispense e i lucidi usati a lezione) possiamo concludere che il punto trovato è un punto dimassimo locale.

e) Si consideri la funzione data chiamata SolveWithHistory che prende in input una funzione da minimiz-zare F, il punto iniziale x1, e un insieme di opzioni (allo stesso modo della funzione fminunc), e trova ilminimo di F memorizzando ad ogni iterazione in opportuni vettori i valori di xk, di f(xk), e di ||∇f(xk)||.Sempre nello script script_ott.m, utilizzando la funzione SolveWithHistory con il metodo BFGSe con il metodo DFP, partendo dal punto x1 = (0, 50)T , si memorizzino i valori di ||∇f(xk)|| in opportunivettori e si calcoli il fattore di convergenza

||∇f(xk+1)||||∇f(xk)|| (1.2)

Si mostri il grafico qualitativo del fattore di convergenza della norma del gradiente rispetto alle iterate,in scala logaritmica sull’asse delle y (suggerimento: usare semilogy). Quale velocità di convergenza siosserva per i due metodi? In questo caso, quale dei due metodi converge più rapidamente? A quale puntoconvergono i due metodi? GIUSTIFICARE LA RISPOSTA

5

Page 7: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

RISPOSTA

Il codice Matlab da scrivere per studiare la convergenza dei due metodi richiesti è il seguente:% Utilizzo la SolveWithHistory al posto della fminunc[h1,h2,h3] = SolveWithHistory(@FaMax, X1, options);% Calcolo il rapporto (1.2) dei gradienti come richiesto nel testo dell’eserciziofor i = 1:length(h3)-1

r1(i) = abs(h3(i+1))/(h3(i));endit1 = 1:length(r1);% Cambio le opzioni per usare il metodo "dfp"options = optimset( ’MaxFunEval’, 80, ...

’MaxIter’, 60, ...’TolFun’, 1e-12, ...’TolX’, 1e-12, ...’Display’, ’iter’, ...’LargeScale’,’off’, ...’Hessian’,’off’, ...’GradObj’,’on’, ...’HessUpdate’, ’bfgs’);

% Richiamo la SolveWithHisotry con le nuove opzioni[h12, h22, h32] = SolveWithHistory(@FaMax, X1, options);% Calcolo il rapporto dei gradienti per il nuovo metodor2 = zeros(length(h32)-1);for i = 1:length(h32)-1r2(i) = abs(h32(i+1))/(h32(i));

endit2 = 1:length(r2);% Plot dei grafici in scala semilogaritmicafigure;% In blu il metodo bfgssemilogy(it1, r1, ’-*b’)hold on% In rosso il metodo dfpsemilogy(it2, r2, ’-*r’)xlabel(’Numero di iterazioni’);ylabel(’Fattore di convergenza’);

Si ricorda, che la funzione SolveWithHistory viene fornita all’esame. Eseguendo nuovamente loscript con le nuove modifiche, l’output che viene restituito e formato dalle due tabelle

Iteration Func-count f(x) Step-size First-order-optimality0 1 4992.18 2001 3 3192.62 0.05001 1602 4 5.9944 1 403 7 0.719574 0.0955342 1.134 8 0.638577 1 0.5585 9 0.627915 1 0.4226 10 0.616483 1 0.3717 11 0.601474 1 0.1938 12 0.595648 1 0.07079 13 0.594576 1 0.020610 14 0.594535 1 0.001411 15 0.594535 1 5.57e-0512 16 0.594535 1 7.41e-0713 17 0.594535 1 1.49e-08

Local minimum possible.

fminunc stopped because it cannot decrease the objective functionalong the current search direction.

<stopping criteria details>

Iteration Func-count f(x) Step-size First-order-optimality0 1 4992.18 2001 3 3192.62 0.05001 1602 4 5.9944 1 403 7 0.724404 0.0958107 1.144 8 0.63175 1 0.5375 9 0.621913 1 0.3816 10 0.616294 1 0.3657 11 0.609793 1 0.3078 12 0.606078 1 0.247

6

Page 8: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

0 5 10 15 20 25

Numero di iterazioni

10-2

10-1

100

Fat

tore

di c

onve

rgen

za

BFGSDFP

Figure 1.3: Confronto della velocità di convergenza di due metodi.

9 13 0.602175 1 0.14710 14 0.599945 1 0.17411 15 0.597763 1 0.17612 16 0.596562 1 0.14813 17 0.595558 1 0.094314 18 0.595065 1 0.054715 19 0.594743 1 0.037216 20 0.594612 1 0.019317 21 0.594553 1 0.010218 22 0.594538 1 0.00619 23 0.594535 1 0.001720 24 0.594535 1 0.00034421 25 0.594535 1 3.76e-0522 26 0.594535 1 4.12e-0623 27 0.594535 1 1.92e-0724 28 0.594535 1 3.51e-09

Local minimum possible.

fminunc stopped because it cannot decrease the objective functionalong the current search direction.

<stopping criteria details>

Inoltre, si ottiene il grafico mostrato in Figura 1.3, da cui concludiamo che entrambi i metodi hanno or-dine di convergenza superlineare (ricordiamoci che stiamo plottando in scala semilogaritmica sull’assey). In questo caso, il metodo bfgs converge in un numero minore di iterazioni (13 iterazioni invecedi 24).

La soluzione completa dell’esercizio nello script script_ott.m viene riportata in Figura 1.4.

7

Page 9: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

1 %%%%%%%%%%%%%%%%%%%%%%%%%% PUNTO (b) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 X1 = [0,50];3 [F1, G1, H1] = Fa(X1)4 X2 = [1,1];5 [F2, G2, H2] = Fa(X2)6 %%%%%%%%%%%%%%%%%%%%%%%%%% PUNTO (c) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 % Dominio della funzione (da centrare): Definisco la meshgrid8 [X, Y] = meshgrid(0.01:0.025:1.5, 0.01:0.025:1.5);9 % Prendo le dimensioni della matrice creata

10 [n, m] = size(X);11 % Prepara una matrice per i valori della funzione obiettivo F12 Z = zeros(n, m);13 % Calcola punto per punto il valore di F14 for i = 1:n15 for j = 1:m16 Z(i,j) = Fa([X(i,j), Y(i,j)]);17 end18 end19 figure(1);20 subplot(1,2,1);21 surf(X, Y, Z);22 subplot(1,2,2);23 contour(X, Y, Z, -[0.5:0.01:1.]);24 colorbar;25 title(’Grafico qualitativo di f(x,y)’);26 %%%%%%%%%%%%%%%%%%%%%%%%%% PUNTO (d) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 % Settaggio delle opzioni richieste28 options = optimset( ’MaxFunEval’, 80, ...29 ’MaxIter’, 60, ...30 ’TolFun’, 1e-12, ...31 ’TolX’, 1e-12, ...32 ’Display’, ’iter’, ...33 ’LargeScale’,’off’, ...34 ’GradObj’,’on’, ...35 ’HessUpdate’, ’bfgs’ );36 % Soluzione con la funzione del Toolbox "fminunc"37 [xstar, fstar] = fminunc(@FaMax, X1, options);38 % Stampa a video il punto trovato39 xstar40 % Calcola la funzione data (quella di partenza) nel punto trovato41 [fs, gs, hs] = Fa(xstar)42 autovalori = eig(hs)43 %%%%%%%%%%%%%%%%%%%%%%%%%% PUNTO (e) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 % Utilizzo la SolveWithHistory al posto della fminunc45 [h1,h2,h3] = SolveWithHistory(@FaMax, X1, options);46 % Calcolo il rapporto (1.2) dei gradienti come richiesto nel testo dell’esercizio47 for i = 1:length(h3)-148 r1(i) = abs(h3(i+1))/(h3(i));49 end50 it1 = 1:length(r1);51 % Cambio le opzioni per usare il metodo "dfp"52 options = optimset( ’MaxFunEval’, 80, ...53 ’MaxIter’, 60, ...54 ’TolFun’, 1e-12, ...55 ’TolX’, 1e-12, ...56 ’Display’, ’iter’, ...57 ’LargeScale’,’off’, ...58 ’Hessian’,’off’, ...59 ’GradObj’,’on’, ...60 ’HessUpdate’, ’bfgs’);61 % Richiamo la SolveWithHisotry con le nuove opzioni62 [h12, h22, h32] = SolveWithHistory(@FaMax, X1, options);63 r2 = zeros(length(h32)-1);64 for i = 1:length(h32)-165 r2(i) = abs(h32(i+1))/(h32(i));66 end67 it2 = 1:length(r2);68 figure;69 semilogy(it1, r1, ’-*b’)70 hold on71 semilogy(it2, r2, ’-*r’)72 xlabel(’Numero di iterazioni’);73 ylabel(’Fattore di convergenza’);

Figure 1.4: Contenuto della soluzione del file script_ott.m.

8

Page 10: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

Soluzione 2

Ottimizzazione, Appello 7 Febbraio2018

2.1 Parte A: OttimizzazioneSi consideri la funzione obiettivo:

f(x) = f([x, y]) = cφ(x, y) + d expφ(x, y), dove φ(x, y) = (a(x+ 1)2 + by2)2 (2.1)

con i seguenti valori per i parametri: a = 0.5, b = 2, c = −0.5, d = 0.4.Si completi lo script Matlab chiamato script_ott.m implementando i seguenti punti:

a) Riportare di seguito il gradiente e l’hessiana della funzione obiettivo f(x, y):

RISPOSTA

Iniziamo con lo scrivere il gradiente e l’hessiana della funzione φ(x):

∇φ(x) =[2(ax2 + 2ax+ a+ by2) (2ax+ 2a)2(ax2 + 2ax+ a+ by2) (2by)

],

∇2φ(x) =

2 (2ax+ 2a)2 + 4a(ax2 + 2ax+ a+ by2) 2 (2by) (2ax+ 2a)

2 (2by) (2ax+ 2a) 2 (2by)2 + 4b(ax2 + 2ax+ a+ by2)

Utilizzando ora le regole per derivare le funzioni composte scriviamo gradiente ed hessiana dellafunzione f(x):

∇f(x) = c∇φ(x) + d expφ(x)∇φ(x)

∇21,1f(x) = c∇2

1,1φ(x) + d expφ(x)(∇1φ(x))2 + d expφ(x)∇21,1φ(x)

∇22,2f(x) = c∇2

2,2φ(x) + d expφ(x)(∇2φ(x))2 + d expφ(x)∇22,2φ(x)

∇21,2f(x) = ∇2

2,1f(x) = c∇21,2φ(x) + d expφ(x)(∇1φ(x))(∇2φ(x)) + d expφ(x)∇2

1,2φ(x)

dove, per non appesantire le notazioni più del dovuto, abbiamo indicato con con ∇i l’i-esima compo-nente del gradiente e con ∇2

i,j la i,j-esima entrata della matrice hessiana.

b) Completare il file F.m in modo che la function calcoli f(x), ∇f(x) e ∇2f(x). Riportare di seguito ivalori di f(x0), ∇f(x0) e ∇2f(x0) nei punti x0 = [−1.2,−0.1]T :

RISPOSTA

Scriviamo, in un file di nome Fa.m, la function MATLAB che dato un vettore x ∈ R2 calcola ilvalore in quel punto del gradiente e dell’hessiana di f(x). Lo script completo contenente la funzioneFa.m viene riportata nella Figura 2.1.

9

Page 11: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

1 function [z, grad, hess] = Fa(X)2 x = X(1);3 y = X(2);45 a=0.5; b=2; c=-0.5; d=0.4;67 % Compute value function8 g = a*(x+1)^2 + b*y^2;9 gx = 2*a*(x + 1);

10 gy = 2*b*y;1112 phi = g^2;13 phix = 2*g*gx;14 phiy = 2*g*gy;1516 z = c*phi + d*exp(phi);1718 % Compute the gradient19 if nargout > 120 grad(1) = c*phix + d*phix*exp(phi);21 grad(2) = c*phiy + d*phiy*exp(phi);22 grad = grad’;2324 % Compute the Hessian25 if nargout > 226 gxx = 2*a;27 gyy = 2*b;2829 phixx = 2*gx*gx + 2*g*gxx;30 phiyy = 2*gy*gy + 2*g*gyy;31 phixy = 2*gx*gy;3233 hess(1,1) = c*phixx + d*phixx*exp(phi) + d*phix*phix*exp(phi);34 hess(2,2) = c*phiyy + d*phiyy*exp(phi) + d*phiy*phiy*exp(phi);35 hess(1,2) = c*phixy + d*phixy*exp(phi) + d*phix*phiy*exp(phi);36 hess(2,1) = hess(1,2);37 end38 end39 end

Figure 2.1: Contenuto del file Fa.m che implementa la funzione (2.1).

Per calcolare il valore della funzione nel punto x0 = [−1.2,−0.1]T , utilizziamo la funzione appenascritta Fa.m, aggiungendo le righe seguenti al file script_ott.m:

X0 = [-1.2;-0.1];

[Fx, Gx, Hx] = Fa(X0)

A questo punto, eseguendo lo script script_ott.m dovreste ottenere:Fx =

0.3998

Gx =0.00160.0032

Hx =-0.0158 -0.0157-0.0157 -0.0632

Alla prova d’esame, si riportino i valori precedenti nell’apposito riguardato sul foglio del tema d’esame.

d) Implementando un’opportuna funzione, si utilizzi la funzione di Matlab fminunc per cercare un eventualepunto di massimo a partire dal punto iniziale x0 = (−1.2,−0.1)T , applicando il metodo di quasi NewtonBFGS e utilizzando le opzioni seguenti:

• Si utilizzi il gradiente implementato in F.m, ovvero si attivi l’opzione GradObj.• Si assegni 50 come numero massimo di valutazioni di f(x) e 50 come numero massimo di iterazioni.Si dichiari il problema di tipo non LargeScale. Si assegnino le tolleranze: TolFun=1e-18 eTolX=1e-18.

10

Page 12: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

(a) Si riportino i valori dell’ultimo punto trovato dall’algoritmo partendo da x0: è un punto stazionario?È un punto di massimo? GIUSTIFICARE LA RISPOSTA.

(b) Riportare gli autovalori della matrice hessiana valutata nell’ultimo punto trovato.(c) Per l’iterata numero 0, numero 1, e per l’ultima, si riportino i seguenti dati:

iteration Func-Count f(x) step-size first-order condition

RISPOSTA

Ricordandoci che vale la relazione seguente (si veda il Capitolo 1 delle dispense del corso):

max f(x) = −min−f(x),

implementiamo prima una funzione Famax.m, e poi nello script script_ott.m scriviamo:% Settaggio delle opzioni richiesteoptions = optimset(’MaxFunEval’, 50, ...

’MaxIter’, 50, ...’TolFun’, 1e-18, ...’TolX’, 1e-18, ...’Display’, ’iter’, ...’LargeScale’,’off’, ...’GradObj’,’on’, ...’HessUpdate’, ’bfgs’);

% Soluzione con la funzione del Toolbox "fminunc"[xstar, fstar] = fminunc(@Famax, X0, options);% Stampa a video il punto trovatoxstar% Calcola la funzione data (quella di partenza) nel punto trovato[fs, gs, hs] = Fa(xstar)% Calcola gli autovalori della matrice hessiana, solo se il% punto e’ un punto stazionario (!)autovalori = eig(hs)

Ed eseguendo otteniamo:First-order

Iteration Func-count f(x) Step-size optimality0 1 -0.399841 0.003181 3 -0.399931 10 0.001432 4 -0.399973 1 0.0005483 5 -0.399989 1 0.0002994 6 -0.399995 1 0.0001695 7 -0.399998 1 9.95e-056 8 -0.399999 1 6.18e-057 9 -0.399999 1 4.72e-058 10 -0.399999 1 4.98e-059 11 -0.399999 1 4.84e-0510 12 -0.4 1 4.19e-0511 13 -0.4 1 2.94e-0512 14 -0.4 1 1.63e-0513 15 -0.4 1 8.03e-06

...42 44 -0.4 1 3.48e-1243 45 -0.4 1 1.63e-1244 46 -0.4 1 7.52e-1345 47 -0.4 1 3.49e-13

Local minimum possible.

fminunc stopped because it cannot decrease the objective functionalong the current search direction.

<stopping criteria details>

xstar =-1.00020.0000

fs =0.4000

gs =1.0e-12 *

11

Page 13: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

Figure 2.2: Grafico e curve di livello della funzione (2.1).

0.3490-0.0300

hs =1.0e-08 *

-0.6899 0.03960.0396 -0.9244

autovalori =1.0e-08 *-0.9309-0.6834

La condizione necessaria del primo ordine sul gradiente è verificata, in quanto il gradiente si annullain xstar, per cui possiamo affermare che il punto trovato dalla fminunc è un punto stazionario.Per quanto riguarda la sua classificazione però non possiamo dire nulla in quanto siamo di fronte avalori di ordine di grandezza di 10−8 che non possono essere considerati significativi. Ci affidiamoquindi al prossimo punto per determinare la natura di questo punto stazionario.

c) Tracciare un grafico qualitativo di f(x, y) e delle sue curve di livello, scegliendo in maniera opportunol’intervallo di valori in cui visualizzare le curve di livello, in modo che venga evidenziato il punto stazionariotrovato nel punto precedente.

RISPOSTA

Per il plot della funzione dobbiamo scegliere un dominio della griglia che contenga almeno il puntostazionario trovato al punto precedente. Per determinare l’intervallo di valori della funzioni obiettivoper cui vogliamo plottare le curve di livello, possiamo sempre fare riferimento al punto precedente.Dopo aver provato diversi valori per la griglia di punti, e per i valori della funzione obiettivo da usareper le curve di livello, arriviamo a scrivere:

% Dominio della funzione (da centrare)[X, Y] = meshgrid(-2:0.05:0., -0.8:0.05:0.8);% Prendo le dimensioni della matrice creata[n, m] = size(X);% Prepara una matrice per i valori della funzione obiettivo FZ = zeros(n, m);% Calcola punto per punto il valore di Ffor i = 1:n

12

Page 14: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

for j = 1:mZ(i,j) = Fa([X(i,j), Y(i,j)]);

endend

figure(1);subplot(1,2,1);surf(X, Y, Z);subplot(1,2,2);contour(X, Y, Z, [0.37:0.00001:0.41]);colorbar;title(’Grafico qualitativo di f(x,y)’);

Eseguendo questo script, otteniamo il plot mostrato in Figura 2.2, da cui possiamo dedurre che ilpunto trovato dalla fminunc è un punto di massimo locale.

e) Si consideri la funzione data chiamata SolveWithHistory che prende in input una funzione da min-imizzare F, il punto iniziale x0, e un insieme di opzioni (allo stesso modo della funzione fminunc), etrova il minimo di F memorizzando ad ogni iterazione in opportuni vettori i valori di xk, di f(xk), edi ||∇f(xk)||. Sempre nello script script_ott.m, utilizzando la funzione SolveWithHistory con ilmetodo BFGS e con il metodo Trust Region, partendo dal punto x1 = (−1.2,−0.1)T , si memorizzino ivalori di ||∇f(xk)|| in opportuni vettori e si calcoli il fattore di convergenza quadratico

||∇f(xk+1)||||∇f(xk)||2

(2.2)

Si mostri il grafico qualitativo del fattore di convergenza quadratico della norma del gradiente rispettoalle iterate, in scala logaritmica sull’asse delle y (suggerimento: usare semilogy). Quale velocità diconvergenza si osserva per i due metodi? GIUSTIFICARE LA RISPOSTA

RISPOSTA

Per studiare la velocità di convergenza del metodo BFGS e del metodo di Trust Region, dobbiamoutilizzare la funzione SolveWithHistory, passandogli in input le opzioni opportune. Tra i valoridi ritorno della SolveWithHistory ci memorizziamo il terzo vettore, che contiene la successione{∇f(xk)}. Con tali valori, memorizziamo il rapporto richiesto (si veda pag. 11 del Capitolo 1 delledispense), nel vettore r1, come fatto nello script seguente:

options = optimset(’MaxFunEval’, 50, ...’MaxIter’, 50, ...’TolFun’, 1e-18, ...’TolX’, 1e-18, ...’Display’, ’iter’, ...’LargeScale’,’off’, ...’GradObj’,’on’, ...’HessUpdate’, ’bfgs’);

[h1,h2,h3] = SolveWithHistory(@Famax, X0, options);

for i =1:length(h3)-1r1(i) = h3 (i+1)/ h3(i)^2 ;

endit1 = 1:length(r1);

options = optimset(’MaxFunEval’, 50, ...’MaxIter’, 50, ...’TolFun’, 1e-18, ...’TolX’, 1e-18, ...’LargeScale’,’on’, ...’GradObj’,’on’, ...’Hessian’,’on’,...’Algorithm’,’trust-region’);

[h12,h22,h32] = SolveWithHistory(@Famax, X0, options);

for i =1:length(h32)-1r2(i) = h32 (i+1)/ h32(i)^2 ;

endit2 = 1:length(r2);

13

Page 15: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

0 10 20 30 40 50

Numero di iterazioni

100

102

104

106

108

1010

1012

Fat

tore

di c

onve

rgen

za

BFGSTRUST-REGION

Figure 2.3: Confronto della velocità di convergenza dei due metodi.

% Plot dei grafi in scala semilogaritmicafigure;semilogy(it1, r1, ’-*b’)hold onsemilogy(it2, r2, ’-+r’)xlabel(’Numero di iterazioni’);ylabel(’Fattore di convergenza’)

Dal plot contenuto in Figura 2.3, verifichiamo che il metodo Trust Region ha una velocità di conver-genza quadratica in quanto esiste una costante M ≈ 104 tale per cui il rapporto dei gradienti (con ildenominatore al quadrato), rimane costante. Al contrario, il metodo BFGS non ha una velocità diconvergenza quadratica, perché tale costante non esiste.

14

Page 16: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

Soluzione 3

Appello online del 13 Luglio 2020

3.1 Parte A: OttimizzazioneSi consideri la funzione:

f([x, y]) = x3 − xy(1 + y)2 (3.1)

a) Si calcoli il gradiente e l’hessiana di questa funzione. Si scriva una funzione Matlab chiamata F.m checalcoli il valore di f(x, y), di ∇f(x, y) e di ∇2f(x, y). Si implementi poi uno script Matlab chiamatoscript_ott.m che contenga i comandi per risolvere i punti seguenti:Calcolare f(x, y), ∇f(x, y) e ∇2f(x, y) nei punti (x1, y1) = (0, 0)T e (x2, y2) = (0.2,−1)T . Riportare sottoi valori trovati.

RISPOSTA

Prima si deve calcolare il gradiente e l’hessiana della funzione data:

∇f(x) =[3 ∗ x2 − y(y + 1)2

−x(3y2 + 4y + 1)

], ∇2f(x) =

6x −3y2 − 4y − 1

−3y2 − 4y − 1 −4x− 6xy

Per calcolare il valore della funzione nei due punti indicati, implementiamo la funzione richiesta F.m,e aggiungiamo le righe seguenti al file script_ott.m:

X1 = [0,0];[F1, G1, H1] = Fa(X1)

X2 = [0.2, -1];[F2, G2, H2] = Fa(X2)

A questo punto, eseguendo lo script script_ott.m otteniamo nella command shell di Matlab:F1 = 0G1 = 0

0H1 =

0 -1-1 0

F2 = 0.0080G2 = 0.1200

0H2 = 1.2000 0

0 0.4000

Alla prova d’esame, si devono riportare i valori precedenti nell’apposito riquadro sul foglio (o nel formonline) del tema d’esame.

b) Tracciare un grafico qualitativo di f(x, y) e delle sue curve di livello, scegliendo in maniera opportunol’intervallo di valori in cui visualizzare le curve di livello, in modo da evidenziare i due punti (x1, y1 e(x2, y2) definiti nel punto precedente.

15

Page 17: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

RISPOSTA

Per la scelta dell’intervallo della mesh, valgono le stesse considerazioni viste negli esercizi svolti inprecedenza. Ovvero, si dovrà scegliere una mesh che contiene almeno i due punti (x1, y1) = (0, 0)T e(x2, y2) = (0.2,−1)T , ed eventualmente dovrà contenere i punti trovati tramite la funzione fminunc.Per questo esercizio, vediamo prima delle soluzioni proposte da alcuni studenti all’esame con dellescelte inappropriate dell’intervallo, nonostante i comandi di Matlab usati fossero corretti. I comandiusati erano i seguenti:

% Dominio della funzione da centrare[X,Y] = meshgrid(-10:0.05:10,-10:0.05:10);% Ricavo le dimensionin di X[n,m] = size(X);% Preparo la matrice che contiene tutti i valori della funzionefor i = 1:n

for j = 1:mZ(i,j) = F([X(i,j),Y(i,j)]);

endend% Traccio il grafico qualitativo di F(x,y)figure(1)subplot(1,2,1)surf(X,Y,Z); % Traccia il grafico di superficie della funzionetitle(’Grafico di F(x,y)’);subplot(1,2,2)contour(X,Y,Z,30); % Traccio le curve di livello della funzionecolorbartitle(’Curve di livello della funzione f(x,y)’);

La figura 3.1 mostra un esempio in cui si è scelto un dominio troppo ampio per il plot: l’unica cosache si evince dal plot della superficie è che la funzione cresce rapidamente sino a 10’000 nel secondo equarto quadrante, mentre decresce rapidamente sino a 10’000 nel primo e terzo quadrante (... e giàdovremmo sospettare che ci sia da qualche parte un punto di sella!). Inoltre, nelle curve di livelloabbiamo tutta la parte centrale del plot completamente priva di curve di livello: non possiamo quindiconcludere nulla sulla natura di eventuali punti stazionari contenuti nel dominio specificato tramitela meshgrid.Se proviamo a cambiare l’intervallo della mesh, restringendoci ai valori compresi tra -2 e 2 perentrambi gli assi, otteniamo il plot di figura 3.2. In questo caso il plot della superficie di f(x, y) iniziaad essere chiaro, ma nel plot delle curve di livello abbiamo ancora una regione centrale in cui nonabbiamo nessuna curva di livello. Per migliorare ulteriormente il plot delle curve di livello, potremmorichiedere a Matlab di usare 200 curve di livello invece di 30 (si raccomanda di provare a cambiarequesto valore nel comando contour per vedere le diverse possibilità), oppure si potrebbe specificarein quali intervalli di valori vogliamo plottare le curve di livello. Poiché osservando il plot sulla sinistraabbiamo il sospetto che ci siano uno o più punti di sella intorno all’origine, utilizziamo il comandocontour nel modo seguente:

contour(X, Y, Z, [-0.05:0.0005:0.05]);

In questo modo stiamo chiedendo di plottare una curva di livello per ogni valore della funzioneobiettivo compreso tra -0.05 e 0.05 a intervalli di 0.0005. Il plot che otteniamo in questo caso, chefinalmente è quello corretto, viene riportato in figura 3.3. Dal plot delle curve di livello si può osservareche a partire dall’origine lungo la direzione (0,−1) ci siano infiniti punti di sella.

c) Si utilizzi la funzione di Matlab fminunc per trovare un eventuale punto di stazionario a partire dal puntoiniziale x2 = (0.2,−1)T , applicando il metodo di DFP e utilizzando le opzioni indicate sotto. Stampare avideo gli autovalori della matrice Hessiana valutata nell’ultimo punto trovato dall’algoritmo. Stampare avideo e riportare l’ultimo punto trovato dall’algoritmo: è un punto stazionario? È un punto di minimo?GIUSTIFICARE LA RISPOSTA.Le opzioni da usare con fminunc sono le seguenti.

• Utilizzare il gradiente implementato in F.m, ovvero si attivi l’opzione GradObj• Assegnare 30 come massimo numero di valutazioni di f(x) e 30 come massimo numero di iterazioni.• Dichiarare il problema di tipo non LargeScale.• Utilizzare le seguenti tolleranze: TolFun=1e− 12 e TolX=1e− 12.

16

Page 18: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

Figure 3.1: Grafico e curve di livello della funzione (3.1): VERSIONE ERRATA!

-30

-20

2

-10

0

2

10

Grafico di F(x,y)

20

0

30

0

-2 -2

Curve di livello della funzione f(x,y)

-2 0 2-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-25

-20

-15

-10

-5

0

5

10

15

20

25

Figure 3.2: Grafico e curve di livello della funzione (3.1): VERSIONE ERRATA!

17

Page 19: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

-3

-2

1

-1

0

10

1

2

3

0-1

-2 -1

Grafico qualitativo di f(x,y)

-1 0 1-2

-1.5

-1

-0.5

0

0.5

1

-0.05

-0.04

-0.03

-0.02

-0.01

0

0.01

0.02

0.03

0.04

0.05

Figure 3.3: Grafico e curve di livello della funzione (3.1): VERSIONE CORRETTA!

RISPOSTA

Lo svolgimento di questa parte dell’esercizio è abbastanza standard, ma è fondamentale essere ingrado di interpretare correttamente i risultati ottenuti tramite il calcolatore.Aggiungendo le righe seguenti nello script script_ott.m otteniamo tutte le informazioni che ciservono:

% Settaggio delle opzioni richiesteoptions = optimset(’MaxFunEval’, 30, ...

’MaxIter’, 30, ...’TolFun’, 1e-12, ...’TolX’, 1e-12, ...’Display’, ’iter’, ...’LargeScale’,’off’, ...’GradObj’,’on’, ...’HessUpdate’, ’dfp’);

% Soluzione con la funzione del Toolbox "fminunc"[xstar, fstar, exitflag, output, grad, hessian] = fminunc(@Fa, X0, options);

fprintf(’PUNTO C ==> x_star=[%.6f, %.6f], F(x_star)=%.6f, iterations=%d, f_evals=%d\n’,...

xstar(1), xstar(2), fstar, output.iterations, output.funcCount);

[fs, gs, hs] = Fa(xstar);

autovalori = eig(hs)

A questo punto, eseguendo lo script otteniamo in particolare:PUNTO C ==> x_star=[0.000001, -1.000000], F(x_star)=0.000000, iterations=26, f_evals=27

grad =1.0e-12 *

0.83760

hessian =

18

Page 20: Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame · 2019-12-09 · Metodi Numerici - Modulo di Ottimizzazione Soluzioni temi d’esame Andrea Codegoni, Stefano

1.0e-05 *

0.3215 -0.0007-0.0007 0.1057

autovalori =

1.0e-05 *

0.10570.3170

In pratica, abbiamo trovato che il punto (0,−1) è si un punto stazionario in quanto il gradiente hatutte componenti nulle (a meno di errori numerici), ma anche l’hessiana ha praticamente tutti glielementi prossimi a zero, che possiamo considerare come nulli. In questo caso quindi le condizioni delprimo e del secondo ordine non ci sono di nessun aiuto. Tuttavia, utilizzando il plot della funzione edelle curve di livello trovati al punto precedente possiamo chiaramente concludere che il punto (0,−1)è un punto di sella.La soluzione completa dell’esercizio nello script script_ott.m viene riportata in Figura 3.4.

1 X1 = [0.0, -0.0];2 [F1, G1, H1] = Fa(X1)34 X2 = [0.2, -1];5 [F2, G2, H2] = Fa(X2)67 X0 = X2;8 % Dominio della funzione (da centrare)9 [X, Y] = meshgrid(-1:0.05:1, -2:0.05:1);

10 % Prendo le dimensioni della matrice creata11 [n, m] = size(X);12 % Prepara una matrice per i valori della funzione obiettivo F13 Z = zeros(n, m);14 % Calcola punto per punto il valore di F15 for i = 1:n16 for j = 1:m17 Z(i,j) = Fa([X(i,j), Y(i,j)]);18 end19 end2021 figure(1);22 subplot(1,2,1);23 surf(X, Y, Z);24 subplot(1,2,2);25 contour(X, Y, Z, [-0.05:0.0005:0.05]);26 colorbar;27 title(’Grafico qualitativo di f(x,y)’);28 % Settaggio delle opzioni richieste29 options = optimset(’MaxFunEval’, 30, ...30 ’MaxIter’, 30, ...31 ’TolFun’, 1e-12, ...32 ’TolX’, 1e-12, ...33 ’Display’, ’iter’, ...34 ’LargeScale’,’off’, ...35 ’GradObj’,’on’, ...36 ’HessUpdate’, ’dfp’);37 % Soluzione con la funzione del Toolbox "fminunc"38 [xstar, fstar, exitflag, output, grad, hessian] = fminunc(@Fa, X0, options);39 fprintf(’PUNTO C ==> x_star=[%.6f, %.6f], F(x_star)=%.6f, iterations=%d, f_evals=%d\n’, ...40 xstar(1), xstar(2), fstar, output.iterations, output.funcCount);41 [fs, gs, hs] = Fa(xstar);42 autovalori = eig(hs)

Figure 3.4: Contenuto della soluzione del file script_ott.m.

19