Я работаю над установкой данных о времени жизни мюона на кривую, чтобы извлечь среднее время жизни, используя функцию lmfit. Общий процесс, который я использую, заключается в том, чтобы выгрузить 13 000 точек данных в 10 бункеров, используя функцию гистограммы, вычисляя неопределенность с квадратным корнем из подсчетов в каждом бункере (это экспоненциальная модель), затем используйте модуль lmfit для определения лучше всего подходят вместе со средствами и неопределенностью. Однако графический вывод метода model.fit() возвращает этот график, где красная линия соответствует (и, очевидно, не соответствует правилу). Fit result output graphlmfit для экспоненциальных данных возвращает линейную функцию
Я смотрел онлайн и не могу найти решение этого вопроса, я бы очень признателен за помощь в выяснении того, что происходит. Вот код.
import os
import numpy as np
import matplotlib.pyplot as plt
from numpy import sqrt, pi, exp, linspace
from lmfit import Model
class data():
def __init__(self,file_name):
times_dirty = sorted(np.genfromtxt(file_name, delimiter=' ',unpack=False)[:,0])
self.times = []
for i in range(len(times_dirty)):
if times_dirty[i]<40000:
self.times.append(times_dirty[i])
self.counts = []
self.binBounds = []
self.uncertainties = []
self.means = []
def binData(self,k):
self.counts, self.binBounds = np.histogram(self.times, bins=k)
self.binBounds = self.binBounds[:-1]
def calcStats(self):
if len(self.counts)==0:
print('Run binData function first')
else:
self.uncertainties = sqrt(self.counts)
def plotData(self,fit):
plt.errorbar(self.binBounds, self.counts, yerr=self.uncertainties, fmt='bo')
plt.plot(self.binBounds, fit.init_fit, 'k--')
plt.plot(self.binBounds, fit.best_fit, 'r')
plt.show()
def decay(t, N, lamb, B):
return N * lamb * exp(-lamb * t) +B
def main():
muonEvents = data('C:\Users\Colt\Downloads\muon.data')
muonEvents.binData(10)
muonEvents.calcStats()
mod = Model(decay)
result = mod.fit(muonEvents.counts, t=muonEvents.binBounds, N=1, lamb=1, B = 1)
muonEvents.plotData(result)
print(result.fit_report())
print (len(muonEvents.times))
if __name__ == "__main__":
main()