将SciPy curve_fit用于具有多种功能形式的数据

时间:2013-06-05 14:49:35

标签: scipy curve-fitting

我正在尝试拟合一些数据,这些数据在时间= 0时开始平坦,尖锐的峰值,然后衰减为两个负指数(第一个作为快速指数,然后在少量时间后作为较慢的指数) 。我一直在尝试使用scipy.optimize中的curve_fit,但是拟合似乎并没有识别出第一个快速衰减的指数。

我所做的就是为不同的时间范围定义两个拟合函数。对于时间< 0我有一个常数(我称之为线,因为起初我使用了一条线)。对于时间> 0,我定义具有不同参数的两个指数的和。然后我猜测这些参数,并将所有内容提供给curve_fit。

我真的只是想知道是否有人对如何识别第一个峰值和快速衰变有任何想法......

在我的谷歌搜索中,我只能找到拟合简单数据的示例(例如单个指数或多项式)。我可能正在接近这个完全错误,任何帮助将不胜感激。谢谢!

另外,我会附上我得到的情节,但这是我的第一篇文章,我没有名声所以它不会让我...

以下是数据的链接: http://www.lehigh.edu/~ivb2/teaching/smp/current/DecayData.txt

以下是代码:

#!/usr/bin/env python

import numpy as np
from scipy import optimize
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

def line(x, *p):
    return p[0]

def exponential(x, *p):
    return p[0] * np.exp(p[1] * x) + p[2]

#Fit function (neg exp in this case)
def fitfunc(time, *p):
    tempArray = np.empty_like(time)
    tempArray[time <= 0] = line(time, p[6])
    tempArray[0 < time] = exponential(time, p[0], p[1], p[2]) + exponential(time, p[3], p[4], p[5])
    return tempArray

#Read in the data to 3 arrays
time, decay1, decay2 = np.loadtxt('DecayData.txt', unpack=True)

#An initial guess for the fit parameters
guess = np.array([5e-2, -2500, 0, 5e-2, -2000, 0, 0])

#Fits the functions using curve_fit
popt, pcov = curve_fit(fitfunc, time, decay1, guess)

print popt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, decay1)
ax.plot(time, fitfunc(time, *popt))
plt.show()

1 个答案:

答案 0 :(得分:0)

我看到两个问题:

    你写的fitfunc中的
  • tempArray[time <= 0] = line(time, p[6])
    tempArray[0 < time] = exponential(time, p[0], p[1], p[2]) + exponential(time, p[3], p[4], p[5])
    

但是在均等的两边,阵列的大小并不相同。我认为在第二行时代并不好;我用

替换了它
    tempArray[time <= 0] = line(time[time<=0], p[6])
    tempArray[0 < time] = exponential(time[0<time], p[0], p[1], p[2]) + exponential(time[0<time], p[3], p[4], p[5])
  • 您对p[1]的初步猜测,如果非常错误,我已将-2500替换为-250000

通过这两项更改,它可以在我的计算机上正常运行。

JPG