Мой 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)