문제
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)
그러나 이것은 제대로 작동하지 않습니다. 실수가 무엇인지 모르겠습니다. 내 제약을 함수로 전달하는 더 좋은 방법이 있습니까? 도와주세요.
해결책
Robert Kern의 의견을 바탕으로 이전 답변을 제거했습니다. 연속 기능과 같은 제약은 다음과 같습니다.
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
, 하한 외부 조건 처리, 하부 경계에서 0 e==a
, 그리고 긍정적 인 e>a
중간 지점까지.
중간 지점 이상, 즉 모든 것입니다 e>1.2*a
, 우리는 대신 연속 기능을 사용합니다 1.4*a-e
. 이것은 전체 제약 기능이 e>1.4*a
, 상단 외부 조건 처리, 상단 경계에서 0 e==1.4*a
, 그리고 긍정적 인 경우 e<1.4*a
, 중간 지점까지.
중간 지점에서 어디에서 e==1.2*a
, 두 기능 모두 동일한 값을 갖습니다. 이것은 전체 기능이 연속적임을 의미합니다.
참조: 문서화 ieqcons
.
1 - 여기 Preython 2.5 구문이 있습니다. b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]