Python scipy.optimize最小化不一致的结果

Python scipy.optimize最小化不一致的结果,python,scipy,scipy-optimize,scipy-optimize-minimize,Python,Scipy,Scipy Optimize,Scipy Optimize Minimize,在运行scipy optimize的最小化函数时,我得到了一些非常奇怪的结果 这是密码 from scipy.optimize import minimize def objective(x): return - (0.05 * x[0] ** 0.64 + 0.4 * x[1] ** 0.36) def constraint(x): return x[0] + x[1] - 5000 cons = [{'type':'eq', 'fun': constraint}] 跑

在运行scipy optimize的最小化函数时,我得到了一些非常奇怪的结果

这是密码

from scipy.optimize import minimize

def objective(x):
    return - (0.05 * x[0] ** 0.64 + 0.4 * x[1] ** 0.36)

def constraint(x):
    return x[0] + x[1] - 5000

cons = [{'type':'eq', 'fun': constraint}]
跑步时

minimize(objective, [2500.0, 2500.0], method='SLSQP',  constraints=cons)
我得到x的每个元素的分配
2500
。 有
fun:-14.164036415985395

通过快速检查,此分配
[38001200]
给出
-14.9

它对初始条件也非常敏感

有没有想过我做错了什么

两种功能

更新 它实际上返回初始条件

如果我试试这个

def objective(x):
    return - (x[0] ** 0.64 + x[1] ** 0.36)

def constraint(x):
    return x[0] + x[1] - 5000.0

cons = [{'type':'eq', 'fun': constraint}]

minimize(objective, [2500, 2500], method='SLSQP', constraints=cons)

返回的结果似乎很好(我已更改了目标函数)

FYI:在查看返回的参数(即
result.x
)之前,应首先检查
result.success
。这个值是真是假?@warren weckesser感谢你的评论。这两个问题都是成功=真实的:虽然一开始很奇怪(假设解算器将找到一个局部最优值,它应该找到),但看起来这不是一个凸最小化问题(不确定hessian),因此该解算器的保证不足以提供全局最优值。对于这样的小问题,像couenne这样的全球解决者应该会起作用。(一个问题有两个新标签;不确定是否有用)如果我将方法更改为
method='trust-constr'
,结果是
[3901.687987821098.31201218]
,这与我在目标函数图中看到的结果一致。我还没有研究过scipy最小值的细节@sascha的评论或许可以解释这个问题——这种行为可能是将SLSQP算法应用到它没有设计的问题上的结果。不过,如果可能的话,如果算法能够检测到出现了错误并引发异常,那就太好了。你能在上的一期中报告这个例子吗?我也使用了1.2.1。我没有尝试第二个例子。在第一个例子中,我忘记了我已经将初始猜测更改为[3000,2000],所以它有点接近最小值。该调用已完成,没有错误或警告。如果我使用[2500,2500]作为初始猜测,我会得到一个警告:
[…]/\u hessian\u update\u strategy.py:187:UserWarning:delta\u grad==0.0。检查近似函数是否为线性函数。如果函数是线性的,则可以通过将Hessian函数定义为零而不是使用拟牛顿近似来获得更好的结果。
但答案仍然正确。