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