0

私は曲線にミューオンのライフタイムデータをフィッティングして、lmfit関数を使って平均寿命を抽出しています。私が使用している一般的なプロセスは、ヒストグラム関数を使用して13,000データポイントを10個のビンにビンし、各ビン内のカウントの平方根で不確実性を計算します(指数関数モデルです)。手段と不確実性に沿ったベストフィット。しかし、model.fit()メソッドの出力をグラフ化すると、このグラフが返されます。ここで赤い線はフィットです(そして、明らかに正しいフィットではありません)。 Fit result output graph指数データのためのlmfitはリニア関数を返します

私はオンラインで見ましたが、これに対する解決策を見つけることができませんでした。何が起こっているのかを理解するために、本当に感謝しています。ここにコードがあります。

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)は、lamb = 1の場合は本質的に0であり、t> 100の場合です。したがって、アルゴリズムがlamb = 1で始まり、それを少し変えてより良い値を見つけると、実際にはモデルがデータとどのくらい一致するか。

あなたは、おそらくN = 1.e6、lamb = 1.e-4、およびB = 100のデータに対してより合理的な値から始めようとお勧めします。

変数が1のオーダーの値を持ち、必要に応じてスケール係数を入れることは、数値的に安定したソリューションを得る上で役に立ちます。

関連する問題