将数据拟合到高斯分布
Fitting data to a gaussian profile
我一直在尝试将高斯拟合到我的光谱中。 (强度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]
这些是光谱的数据点。谁能帮我更好地拟合数据。我已经尽力了。
非常感谢。
第一步始终是绘制数据,您已经这样做了。接下来是猜测初始值。如果与情节相比,amp
和 cen
的那些看起来合理。但是 wid
呢?它是 SQUARED 分布宽度的 2 倍。从情节来看,宽度本身必须有几千多。如果平方,可能达到10^7,乘以2得到2*10^7作为初始值。离你的 35 岁还很远!
一种可能的解决方案:
amp = 0.0106283
cen = 55784
wid = 1.92911e+08
剧情:
我一直在尝试将高斯拟合到我的光谱中。 (强度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]
这些是光谱的数据点。谁能帮我更好地拟合数据。我已经尽力了。
非常感谢。
第一步始终是绘制数据,您已经这样做了。接下来是猜测初始值。如果与情节相比,amp
和 cen
的那些看起来合理。但是 wid
呢?它是 SQUARED 分布宽度的 2 倍。从情节来看,宽度本身必须有几千多。如果平方,可能达到10^7,乘以2得到2*10^7作为初始值。离你的 35 岁还很远!
一种可能的解决方案:
amp = 0.0106283
cen = 55784
wid = 1.92911e+08
剧情: