将高斯拟合到python中的吸收线

我正在尝试将高斯拟合到我的数据中,该数据是在非常狭窄的光谱窗口中拍摄的。我们得到了大约2个连续体点,然后得到大约10-11个连续体点。我认为应该仍然可以拟合它,但是曲线拟合每次都会失败,而且我不确定为什么。

运行时,我得到User

代码和数据:

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800.
xiaozhuhechaohong 回答:将高斯拟合到python中的吸收线

正如错误所述,找到最佳值的过程并不收敛。如果您真的认为自己可以用高斯曲线拟合,那么通常这意味着您的起点很差。

您如何给出起点可能是个问题,尤其是考虑到在位置11、12和13处可能出现另一个信号时,如何提供sigma。无论如何,这不是最大的问题,但是您忘记为高斯函数添加偏移量了

#             ----> new parameter in signature
#             |
def Gauss(x,y0,a,x0,sigma):
    return y0 + a * np.exp(-(x - x0)**2 / (2 * sigma**2))
#           |
#           -------> adding and offset

然后,您可以决定如何为偏移量提供起点,但是肉眼看,我确实设置了5000

popt,pcov = curve_fit(Gauss,x,y,p0=[5000,max(y),mean,sigma])

这样做,我很适合。但是,由于最后三个数据点,它不是一个很好的数据点。

enter image description here

如果您避免使用这些值,则拟合度会显着提高。

enter image description here

编辑:

如评论中所示,高斯的中心位于向下看的大约8点(对不起,这是一条吸收线)。

在这种情况下,偏移量应位于最大〜22000左右,然后振幅参数应为负〜-(max(y)-min(y))〜-16000。

此外,最好将xx更改如下

xx = np.linspace(0,13,100)

xx = np.arange(0,0.05)

哪个会给

enter image description here

并检查popt基本上可以得到我提到/估算的值,只需查看σ为2.7的图〜(2180,-16000,8),这是我唯一没有得到的值。立即对如何估算产生感觉。

我的猜测是,您实际上应该拟合高斯和柯西/洛伦兹线形的混合,或者甚至更好地拟合Voigt lineshape,以说明实验性拓宽。

本文链接:https://www.f2er.com/3030530.html

大家都在问