Fminsearch non trova il minimo assoluto
Salve a tutti. Pochi giorni fa ho aperto un topic riguardo un problema con uno script MATLAB. Ora sono andato un po' avanti e apro un nuovo topic essendo il problema un po' più specifico.
Senza ripetere tutto (potete leggere nel vecchio topic), devo trovare il minimo di questa funzione:


(Ho anche il file .fig. Se mi dite come fare lo allego)
Come si vede, il minimo assoluto (al di fuori della porzione visualizzata la funzione cresce sempre) si trova in (1.5 , 0.5) . Se però uso la funzione fminsearch impostando come punto iniziale (0,0) , questa mi restituisce come minimo il punto (0.6,0) che come si vede è solo un minimo relativo.
Il problema è che la funzione dipende da una serie di parametri in input, quindi non posso sapere a priori quale sia il punto migliore da cui iniziare la ricerca. Inoltre potrebbe variare persino l'ordine di grandezza di questi parametri, ma quello lo posso sempre "misurare" prima di far partire la ricerca con fminseach.
Come posso fare per dire alla funzione fminseach di "guardare" in un intorno più vasto, in modo da trovare il minimo assoluto "vero"?
Senza ripetere tutto (potete leggere nel vecchio topic), devo trovare il minimo di questa funzione:


(Ho anche il file .fig. Se mi dite come fare lo allego)
Come si vede, il minimo assoluto (al di fuori della porzione visualizzata la funzione cresce sempre) si trova in (1.5 , 0.5) . Se però uso la funzione fminsearch impostando come punto iniziale (0,0) , questa mi restituisce come minimo il punto (0.6,0) che come si vede è solo un minimo relativo.
Il problema è che la funzione dipende da una serie di parametri in input, quindi non posso sapere a priori quale sia il punto migliore da cui iniziare la ricerca. Inoltre potrebbe variare persino l'ordine di grandezza di questi parametri, ma quello lo posso sempre "misurare" prima di far partire la ricerca con fminseach.
Come posso fare per dire alla funzione fminseach di "guardare" in un intorno più vasto, in modo da trovare il minimo assoluto "vero"?
Risposte
Ok. Argomento chiuso.
Sbagliavo io: fminsearch è normale cerchi il minimo relativo e che quindi sia fortemente dipendente dal punto iniziale.
Essendo il mio problema un problema di ottimizzazione di errori quadratici è meglio usare la funtion lsqnonlin.
Il codice da me usato è il seguente:
dove fun è la seguente:
Grazie a tutti.
Ciao
Sbagliavo io: fminsearch è normale cerchi il minimo relativo e che quindi sia fortemente dipendente dal punto iniziale.
Essendo il mio problema un problema di ottimizzazione di errori quadratici è meglio usare la funtion lsqnonlin.
Il codice da me usato è il seguente:
pto_new=lsqnonlin(@(X)fun(X,pti_test,d),[0;0],[],[],... optimset('Display','off','Algorithm','levenberg-marquardt'));
dove fun è la seguente:
function E=fun(X,pti,d) x0=pti(:,1); y0=pti(:,2); E=0; for i=1:size(x0,1) E=E+ (sqrt((x0(i)-X(1))^2+(y0(i)-X(2))^2) -d(i))^2; end end
Grazie a tutti.
Ciao