0

Я работаю над установкой данных о времени жизни мюона на кривую, чтобы извлечь среднее время жизни, используя функцию 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() 

ответ

0

Это может быть простая проблема масштабирования. В качестве быстрого теста попробуйте делить все необработанные данные в 1000 раз (как X, так и Y), чтобы увидеть, влияет ли изменение величины данных.

0

Для того чтобы построить на Джеймсе Филлипсе ответ, я думаю, что данные, которые вы показываете на вашем графике, подразумевают значения для N, lamb и B, которые сильно отличаются от 1, 1, 1. Имейте в виду, что exp (-lamb * t) составляет по существу 0 для lamb = 1 и t> 100. Итак, если алгоритм начинается с lamb = 1 и изменяется немного, чтобы найти лучшее значение, он фактически не сможет увидеть какую-либо разницу в насколько хорошо модель соответствует данным.

Я предлагаю попытаться начать со значений, которые более разумны для данных, которые у вас есть, возможно, N = 1.e6, lamb = 1.e-4 и B = 100.

Как предположил Джеймс, переменные имеют значения порядка 1 и при необходимости применяют масштабные коэффициенты, которые часто полезны при получении численно стабильных решений.

Смежные вопросы