Python 对约束函数使用lambda

Python 对约束函数使用lambda,python,lambda,numpy,scipy,Python,Lambda,Numpy,Scipy,问题: 我想传递不等式约束。考虑到我有6个参数 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)] # act

问题: 我想传递不等式约束。考虑到我有6个参数

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)
初始值中,我的约束条件是:

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

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

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]如果x[4]根据Robert Kern的评论,我删除了我之前的答案。以下是作为连续函数的约束:

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]如果x[4]我不知道numpy,但是a和b是负数吗?否则,我看不出e和f的任何值如何满足1.4*a。如果你清楚地说明你正在做什么,你想发生什么,以及实际发生了什么,而不是仅仅粘贴一个代码片段,这会有所帮助。@pear,我试着回答你的问题,但正如hughdbrown所说,上面代码中的约束似乎不适用于正数。也许前两个符号是反方向的?对不起,所有符号都是大于0的正值。我变了,我希望是正确的。我不知道numpy,但a和b是负数吗?否则,我看不出e和f的任何值如何满足1.4*a。如果你清楚地说明你正在做什么,你想发生什么,以及实际发生了什么,而不是仅仅粘贴一个代码片段,这会有所帮助。@pear,我试着回答你的问题,但正如hughdbrown所说,上面代码中的约束似乎不适用于正数。也许前两个符号是反方向的?对不起,所有符号都是大于0的正值。我变了,我希望它是正确的。不,这行不通。约束函数应尽可能连续,当满足时大于0,系统暂停,正如Robert所说,函数必须连续。所以我做了λx:([1.4*x[0]-x[0]]),即λx:(max-min)。但是我所做的是否正确我不知道。@pear,我不认为这是正确的,因为它在表达式中根本不使用e(aka
x[4]
)。这个表达式相当于
1.4*a-a
,它的值总是
0.4a
@system Pause,谢谢,b1和b2似乎工作得很好,但b3=lambda x:x[2]-x[3]没有按预期工作。例如,有时func()传递[150,192,1.8487,2.07364,194,216],这里b1和b2定义得很好,但是b3被违反了。像这样的事情会发生好几次,怎么办?有更好的定义“b2”的方法吗?@pear,对不起,我不知道为什么违反了
b3
。减去
c-d
(又称
x[2]-x[3]
)是一个连续函数,当
c>d
时为正,当
cNo时为零/负,这将不起作用。约束函数应尽可能连续,当满足时大于0,系统暂停,正如Robert所说,函数必须连续。所以我做了λx:([1.4*x[0]-x[0]]),即λx:(max-min)。但是我所做的是否正确我不知道。@pear,我不认为这是正确的,因为它在表达式中根本不使用e(aka
x[4]
)。这个表达式相当于
1.4*a-a
,它的值总是
0.4a
@system Pause,谢谢,b1和b2似乎工作得很好,但b3=lambda x:x[2]-x[3]没有按预期工作。例如,有时func()传递[150,192,1.8487,2.07364,194,216],这里b1和b2定义得很好,但是b3被违反了。像这样的事情会发生好几次,怎么办?有更好的定义“b2”的方法吗?@pear,对不起,我不知道为什么违反了
b3
。减去
c-d
(又称
x[2]-x[3]
)是一个连续函数,当
c>d
时为正,当
c>时为零/负