我需要将模型与数据进行比较,以找到最适合的输入。我的数据是物体在不同波长的表面反射率(=散射光+热发射),我用普朗克定律模拟热发射部分来模拟反射率。我需要找到模拟的发射(以及反射率)与观测值相匹配的温度。
为此,我将普朗克定律定义为:
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找出哪个T导致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),根本不符合数据。有没有人知道为什么它不能正确收敛?提前谢谢。
发布于 2020-03-13 18:27:00
好吧,我的代码中有几个问题:
1)在我的planck函数中,相对于太阳光谱辐照度的热发射是thermal = 0.95*(intensity*4*np.pi)/(SSI*1e9)而不是thermal = 0.95 * (intensity*np.pi*D**2)/(SSI*1e9)。
2)最大的错误是在我的residuals函数中,它给了我大约200K而不是~300。这个想法是为了最小化观察到的“总体”反射光谱(=反向散射光+热发射)和模拟的“总体”光谱(在residuals中正确地计算为S = scat_light + 0.95*planck(T) )之间的差异。误差来自于此函数返回后向散射光和模拟的总反射光谱(=baskscaterred +热)之间的平方差之和:由于后向散射光的‘量’比所研究波长的热发射‘小’得多,它试图拟合一个‘更小’的数据(从而解释了低温拟合)。
我改变了这一点,现在我获得了~313K的温度,与我观察到的总反射率曲线非常匹配。
感谢大家的回复!
发布于 2020-03-13 01:32:35
根据scipy.optimize.minimize文档,x0应该是“初始猜测。大小为(n,)的实数元素数组,其中‘n’是自变量的数量。”所以你在猜测T=345的温度会最小化平方差的总和。然后为数据中的所有T返回一个最好的T(假设您有多个样本),以最小化此函数。显然,您知道答案应该在340K左右,因此我认为您的公式中存在引入或导出planck()函数的某个地方的错误。
查看res输出的其他属性也不会有什么坏处,看看是否可以从中获得更多线索。
https://stackoverflow.com/questions/60657271
复制相似问题