2013-09-23 2 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합니다 (Nelder-미드 알고리즘의 구현을 포함하는)을, 당신이 시도 할 수 있습니다 :

: 다음과 같은 출력을 얻을 수

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)을 0123과 함께 사용하십시오.함수를 배열을 받아들이는 함수로 변환해야합니다 (위 예제에서 어떻게하는지 보여 줬습니다);

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