실험실에서 기기를 사용하여 측정 한 다음 데이터가 있습니다. 기기는 직경을 기준으로 서로 다른 크기의 입자를 빈에 수집하므로 측정은 기본적으로 "바인딩"됩니다.
import numpy as np
import matplotlib.pylab as plt
from lmfit import models
y = np.array([196, 486, 968, 2262, 3321, 4203, 15072, 46789, 95201, 303494, 421484, 327507, 138931, 27973])
bins = np.array([0.0150, 0.0306, 0.0548, 0.0944, 0.1540, 0.2560, 0.3830, 0.6050, 0.9510, 1.6400, 2.4800, 3.6700, 5.3800, 9.9100, 15])
bin_width=np.diff(bins)
x_plot = np.add(bins[:-1],np.divide(bin_width,2))
x=x_plot
y=y
여기에 플로팅하면 데이터가 어떻게 보이는지 나타납니다. x 스케일 단위로 0.1 정도의 모드와 2 정도의 모드가 있습니다.
이 연구 영역 내에서 이러한 데이터에 "다중 모드"로그 정규 분포를 맞추는 것이 일반적입니다.이를 감안할 때 LMFIT를 사용하여 모드를 약 2에 맞추 었습니다.
model = models.LognormalModel()
params = model.make_params(center=1.5, sigma=0.6, amplitude=2214337)
result = model.fit(y, params, x=x)
print(result.fit_report())
plt.plot(x, y, label='data')
plt.plot(x, result.best_fit, label='fit')
plt.xscale("log")
plt.yscale("log")
plt.legend()
plt.show()
예상대로 이것은 2 주변의 두 번째 모드에 적합한 결과를 가져옵니다. 내 질문은 0.1 주변의 두 번째 모드를 어떻게 맞출 것인가입니다 (본질적으로 두 모드의 합이 데이터에 적합해야 함)? 세 가지 모드가 더 좋을 것이라고 주장 할 수도 있지만 두 가지 모드를 사용하는 방법을 이해하면 세 번째 모드를 추가하는 것은 사소한 일이라고 가정합니다.
lmfit.Models
다음과 같이 함께 추가 할 수 있습니다.
model = (models.LognormalModel(prefix='p1_') +
models.LognormalModel(prefix='p2_') +
models.LognormalModel(prefix='p3_') )
params = model.make_params(p1_center=0.3, p1_sigma=0.2, p1_amplitude=1e4,
p2_center=1.0, p2_sigma=0.4, p2_amplitude=1e6,
p3_center=1.5, p3_sigma=0.6, p3_amplitude=2e7)
복합 모델에서 모델의 각 구성 요소는 매개 변수 이름 앞에 추가되는 자체 "접두어"(모든 문자열)를 갖습니다. 다음에 맞는 모델 구성 요소의 사전을 얻을 수 있습니다.
components = result.eval_components()
# {'p1_': Array, 'p2_': Array, 'p3_': Array}
for compname, comp in components.keys():
plt.plot(x, comp, label=compname)
세미 로그 또는 로그 로그 플롯에 표시 할 데이터를 피팅하려면 모델을에 피팅하는 것을 고려할 수 있습니다 log(y)
. 그렇지 않으면 적합도가 매우 낮은 값에서 부적합에 대해 민감하지 않습니다 y
.
참고 lmfit
모델과 매개 변수가 범위를 지원합니다. 다음과 같은 경계를 배치해야하거나 찾을 수 있습니다.
params['p1_amplitude'].min = 0
params['p1_sigma'].min = 0
params['p1_center'].max = 0.5
params['p3_center'].min = 1.0
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다