Scipy:最小化与最小化标量;返回 F 与返回 F**2;应该不会有什么不同



我刚刚发现了一个我无法解释的行为。我错过了什么吗?

我有一个隐式函数:

def my_cost_fun(x,a,b,c):
    # x is a scalar; all variables are provided as numpy arrays
    F = some_fun(x,a,b,c) - x
    return F

我确实使用以下方法最小化函数:

  • optimize.fsolve(my_cost_fun,0.2,args = (a,b,c))
  • optimize.brentq(my_cost_fun,-0.2,0.2,args = (a,b,c))

或者通过最小化功能:

  • optimize.minimize(my_cost_fun,0.2,args = (a,b,c),method = 'L-BFGS-B',bounds=((0,a),)

奇怪的是:

  • 如果我使用return F

    • brent_q方法和求解确实给出了相同的结果,并且%timeit测量了~250 μs的最快环路
    • L-BFGS-B(以及SLSQP和TNC)根本不会改变x0并提供错误的结果
  • 如果我使用return F**2

    • fsolve 返回正确的解,但收敛缓慢;最快循环为 1.2 ms。

    • L-BFGS-B 返回正确的解决方案,但收敛缓慢:最快环路为 1.5 毫秒

有人可以解释为什么吗?

正如我在评论中提到的:

以下是为什么L-BFGS-B在使用return F时不起作用的一种可能的解释:如果F的值可以是负数,那么优化.最小化将尝试找到它所能找到的最负值。 minimize不一定找到根,而是找到最小值。如果你返回F**2,因为对于实值函数F**2总是正的,F**2的最小值将在 F=0 时发生,即最小值将是根。

这并不能解释您的时间问题,但这可能是次要问题。 如果您有机会发布定义,我仍然会很好奇研究您的特定some_fun(x,a,b,c)的时间。

最新更新