Python scipy.optimize.minimize结果超出边界
我有一组三个方程要解。变量c[0]、c[1]、c[2]是范围为-1到1的成本函数。从我在网上的发现来看,scipy优化是最好的方式。除了c[0]到c[3]之外,方程中的一切都是常数,并且是已知的 0=a+u*c[0] 0=b+v*c[1]+w*c[2] 0=d-n*c[1]+m*c[2] 我将其转化为以下带有边界和约束的优化问题,因此我需要Python scipy.optimize.minimize结果超出边界,python,python-3.x,optimization,scipy,Python,Python 3.x,Optimization,Scipy,我有一组三个方程要解。变量c[0]、c[1]、c[2]是范围为-1到1的成本函数。从我在网上的发现来看,scipy优化是最好的方式。除了c[0]到c[3]之外,方程中的一切都是常数,并且是已知的 0=a+u*c[0] 0=b+v*c[1]+w*c[2] 0=d-n*c[1]+m*c[2] 我将其转化为以下带有边界和约束的优化问题,因此我需要SLSQP c=np.array([]) def fun(c): return abs(c[0])+abs(c[1])+abs(c[2])
SLSQP
c=np.array([])
def fun(c):
return abs(c[0])+abs(c[1])+abs(c[2])
x0 = [0.05,0.05,0.05]
bnds = [(-1.0,1.0),(-1.0,1.0),(-1.0,1.0)]
cons = ({'type': 'eq', 'fun': lambda c: a+u*c[0]},
{'type': 'eq', 'fun': lambda c: b+v*c[1]+w*c[2]},
{'type': 'eq', 'fun': lambda c: d-n*c[1]+m*c[2]},
)
res = minimize(fun, x0, method='SLSQP',
bounds=bnds,
constraints=cons)
我得到:
status: 0
success: True
njev: 3
nfev: 15
fun: 33.015905119807698
x: array([ 1.04805004e-02, 1.01768804e+01, -2.28285442e+01])
message: 'Optimization terminated successfully.'
jac: array([ 1., 1., -1., 0.])
nit: 3
所以我的界限似乎被忽略了。翻译不等式中的边界得到了同样的结果
计算值如下所示:
a = -3943.3960306568406
b = 172710.8224501527
d = -380842.9800419506
u = 376260.28
v = 112878.084
w = 57886.196
n = -3205737.5856
m = 1412423.1824
尝试使用Scipy版本>=0.15.0
SLSQP例程在以前的版本中有一个已知的错误,即在没有给出约束函数的雅可比数的情况下。对于计算的高值,我感到抱歉,但我不想冒险在Scipy版本>=0.15.0时给您错误的输入。(还有--
d
的值是多少?)谢谢你的评论。在第一个版本中,我将d称为c,但我认为这会导致对变量的错误理解,不过我现在已经修复了它。最初我在scipy 0.15.1上运行它,但现在我将其更新为scipy 0.16.1。结果是奇怪的,res说101个迭代步骤都不成功,但得到的值还可以。你解决了@pv的问题,我现在面对的是另一个^^将其作为答案发布,以便我可以接受您的方程组可以手动求解-这些值与输出值相比如何?通过检查,c[0]确实是正确的。