scipy.optimize究竟如何最大限度地减少功能工作?

时间:2017-07-26 20:16:06

标签: python lambda minimize calculus

我一直在查看最小化函数声明文件,我真的很困惑这个函数是如何工作的。例如,如果我有这样的事情:

import numpy as np
from scipy.integrate import quad
from scipy.optimize import minimize
encoderdistance = 2.53141952655
Dx = lambda t: -3.05 * np.sin(t)
Dy = lambda t: 2.23 * np.cos(t)
def func(x): return np.sqrt(Dx(x)**2 + Dy(x)**2)
print minimize(lambda x: abs(quad(func, 0, x)[0] - encoderdistance), 1).x
print minimize(lambda x: abs(4.24561823393 - encoderdistance), 1).x

底部的第二个print语句将产生与顶部不同的结果,即使我为其生成的值减去了quad函数。如果这是由于lambda x部分引起的,你能解释一下它是如何影响这行代码的吗?另外,你如何键入第二行到最后一行计算器,如wolfram alpha?谢谢!

3 个答案:

答案 0 :(得分:2)

优化器需要一个最小化的函数 - 这就是char *的含义。

在倒数第二行中,您要求优化器找到x的值,使得从0到x的func(x)的积分接近于encoderdistance。

在最后一行中,最后一行中要最小化的函数只是一个标量值,不依赖于x,优化器正在退出,因为它无法改变它。

答案 1 :(得分:1)

scipy.minimize的工作原理如here所述,但这不是您的问题。你有两个lambda函数绝对不一样:

lambda x: abs(quad(func, 0, x)[0] - encoderdistance)
lambda x: abs(4.24561823393 - encoderdistance)

第一个是'V'形功能,而第二个是水平线。 scipy发现'V'的最小值约为1.02,并且无法在水平线上执行任何最小化,因此它会返回您的初始猜测:1。

答案 2 :(得分:0)

以下是在Mathematica中如何做到这一点:

print minimize(lambda x: abs(4.24561823393 - encoderdistance), 1).x

关于你的第一个问题,在声明中:

x

你的lambda函数是一个常量,独立于参数 minimize。 {{1}}在观察到函数在参数的几个变化之后没有减少之后立即退出。