Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 指数衰减拟合_Python_Numpy_Scipy - Fatal编程技术网

Python 指数衰减拟合

Python 指数衰减拟合,python,numpy,scipy,Python,Numpy,Scipy,我试图拟合一些分布在指数衰减后的时间内的数据。我试着在网上找到一些合适的例子,但是我的代码不适合这些数据。拟合只会产生一条直线。也许初始参数有问题?到目前为止,我只使用高斯拟合和直线拟合,使用相同的方法,这可能不适合这种情况。 代码从web获取数据,因此可以直接执行。 问题:为什么代码没有产生任何匹配? 非常感谢 #!/usr/bin/env python import pyfits, os, re, glob, sys from scipy.optimize import leastsq f

我试图拟合一些分布在指数衰减后的时间内的数据。我试着在网上找到一些合适的例子,但是我的代码不适合这些数据。拟合只会产生一条直线。也许初始参数有问题?到目前为止,我只使用高斯拟合和直线拟合,使用相同的方法,这可能不适合这种情况。 代码从web获取数据,因此可以直接执行。 问题:为什么代码没有产生任何匹配? 非常感谢

#!/usr/bin/env python

import pyfits, os, re, glob, sys
from scipy.optimize import leastsq
from numpy import *
from pylab import *
from scipy import *

rc('font',**{'family':'serif','serif':['Helvetica']})
rc('ps',usedistiller='xpdf')
rc('text', usetex=True)
#------------------------------------------------------

tmin = 56200
tmax = 56249

data=pyfits.open('http://heasarc.gsfc.nasa.gov/docs/swift/results/transients/weak/GX304-1.orbit.lc.fits')
time  = data[1].data.field(0)/86400. + data[1].header['MJDREFF'] + data[1].header['MJDREFI']
rate  = data[1].data.field(1)
error = data[1].data.field(2)
data.close()

cond = ((time > 56210) & (time < 56225))
time = time[cond]
rate = rate[cond]
error = error[cond]

right_exp = lambda p, x: p[0]*exp(-p[1]*x)
err = lambda p, x, y:(right_exp(p, x) -y)
v0= [0.20, 56210.0, 1]
out = leastsq(err, v0[:], args = (time, rate), maxfev=100000, full_output=1)
v = out[0] #fit parameters out
xxx = arange(min(time), max(time), time[1] - time[0])
ccc = right_exp(v, xxx)
fig = figure(figsize = (9, 9)) #make a plot
ax1 = fig.add_subplot(111)
ax1.plot(time, rate, 'g.') #spectrum
ax1.plot(xxx, ccc, 'b-') #fitted spectrum
savefig("right exp.png")

axis([tmin-10, tmax, -0.00, 0.45])
#/usr/bin/env python
导入pyfits、os、re、glob、sys
从scipy.optimize import leastsq
从numpy进口*
从派拉布进口*
从scipy导入*
rc('font',**{'family':'serif','serif':['Helvetica']})
rc('ps',UseDilleter='xpdf')
rc('text',usetex=True)
#------------------------------------------------------
tmin=56200
tmax=56249
数据=pyfits.open('http://heasarc.gsfc.nasa.gov/docs/swift/results/transients/weak/GX304-1.orbit.lc.fits')
时间=数据[1]。数据。字段(0)/86400+数据[1]。标题['MJDREFF']+数据[1]。标题['MJDREFI']
速率=数据[1]。数据。字段(1)
错误=数据[1]。数据。字段(2)
data.close()
条件=((时间>56210)和(时间<56225))
时间=时间[秒]
速率=速率[秒]
错误=错误[cond]
右经验=λp,x:p[0]*exp(-p[1]*x)
err=lambda p,x,y:(右经验(p,x)-y)
v0=[0.2056210.0,1]
out=leastsq(err,v0[:],args=(时间,速率),maxfev=100000,满输出=1)
v=out[0]#拟合参数
xxx=arange(最小(时间)、最大(时间)、时间[1]-时间[0])
ccc=右试验(v,xxx)
图=图(figsize=(9,9))#绘制一个图
ax1=图add_子批次(111)
ax1.绘图(时间、速率、g.)谱
ax1.图(xxx,ccc,'b-')#拟合光谱
savefig(“right exp.png”)
轴([tmin-10,tmax,-0.00,0.45])

您的问题是病态的,因为您的数组
时间
包含大量数字,当在
exp(-a*time)
中使用时,这些数字给出的值接近
0。
,这会欺骗
err
函数,因为您的
速率
数组包含的值也接近
0。
,从而导致小错误。换句话说,指数函数中的高
a
给出了一个很好的解决方案

要解决此问题,您可以:

  • 更改衰减函数以包含初始时间:
    exp(-a*(time-time0))
  • 将输入数据更改为从较小的数字开始:
    time-=time.min()
对于这两个选项,您必须更改初始猜测值
v0
,例如
v0=[0,0.]
。第一个解决方案似乎更为健壮,您不必管理
时间
数组中的更改。
time0
的一个好的初始猜测是
time.min()

给予:


不过,最终结果取决于
v0
,例如
v0=[1,1,time.min()]
它衰减太快,无法找到最佳值。

将公式更改为
p[0]*exp(-p[2]*(x-p[1])
非常感谢!图中的结果似乎是corecct,但我收到消息:“exp中遇到溢出”。溢出显然是因为您将大量数字插入到指数中(大约56200)。为了获得最佳拟合结果,请始终将点缩放/移动到1(x和y)的顺序,然后将结果缩放/移动回原位。
right_exp = lambda p, x: p[0]*exp(-p[1]*(x-p[2]))
err = lambda p, x, y:(right_exp(p, x) -y)
v0= [0., 0., time.min() ]
out = leastsq(err, v0, args = (time, rate))
v = out[0] #fit parameters out
xxx = arange(min(time), max(time), time[1] - time[0])
ccc = right_exp(v, xxx)
fig = figure(figsize = (9, 9)) #make a plot
ax1 = fig.add_subplot(111)
ax1.plot(time, rate, 'g.') #spectrum
ax1.plot(xxx, ccc, 'b-') #fitted spectrum
fig.show()