【发布时间】:2019-11-27 06:22:40
【问题描述】:
我最近运行了一个脚本,用help of SO 将高斯拟合到我的吸收曲线。我希望如果我简单地用 Voigt 函数替换 Gauss 函数,一切都会好起来的,但情况似乎并非如此。我认为主要是因为它是一个移位的voigt。
编辑:轮廓是光学厚度不同的吸收线。在实践中,它们将是光学厚和薄特征之间的混合。就像这张图的底部一样。当前数据将更像顶部图像,但底部可能已经变平了一点。 (我们只看到轮廓的左侧,稍微超出了中心)
对于高斯,它看起来像这样,并且正如预测的那样,底部似乎没有拟合希望的深度,但仍然非常接近。配置文件本身应该仍然是一个voigt。但现在我意识到中心点可能会导致不合身。所以也许应该根据机翼位置添加重量?
我主要想知道移位函数是否可能被错误定义,或者它是否是我的起始值。
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
from scipy.special import wofz
x = np.arange(13)
xx = xx = np.linspace(0, 13, 100)
y = np.array([19699.959 , 21679.445 , 21143.195 , 20602.875 , 16246.769 ,
11635.25 , 8602.465 , 7035.493 , 6697.0337, 6510.092 ,
7717.772 , 12270.446 , 16807.81 ])
# weighted arithmetic mean (corrected - check the section below)
#mean = 2.4
sigma = 2.4
gamma = 2.4
def Gauss(x, y0, a, x0, sigma):
return y0 + a * np.exp(-(x - x0)**2 / (2 * sigma**2))
def Voigt(x, x0, y0, a, sigma, gamma):
#sigma = alpha / np.sqrt(2 * np.log(2))
return y0 + a * np.real(wofz((x - x0 + 1j*gamma)/sigma/np.sqrt(2))) / sigma /np.sqrt(2*np.pi)
popt, pcov = curve_fit(Voigt, x, y, p0=[8, np.max(y), -(np.max(y)-np.min(y)), sigma, gamma])
#p0=[8, np.max(y), -(np.max(y)-np.min(y)), mean, sigma])
plt.plot(x, y, 'b+:', label='data')
plt.plot(xx, Voigt(xx, *popt), 'r-', label='fit')
plt.legend()
plt.show()
【问题讨论】:
-
请您添加 x 和 y 的值,好吗?还有,xx。
-
对不起!现在完成
-
实际上,线形应该是洛伦兹的,它们会被扩展为高斯。所以,现在你正在做的不是扩大你的高斯,而是让它更紧。
-
代码中缺少导入,请提供完整的工作示例!
-
添加了有关问题和导入的更多信息。
标签: python curve-fitting