Мне нужно сравнить модель с данными, чтобы найти наилучший подходящий ввод. Мои данные - это поверхностная отражательная способность тела (= рассеянный свет + тепловое излучение) на разных длинах волн, и я моделирую отражательную способность, моделируя часть теплового излучения по закону Планка. Мне нужно найти температуру, при которой моделируемое излучение (и, следовательно, коэффициент отражения) соответствует наблюдениям.
Для этого я определяю закон Планка как:
h = 6.626070e-34 # the Planck constant
c = 2.997924e+8 # the speed of light in vacuum
k = 1.380649e-23 # the Boltzmann constant
def planck(T): # Planck's law for black body radiation
intensity = (2*h*c**2) / ( ((wvleng*1e-9)**5) * (np.exp(h*c/((wvleng*1e-9)*k*T)) - 1.0) )
thermal = 0.95 * (intensity*np.pi*D**2)/(SSI*1e9)
return thermal
, который возвращает тепловое излучение тела на разных длинах волн. Затем я определил функцию, которая будет определять соответствие (сумма квадратов разницы между моделью и данными на каждой длине волны):
def residuals(T): #
S = scat_light + 0.95*planck(T) # simulated reflectance
return np.sum((reflectance - S)**2)
, где T - температура черного тела. Наконец, я использую optimize.minimize
, чтобы найти, какое Т приводит к наилучшему соответствию между S (имитируемой отражательной способностью) и отражательной способностью данных:
x0 = 345.0 # initial guess, temperature is the only variable
res = scipy.optimize.minimize(residuals, x0, method='SLSQP') # optimization
fitted_temperature = res.x
Вот проблема: она дает мне температуру намного ниже (~ 220K) чем это должно быть (около 340K), не вписываясь в данные вообще. У кого-нибудь есть идеи о том, почему он не сходится должным образом? Заранее спасибо.