我正在尝试将高斯拟合到我的数据中,该数据是在非常狭窄的光谱窗口中拍摄的。我们得到了大约2个连续体点,然后得到大约10-11个连续体点。我认为应该仍然可以拟合它,但是曲线拟合每次都会失败,而且我不确定为什么。
运行时,我得到User
代码和数据:
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800.
正如错误所述,找到最佳值的过程并不收敛。如果您真的认为自己可以用高斯曲线拟合,那么通常这意味着您的起点很差。
您如何给出起点可能是个问题,尤其是考虑到在位置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])
这样做,我很适合。但是,由于最后三个数据点,它不是一个很好的数据点。
如果您避免使用这些值,则拟合度会显着提高。
如评论中所示,高斯的中心位于向下看的大约8点(对不起,这是一条吸收线)。
在这种情况下,偏移量应位于最大〜22000左右,然后振幅参数应为负〜-(max(y)-min(y))〜-16000。
此外,最好将xx
更改如下
xx = np.linspace(0,13,100)
或
xx = np.arange(0,0.05)
哪个会给
并检查popt
基本上可以得到我提到/估算的值,只需查看σ为2.7的图〜(2180,-16000,8),这是我唯一没有得到的值。立即对如何估算产生感觉。
我的猜测是,您实际上应该拟合高斯和柯西/洛伦兹线形的混合,或者甚至更好地拟合Voigt lineshape,以说明实验性拓宽。