【问题标题】:Find minimum and maximum values of a function查找函数的最小值和最大值
【发布时间】:2013-09-28 16:48:22
【问题描述】:

我有一个函数,我想找到它的最大值和最小值。我的功能是这样的:

def function(x, y):
    exp = (math.pow(x, 2) + math.pow(y, 2)) * -1
    return math.exp(exp) * math.cos(x * y) * math.sin(x * y)

我有一个 x [-1, 1] 和 y [-1, 1] 的区间。我想找到一种方法,仅限于这个区间,来发现这个函数的最大值和最小值。

【问题讨论】:

  • 你真的只限于这个功能吗?或者您是否希望能够为任意功能执行此操作?如果只是这个函数,那么你可以通过微分找到相对极值。
  • 您想要接近的估计值还是精确的浮点最大值?
  • 嗨,@mgilson,这是一个测试函数。它可能会改变。
  • @ShashankGupta,这可能是接近的估计。谢谢大家。

标签: python function max min


【解决方案1】:

例如,使用 scipyfmin(其中包含 Nelder-Mead 算法的实现),您可以试试这个:

import numpy as np
from scipy.optimize import fmin
import math

def f(x):
    exp = (math.pow(x[0], 2) + math.pow(x[1], 2)) * -1
    return math.exp(exp) * math.cos(x[0] * x[1]) * math.sin(x[0] * x[1])

fmin(f,np.array([0,0]))

产生以下输出:

Optimization terminated successfully.
     Current function value: -0.161198
     Iterations: 60
     Function evaluations: 113 
array([ 0.62665701, -0.62663095])

请记住:

1) 使用scipy,您需要将您的函数转换为接受数组的函数(我在上面的示例中展示了如何做到这一点);

2) fmin 与大多数配对一样使用迭代算法,因此您必须提供一个起点(在我的示例中,我提供了(0,0))。您可以提供不同的起点来获得不同的最小值/最大值。

【讨论】:

  • 太棒了,但是因为我们可以通过一个起点,所以有一种方法可以将函数限制在一个范围内,正如我在问题中提到的那样,或者我可以收到超出我范围的输出(这是在我看来是什么)?感谢您的关注。
  • 你可以使用支持变量边界的方法,比如fmin_tnc(这样使用:fmin_tnc(f,np.array([0.5,-0.5]), approx_grad=True, bounds=[(-1,1),(-1,1)]))。
【解决方案2】:

这里给出了相当接近的估计值(不准确)。

import math
import random
import sys

def function(x, y):
    exp = (math.pow(x, 2) + math.pow(y, 2)) * -1
    return math.exp(exp) * math.cos(x * y) * math.sin(x * y)

max_func = - sys.maxint - 1
min_func = sys.maxint
maximal_x, maximal_y = None, None
minimal_x, minimal_y = None, None

for i in xrange(1000000):
    randx = random.random()*2 - 1
    randy = random.random()*2 - 1
    result = function(randx, randy)
    max_func = max(max_func, result)
    if max_func == result:
        maximal_x, maximal_y = randx, randy
    min_func = min(min_func, result)
    if min_func == result:
        minimal_x, minimal_y = randx, randy

print "Maximal (x, y):", (maximal_x, maximal_y)
print "Max func value:", max_func, '\n'
print "Minimal (x, y):", (minimal_x, minimal_y)
print "Min func value:", min_func

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2021-09-15
    • 2017-04-20
    • 2018-10-26
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多