1

从这段代码中,我可以使用“out.best_fit”打印最终拟合,我现在想做的是将每个峰值绘制为单独的高斯曲线,而不是将它们全部合并为一条曲线。

from pylab import *
from lmfit import minimize, Parameters, report_errors
from lmfit.models import GaussianModel, LinearModel, SkewedGaussianModel
from scipy.interpolate import interp1d
from numpy import *

fit_data = interp1d(x_data, y_data)

mod = LinearModel()
pars = mod.make_params(slope=0.0, intercept=0.0)
pars['slope'].set(vary=False)
pars['intercept'].set(vary=False)


x_peak = [278.35, 334.6, 375]
y_peak = [fit_data(x) for x in x_peak]


i = 0
for x,y in zip(x_peak, y_peak):
    sigma = 1.0
    A = y*sqrt(2.0*pi)*sigma
    prefix = 'g' + str(i) + '_'

    peak = GaussianModel(prefix=prefix)

    pars.update(peak.make_params(center=x, sigma=1.0, amplitude=A))

    pars[prefix+'center'].set(min=x-20.0, max=x+20.0) 

    pars[prefix+'amplitude'].set(min=0.0)
    mod = mod + peak
    i += 1

out = mod.fit(y_data, pars, x=x_data)

plt.figure(1)
plt.plot(x_data, y_data)
plt.figure(1)
plt.plot(x_data, out.best_fit, '--')

全局拟合图:

截屏

4

1 回答 1

1

我认为您想在适合之后执行此操作:

components = out.eval_components(x=x_data)
for model_name, model_value in components.items():
    plt.plot(x_data, model_value)

# or more simply, if you prefer:
plt.plot(x_data, components['g0_'])
plt.plot(x_data, components['g1_'])
...

也就是说,ModelResult.eval_components()对于复合模型,将返回一个字典,其中的键是组件模型的前缀,值是该组件的计算模型。

于 2017-02-28T22:10:01.510 回答