Python 指数数据返回线性函数的lmfit

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

我正在将μ介子寿命数据拟合成一条曲线,用lmfit函数提取平均寿命。我使用的一般过程是使用直方图函数将13000个数据点分为10个数据点,用每个数据点中计数的平方根计算不确定性(这是一个指数模型),然后使用lmfit模块确定最佳拟合以及平均值和不确定性。但是,绘制model.fit()方法的输出会返回此图,其中红线是拟合(显然不是正确的拟合)

我在网上查过了,但找不到解决办法,我真的很感激你能帮我弄清楚到底发生了什么。这是密码

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的数量级,并在必要时加入比例因子,通常有助于获得数值稳定的解