Python 指数数据返回线性函数的lmfit
我正在将μ介子寿命数据拟合成一条曲线,用lmfit函数提取平均寿命。我使用的一般过程是使用直方图函数将13000个数据点分为10个数据点,用每个数据点中计数的平方根计算不确定性(这是一个指数模型),然后使用lmfit模块确定最佳拟合以及平均值和不确定性。但是,绘制model.fit()方法的输出会返回此图,其中红线是拟合(显然不是正确的拟合) 我在网上查过了,但找不到解决办法,我真的很感激你能帮我弄清楚到底发生了什么。这是密码Python 指数数据返回线性函数的lmfit,python,curve-fitting,data-analysis,nonlinear-optimization,Python,Curve Fitting,Data Analysis,Nonlinear Optimization,我正在将μ介子寿命数据拟合成一条曲线,用lmfit函数提取平均寿命。我使用的一般过程是使用直方图函数将13000个数据点分为10个数据点,用每个数据点中计数的平方根计算不确定性(这是一个指数模型),然后使用lmfit模块确定最佳拟合以及平均值和不确定性。但是,绘制model.fit()方法的输出会返回此图,其中红线是拟合(显然不是正确的拟合) 我在网上查过了,但找不到解决办法,我真的很感激你能帮我弄清楚到底发生了什么。这是密码 import os import numpy as np impor
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()
导入操作系统
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从numpy导入sqrt、pi、exp、linspace
从lmfit导入模型
类数据():
定义初始化(自我,文件名):
times\u dirty=sorted(np.genfromtxt(文件名,分隔符='',解包=False)[:,0])
self.times=[]
对于范围内的i(len(times_dirty)):
如果times_dirty[i]这可能是一个简单的缩放问题。作为一个快速测试,试着将所有原始数据除以1000(X和Y),看看改变数据的大小是否有任何影响。根据詹姆斯·菲利普斯的回答,我认为您在图表中显示的数据意味着N、lamb和B的值与1、1、1非常不同。请记住,对于lamb=1,exp(-lamb*t)本质上是0,而t>100。因此,如果算法从lamb=1开始,并稍微改变它以找到一个更好的值,那么它实际上无法看到模型与数据匹配程度的任何差异
我建议尝试从更合理的数据值开始,也许N=1.e6,lamb=1.e-4,B=100
正如James所建议的,让变量的值在1的数量级,并在必要时加入比例因子,通常有助于获得数值稳定的解