查找函数的最小值和最大值

时间:2013-09-23 17:20:37

标签: python function max min

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

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]的间隔。我想找到一种限制在这个间隔内的方法来发现这个函数的最大值和最小值。

2 个答案:

答案 0 :(得分:9)

例如,使用scipy的{​​{3}}(其中包含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))。您可以提供不同的起点以获得不同的最小值/最大值。

答案 1 :(得分:1)

这是一个给出相当接近的估计(不准确)的东西。

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