代码之家  ›  专栏  ›  技术社区  ›  Hiddenguy

洛伦兹符合两种编写代码的方法

  •  1
  • Hiddenguy  · 技术社区  · 6 年前

    我现在正在努力适应洛伦兹曲线。我会尽力解释我的问题。我需要为洛伦兹曲线拟合编写自己的代码,这样我可以在方程中添加一些东西。我已经实现了洛伦兹配合 model def 我写过类似的东西,但没用。查看我的代码:

    下面是我的数据:

    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 洛伦兹,下面的情节 模型 洛伦兹。

    结果是: enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   kabanus    6 年前

    像个括号问题。这是:

    (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 (请参阅洛伦兹一页)。不过,我看不出这是为什么。