我刚刚发现了一个我无法解释的行为。我错过了什么吗?
我有一个隐式函数:
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
并提供错误的结果
- brent_q方法和求解确实给出了相同的结果,并且
如果我使用
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)
的时间。