web-dev-qa-db-ja.com

関数の最小値と最大値を見つける

関数があり、その最大値と最小値を見つけたいと思います。私の機能はこれです:

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]の間隔があります。この間隔に限定して、この関数の最大値と最小値を見つける方法を見つけたいと思います。

7
pceccon

たとえば、scipyの-​​ fmin (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)を指定しました)。さまざまな最小値/最大値を取得するために、さまざまな開始点を指定できます。

11
Emanuele Bezzi

これはかなり近い見積もりを与えるものです(正確ではありません)。

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
1
Shashank