2017-03-25 4 views
3

現在、私は関数fを定義する次のコードを持っています。パラメータで関数を最小化

a = #something 
b = #something 
c = #something 
def f(x): 
    """Evaluates some function that depends on parameters a, b, and c""" 
    someNumber = #some calculation 
    return someNumber 

理想的には私はdef f(x, a, b, c)を行うだろうが、私はxに関してfを最小限に抑えています、もう1つは、引数のパラメータを持つ関数を最小化するためにscipyのダウンロードの最適化ツールボックスを許可していません。私は、a, bcの複数の値のための私の最小化コードを実行したいと述べた。私はこれを行う方法がありますか?

+2

'functools.partial'を使って特定の' a、b、c'値を持つ関数を「フリーズ」しますか? –

+0

@ PM2Ringこれはうまくいくはずですが、私は今このツールについて知ってうれしいですが、@Liteyeが指摘しているように、 'minimize'は実際にパラメータを渡すことができます。ありがとう! –

+1

心配はいりません。あなたがそれを必要とするときには「部分的」は素晴らしいですが、私はSciPyを知らないので、それは示唆にすぎません。明らかに、Liteyeの答えがこれを行う適切な方法です。 :) –

答えて

7

あなたはこれがminimizeの使用に関する簡単な質問と答えですargs

minimize(f, x0, args=(a, b, c)) 
+0

私はドキュメントでこれを見ていないと信じられません。ありがとうございました! –

1

に追加の引数を指定することができます。他のユーザーがもっと具体的なものを必要とする場合は、ここに簡単な例があります。

一般二次方程式:

In [282]: def fun(x, a,b,c): 
    ...:  return a*x**2 + b*x + c 

In [283]: optimize.minimize(fun, 10, args=(1,0,0)) 
Out[283]: 
     fun: 1.7161984122524196e-15 
hess_inv: array([[ 0.50000001]]) 
     jac: array([ -6.79528891e-08]) 
    message: 'Optimization terminated successfully.' 
    nfev: 15 
     nit: 4 
    njev: 5 
    status: 0 
    success: True 
     x: array([ -4.14270251e-08]) 

In [284]: optimize.minimize(fun, 10, args=(1,1,1)) 
Out[284]: 
     fun: 0.7500000000000221 
hess_inv: array([[ 0.49999999]]) 
     jac: array([ 3.12924385e-07]) 
    message: 'Optimization terminated successfully.' 
    nfev: 12 
     nit: 2 
    njev: 4 
    status: 0 
    success: True 
     x: array([-0.49999985]) 

機能は、同様に、入力として配列を取るが、それでも単一の(スカラー)を返す必要がある可能性があり値:

In [289]: optimize.minimize(fun, [10,10,10], args=(np.array([1,2,3]), 1, 1)) 
Out[289]: 
     fun: 2.541666666667115 
hess_inv: array([[ 0.50021475, -0.00126004, 0.00061239], 
     [-0.00126004, 0.25822101, -0.00259327], 
     [ 0.00061239, -0.00259327, 0.16946887]]) 
     jac: array([ -8.94069672e-08, 4.47034836e-07, -2.20537186e-06]) 
    message: 'Optimization terminated successfully.' 
    nfev: 55 
     nit: 9 
    njev: 11 
    status: 0 
    success: True 
     x: array([-0.50000006, -0.2499999 , -0.16666704]) 

In [286]: def fun(x, a,b,c): 
...:  return (a*x**2 + b*x + c).sum() 

それはすることをお勧めします関数が提案されたx0とargsで実行されていることを確認してください。あなたは目的関数を呼び出し、または引数がどのように動作するかに関して、混乱していることができない場合

In [291]: fun(np.array([10,10,10]), np.array([1,2,3]), 1, 1) 
Out[291]: 633 

minimizeは特効薬ではありません。この最小化は目的関数の理解と同じくらい良いです。

関連する問題