10

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

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

4

2 に答える 2

17

たとえば、(Nelder-Mead アルゴリズムの実装を含む) を使用して、scipyこれfminを試すことができます。

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))。さまざまな開始点を指定して、さまざまな最小値/最大値を取得できます。

于 2013-09-23T18:27:40.237 に答える