Python 最小化函数 : passing additional arguments to constraint dictionary

标签 python python-2.7 scipy minimize

我不知道如何通过最小化函数将附加参数传递给约束字典。我可以成功地将额外的参数传递给目标函数。

有关最小化功能的文档在此处:http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize

constraints 参数是一个包含字段“args”的字典,其中 args 是一个序列。我确定这是我需要传递额外参数的地方,但我不知道语法。我得到的最接近的如下:

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 参数,那么上面的代码就可以工作了。

最佳答案

答案很简单,就是 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)

关于Python 最小化函数 : passing additional arguments to constraint dictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148296/

相关文章:

python - 从 PuLP 迁移到 Scipy

python - 在 scipy 中导入 qmc 作为子模块

python - 管理自定义对象到额外日期和时间的最佳方法

python - 使用 Python 和 Selenium 按文本单击按钮

python - 如何从网站中提取信息?

python - 使用 py_compile 时未捕获语法错误

python-2.7 - 如果任务成功完成,AsyncResult 返回 None

python - 通过函数: UnboundLocalError更改全局变量

python - 如何从图中提取点?

python - 根据条件从列表的数据框列中计算和删除元素