Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scipy.optimize.minimize结果超出边界_Python_Python 3.x_Optimization_Scipy - Fatal编程技术网

Python scipy.optimize.minimize结果超出边界

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

我有一组三个方程要解。变量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])
    
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]确实是正确的。