python - 洛伦兹拟合两种编写代码的方式

标签 python numpy curve-fitting lmfit

我现在正在努力解决洛伦兹曲线拟合问题。我会尝试解释我的问题。我需要编写自己的洛伦兹曲线拟合代码,以便我可以在方程中添加一些内容。我已经用 modeldef 实现了洛伦兹拟合,我写了类似的内容,但它不起作用。查看我的代码:

这是我的数据:

for dataset in [Bxfft]:
    dataset = np.asarray(dataset)
    freqs, psd = signal.welch(dataset, fs=266336/300, window='hamming', nperseg=16192, scaling='density')
    plt.semilogy(freqs[30:-7000], psd[30:-7000]/dataset.size**0, color='r', label='Bx')
    x = freqs[100:-7900]
    y = psd[100:-7900]

这是我定义的洛伦兹曲线拟合:

def lorentzian(x, amp, cen, sig):
    return (amp/np.pi) * (sig/(x-cen)**2 + sig**2)

model = Model(lorentzian)
pars = model.make_params(amp=6, cen=5, sig=1)
pars['amp'].max = 6
result = model.fit(y, pars, x=x)
final_fit = result.best_fit
print(result.fit_report(min_correl=0.25))
plt.plot(x, final_fit, 'k--', linewidth=3)

这里由模型函数完成:

model2 = LorentzianModel()
params2 = model2.make_params(amplitude=6, center=5, sigma=1)
params2['amplitude'].value = 6
result2 = model2.fit(y, params2, x=x)
final_fit2 = result2.best_fit
print(result2.fit_report(min_correl=0.25))
plt.plot(x, final_fit2, 'k--', linewidth=3)

上图适用于 def 洛伦兹,下图适用于 model 洛伦兹。

这就是结果:enter image description here

最佳答案

看起来像是括号问题。这:

(amp/np.pi) * (sig/(x-cen)**2 + sig**2)

不是洛伦兹。这:

(amp/np.pi) * (sig/((x-cen)**2 + sig**2))

是。此外,在极少数情况下,您可能会遇到轻微的整数问题 cen,x,sig 都是整数。您可以使用 math.pow 来解决这个问题,或者使用 lmfit 中的方法并将 x 乘以 float :1.0*x -cen.

作为旁注,由于某种原因,lmfit 等效地编写了此函数,但 a bit differently (可在洛伦兹页上找到)。但我看不出有什么理由。

关于python - 洛伦兹拟合两种编写代码的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50581956/

相关文章:

python - 键错误 : None of [Int64Index. ..] dtype='int64] 在列中

python - 如何覆盖另一个库中的现有记录器?

python - 在 Numpy 1.6.1 中将 float32 数组转换为 datetime64

具有峰值和平顶(超)高斯信号的 Python 曲线拟合问题

Python(scipy.optimize.curve_fit 的问题)

python - Plotly - 在 createtd 跟踪后更新子图标题

python - pyqt:删除所有项目并添加新项目时正确更新 QGridLayout

python - 用另一个数组索引一个 numpy 数组

python - 将 Numpy 中的矩阵列表相乘

python - python(scipy)曲线拟合的奇怪结果