Nick T
Nick T

Reputation: 26717

Finding the maximum of a function

How do I find the maximum of a function in Python? I could try to hack together a derivative function and find the zero of that, but is there a method in numpy (or other library) that can do it for me?

Upvotes: 23

Views: 78827

Answers (5)

rndev
rndev

Reputation: 792

Maximum of a function with parameters.

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)

Upvotes: -1

phasor
phasor

Reputation: 51

I think scipy.optimize.minimize_scalar and scipy.optimize.minimize are the preferred ways now, that give you access to the range of techniques, e.g.

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

for a single variable function that must lie between 0 and 1.

Upvotes: 4

MRocklin
MRocklin

Reputation: 57281

If your function is solvable analytically try SymPy. I'll use EMS's example above.

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]

Of course, you'll still need to check that 1 is a maximizer and not a minimizer of f

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

Upvotes: 9

ely
ely

Reputation: 77464

You can use scipy.optimize.fmin on the negative of your function.

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

Upvotes: 31

zarthur
zarthur

Reputation: 521

You could try SymPy. SymPy might be able to provide you with the derivative symbolically, find its zeros, and so on.

Upvotes: 0

Related Questions