将数据拟合到高斯轮廓

Posted

技术标签:

【中文标题】将数据拟合到高斯轮廓【英文标题】:Fitting data to a gaussian profile 【发布时间】:2021-04-16 06:48:02 【问题描述】:

我一直在尝试将高斯拟合到我的频谱中。 (强度v/s速度谱)

spectrum

New fitted spectrum

我使用以下代码。但是,从结果中可以看出,拟合中仅包含一个数据点。有什么我可以做的,以便我可以在高斯中包含更多点。

from numpy import exp, linspace, random
import matplotlib.pyplot as plt
def gaussian(x, amp, cen, wid):
    return amp * exp(-(x-cen)**2 / wid)

from scipy.optimize import curve_fit
x = velocity
y = data
print(x)
print(y)

init_vals = [0.00950554, 60000, 35]  # for [amp, cen, wid]
best_vals, covar = curve_fit(gaussian, x, y, p0=init_vals)
print(best_vals)
print(repr(covar))

ym = gaussian(x, best_vals[0], best_vals[1], best_vals[2])
fig = plt.figure()
ax = fig.add_subplot(211)
ax.plot(x,y)
ax = fig.add_subplot(212)
ax.plot(x, y, c='k', label='Function')
ax.plot(x, ym, c='r', label='Best fit')
plt.legend()
plt.show()

数据点:

x: [-5.99999993e+04 -4.99999993e+04 -3.99999993e+04 -2.99999993e+04
 -1.99999993e+04 -9.99999934e+03  6.65010004e-04  1.00000007e+04
  2.00000007e+04  3.00000007e+04  4.00000007e+04  5.00000007e+04
  6.00000007e+04  7.00000007e+04  8.00000007e+04  9.00000007e+04
  1.00000001e+05  1.10000001e+05  1.20000001e+05  1.30000001e+05
  1.40000001e+05]

y: [ 0.00056511 -0.00098584 -0.00325616 -0.00101042  0.00168894 -0.00097406
 -0.00134408  0.00128847 -0.00111633 -0.00151621  0.00299326  0.00916455
  0.00960554  0.00317363  0.00311124 -0.00080881  0.00215932  0.00596419
 -0.00192256 -0.00190138 -0.00013216]

这些是光谱的数据点。任何人都可以帮助我更好地拟合数据。我一直在尽我所能。

非常感谢。

【问题讨论】:

【参考方案1】:

第一步始终是绘制数据,您已经这样做了。接下来是猜测初始值。如果与情节相比,ampcen 的那些看起来很合理。但是wid 呢?它是 SQUARED 分布宽度的 2 倍。从情节上看,宽度本身肯定是几千的。如果平方,它可能达到 10^7,乘以 2 得到 2*10^7 作为初始值。离你的 35 岁还差得很远!

一种可能的解决方案:

amp = 0.0106283 岑 = 55784 wid = 1.92911e+08

剧情:

【讨论】:

非常感谢。您能否告诉我应该对代码进行哪些更改才能获得上述图?我尝试但无法成功复制图表。再次感谢您的帮助。 wid 的初始值更改为与我作为可能解决方案给出的值相似的值。例如,1e8 init_vals = [0.00950554, 60000, 1e8] 就像一个魅力。 再次感谢。我试过了,得到的结果附加为“新拟合光谱”。有没有什么办法可以让我的曲线和你得到的一样平滑? 我不知道。我不使用 python :-)

以上是关于将数据拟合到高斯轮廓的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LMfit 将曲线拟合到双高斯/偏斜高斯

在 C++ 中拟合 2d 高斯函数太慢了

在 seaborn displot/histplot 函数中绘制高斯拟合直方图(不是 distplot)

matlab高斯拟合的初始值问题

高斯曲线拟合

如何用单边数据拟合高斯分布?