2017-11-22 15 views
0

가우스에 적합하지만 변수 cen과 cen2가 일정해야합니다.변수를 적합하지 않게 설정하는 방법

from pylab import * 
import matplotlib.mlab 
from lmfit import Model 

def gaussian(x, amp, cen, wid,amp2,cen2,wid2): 

return (amp/(sqrt(2*pi)*wid)) * exp(-(x-cen)**2 /(2*wid**2))+ 
(amp2/(sqrt(2*pi)*wid2)) * exp(-(x-cen2)**2 /(2*wid**2)) 

model = Model(gaussian) 
model.set_param_hint('amp',min=1.4, max=1.48) 
model.set_param_hint('amp2',min=0.00003,max=0.00005) 
parameters = model.make_params(amp=1.46, cen=0, wid=1, amp2=0.00005, 
cen2=10,wid2=5) 

result = model.fit(y, parameters, x=x) 

모델은 가우스이지만 피치를 f.ex로 설정합니다. 5.

print(result.fit_report()) 
#plt.yscale('log') 
#plt.ylim(((0,0.0004))) 
plt.scatter(x, y, s=0.7) 
plt.plot(x, result.best_fit, 'r-') 
plt.fill_between(x, result.best_fit-0.03, result.best_fit+0.03, 
color="#ABABAB",alpha=0.5) 
plt.show() 

어떻게하면됩니까?

+0

@kKinga Jn "cen과 cen2는 항상 일정해야합니다"는 의미는 무엇입니까? 또한 "0.0이 아니라 f.ex. 5로 센터 설정"은 무엇을 의미합니까? 귀하의 "가우스"함수는 2D 가우스를 정의하지 않지만 2 개의 1-D 가우스를 합한 것입니다. 당신이 맞추려고하는 것을 더 잘 설명하고 전체 스크립트와 전체 출력을 모두 제공하는 것이 도움이 될 것입니다. –

+0

끊임없이 있어야합니다. 즉, 적합하지 않거나 변경되지 않습니다. 이 매개 변수 (cen, cen2)를 설정하면 변경되지 않습니다. 예, 당신 말이 맞아요! 이것은 2 개의 1-D 가우시안의 합계입니다. 내 잘못. 그리고 ... 이것은 전체 스크립트입니다. –

답변

0

귀하의 의견에 귀하는 귀하가 스크립트를 업데이트했다고 말하지만 나는 그것을 보지 못했습니다.

는 2 차원 가우시안은 전형적 xy은 2 개 개의 다른 축에 대한 1-D 어레이로 예상

#!/usr/bin/env python 
import numpy as np 
def gaussian2d(x, y, amplitude=1, centerx=0, centery=0, sigmax=1, sigmay=1): 
    gauss_x = np.exp(-(1.0*x-centerx)**2/(2.0*sigmax**2)) 
    gauss_y = np.exp(-(1.0*y-centery)**2/(2.0*sigmay**2)) 
    return amplitude * np.outer(gauss_x, gauss_y)/(2*np.pi*sigmax*sigmay) 

로서 정의 될 것이다. 물론 맞는 데이터는 동일한 격자에 있어야합니다. 데이터가 어떻게 구성되어 있는지에 따라 다른 numpy 축 트릭 (meshgrid 등)을 확인하고 싶을 수 있습니다. 당신이 만드는 모두 xy 독립 변수를 하나의 2 차원 배열 전달, 또는 특정 있도록

lmfit.Model로 그를 설정하려면, 당신은 그 정의를 변경하려면, 다음 중 하나를해야 할 것 Model

model = Model(gaussian2d, independent_vars=['x', 'y']) 
와 같은

여기 파라미터 경계 또는 제한을 설정하려면, 당신은 (당신이 당신의 예에서 가지고) 할 수

에 : 나는 실제 질문은 무슨 생각을 들어

16,

model.set_param_hint('amplitude', min=0, max=2) model.set_param_hint('centery', value=10, vary=False) 

또는 먼저 매개 변수를 확인한 다음 경계와 제약 적용 할 수 있습니다

model = Model(gaussian2d, independent_vars=['x', 'y']) 
parameters =model.make_params(centerx=0, sigmax=1, ...) 
parameters['amplitude'].min = 0 
parameters['amplitude'].max = 10 
parameters['centery'].value = 5.0 
parameters['centery'].vary = False 

등을.