1

x^2のような関数の最小値を計算する関数を定義しました。負の関数を掛けて同様の関数の最小値を計算することにより、関数の最大値を計算する関数を定義したいと思います。

def myf(g):
        return -(g+1.3)**2+5
def maximize(f,low,high,tol):
        return minimize(-1*f,low,high,tol)

これを行う方法はありますか?私が持っているものを試してみると、次のエラーが発生します:

TypeError: unsupported operand type(s) for *: 'int' and 'function'

最小化は次のように定義されます。

def minimize(f,low,high, tol):
    if low>high:
        c=low; a=high
        a=float(a); c=float(c);
    else:
        a=float(low); c=float(high);
    b=a+(c-a)*.618033
    fa=f(a); fc=f(c)
    fb=f(b);
    if fb>fa or fb>fc: return maximize(f,low,high,tol)
    while abs(a-c)>tol:
        d=a+(c-b);
        fd=f(d);
        if d<b:
            if fb<fd:
                a=d; fa=fd;
            else:
                c=b; b=d
                fc=fb; fb=fd
        else:           
            if fd<fb:
                a=b; fa=fb; 
                b=d; fb=fd
            else:
                c=d; fc=fd
    return (a+c)/2.

Pythonコードのみのソリューションを探しています。

4

3 に答える 3

4

関数に数値を掛けることはできません。代わりに、古い関数を使用して結果(関数自体ではなく)に数値を乗算する新しい関数を作成します。

def maximize(f,low,high,tol):
    return minimize(lambda x: -f(x),low,high,tol)
于 2012-04-08T23:50:13.313 に答える
1

これを行うにはいくつかの方法があります。最も簡単なのは、関数を別の関数に「ラップ」することです。ラムダを使用できます:new_f = lambda x: -f(x)。ラムダに慣れていない場合、これはのショートカットです

def new_f(x):
    return -f(x)
于 2012-04-08T23:50:04.983 に答える
1

多分あなたは使うべきscipy.optimizeですか?

http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html

于 2012-04-09T00:01:57.530 に答える