到底是怎么回事scipy.optimize公司最小化函数功?

2024-09-25 00:22:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经看过了minimize函数的声明文件,我真的很困惑函数是如何工作的。例如,如果我有这样的东西:

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这样的计算器中?谢谢!在


Tags: lambda函数fromimport声明npscipyabs
3条回答

优化器需要一个函数来最小化lambda x:的作用。在

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

在最后一行中,在最后一行中要最小化的函数只是一个标量值,与x没有依赖关系,优化器正在退出,因为它无法更改该值。在

描述了scipy.minimize的工作原理here,但这不是你的问题。有两个lambda函数绝对不同:

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

第一个是V形函数,第二个是水平线。scipy在大约1.02处找到“V”的最小值,并且无法在水平线上执行任何最小化操作,因此它返回您的初始猜测:1。在

下面是如何在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]]

关于你的第一个问题,在发言中:

^{pr2}$

lambda函数是一个常数,独立于参数xminimize在观察到函数在参数的几个变化后没有减少后立即退出。在

相关问题 更多 >