Основываясь на комментарии Роберта Керна, я удалил свой предыдущий ответ. Вот ограничения как непрерывные функции:
b1 = lambda x: x[4]-x[0] if x[4]<1.2*x[0] else 1.4*x[0]-x[4]
b2 = lambda x: x[5]-x[1] if x[5]<1.2*x[1] else 1.4*x[1]-x[5]
b3 = lambda x: x[2]-x[3]
Примечание: для этого синтаксиса требуется Python 2.5 или выше. 1
Чтобы получить ограничение a<=e<=1.4*a
, обратите внимание, что 1.2*a
- это промежуточная точка между a
и 1.4*a
.
Ниже этой точки, то есть все e<1.2*a
, мы используем непрерывную функцию e-a
. Таким образом, общая функция ограничения является отрицательной, когда e<a
, обрабатывая нижнее условие выхода за пределы, ноль на нижней границе e==a
, а затем положительной для e>a
до половины пути.
Над серединой, то есть всеми e>1.2*a
, вместо этого мы используем непрерывную функцию 1.4*a-e
. Это означает, что общая функция ограничения отрицательна, когда e>1.4*a
, обрабатывает верхнее условие выхода за пределы, ноль на верхней границе e==1.4*a
, а затем положительна, когда e<1.4*a
, до половины.
В половине пути, где e==1.2*a
, обе функции имеют одинаковое значение. Это означает, что общая функция непрерывна.
Ссылка: документация для ieqcons
.
1 - Вот синтаксис перед Python 2.5: b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]