2017-07-26 149 views
0

我一直在尋找最小化函數聲明文件,並且我對函數的工作原理感到困惑。因此,舉例來說,如果我有這樣的事情:scipy.optimize的最小化函數的工作原理是什麼?

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語句將產生比即使我的埋入了它產生的價值四功能上的一個不同的結果。如果這是由於lambda x部分造成的,那麼你能解釋一下它是如何影響那行代碼的嗎?另外,如何將倒數第二行輸入到wolfram alpha等計算器中?謝謝!

回答

2

優化程序需要一個函數來最小化 - 這就是lambda x:的意思。

在倒數第二行中,您要求優化器找到x的值,使得func(x)從0到x的積分接近encoderdistance。

在最後一行中,最後一行中要最小化的函數只是一個標量值,不依賴於x,優化程序正在救援,因爲它不能改變它。

0

這裏是你如何能做到這一點在數學:

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函數是一個常數獨立的說法xminimize在觀察到函數在參數的幾個變體之後沒有減少之後立即退出。

1

如何工作描述here但這不是你的問題。你有兩個絕對不同的lambda函數:

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

第一個是'V'形函數,而第二個是水平線。 scipy發現'V'的最小值約爲1.02,並且不能在水平線上執行任何最小化,因此它會返回您的初始猜測:1.

相關問題