私は、放射輝度の測定値にプランク曲線をフィットさせようとしています。私はいくつかの既知の波長(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
が11波長での放射輝度測定値の入力と、scipy.optimize.curve_fitで使用され
適合関数は、放射輝度データを取得し、それらが作られた波長を宣言した後に呼び出されます。ここでの例:
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)
は、これら2つのリストは、11の波長の各々の上限および下限です。
これらの境界をscipy.optimize.curve_fitで考慮するにはどうすればよいですか? boundsオプションがありますが、例から、私はこれらが個々の点ではなく、全体としての独立変数の境界であることを理解しています。
境界を2タプルに設定しようとしました。最初の要素は2つの独立変数の下限です.2番目の要素は上限です。その独立変数)が境界に設定されていないように各要素は、他の独立変数、温度に対するリスト(11の波長の下限または上限)とnp.infで構成され:
wl_bounds = ([wl_lowerbound_list, -np.inf] , [wl_upperbound_list, np.inf])
しかし、私はエラーが発生しました。
どうすればいいですか?これはscipy.optimize.curve_fitで可能ですか?または代わりに?
ありがとうございました。
こんにちは。お返事をありがとうございます。私が恐れていたように、私は思ったよりも複雑です。 –