首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >曲线拟合模型的拼接

曲线拟合模型的拼接
EN

Stack Overflow用户
提问于 2018-06-01 20:34:09
回答 1查看 159关注 0票数 1

我有这7条准洛伦兹曲线,它们符合我的数据。

我想和他们一起,画出一条相连的曲线。你有什么想法要怎么做吗?我在lmfit文档上读到过有关ComposingModel的内容,但不清楚如何做到这一点。

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

代码语言:javascript
复制
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替换ready。

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

C:\Python27\lib\site-packages\lmfit\printfuncs.py:153:

RuntimeWarning:在模型[ double_scalars ] spercent =‘({0:2.2%})’.format(abs(par.stderr/par.value))中遇到无效值

关于我自己的模型:

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 10:21:05

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

代码语言:javascript
复制
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)使用前缀来避免参数的名称冲突。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50643564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档