2016-06-08 55 views
1

我知道有与此有关的线程,但我很困惑,我想让我的数据适合我的数据。Python - 从记录值拟合指数衰减曲线

我的数据被导入并绘制成这样。

import matplotlib.pyplot as plt 
%matplotlib inline 
import pylab as plb 
import numpy as np 
import scipy as sp 
import csv 

FreqTime1 = [] 
DecayCount1 = [] 
with open('Half_Life.csv', 'r') as f: 
    reader = csv.reader(f, delimiter=',') 
    for row in reader: 
     FreqTime1.append(row[0]) 
     DecayCount1.append(row[3]) 

FreqTime1 = np.array(FreqTime1) 
DecayCount1 = np.array(DecayCount1) 

fig1 = plt.figure(figsize=(15,6)) 
ax1 = fig1.add_subplot(111) 
ax1.plot(FreqTime1,DecayCount1, ".", label = 'Run 1') 
ax1.set_xlabel('Time (sec)') 
ax1.set_ylabel('Count') 
plt.legend() 

enter image description here

问题是,我遇到困难设置常规指数衰减,在我不知道如何从数据集中计算的参数值。

如果可能的话,那么我想要用图表显示拟合衰减方程的方程。但是,如果能够生产出适合的产品,这可以很容易地应用。

编辑 ------------------------------------------- ------------------

所以使用Stanely基R提及

def model_func(x, a, k, b): 
    return a * np.exp(-k*x) + b 

x = FreqTime1 
y = DecayCount1 


p0 = (1.,1.e-5,1.) 
opt, pcov = curve_fit(model_func, x, y, p0) 
a, k, b = opt 

我与此错误消息

返回的拟合函数时

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('S32') dtype('S32') dtype('S32')

有关如何解决此问题的任何想法?

+0

看看http://stackoverflow.com/questions/21420792/exponential-curve-fitting-in-scipy –

回答

3

你必须使用curve_fit从scipy.optimize:http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.optimize.curve_fit.html

from scipy.optimize import curve_fit 
import numpy as np 
# define type of function to search 
def model_func(x, a, k, b): 
    return a * np.exp(-k*x) + b 

# sample data 
x = np.array([399.75, 989.25, 1578.75, 2168.25, 2757.75, 3347.25, 3936.75, 4526.25, 5115.75, 5705.25]) 
y = np.array([109,62,39,13,10,4,2,0,1,2]) 

# curve fit 
p0 = (1.,1.e-5,1.) # starting search koefs 
opt, pcov = curve_fit(model_func, x, y, p0) 
a, k, b = opt 
# test result 
x2 = np.linspace(250, 6000, 250) 
y2 = model_func(x2, a, k, b) 
fig, ax = plt.subplots() 
ax.plot(x2, y2, color='r', label='Fit. func: $f(x) = %.3f e^{%.3f x} %+.3f$' % (a,k,b)) 
ax.plot(x, y, 'bo', label='data with noise') 
ax.legend(loc='best') 
plt.show() 

enter image description here

+0

凉。对于这种情况,我是否必须为我的数据集应用for循环? – DarthLazar

+0

循环什么? 'curve_fit'已经搜索了合适的拟合函数。 – Serenity

+0

当我将x和y的值定义为数组时,我用这个返回,'ufunc'multiply'不包含具有签名匹配类型的循环dtype('S32')dtype('S32')dtype('S32 ')' – DarthLazar

1

“我与此错误消息

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('S32') dtype('S32') dtype('S32') 

如何任何想法返回解决这个问题?“

读取CSV文件以创建FreqTime1DelayCount1的代码正在创建字符串数组。你可以通过@StanleyR在评论中提出的建议来解决这个问题。一个更好的想法是将这段代码:

FreqTime1 = [] 
DecayCount1 = [] 
with open('Half_Life.csv', 'r') as f: 
    reader = csv.reader(f, delimiter=',') 
    for row in reader: 
     FreqTime1.append(row[0]) 
     DecayCount1.append(row[3]) 

FreqTime1 = np.array(FreqTime1) 
DecayCount1 = np.array(DecayCount1) 

有:

FreqTime1, DecayCount1 = np.loadtxt('Half_Life.csv', delimiter=',', usecols=(0, 3), unpack=True)