我正在嘗試將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可以嗎?或與替代?
謝謝。
你好。感謝您的回覆。正如我擔心的那樣,它比我想象的更復雜。 –