2013-09-23 21 views
5

Mam funkcję i chciałbym znaleźć jej maksymalną i minimalną wartość. Moja funkcja jest następująca:Znajdź wartości minimalne i maksymalne funkcji

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) 

Mam przedział dla x [-1, 1] i y [-1, 1]. Chciałbym znaleźć sposób, ograniczony do tego przedziału, aby odkryć wartości maksymalne i minimalne tej funkcji.

+2

Czy naprawdę ogranicza się tylko do tej funkcji? A może chcesz to zrobić dla dowolnej funkcji? Jeśli jest to tylko ta funkcja, możesz znaleźć relatywny ekstrema poprzez różnicowanie. – mgilson

+6

Powinieneś zajrzeć tutaj: http://docs.scipy.org/doc/scipy/reference/optimize.html –

+0

Czy chcesz uzyskać przybliżone prognozy lub maksymalną wartość zmiennoprzecinkową? – Shashank

Odpowiedz

8

stosując, na przykład, scipy „s fmin (który zawiera implementację algorytmu Nelder-Mead), można spróbować to:

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])) 

co daje następujący wynik:

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

Należy pamiętać, że:

1) z scipy musisz przekonwertować swoją funkcję na funkcję akceptującą tablicę (pokazałem, jak to zrobić w powyższym przykładzie);

2) fmin używa, podobnie jak większość swoich par, iteracyjnego algorytmu, dlatego musisz podać punkt początkowy (w moim przykładzie podałem (0,0)). Możesz podać różne punkty początkowe, aby uzyskać różne minimalne/maksymalne.

+0

Awesome, ale jak możemy po prostu przekazać punkt wyjścia, istnieje sposób na ograniczenie funkcji w zakresie, jak wspomniałem w moim pytaniu lub mogę otrzymać wyjście z mojego zakresu (tak mi się wydaje)? Dziękuję za uwagę. – pceccon

+1

Możesz użyć metody obsługującej zmienne ograniczenie, np. 'Fmin_tnc' (jest używane w następujący sposób:' fmin_tnc (f, np.array ([0.5, -0.5]), approx_grad = True, bounds = [(- 1, 1), (- 1,1)]) "). –

1

Oto coś, co daje dość dokładne szacunki (a nie dokładne).

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