Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 曲线拟合模型的连接_Python 2.7_Curve Fitting_Lmfit - Fatal编程技术网

Python 2.7 曲线拟合模型的连接

Python 2.7 曲线拟合模型的连接,python-2.7,curve-fitting,lmfit,Python 2.7,Curve Fitting,Lmfit,我有7条拟洛伦兹曲线,它们与我的数据相吻合。 我想加入他们,形成一条相连的曲线。你知道怎么做吗?我在lmfit文档中读过关于ComposingModel,但不清楚如何做到这一点 下面是我的两条拟合曲线代码示例 for dataset in [Bxfft]: dataset = np.asarray(dataset) freqs, psd = signal.welch(dataset, fs=266336/300, window='hamming', nperseg=16192,

我有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的一些提示,他发布了一个答案,并使用他的代码得出以下结论:

因此,我的代码与他的代码类似,但随着每个峰值而扩展。我现在正在努力的是用我自己的替代ready
LorentzModel

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

C:\Python27\lib\site packages\lmfit\printfuncs.py:153:RuntimeWarning: 在双\u标量[[Model]]spercent中遇到无效值= “({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]

三个洛伦兹人的合成模型如下所示:

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)使用前缀以避免参数的名称冲突


我希望这足以让你开始…

amp
e
在你对洛伦兹的定义中是完全相关的。请(并且始终)报告完整准确的回溯。我不知道Python2.7怎么可能在那里给出运行时警告。很抱歉让你失望,但这就是全部错误。看看我的问题,在那里你可以找到我桌面上的PS。我不明白这怎么可能是整个信息,或者它怎么可能与输出文本交错并着色。但是,我不明白你为什么把截图作为输出文本。。。为什么不直接发这篇文章呢?看起来这可能来自于某种Python风格的IDE或环境——我不知道这是什么,但无论是什么使文本着色,都可能是在“解释”错误消息。当然,一个完整的最小示例和完整的输出总是一个好主意。然后,实际问题已经确定,
amp
e
是完全相关的。这就是我所做的,我复制了整个文本,但你认为我没有发布整个错误。你说,
amp
e
是相关的。那我该换什么?请注意,在我以前的代码中,
amp
e
的值与这里的值相同,但一切都运行良好,没有任何错误。我已经找到了问题所在。这个问题已经到了极限。当我把它们扔掉时,一切都很好,向我展示了我期望的价值观。我把你的答案标记为解决我问题的答案,因为没有你的帖子我是无法完成的。因此,感谢您的合作:)