21

如何在 Python 中找到函数的最大值?我可以尝试将一个导数函数组合在一起并找到它的零,但是numpy(或其他库)中是否有一种方法可以为我做到这一点?

4

5 回答 5

27

您可以scipy.optimize.fmin在函数的负数上使用。

def f(x): return -2 * x**2 + 4 * x
max_x = scipy.optimize.fmin(lambda x: -f(x), 0)
# array([ 1.])
于 2012-04-13T19:17:45.493 回答
9

如果您的函数可以解析求解,请尝试 SymPy。我将使用上面的 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]

当然,您仍然需要检查 1 是否是 f 的最大值而不是最小值

In [7]: f.diff(x).diff(x) < 0
Out[7]: True
于 2012-04-19T13:54:32.127 回答
3

我认为scipy.optimize.minimize_scalar并且scipy.optimize.minimize是现在的首选方式,可以让您访问各种技术,例如

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

对于必须位于 0 和 1 之间的单个变量函数。

于 2014-12-03T09:41:33.040 回答
0

你可以试试SymPy。SymPy 可能能够象征性地为您提供导数,找到它的零点,等等。

于 2012-04-13T20:50:58.217 回答
-1

带参数的函数的最大值。

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)
于 2014-12-05T16:16:11.167 回答