【问题标题】:lmfit for exponential data returns linear functionlmfit 指数数据返回线性函数
【发布时间】: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


    【解决方案1】:

    这可能是一个简单的缩放问题。作为一个快速测试,尝试将所有原始数据除以 1000(X 和 Y)以查看更改数据大小是否有任何影响。

    【讨论】:

      【解决方案2】:

      只是以 James Phillips 的回答为基础,我认为您在图表中显示的数据暗示 N、lamb 和 B 的值与 1、1、1 非常不同。请记住 exp(-lamb*t ) 对于lamb = 1 和t> 100,本质上为0。因此,如果算法从lamb=1 开始并稍微改变它以找到更好的值,它实际上不会看到任何差异模型与数据匹配得很好。

      我建议尝试从对您拥有的数据更合理的值开始,也许 N=1.e6、lamb=1.e-4 和 B=100。

      正如 James 所建议的,让 变量 的值约为 1,并根据需要输入比例因子通常有助于获得数值稳定的解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 2011-07-19
        • 1970-01-01
        相关资源
        最近更新 更多