2013-09-23 31 views
5

Bir fonksiyona sahibim ve maksimum ve minimum değerlerini bulmak istiyorum. Benim işlevim:Bir fonksiyonun minimum ve maksimum değerleri bul

X [-1, 1] ve y [-1, 1] için bir ara verim var. Bu işlevin maksimum ve min değerlerini bulmak için bu aralıkla sınırlı bir yol bulmak istiyorum.

+2

Gerçekten bu işlevle sınırlı mısınız? Ya da keyfi bir işlev için bunu yapmak ister misiniz? Sadece bu işlevse, farklılaşarak göreceli ekstrema bulabilirsiniz. – mgilson

+6

Muhtemelen buraya bir göz atmalısınız: http://docs.scipy.org/doc/scipy/reference/optimize.html –

+0

Yakın tahminler mi yoksa tam kayan nokta mı istiyorsunuz? – Shashank

cevap

8

Örneğin kullanılarak, scipy sitesindeki fmin (Nelder-Mead algoritmasının uygulanması içerir), bu deneyin:

: Aşağıdaki çıkışı sağlayan

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

akılda

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

saklayın o:

1)ileişlevinizi bir diziyi kabul eden bir işleve dönüştürmeniz gerekir (yukarıdaki örnekte nasıl yapılacağını gösterdim);

2) fmin kullanımlar, kendi çiftleri, tekrarlanan bir algoritma çoğu gibi, bu nedenle, bir başlangıç ​​noktası temin gerekir (bizim örneğimizde, l) (0,0) sağladı. Farklı minima/maxima elde etmek için farklı başlangıç ​​noktaları sağlayabilirsiniz.

+0

Harika, ama bir başlangıç ​​noktasından geçebildiğimiz gibi, soruda bahsettiğim gibi bir fonksiyonu sınırlamak için bir yol var ya da menzimden bir çıktı alabilirim (bana öyle geliyor)? İlginiz için teşekkürler. – pceccon

+1

"fmin_tnc" gibi değişken sınırlamayı destekleyen bir yöntem kullanabilirsiniz (şöyle kullanılır: fmin_tnc (f, np.array ([0.5, -0.5]), yaklaşık_grad = True, bounds = [(- 1, 1), (- 1,1)]) '). –

1

Burada oldukça yakın tahminler veren bir şey var (kesin değil).

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 
İlgili konular