2013-09-28 15 views
12

Sto convertendo un codice Matlab in python usando numpy. Tutto ha funzionato abbastanza bene, ma recentemente ho incontrato la funzione fminsearch.analogico numpy/scipy di matlach's fminsearch

Quindi, per farla breve: c'è un modo semplice per fare in pitone qualcosa di simile:

banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2; 
[x,fval] = fminsearch(banana,[-1.2, 1]) 

che restituirà

x = 1.0000 1.0000 
fval = 8.1777e-010 

Fino ad ora non ho trovato nulla che sembra simile a Numpy. L'unica cosa che ho trovato simile è scipy.optimize.fmin. In base alla definizione,

Ridurre a icona una funzione utilizzando l'algoritmo in discesa semplice.

Ma in questo momento non riesco a trovare per scrivere il codice Matlab suddetta di utilizzare questa funzione

risposta

15

E 'solo una conversione straight-forward da sintassi Matlab per la sintassi Python:

import scipy.optimize 

banana = lambda x: 100*(x[1]-x[0]**2)**2+(1-x[0])**2 
xopt = scipy.optimize.fmin(func=banana, x0=[-1.2,1]) 

con uscita:

Optimization terminated successfully. 
     Current function value: 0.000000 
     Iterations: 85 
     Function evaluations: 159 
array([ 1.00002202, 1.00004222]) 
8

fminsearch implementa il metodo Nelder-Mead, vedere Matlab documento: http://www.mathworks.com/help/matlab/ref/fminsearch.html. Nella sezione di riferimento.

Per trovare l'equivalente in scipy, è sufficiente controllare le stringhe doc dei metodi forniti in scipy.optimize. Vedi: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin.html#scipy.optimize.fmin. fmin implementa anche il metodo Nelder-Mead.

I nomi non sempre vengono tradotti direttamente da matlab a scipy e talvolta sono anche fuorvianti. Ad esempio, il metodo di Brent è implementato come fminbnd in Matlab ma optimize.brentq in scipy. Quindi, controllare le stringhe doc è sempre una buona idea.

Problemi correlati