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)

但是,这不能正常工作。我不知道这个错误是什么。 有没有更好的方式来传递我的约束功能? 请帮我。

有帮助吗?

解决方案

根据罗伯特·克恩的评论,我已删除了我以前的答案。下面是约束的连续函数:

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*aa1.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]]

scroll top