Python最小化函数:将附加参数传递到约束字典

Python最小化函数:将附加参数传递到约束字典,python,python-2.7,scipy,minimize,Python,Python 2.7,Scipy,Minimize,我不知道如何通过最小化函数将附加参数传递到约束字典。我可以成功地将其他参数传递给目标函数 关于最小化功能的文档如下: 约束参数是一个dict,它有一个字段“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

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

关于最小化功能的文档如下:

约束参数是一个dict,它有一个字段“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
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
1 p0=np.数组([1,1,1])
---->2最小化(f_至_min[1,2],args=(p0,),方法='SLSQP',约束=f_至_min_cons)
最小化中的C:\Python27\lib\site packages\scipy\optimize\\u minimize.pyc(fun、x0、args、method、jac、hess、hessp、bounds、constraints、tol、callback、options)
356 elif meth==“slsqp”:
357返回_最小化_slsqp(fun、x0、args、jac、bounds、,
-->358限制条件,**选项)
359其他:
360提升值错误('未知解算器%s'%1!''方法)
C:\Python27\lib\site packages\scipy\optimize\slsqp.pyc in_minimize_slsqp(func、x0、args、jac、bounds、constraints、maxiter、ftol、iprint、disp、eps、**未知选项)
298#meq,mieq:平等和不平等约束的数量
299 meq=和(图(len,[c['fun'](x,*c['args'])中的c在cons['eq']]中的最小值)
-->300 mieq=sum(对于cons['ineq']]中的c,映射(len,[c['fun']](x,*c['args']))
301#m=约束的总数
302 m=meq+mieq
in(x,p)
---->1 f_to_min_cons=({'type':'ineq','fun':lambda x,p:x[0]+p[0],'args':(p,)})
索引器:列表索引超出范围
我正在访问附加参数的第一个元素,因此不应该出现超出范围的错误


如果从最小化函数中删除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)

我在这台电脑上安装了scipy 0.9,因此没有
minimize
,我无法测试它。但是您的代码中有一个
p=[]
,因此当您尝试获取
p[0]
时,
索引超出范围。将您的
f_更改为\u min_cons
定义,使其具有
'args':(p0,)
,您应该已经上路了。除了@Jaime已经说过的内容之外:问题中的代码中似乎有语法错误:检查
'args'
参数前的右括号。感谢您的评论。是的,这确实有效。但是,如果我理解正确,我相信p0没有通过最小化函数传递到约束字典。i、 e.如果我将最小化参数'args'=(p0,)更改为'args'=(p1,),则p1将用于目标函数,f_至_min,但p0将用于约束字典。是的,关于语法错误,您是对的。我一定是手工编辑了这篇文章,而不是从Python代码中复制粘贴。已更新。再次感谢您的评论。我只是想确认一下。无法从最小化调用向约束函数传递附加参数。如果是这样的话,我不明白为什么最小化函数是这样设置的:额外的参数可以传递给代价函数,但不能传递给约束函数。