2013-09-23 98 views
5

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

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

你真的只限于这个功能吗?或者你想为任意功能做到这一点?如果只是这个函数,那么通过区分就可以找到相对极值。 – mgilson

+6

你也许应该看看这里:http://docs.scipy.org/doc/scipy/reference/optimize.html –

+0

你想要接近的估计或确切的浮点数最大? – Shashank

回答

8

使用,例如,scipyfmin(其中包含内尔德 - 米德算法的实现),你可以试试这个:

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)with scipy你需要将你的函数转换为一个接受数组的函数(我在上面的例子中展示了如何实现);

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

+0

太棒了,但是因为我们只能通过一个起点,所以有一种方法可以限制我在问题中提到的范围内的功能,或者我可以从范围内接收输出(这是我看来的)?感谢您的关注。 – pceccon

+1

您可以使用支持变量边界的方法,如'fmin_tnc'(它的用法如下:'fmin_tnc(f,np.array([0.5,-0.5]),approx_grad = True,bounds = [( - 1, 1),( - 1,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