2012-04-13 16 views
9

¿Cómo puedo encontrar el máximo de una función en Python? Podría intentar hackear juntos una función derivada y encontrar el cero de eso, pero ¿hay algún método en numpy (u otra biblioteca) que pueda hacerlo por mí?Encontrar el máximo de una función

+0

Busque en la sección de búsqueda dorada. http://en.wikipedia.org/wiki/Golden_section_search – wberry

+0

@EMS eso es generalmente lo que hago, pero no siempre estoy así. Tienes que darle tiempo a la gente: P –

+0

Lo siento, no quise sonar perspicaz. Muchas cosas no son aceptadas, así que generalmente escribo un recordatorio como ~ 1 día más tarde, antes de olvidar que incluso respondí esa pregunta específica. – ely

Respuesta

15

Puede usar scipy.optimize.fmin en el negativo de su función.

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

Pero tenga en cuenta que realmente necesita prestar atención a los problemas de análisis numérico aquí. A menudo es una señal de alerta de error inminente cuando alguien dice "¿cómo puede una biblioteca resolver esto por mí?" Asegúrese de que * usted * realmente comprenda qué está haciendo la función de la biblioteca. Eso es cierto incluso si has estado haciendo un trabajo numérico durante mucho tiempo. Recientemente sufrí un [problema similar] (http://stackoverflow.com/questions/10038543/tracking-down-the-assumptions-made-by-scipys-ttest-ind-function) con 'scipy.stats'. – ely

+0

Lo siento por una pregunta sin relación, pero ¿por qué hay cero en la expresión lambda? – user1700890

+1

El cero no es parte de la 'lambda'. Un 'lambda' no puede devolver implícitamente una' tupla' devolviendo una secuencia de valores separados por comas, como lo hace una función regular de Python. En este caso, la coma es parte de la lista de argumentos para 'scipy.optimize.fmin', por lo que el primer argumento completo es' lambda x: -f (x) 'y el segundo argumento completo es' 0'. – ely

1

Usted podría intentar SymPy. SymPy podría proporcionarle la derivada de forma simbólica, encontrar sus ceros, etc.

5

Si su función se puede solucionar analíticamente, intente SymPy. Usaré el ejemplo de EMS arriba.

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] 

Por supuesto, usted todavía tiene que comprobar que 1 es un maximizador y no un minimizador de f

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

Creo scipy.optimize.minimize_scalar y scipy.optimize.minimize son las formas preferidas ahora, que le dará acceso al rango de técnicas, por ejemplo

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

para una sola función variable que debe estar entre 0 y 1.

0

máximo de una función con parámetros.

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) 
Cuestiones relacionadas