如何在Python中找到函数的最大值?我可以尝试将衍生函数组合在一起并找到其中的零,但是numpy
(或其他库)中是否有一个可以为我做的方法?
答案 0 :(得分:19)
您可以对功能的否定使用scipy.optimize.fmin
。
def f(x): return -2 * x**2 + 4 * x
max_x = scipy.optimize.fmin(lambda x: -f(x), 0)
# array([ 1.])
答案 1 :(得分:6)
如果您的功能可解析,请尝试使用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
答案 2 :(得分:1)
您可以尝试SymPy。 SymPy可能能够象征性地为您提供衍生物,找到它的零,等等。
答案 3 :(得分:1)
我认为scipy.optimize.minimize_scalar
和scipy.optimize.minimize
是现在的首选方式,可让您访问各种技术,例如
solution = scipy.optimize.minimize_scalar(lambda x: -f(x), bounds=[0,1], method='bounded')
表示单个变量函数必须介于0和1之间。
答案 4 :(得分:0)
带参数的函数的最大值。
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)