2017-04-08 51 views
0

我找不到可能告訴curve_fit只使用特定範圍內的x值。我找到了「邊界」參數,但這似乎只適用於我的函數的參數。Python:來自scipy.optimze的Curve_fit對x值的範圍沒有可能

當有人想要適合的數據(例如,線性曲線(但僅限於數據的特定區域))時,必須創建一個新列表。特別是因爲pyplot.plot需要兩個單獨的列表x和y值,而手工整理你需要它們作爲(x,y)對。

回答

1

最簡單的解決方案的確是創建一個新列表,它是原始列表的過濾版本。當然最好使用numpy數組而不是python列表。

所以假設有兩個數組xy,其中你只是想以適應這些值,其中x是比一些數字a更大的功能f。 您可以將它們過濾和curve_fit作爲

x2 = x[x>a] 
y2 = y[x>a] 
popt2, _ = scipy.optimize.curve_fit(f, x2, y2) 

一個完整的例子:

import numpy as np; np.random.seed(0) 
import matplotlib.pyplot as plt 
import scipy.optimize 

x = np.linspace(-1,3) 
y = x**2 + np.random.normal(size=len(x)) 
f = lambda x, a,b : a* x +b 

popt, _ = scipy.optimize.curve_fit(f, x,y, p0=(1,0)) 

x2 = x[x>0.7] 
y2 = y[x>0.7] 
popt2, _ = scipy.optimize.curve_fit(f, x2,y2, p0=(1,0)) 

plt.plot(x,y, marker="o", ls="", ms=4, label="all data") 
plt.plot(x, f(x, *popt), color="moccasin", label="fit all data") 
plt.plot(x2, f(x2, *popt2), label="fit filtered data") 

plt.legend() 
plt.show() 

enter image description here

最後只提它,你也可以用邏輯運算符,如x[(x>0.7) & (x<2.5)]連接幾個條件。