【问题标题】:Joining of curve fitting models曲线拟合模型的连接
【发布时间】:2018-11-11 14:29:44
【问题描述】:

我有这 7 条准洛伦兹曲线适合我的数据。

我想加入他们,制作一条连接的曲线。你有什么想法吗?我在lmfit 上阅读了有关ComposingModel 的文档,但不清楚如何执行此操作。

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

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)

更新!!!

我使用了来自用户 @MNewville 的一些提示,他发布了一个答案并使用他的代码我得到了这个:

所以我的代码与他的相似,但随着每个峰值进行了扩展。我现在正在努力用我自己的替换准备好的LorentzModel

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

C:\Python27\lib\site-packages\lmfit\printfuncs.py:153: RuntimeWarning: double_scalars [[Model]] 中遇到的无效值百分比 = '({0:.2%})'.format(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]

【问题讨论】:

    标签: python-2.7 curve-fitting lmfit


    【解决方案1】:

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

    from lmfit import Model, LorentzianModel
    peak1 = LorentzianModel(prefix='p1_')
    peak2 = LorentzianModel(prefix='p2_')
    peak3 = LorentzianModel(prefix='p3_')
    
    # make composite by adding (or multiplying, etc) components
    model = peak1 + peaks2 + peak3
    
    # make parameters for the full model, setting initial values 
    # using the prefixes
    params = model.make_params(p1_amplitude=10, p1_center=8, p1_sigma=3,
                               p2_amplitude=10, p2_center=15, p2_sigma=3,
                               p3_amplitude=10, p3_center=20, p3_sigma=3)
    
    # perhaps set bounds to prevent peaks from swapping or crazy values
    params['p1_amplitude'].min = 0
    params['p2_amplitude'].min = 0
    params['p3_amplitude'].min = 0
    params['p1_sigma'].min = 0
    params['p2_sigma'].min = 0
    params['p3_sigma'].min = 0
    params['p1_center'].min = 2
    params['p1_center'].max = 11
    params['p2_center'].min = 10
    params['p2_center'].max = 18
    params['p3_center'].min = 17
    params['p3_center'].max = 25
    
    # then do a fit over the full data range
    result = model.fit(y, params, x=x)
    

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

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

    【讨论】:

    • ampe 在您对洛伦兹的定义中完全相关。请(并且始终)报告完整和准确的回溯。我看不出 Python2.7 怎么可能在那里给出 RuntimeWarning。
    • 很抱歉让您失望了,但这就是整个错误。看我的问题,那里可以找到我桌面的PS。
    • 我不明白这可能是整个消息,也不明白它如何与输出文本交错并着色。但是,我不明白您为什么将屏幕截图作为输出文本发布……为什么不直接发布文本?看起来这可能来自某些 Python 式 IDE 或环境——我不知道那是什么,但是任何使文本着色的东西都可能是“解释”错误消息。当然,一个完整的最小示例和完整的输出总是一个好主意。话又说回来,实际问题已经确定,ampe 是完全相关的。
    • 嗯,这就是我所做的,我复制了整个文本,但你认为我没有发布整个错误。你说ampe 是相关的。那我应该改变什么?请注意,在我之前的代码中,ampe 的值与此处相同,但一切运行良好,根本没有错误。
    • 嗯,我发现了问题所在。问题出在边界上。当我把它们扔掉时,一切都很好,向我展示了我所期望的价值观。我将您的答案标记为可以解决我的问题的答案,因为没有您的帖子,我将无法完成。所以谢谢你的合作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2015-03-02
    • 2011-10-14
    相关资源
    最近更新 更多