Scipy свести к минимуму: как передать аргументы как цели, так и ограничения - PullRequest
0 голосов
/ 10 февраля 2019

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

1 Ответ

0 голосов
/ 10 февраля 2019

Хорошо, я подумал, что это сочетание синтаксических ошибок с моей стороны и того, как должны передаваться аргументы.Для тех, у кого может быть тот же вопрос, я выложу ответ здесь.

Целевая функция - 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...