2013-09-23 117 views
5

Tôi có chức năng và tôi muốn tìm giá trị tối đa và tối thiểu của nó. Chức năng của tôi là:Tìm giá trị tối thiểu và tối đa của hàm

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) 

Tôi có một khoảng thời gian cho x [-1, 1] và y [-1, 1]. Tôi muốn tìm một cách, giới hạn trong khoảng thời gian này, để khám phá các giá trị tối đa và tối thiểu của hàm này.

+2

Bạn có thực sự giới hạn đối với chức năng này không? Hay bạn muốn có thể làm điều này cho một chức năng tùy ý? Nếu nó chỉ là chức năng này, thì bạn có thể tìm thấy extrema tương đối bằng cách phân biệt. – mgilson

+6

Bạn có thể nên xem tại đây: http://docs.scipy.org/doc/scipy/reference/optimize.html –

+0

Bạn có muốn ước tính gần đúng hoặc điểm nổi chính xác tối đa không? – Shashank

Trả lời

8

Sử dụng, ví dụ, scipy 's fmin (trong đó có một thực hiện các thuật toán Nelder-Mead), bạn có thể thử này:

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

trong đó sản lượng đầu ra sau đây:

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

Hãy nhớ rằng:

1) với scipy bạn cần phải chuyển đổi hàm của bạn thành một hàm chấp nhận một mảng (tôi đã chỉ ra cách thực hiện nó trong ví dụ trên);

2) fmin sử dụng, giống như hầu hết các cặp của nó, một thuật toán lặp, do đó bạn phải cung cấp điểm bắt đầu (trong ví dụ của tôi, tôi cung cấp (0,0)). Bạn có thể cung cấp các điểm bắt đầu khác nhau để có được minima/maxima khác nhau.

+0

Tuyệt vời, nhưng khi chúng ta có thể vượt qua một điểm bắt đầu, có một cách để giới hạn chức năng trong một phạm vi như tôi đã đề cập trong câu hỏi của mình hoặc tôi có thể nhận được đầu ra ngoài phạm vi của tôi (đây là những gì tôi thấy)? Cảm ơn vì đã chú ý. – pceccon

+1

Bạn có thể sử dụng một phương thức hỗ trợ giới hạn biến, như 'fmin_tnc' (nó được sử dụng như sau:' fmin_tnc (f, np.array ([0.5, -0.5]), approx_grad = True, bounds = [(- 1, 1), (- 1,1)]) '). –

1

Dưới đây là một cái gì đó đưa ra ước tính khá gần (không chính xác).

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 
Các vấn đề liên quan