我的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)
但这不起作用。在定义name 'p' is not defined
的行中收到错误cons
。如何将参数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)
答案 0 :(得分:0)
好吧,我发现这是语法错误和参数传递方式的混合体。对于可能有相同问题的人,我将在此处发布答案。
目标函数是obj(e, p)
。我们只想最小化e
,所以我们创建其他自变量arguments = (0.5,)
的元组。即,设置了特定值p=0.5
。接下来定义约束函数
def prob_bound(e, p):
return -e - p + 1
现在将约束字典写为
cons = ({'type': 'ineq',
'fun': prob_bound,
'args': arguments
})
最后,有人叫最小化器
result = minimize(obj, initial_guess, method = 'SLSQP', args = arguments, constraints = cons)