2016-11-24 184 views
0

我正在使用Scipy將我的數據調整爲函數。該函數給出2個參數的值,在這種情況下,ab。我想使用綁定參數來限制這些參數可以採用的值,每個參數都有自己的可接受值範圍。Scipy Curve_fit。多個參數的單獨界限

可接受值:15 <一個< 50和0.05 < b < 0.2

我想知道如何實現它們。官方文檔僅顯示如何爲1個參數執行這些操作。這個問題類似於:Python curve fit library that allows me to assign bounds to parameters。這也只能解決1個參數的邊界。

這裏是我的嘗試:

def Ebfit(x,a,b): 
    Eb_mean = a*(0.0256/kt)       # Eb at bake temperature 
    Eb_sigma = b*Eb_mean 
    Foursigma = 4*Eb_sigma 
    Eb_a = np.linspace(Eb_mean-Foursigma,Eb_mean+Foursigma,N_Device) 
    dEb = Eb_a[1] - Eb_a[0] 
    pdfEb_a = spys.norm.pdf(Eb_a,Eb_mean,Eb_sigma) 

    ## Retention Time 

    DMom = np.zeros(len(x),float) 
    tau = (1/f0)*np.exp(Eb_a) 
    for bb in range(len(x)): 
     DMom[bb]= (1 - 2*(sum(pdfEb_a*(1 - np.exp(np.divide(-x[bb],tau))))*dEb)) 
    return DMom 

time = datafile['time'][0:501] 
Moment = datafile['25Oe'][0:501] 

params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[(15,50),(0.05,0.2)]) 

我也曾嘗試以下變化,看看是否括號是問題:

params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[[15,50],[0.02,0.2]]) 
params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=((15,50),(0.02,0.2))) 

,但我得到了同樣的錯誤了所有這些變體

ValueError: Each lower bound mush be strictly less than each upper bound.

它只適用於單個綁定,如:

params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[0,50]) 

任何幫助表示讚賞。 謝謝!

+0

關於'curve_fit.bounds'文檔你不明白如何做到這一點的不明之處?請注意,文檔中提到了「array_like的2- *元組」,因此您可能需要將這些內部列表更改爲元組。 – Evert

+0

@Evert嘿,Yeap我也試過。儘管如此,我仍然得到相同的錯誤。我編輯了這個問題以包含我所嘗試的內容。 – xplodnow

回答

1

bounds=[[0,50],[0,0.3]])表示第二個參數大於50但小於0.3。第一個參數也固定爲零。

格式是bounds =(lower,upper)。

+0

啊,我明白你的意思了。所以它應該是:bounds = [[15,0.05],[50,0.2]] – xplodnow

0

根據@ ev-br的建議。我嘗試了界限參數的下列變化,結果非常好。

bounds=[[15,0.02],[50,0.2]] 
到底

所以,爭論給予應如下:

bounds=[[a1,b1],[a2,b2]] 

A1一個A2一個上限下限。 Sames用於b

相關問題