2017-02-28 2 views
1

"out.best_fit"으로 최종 적합을 인쇄 할 수 있습니다. 지금 내가하고 싶은 것은 개별 피크가 각각 가우스 커브가 아닌 모든 커브가 단일 커브로 병합됩니다. 글로벌 적합의python-lmfit으로 가우스 커브 피팅 한 후 개별 피크를 그립니다

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, '--') 

플롯 : 반환하는 복합 모델입니다

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() :

Screenshot

+1

'x_data'와'y_data'는 무엇입니까? – Cleb

+0

죄송합니다. x 및 y 데이터에 대한 목록은 두 개뿐입니다. – TMR

+0

'out'에서 적합 매개 변수를 가져올 수 없습니까? 그들은 적합성의 y 값을 계산하기 위해 어딘가에 저장되어야합니다. 그런 다음 적합 매개 변수를 추출하면 단일 가우스 분포를 그릴 수 있습니다. –

답변

1

나는 당신이 당신의 적합 후에이 작업을 수행 할 수 생각 구성 요소 모델의 접두사 인 키가있는 사전 및 해당 구성 요소의 계산 된 모델 값이 포함됩니다.

+0

M Newville, 고맙습니다. 내가 찾고 있던 것이 었습니다. 그러나 전문가는 아니지만 내장 모델을 사용하고 있으므로 제안 내용이 내 코드에서 작동하지 않는다고 생각합니다. 어쨌든, 나는 내 자신의 모델에 맞춰야하므로 Model 클래스를 사용해야 만한다. 그러면 내가 당신의 솔루션을 사용할 수 있다고 생각한다. – TMR

+1

ModelResult.eval_components()는 내장 모델을 사용하는 모든 복합 모델에서 작동해야합니다. –