【发布时间】:2017-02-05 15:17:02
【问题描述】:
我正在努力将 μ 子寿命数据拟合到曲线上,以使用 lmfit 函数提取平均寿命。我使用的一般过程是使用 histogram 函数将 13,000 个数据点分成 10 个 bin,用每个 bin 中计数的平方根计算不确定性(它是一个指数模型),然后使用 lmfit 模块来确定最适合与手段和不确定性。但是,绘制 model.fit() 方法的输出会返回此图,其中红线是拟合(显然不是正确的拟合)。 Fit result output graph
我在网上查看过,但找不到解决方案,我非常感谢能帮助我弄清楚发生了什么。这是代码。
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()
【问题讨论】:
标签: python curve-fitting data-analysis nonlinear-optimization