从数据集*编辑中规范化普朗克定律曲线拟合中的值*

2024-10-03 15:21:41 发布

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

我有大量的数据,在强度计数和波长方面,我想用Planks定律来确定温度的猜测参数。在

数据集作为文本文件导入

import numpy as np
import scipy as sp
from scipy.optimize import curve_fit

with open('Good_SolarRun2.txt') as g:
    data = g.read()
data = data.split('\n')
Wavle2 = [float(row.split()[0]) for row in data]   # Wavelength (nm)
Int2 = [float(row.split()[1]) for row in data]  # Intensity (counts)

所以我现在定义了Planks定律的拟合模型(以波长为单位) https://en.wikipedia.org/wiki/Planck%27s_law

---根据用户Evert的建议,我将常量设置为1,因为在计算机上对小数字进行优化很困难。在

^{pr2}$

现在,我用我的数据集设置曲线拟合配置。在

x = Wavle2

# This has the same shape as Wavle2, but these values are scaled by me.
# Also the same shape as Int2
y = np.array(Intscale2P)

p0_R = (500.) 
optR, pcovR = curve_fit(Plancks_Law, x, y, p0_R)
T_R = optR
T_Rp = pcovR
yM = Plancks_Law(x, T_R)

print T_R返回542.04628177的值

是一些未知单位。现在我要把所有的单位都转换成正确的单位。尤其是指数中正确单位的值。在

有什么办法纠正吗?在


Tags: 数据importdataasnp单位scipyfit
1条回答
网友
1楼 · 发布于 2024-10-03 15:21:41

这里有一个稍微有点棘手的问题:根据x值(波长),指数1/(lamb*T)通常太大而无法计算,因此会出现溢出。(或者太小,结果总是零。在

最好把你的普朗克函数分成三部分:

  • 其中lamb * T较大的部分,例如>;100。然后可以使用Rayleigh-Jeans近似。在
  • 其中lamb * T很小的部分,比如<;1e-4。然后你可以使用维恩近似。在
  • 对于中间部分,使用函数本身。在

这样可以防止溢出。在


为了获得良好的拟合结果,最好不要让参数和数据结果进入机器的限制,要么太大,要么太小。由于拟合通常会产生超出输入(参数或数据)范围的中间结果,因此最安全的做法是一切都是有序统一的(这只是"(hu)man(s) being the measure of all things"的结果,计算机是由人类制造的,并且是为人类制造的)。在

从原始普朗克函数开始:

alpha = 2*h*c*c
beta = h*c/k
return alpha/np.power(lamb,5.0) * 1/( np.exp( beta/(lamb*T)) - 1 )

注意,alpha只是一个标准化。把它放在这里,最后应用到你的拟合结果。在拟合过程中,没有任何大或小的alpha值,只有1。这一点很简单。在

对于beta,你不能真的这样做:你不能在指数之外对它进行建模,然后在事实发生后应用它。这就是上面的三部分功能的目的,以规避那里的问题。在

不过,您可以(也可能应该)规范化您的x值。假设你的输入是1e-9阶,所以纳米用米表示。以纳米为单位,将所有数值乘以1e9。现在x输入值的顺序是统一的。在

当然,这意味着你的alpha会改变;这里有一个lambd**-5因子,所以如果lambd上升了1e9,那么这里的情况就改变了1/1e-(9*5) = 1e45。将因子转化为α。在

对于beta版有类似的情况:将beta乘以1e9。在

最后,您还可以尝试“规范化”T。5000离顺序单位不远,但是你可以把它变成整数5,然后把系数1000加到beta
另外,将alphabeta放在函数的外部:它们本质上是常量,不需要每次调用函数时都计算它们。这会使试穿更快。在

注意:如果您从函数中删除alpha,并且只在试穿后才使用它,请不要忘记将其从Wien和Rayleigh Jeans近似值中取出。如下所述:测试(例如,手动比较你从一个配方到另一个配方的区域的结果,看看是否匹配。或者简单地在对数对数图上画一条宽范围的曲线)!在


免责声明:我没有测试过这个,可能是弄错了标志。三次检查是否需要1e45,而不是1e-45,对于1e9或1e-9,同样如此。简单的检查:输入一些以米为单位的合适的数值,看看你得到的通量是多少,然后把波长以纳米为单位,再加上其他因素,看看你得到的通量是否相同。在

另外:抓起一张纸,一步一步地计算出变化。在这里这样做,您就可以将相同的方法应用于其他函数和拟合问题。在

相关问题 更多 >