簡體   English   中英

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

[英]Find minimum and maximum values of a function

我有一個函數,我想找到它的最大值和最小值。 我的功能是這樣的:

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] 的間隔。 我想找到一種方法,僅限於這個區間,來發現這個函數的最大值和最小值。

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

這是給出相當接近的估計(不准確)的東西。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM