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

13

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

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]。我希望在这个区间内找到此函数的最大值和最小值。


3
你是否仅限于此功能?还是希望能对任意函数执行此操作?如果只是针对此函数,那么你可以通过求导来找到相关极值。 - mgilson
7
你可以在这里看一下:http://docs.scipy.org/doc/scipy/reference/optimize.html - Emanuele Bezzi
你想要一个近似值还是精确的浮点数最大值? - Shashank
嗨,@mgilson,这是一个测试函数。它可能会改变。 - pceccon
@ShashankGupta,这可能是近似值。谢谢大家。 - pceccon
@EmanueleBezzi,我已经看过了。但是我还没有想出如何使用函数 z = f(x,y) 而不仅仅是 y = f(x)。 - pceccon
2个回答

22

例如,使用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))。您可以提供不同的起始点以获得不同的最小值/最大值。


1
很棒,但我们只能传递一个起始点,有没有办法限制函数在我提出问题中提到的范围内或者我可以得到超出范围的输出(这是我所理解的)?感谢关注。 - pceccon
3
您可以使用支持变量边界的方法,例如 fmin_tnc(用法如下:fmin_tnc(f,np.array([0.5,-0.5]), approx_grad=True, bounds=[(-1,1),(-1,1)]))。 - Emanuele Bezzi

0

这里有一些可以提供相对接近的估计值(不是精确值)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接