1

原始数据

经过大量搜索并且无法找到答案,我选择将我的问题放在这里。

如何将 y=(1/A)e^(-x/A) 形式的指数函数拟合到显示的数据并绘制该函数?我仍然需要一些习惯来适应 Python。帮助将不胜感激!

先感谢您。

4

2 回答 2

1

这段代码很合适。

first = True
lifetimes = []
counts = []
with open('Werkverkeer.txt') as w:
    next(w)
    for line in w:
        _, life, count = line.rstrip().split()
        life, count = float(life), int(count)
        if count==0:
            continue
        lifetimes.append(life-0.005)
        counts.append(count)

probs = [_/sum(counts) for _ in counts]
print (probs)

from scipy.optimize import leastsq
from scipy.stats import expon
from numpy import exp

def residual(params, X, data):
    model = [expon.cdf(x+0.005, scale=params[0])-expon.cdf(x-0.005, scale=params[0]) for x in X]
    return [d-m for (d,m) in zip(data, model)]

r = leastsq(residual, [140], args=(lifetimes, probs))
estimate = r[0][0]
print (estimate)

fitted = [expon.cdf(x+0.005, scale=estimate)-expon.cdf(x-0.005, scale=estimate) for x in lifetimes]
print(fitted)

from matplotlib import pyplot as plt

plt.plot(lifetimes, probs, 'r.')
plt.plot(lifetimes, fitted, 'b-')

plt.show()

曲线拟合

注意事项:

  • 而不是适合counts我已经适合归一化counts,这是概率的估计,因为计数实际上是一种估计生命周期的概率密度函数的方法。
  • 因为我使用的是计数,所以对于给定的参数值,我需要在 bin 边界之间拟合密度函数下的区域。因此,线model =.
  • 像往常一样,最后一行residual返回观察到的概率(基于计数)和临时计算的概率之间的差异。

leastsq返回参数的值 0.0497646352872。

于 2017-11-23T04:43:06.317 回答
1

看来我想通了。

def exponential_fit(x, a, c):
"""
Logarithmic fit used for the MuonLab life time measurements.
:param x:
:param a:
:param c:
:return:
"""
return (1/a)*np.exp(-x/a)+c

def logarithmic_fit_plot(x, y): # WIP font = {'family': 'normal', 'weight': 'bold', 'size': 20}

matplotlib.rc('font', **font)
xdata = x
ydata = y
plt.rc('text', usetex=True)
plt.plot(xdata, ydata, '.', label='sample')
popt, pcov = sp.optimize.curve_fit(exponential_fit, xdata, ydata)
plt.plot(xdata, exponential_fit(xdata, *popt), 'r-',
         label=r"$\frac{1}{\tau_0}e^{\frac{-x}{\tau_0}}, \tau_0=%5.3f, c=%5.3f$" % tuple(popt))
plt.legend()
plt.show()

可悲的是,它不太适合数据,但我猜这只是一个数学问题。

于 2017-11-22T21:59:29.393 回答