지수 기하 급수적 인 감소 다음에 분배되는 일부 데이터를 맞추려고합니다. 필자는 웹에서 적절한 예제를 따르려고했지만 코드가 데이터에 맞지 않습니다. 적합성으로 인해 직선 만 생깁니다. 어쩌면 초기 매개 변수에 문제가있을 수 있습니까? 지금까지는 동일한 방법을 사용하여 가우스 및 라인 맞춤 만 사용했는데이 경우에 맞지 않을 수 있습니다. 코드는 웹에서 데이터를 가져와 직접 실행 가능합니다. 질문 : 코드가 적합하지 않은 이유는 무엇입니까? 미리 감사드립니다.지수 기수 감쇠 피팅
#!/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])
수식을'p [0] * exp (-p [2] * (x-p [1]))' – Evert
으로 바꿔 줘서 고마워! 플롯이 corecct를 생성하는 것으로 보입니다. 그러나 "exp에서 오버 플로우가 발생했습니다"라는 메시지가 나타납니다. –
오버 플로우는 분명히 큰 숫자를 지수로 삽입하기 때문에 발생합니다 (약 56200). 최적의 결과를 얻으려면 점을 항상 1 (x 및 y)의 순서로 축척/시프트 한 다음 결과를 다시 축척/이동하십시오. – Evert