scipy.optimize 的最小化功能究竟是如何工作的?
How exactly does scipy.optimize's minimize function work?
我一直在查看最小化函数声明文件,我对函数的工作原理感到很困惑。例如,如果我有这样的东西:
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)?谢谢!
以下是您在 Mathematica 中的操作方法:
Dx[t_] := -3.05*Sin[t]
Dy[t_] := 2.23*Cos[t]
func[x_] := Sqrt[Dx[x]^2 + Dy[x]^2]
encoderdistance = 2.53141952655;
fmin[x_?NumberQ] :=
Abs[NIntegrate[func[t], {t, 0, x}] - encoderdistance]
NMinimize[fmin[x], x][[2]][[1]][[2]]
关于你的第一个问题,声明中:
print minimize(lambda x: abs(4.24561823393 - encoderdistance), 1).x
您的 lambda 函数是一个常量独立于参数 x
。 minimize
观察到函数在参数的几个变化后没有减少后立即退出。
描述了 scipy.minimize
的工作原理 here 但这不是您的问题。你有两个绝对不一样的 lambda 函数:
lambda x: abs(quad(func, 0, x)[0] - encoderdistance)
lambda x: abs(4.24561823393 - encoderdistance)
第一个是'V'形函数,第二个是水平线。 scipy
在大约 1.02 处找到 'V' 的最小值,并且无法在水平线上执行任何最小化,因此 returns 您的初始猜测:1.
优化器需要一个函数来最小化——这就是 lambda x:
的意义所在。
在倒数第二行中,您要求优化器找到 x 的值,使 func(x) 从 0 到 x 的积分接近编码器距离。
在最后一行中,要在最后一行中最小化的函数只是一个标量值,不依赖于 x,优化器正在退出,因为它无法更改它。
我一直在查看最小化函数声明文件,我对函数的工作原理感到很困惑。例如,如果我有这样的东西:
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)?谢谢!
以下是您在 Mathematica 中的操作方法:
Dx[t_] := -3.05*Sin[t]
Dy[t_] := 2.23*Cos[t]
func[x_] := Sqrt[Dx[x]^2 + Dy[x]^2]
encoderdistance = 2.53141952655;
fmin[x_?NumberQ] :=
Abs[NIntegrate[func[t], {t, 0, x}] - encoderdistance]
NMinimize[fmin[x], x][[2]][[1]][[2]]
关于你的第一个问题,声明中:
print minimize(lambda x: abs(4.24561823393 - encoderdistance), 1).x
您的 lambda 函数是一个常量独立于参数 x
。 minimize
观察到函数在参数的几个变化后没有减少后立即退出。
描述了 scipy.minimize
的工作原理 here 但这不是您的问题。你有两个绝对不一样的 lambda 函数:
lambda x: abs(quad(func, 0, x)[0] - encoderdistance)
lambda x: abs(4.24561823393 - encoderdistance)
第一个是'V'形函数,第二个是水平线。 scipy
在大约 1.02 处找到 'V' 的最小值,并且无法在水平线上执行任何最小化,因此 returns 您的初始猜测:1.
优化器需要一个函数来最小化——这就是 lambda x:
的意义所在。
在倒数第二行中,您要求优化器找到 x 的值,使 func(x) 从 0 到 x 的积分接近编码器距离。
在最后一行中,要在最后一行中最小化的函数只是一个标量值,不依赖于 x,优化器正在退出,因为它无法更改它。