Python和lmfit:如何绘制通过最小化函数的残差获得的多重拟合

2024-04-20 06:49:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对两个数据集进行全局拟合并绘制结果。 我找到了@M Newville回答的“Python和lmfit:如何使用共享参数拟合多个数据集”的答案。修改后的代码为:

params =  Parameters()
params.add('center_1',    5.0, vary=True)
params.add('amplitude_1', 10.0, vary=True)
params.add('sigma_1',    1.0, vary=True)

params.add('center_2',    8.0, vary=True)
params.add('amplitude_2', 3.0, vary=True)
params.add('sigma_2',    2.0, vary=True)

x = linspace(-10, 10, 101)
data1 = gaussian(x, 5.33, 3.21, 1.51) + random.normal(0, 0.2, x.size)
data2 = gaussian(x, 3.1, 1.21, 1.51) + random.normal(0, 0.2, x.size)
datasets = [data1, data2]
def residual(params, x, datasets):
    model1 = gaussian(x, params['amplitude_1'], params['center_1'], params['sigma_1'])
    model2 = gaussian(x, params['amplitude_2'], params['center_2'], params['sigma_2'])

    resid1 = datasets[0] - model1
    resid2 = datasets[1] - model2
    return np.concatenate((resid1, resid2))

fit = minimize(residual, params, args=(x,), kws={'datasets': datasets})
print(fit_report(fit))

Só,我的问题是,我想把数据和拟合结果显示在一个图表中,但我不知道怎么做? 拜托,有人能给我一个线索吗

编辑:

我的新代码是:

params =  Parameters()
params.add('cen',    5.0, vary=True)
params.add('amp', 10.0, vary=True)
params.add('sig',    1.0, vary=True)

params.add('pen',    8.0, vary=True)
params.add('inter', 3.0, vary=True)

def reta(x, a, c):
        return a * x + c

x = linspace(-10, 10, 101)
data1 = gaussian(x, 5.33, 3.21, 1.51) + random.normal(0, 0.2, x.size)
data2 = reta(x, 3.1, 1) + random.normal(0, 0.2, x.size)
datasets = [data1, data2]
def residual(params, x, datasets):
    model1 = gaussian(x, params['amp'], params['cen'], params['sig'])
    model2 = reta(x, params['pen'], params['inter'])

    resid1 = datasets[0] - model1
    resid2 = datasets[1] - model2
    return np.concatenate((resid1, resid2))

fit = minimize(residual, params, args=(x,), kws={'datasets': datasets})
print(fit_report(fit))

plt.figure()
plt.plot(x, data1)
plt.plot(x, data2)

如果我只有一个函数,我可以绘制如下图:

plt.plot(x, residual(fit.params) + data1, 'r', label='best fit')

但对于两款车型,我遇到了问题


Tags: addtruerandomparamsgaussiansigmafitdatasets