2012-04-13 12 views
9

Jak znaleźć maksimum funkcji w Pythonie? Mógłbym spróbować zhakować pochodną funkcję i znaleźć zero tego, ale czy istnieje metoda w numpy (lub innej bibliotece), która może to zrobić dla mnie?Wyszukiwanie maksimum funkcji

+0

Sprawdź wyszukiwanie w złotym przekroju. http://en.wikipedia.org/wiki/Golden_section_search – wberry

+0

@EMS to na ogół to, co robię, ale nie zawsze jestem na SO. Musisz dać ludziom trochę czasu: P –

+0

Przepraszam, nie chciałem brzmieć persnickety. Wiele się nie zgadza, więc generalnie piszę notatkę przypominającą około 1 dzień później, zanim zapomnę, że nawet odpowiedziałem na to konkretne pytanie. – ely

Odpowiedz

15

Możesz użyć scipy.optimize.fmin na minusie swojej funkcji.

def f(x): return -2 * x**2 + 4 * x 
max_x = scipy.optimize.fmin(lambda x: -f(x), 0) 
# array([ 1.]) 
+7

Należy jednak pamiętać, że naprawdę należy zwrócić uwagę na problemy z analizą numeryczną. Często jest to czerwona flaga zbliżającego się błędu, gdy ktoś mówi: "w jaki sposób biblioteka może rozwiązać to dla mnie?" Upewnij się, że * ty * naprawdę rozumiesz, co robi funkcja biblioteki. To prawda, nawet jeśli wykonywałeś pracę numeryczną przez długi czas. Niedawno miałem [podobny problem] (http://stackoverflow.com/questions/10038543/tracking-down-theassassions-made-by-scipys-ttest-ind-function) z 'scipy.stats'. – ely

+0

Przykro mi z powodu niepowiązanego pytania, ale dlaczego w wyrażeniu lambda występuje zero? – user1700890

+1

Zero nie jest częścią 'lambda'. 'Lambda' nie może niejawnie zwrócić' krotki', zwracając rozdzielaną przecinkami sekwencję wartości, tak jak zwykła funkcja Pythona. W tym przypadku przecinek jest częścią listy argumentów dla 'scipy.optimize.fmin', więc cały pierwszy argument to' lambda x: -f (x) ', a cały drugi argument to' 0'. – ely

1

Możesz spróbować SymPy. SymPy może być w stanie dostarczyć pochodną symbolicznie, znaleźć jej zera i tak dalej.

5

Jeśli twoja funkcja jest możliwa do rozwiązania analitycznie spróbuj SymPy. Użyję powyższego przykładu EMS.

In [1]: from sympy import * 
In [2]: x = Symbol('x', real=True) 

In [3]: f = -2 * x**2 + 4*x 

In [4]: fprime = f.diff(x) 
In [5]: fprime 
Out[5]: -4*x + 4 

In [6]: solve(fprime, x) # solve fprime = 0 with respect to x 
Out[6]: [1] 

Oczywiście, będzie trzeba jeszcze sprawdzić, czy 1 jest maximizer a nie Minimizer f

In [7]: f.diff(x).diff(x) < 0 
Out[7]: True 
1

myślę scipy.optimize.minimize_scalar i scipy.optimize.minimize są preferowane sposoby teraz, że daje dostęp do zakresu technik, np

solution = scipy.optimize.minimize_scalar(lambda x: -f(x), bounds=[0,1], method='bounded') 

dla jednej zmiennej funkcji, które muszą mieścić się między 0 i 1.

0

maksimum funkcji z parametrów.

import scipy.optimize as opt 

def get_function_max(f, *args): 
    """ 
    >>> round(get_function_max(lambda x, *a: 3.0-2.0*(x**2)), 2) 
    3.0 

    >>> round(get_function_max(lambda x, *a: 3.0-2.0*(x**2)-2.0*x), 2) 
    3.5 

    >>> round(get_function_max(lambda x, *a: a[0]-a[1]*(x**2)-a[1]*x, 3.0, 2.0), 2) 
    3.5 
    """ 
    def func(x, *arg): 
     return -f(x, *arg) 
    return f(opt.fmin(func, 0, args=args, disp=False)[0], *args) 
Powiązane problemy