Я объясню более подробно комментарий @ sascha.
Во-первых, давайте посмотрим на разницу между неравенством и ограничениями равенства. документация гласит:
Ограничение равенства означает, что результат функции ограничения должен быть нулевым, тогда как неравенство означает, что оно должно быть неотрицательным.
Таким образом, для ограничения, что x [0] + x [1] <= 100, вы можете использовать ограничение неравенства и определить функцию ограничения следующим образом: </p>
def constraint(x):
return 100 - x[0] - x[1]
, который является неотрицательным, если условие выполнено.
Для условия, что x [0] + x [1] == 100, у вас есть две возможности:
- Вы можете использовать два ограничения неравенства:
def constraint1(x):
return 100 - x[0] - x[1]
def constraint2(x):
return x[0] + x[1] - 100
con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'ineq', 'fun': constraint2}
- Вы можете использовать ограничение равенства:
def constraint(x):
return x[0] + x[1] - 100
con = {'type': 'eq', 'fun': constraint}
Вы также можете рассмотреть возможность использования операторов if в своей функции ограничения, если это кажется вам более интуитивным:
def constraint(x):
return 1 if x[0] + x[1] <= 100 else 0
con = {'type': 'ineq', 'fun':constraint}
Относительно ваших ограничений 2 и 3, обратите внимание, что x[0]%=0
- это сокращение от x[0] = x[0]%0
. Это означает, что это задание. Попытка вернуть назначение приводит к синтаксической ошибке.
Кроме того, вы должны быть осторожны: модуль по нулю не определен. Например, 5%0
выдаст вам ошибку. (Хотя кажется, что для массива NumPy x
x[0]%0
только выдает предупреждение и возвращает 0.)
Можете ли вы объяснить, чего вы хотите достичь с помощью этого ограничения?