这是我的最小可行化产品(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,)
。在某些情况下,它可能会自动将标量转换为元组,但为了安全起见,我建议手动进行转换。 - hpauljargs=(0.5,)
将p
设置为在调用obj
时使用的参数。但是,查看minimize
的文档,似乎cons
中的args
定义了传递给 lambda 的内容。因此,我会尝试'args': (0.5,)
。我很少使用cons
,所以完全是根据文档而非经验来进行操作。 - hpaulj