2016-06-21 54 views
1

我正在嘗試將Planck曲線擬合爲輻射讀數。我知道一些已知波長(11個數據點)的輻射亮度,擬合的參數是溫度。將邊界分配給scipy.optimize.curve_fit函數內的各個獨立點

普朗克函數從波長和溫度返回輻射:

def fit_planck_curve(wavs_list, rads_list) : 
    temp = curve_fit(bbody, wavs_list, rads_list, p0=1800) 
    return(temp) 

def bbody(lam, T) : 
    lam = 1e-6 * lam # from micrometres to metres 
    return 2*h*c**2/(lam**5 * (np.exp(h*c/(lam*k*T)) - 1)) # radiance in SI units: W.m-2.sr-1.m-1 

由scipy.optimize.curve_fit在11個波長使用的,與所述輻射讀數的輸入

擬合函數是在獲得輻射數據並聲明它們所在的波長後調用的。下面一個例子:

wavelengths_list = [0.555, 0.659, 0.865, 1.375, 1.61, 2.25, 3.74, 10.85, 12, 3.74, 10.85] 
radiances_list = [268900000.00000006, 233200000.00000003, 174400000.0, 200000.0, 49200000.0, 8800000.0, 725170.86180638766, 5713946.0379738025, 5468427.1473144693, 902723.66658727441, 5698079.1655633291] 
Temp_estimate = fit_planck_curve(wavelengths_list, radiances_list)[0][0] 

到目前爲止,這個工程。

但我想輸入一些更多的信息,即波長的邊界。 對於每個在其中輻射讀數作出的11個波長(自變量)的,有界:

wl_width_array = np.array([0.02, 0.02, 0.02, 0.015, 0.06, 0.05, 0.38, 0.9, 1, 0.38, 0.9]) 
wl_lowerbound_list = list(np.array(wavelengths_list) - wl_width_array) 
wl_upperbound_list = list(np.array(wavelengths_list) + wl_width_array) 

這兩個列表是上界和下界的每個11個波長。

我該如何讓scipy.optimize.curve_fit考慮到這些界限?有界限選項,但從例子中,我明白這些是自變量整體的界限,而不是個別點。

我試圖設置界限爲2元組,其中第一個元素是兩個獨立變量的下界,第二個元素是上界。每個元素由一個列表(11個波長的下限或上限)和np.inf組成,用於其他自變量,即溫度,以便該自變量未設置爲界限):

wl_bounds = ([wl_lowerbound_list, -np.inf] , [wl_upperbound_list, np.inf]) 

但是,我得到了一個錯誤。

這怎麼辦? scipy.optimize.curve_fit可以嗎?或與替代?

謝謝。

回答

2

看來你的「邊界」以某種方式量化了自變量(波長)讀數的不確定性。

bounds參數絕對沒有幫助:它的工作是設置您所估計參數的允許範圍(例如,您知道溫度不是負值)。

如果您正在處理因變量上的錯誤條,可以直接使用least_squaressum_i (y_i - f(x_i))**2/dy_i**2形式的成本函數。

現在,由於您正在處理獨立變量上的錯誤條,因此無法正常工作。 考慮這些因素的一種簡單方法可能是假定某些分佈用於單獨測量(例如,寬度由您的界限給出的高斯),生成一組合成數據集,擬合這些數據集並分析溫度分佈結果。

+0

你好。感謝您的回覆。正如我擔心的那樣,它比我想象的更復雜。 –

相關問題