Lorentzian适合编写代码的两种方式

时间:2018-05-29 10:22:01

标签: python numpy curve-fitting lmfit

我现在正在努力与Lorentzian曲线拟合。我会试着解释一下我的问题。我需要为Lorentzian曲线拟合编写自己的代码,这样我就可以在方程式中添加一些东西。我已经使用modeldef实现了Lorentzian拟合,我写的类似,但它不起作用。看看我的代码:

以下是我的数据:

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 Lorentzian,下图为model Lorentzian。

这就是结果:enter image description here

1 个答案:

答案 0 :(得分:2)

看起来像一个括号问题。这样:

(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乘以浮点数1.0*x-cen

作为旁注,lmfit由于某种原因等价地写了这个函数,但是a bit differently(在页面lorentzian上找到)。我不明白这个原因。