使用scipy.optimize.minimize()

2024-05-16 10:58:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将模型与数据进行比较,以找到最佳拟合输入。我的数据是物体在不同波长下的表面反射率(=散射光+热发射),我用普朗克定律模拟热发射部分的反射率。我需要找到模拟发射(以及反射率)与观测值相符的温度

为此,我将普朗克定律定义为:

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),根本不符合数据。有人知道它为什么不能正确收敛吗?提前谢谢


Tags: the数据模型定义defnp温度light
2条回答

根据scipy.optimize.minimize文档x0应该是,“初始猜测。大小为(n,)的实元素数组,其中'n'是自变量的数量。”因此,您猜测温度T=345将最小化平方差之和。然后,这将为数据中的所有T返回一个最佳T(假设您有多个样本),以最小化此函数。显然,你知道答案应该是340K左右,我想你的公式中有一个错误,导致了planck()函数的引入或引出

查看res输出的其他属性,看看是否可以获得额外的线索,也不会有什么坏处

好的,我的代码中有几个问题:

1)在myplanck函数中,我的热辐射相对于太阳光谱辐照度是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)in residuals之间的差异降至最低该函数返回后向散射光和模拟的总反射光谱(=巴斯克散射+热)之间的平方差之和,这一事实导致了误差:由于后向散射光的“量”比研究波长的热发射要“小”得多,因此它试图拟合“较小”的数据(从而解释了低温拟合)

我改变了这一点,现在我得到了~313K的温度,这与我观察到的整体反射曲线非常吻合

谢谢大家的回复

相关问题 更多 >