Python 对约束函数使用lambda
问题: 我想传递不等式约束。考虑到我有6个参数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
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(akax[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(akax[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>时为零/负