6

最小化関数を介して追加の引数を制約辞書に渡す方法がわかりません。追加の引数を目的関数に正常に渡すことができます。

最小化機能に関するドキュメントはこちら: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize

制約引数は、args がシーケンスであるフィールド 'args' を持つ dict です。これは、追加の引数を渡す必要がある場所だと確信していますが、構文はわかりません。私が持っている最も近いものは以下の通りです:

from scipy.optimize import minimize
def f_to_min (x, p):
    return (p[0]*x[0]*x[0]+p[1]*x[1]*x[1]+p[2])

f_to_min([1,2],[1,1,1]) # test function to minimize

p=[] # define additional args to be passed to objective function
f_to_min_cons=({'type': 'ineq', 'fun': lambda x, p : x[0]+p[0], 'args': (p,)}) # define constraint

p0=np.array([1,1,1])
minimize(f_to_min, [1,2], args=(p0,), method='SLSQP', constraints=f_to_min_cons)

次のエラーが表示されます

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-19-571500063c9e> in <module>()
      1 p0=np.array([1,1,1])
----> 2 minimize(f_to_min, [1,2], args=(p0,), method='SLSQP', constraints=f_to_min_cons)

C:\Python27\lib\site-packages\scipy\optimize\_minimize.pyc in minimize(fun, x0, args,     method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    356     elif meth == 'slsqp':
    357         return _minimize_slsqp(fun, x0, args, jac, bounds,
--> 358                                constraints, **options)
    359     else:
    360         raise ValueError('Unknown solver %s' % method)

C:\Python27\lib\site-packages\scipy\optimize\slsqp.pyc in _minimize_slsqp(func, x0,     args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, **unknown_options)
    298     # meq, mieq: number of equality and inequality constraints
    299     meq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in     cons['eq']]))
--> 300     mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in     cons['ineq']]))
    301     # m = The total number of constraints
    302     m = meq + mieq

<ipython-input-18-163ef1a4f6fb> in <lambda>(x, p)
----> 1 f_to_min_cons=({'type': 'ineq', 'fun': lambda x, p : x[0]+p[0], 'args': (p,)})

IndexError: list index out of range

追加パラメーターの最初の要素にアクセスしているので、範囲外のエラーは発生しません。

最小化関数から Constraints=f_to_min_cons 引数を削除すると、上記のコードが機能します。

4

1 に答える 1

1

簡単に言えば、p = [] には要素も長さもありません。そのため、p[0] は範囲外です。

p = [0] を設定した以下は、エラーなしで実行されます。p が実際に保持すべきものはもちろん、与えられた情報で答えられるものではありません。

import numpy as np

from scipy.optimize import minimize
def f_to_min (x, p):
    return (p[0]*x[0]*x[0]+p[1]*x[1]*x[1]+p[2])

f_to_min([1,2],[1,1,1]) # test function to minimize

p=[0] # define additional args to be passed to objective function
f_to_min_cons=({'type': 'ineq', 'fun': lambda x, p : x[0]+p[0], 'args': (p,)},) # define constraint

p0=np.array([1,1,1])
minimize(f_to_min, [1,2], args=(p0,), method='SLSQP', constraints=f_to_min_cons)
于 2018-08-15T19:31:03.837 に答える