连接曲线拟合模型

时间:2018-06-01 12:34:09

标签: python-2.7 curve-fitting lmfit

我有7条准洛伦兹曲线,符合我的数据。 enter image description here

我想加入他们,制作一条连接的曲线。你有什么想法怎么做?我在ComposingModel文档中已经阅读了lmfit,但目前尚不清楚如何执行此操作。

以下是我的两条拟合曲线代码的示例。

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

    # 8 Hz
    model = Model(lorentzian)
    params = model.make_params(amp=6, cen=5, sig=1, e=0)
    result = model.fit(y, params, x=x)
    final_fit = result.best_fit
    print "8 Hz mode"
    print(result.fit_report(min_correl=0.25))
    plt.plot(x, final_fit, 'k-', linewidth=2)

    # 14 Hz
    x2 = freqs[220:-7780]
    y2 = psd[220:-7780]

    model2 = Model(lorentzian)
    pars2 = model2.make_params(amp=6, cen=10, sig=3, e=0)
    pars2['amp'].value = 6
    result2 = model2.fit(y2, pars2, x=x2)
    final_fit2 = result2.best_fit
    print "14 Hz mode"
    print(result2.fit_report(min_correl=0.25))
    plt.plot(x2, final_fit2, 'k-', linewidth=2)

UPDATE !!!

我使用了@MNewville用户的一些提示,他们发布了一个答案并使用他的代码我得到了这个: enter image description here

所以我的代码与他的代码类似,但每个峰值都会扩展。我现在正在努力的是用我自己的替换就绪LorentzModel

问题是当我这样做时,代码会给我一个这样的错误。

  

C:\ Python27 \ lib \ site-packages \ lmfit \ printfuncs.py:153:RuntimeWarning:   double_scalars中遇到的值无效[[Model]] spercent =   。 '({0:0.2%})' 格式(ABS(par.stderr / par.value))

关于我自己的模特:

    def lorentzian(x, amp, cen, sig, e):
         return (amp*(1-e)) / ((pow((1.0 * x - cen), 2)) + (pow(sig, 2)))

    peak1 = Model(lorentzian, prefix='p1_')
    peak2 = Model(lorentzian, prefix='p2_')
    peak3 = Model(lorentzian, prefix='p3_')

    # make composite by adding (or multiplying, etc) components
    model = peak1 + peak2 + peak3

    # make parameters for the full model, setting initial values
    # using the prefixes
    params = model.make_params(p1_amp=6, p1_cen=8, p1_sig=1, p1_e=0,
                               p2_ampe=16, p2_cen=14, p2_sig=3, p2_e=0,
                               p3_amp=16, p3_cen=21, p3_sig=3, p3_e=0,)

其余代码与@MNewville

类似

[![在此处输入图像说明] [3]] [3]

1 个答案:

答案 0 :(得分:2)

3洛伦兹人的复合模型如下所示:

double

我认为你缺少的关键部分是:a)只是将模型加在一起,b)使用前缀来避免参数名称冲突。

我希望这足以让你开始......