Использование лямбды для функции ограничения - PullRequest
1 голос
/ 02 октября 2009
import numpy 
from numpy import asarray

Initial = numpy.asarray [2.0, 4.0, 5.0, 3.0, 5.0, 6.0]       # Initial values to start with


bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000), (1.0, 5000), (2, 1000000)] 

# actual passed bounds

b1 = lambda x: numpy.asarray([1.4*x[0] - x[0]])  
b2 = lambda x: numpy.asarray([1.4*x[1] - x[1]])  
b3 = lambda x: numpy.asarray([x[2] - x[3]])     
constraints = numpy.asarray([b1, b2, b3])

opt= optimize.fmin_slsqp(func,Initial,ieqcons=constraints,bounds=bounds, full_output=True,iter=200,iprint=2, acc=0.01)

Проблема: Я хочу передать ограничения неравенства. Считайте, что у меня 6 параметров

[ a, b, c, d, e, f]

в значениях Initial, и мои ограничения:

a<=e<=1.4*a   ('e' varies from a to 1.4*a)
b<=f<=1.4*b   ('f' varies from b to 1.4*b)
c>d           ('c' must always be greater than d)

Но это не работает должным образом. Я не знаю, в чем ошибка. Есть ли лучший способ передать мои ограничения как функцию? Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 03 октября 2009

Основываясь на комментарии Роберта Керна, я удалил свой предыдущий ответ. Вот ограничения как непрерывные функции:

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]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...