经过大量搜索并且无法找到答案,我选择将我的问题放在这里。
如何将 y=(1/A)e^(-x/A) 形式的指数函数拟合到显示的数据并绘制该函数?我仍然需要一些习惯来适应 Python。帮助将不胜感激!
先感谢您。
经过大量搜索并且无法找到答案,我选择将我的问题放在这里。
如何将 y=(1/A)e^(-x/A) 形式的指数函数拟合到显示的数据并绘制该函数?我仍然需要一些习惯来适应 Python。帮助将不胜感激!
先感谢您。
这段代码很合适。
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
,这是概率的估计,因为计数实际上是一种估计生命周期的概率密度函数的方法。model =
.residual
返回观察到的概率(基于计数)和临时计算的概率之间的差异。leastsq
返回参数的值 0.0497646352872。
看来我想通了。
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()
可悲的是,它不太适合数据,但我猜这只是一个数学问题。