문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top