【发布时间】:2019-07-03 20:05:12
【问题描述】:
我的MWE如下
def obj(e, p):
S = f(e) + g(p)
return S
我想仅通过 e 最小化这个函数,并将 p 作为参数传递给函数。但是,我也想要一个依赖于 p 和 e 的约束,其形式为 p + e < 1
我试过了
cons = {'type': 'ineq',
'fun': lambda e, p: -e -p + 1,
'args': (p)}
然后,我尝试将 p = 0.5 的情况最小化
minimize(obj, initial_guess, method = 'SLSQP', args = 0.5, constraints = cons)
但这不起作用。我在定义cons 的行中收到错误name 'p' is not defined。如何将参数 p 传递给目标函数和约束?
完整代码如下
from scipy.optimize import minimize
from scipy.stats import entropy
import numpy as np
#Create a probability vector
def p_vector(x):
v = np.array([x, 1-x])
return v
#Write the objective function
def obj(e, p):
S = -1*entropy(p_vector(p + e), base = 2)
return S
##Constraints
cons = {'type': 'ineq',
'fun': lambda e: -p - e + 1,
'args': (p,)
}
initial_guess = 0
result = minimize(obj, initial_guess, method = 'SLSQP', args = (0.5, ), constraints = cons)
print(result)
【问题讨论】:
-
将
args作为元组传递使用(p,)和(0.5,)。在某些情况下,它可能会为您将标量变成元组,但为了安全起见,我自己会这样做。 -
我在定义 cons 时使用 'args': (p,) 进行了尝试,但我仍然有一个错误,提示名称 'p' 未在该行中定义。另外,如果不清楚 p = 0.5 是我正在尝试运行的情况
-
args=(0.5,)在对obj的调用中设置p。但是查看minimize文档,它看起来像cons中的args,定义了传递给lambda 的内容。所以我会尝试'args': (0.5,)。我没有经常使用cons,所以我完全根据文档工作,而不是经验。 -
嗯,它现在给了我一个新错误“
() 需要 1 个位置参数,但给出了 2 个”。为了清楚起见,我已将完整代码附加到问题中
标签: python-3.x optimization scipy