scipy:最小化 vs. minimize.scalar; return F 对比 return F**2;不应该有所作为吗?
scipy: minimize vs. minimize.scalar; return F versus return F**2; shouldnt make a difference?
我刚发现一个我无法解释的行为。我错过了什么吗?
我有一个隐式函数:
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 方法和 fsolve 确实给出相同的结果,并且
%timeit
测量最快的循环约 250 µs
- L-BFGS-B(以及 SLSQP 和 TNC)根本没有改变
x0
并提供了错误的结果
如果我用return F**2
:
fsolve returns右解但收敛较慢;最快循环 1.2 毫秒
L-BFGS-B returns 正确的解决方案但收敛速度较慢:最快循环 1.5 毫秒
有人可以解释为什么吗?
正如我在评论中提到的:
这里有一个可能的解释为什么当你使用 return F
时 L-BFGS-B 不工作:如果 F
的值可以是负数,那么 optmize.minimize 会尝试找到它能找到的最负值。 minimize
不一定是求根,而是求最小值。如果您改为 return F**2
,因为对于实值函数 F**2
将始终为正,因此 F**2
的最小值将发生在 F=0 处,即最小值将是根。
这并不能解释您的时间问题,但这可能是次要问题。如果您有机会 post 定义,我仍然很想研究您的特定 some_fun(x,a,b,c)
的时间安排。
我刚发现一个我无法解释的行为。我错过了什么吗?
我有一个隐式函数:
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 方法和 fsolve 确实给出相同的结果,并且
%timeit
测量最快的循环约 250 µs - L-BFGS-B(以及 SLSQP 和 TNC)根本没有改变
x0
并提供了错误的结果
- brent_q 方法和 fsolve 确实给出相同的结果,并且
如果我用
return F**2
:fsolve returns右解但收敛较慢;最快循环 1.2 毫秒
L-BFGS-B returns 正确的解决方案但收敛速度较慢:最快循环 1.5 毫秒
有人可以解释为什么吗?
正如我在评论中提到的:
这里有一个可能的解释为什么当你使用 return F
时 L-BFGS-B 不工作:如果 F
的值可以是负数,那么 optmize.minimize 会尝试找到它能找到的最负值。 minimize
不一定是求根,而是求最小值。如果您改为 return F**2
,因为对于实值函数 F**2
将始终为正,因此 F**2
的最小值将发生在 F=0 处,即最小值将是根。
这并不能解释您的时间问题,但这可能是次要问题。如果您有机会 post 定义,我仍然很想研究您的特定 some_fun(x,a,b,c)
的时间安排。