我一直在查看最小化函数声明文件,我真的很困惑这个函数是如何工作的。例如,如果我有这样的事情:
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?谢谢!
答案 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}}在观察到函数在参数的几个变化之后没有减少之后立即退出。