Для ограничений.Из документов :
Ограничение равенства означает, что результат функции ограничения должен быть нулевым, тогда как неравенство означает, что оно должно быть неотрицательным.Обратите внимание, что COBYLA поддерживает только ограничения неравенства.
Следовательно, ваше ограничение - это просто функция, которая должна быть неотрицательной.В вашем случае:
def constraint(y):
return y[0] * y[1]
Обратите внимание, что функция должна вводить вектор.Например:
def f(x):
x1, x2 = x
return x1**2 + x2**2
РЕДАКТИРОВАТЬ Использование функции, которая пытается сопоставить рассчитанные и наблюдаемые данные.
def calculated_x(y):
""" example """
y1, y2 = y
x1 = 0.5 + 0.2 * y1 + 0.3 * y2
x2 = 0.4 + 0.1 * y1 + 0.3 * y2
def f(y, x1, x2):
x1_calc, x2_calc = calculated_x(y)
return (x1- x1_calc)**2 + (x2 - x2_calc)**2
m = minimize(f, [0,0], args=(3,2), constraints=({'fun': lambda y: y[0] * y[1], 'type': 'ineq'},))
print(m)
>> array([3, 1.999999])
Вы также можете построить функцию на основе минимизации(пример выше):
def minimize_y(x1, x2):
# note that x1 and x2 become arguments
m = minimize(f, [0,0], args=(x1,x2), constraints=({'fun': lambda y: y[0] * y[1], 'type': 'ineq'},)
return m.x