使用卷积积分拟合指数衰减 - Python

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (222)

我正在拟合以下数据:t:time(s),G:count,f:impulse function:

 t      G      f 
-7200   4.7     0
-6300   5.17    0
-5400   4.93    0
-4500   4.38    0
-3600   4.47    0
-2700   4.4     0
-1800   3.36    0
 -900   3.68    0
    0   4.58    0
  900   11.73   11
 1800   18.23   8.25
 2700   19.33   3
 3600   19.04   0.5
 4500   17.21   0
 5400   12.98   0
 6300   11.59   0
 7200   9.26    0
 8100   7.66    0
 9000   6.59    0
 9900   5.68    0
10800   5.1     0

使用以下卷积积分:

更具体地说:

其中:lambda_1 = 0.000431062lambda_2 = 0.000580525

用于执行该拟合的代码是:

#Extract data into numpy arrays
t=df['t'].as_matrix()
g=df['G'].as_matrix()
f=df['f'].as_matrix()
#Definition of the function
def convol(x,A,B,C):
    dx=x[1]-x[0]
    return A*np.convolve(f, np.exp(-lambda_1*x))[:len(x)]*dx+B*np.convolve(f, np.exp(-lambda_2*x))[:len(x)]*dx+C

#Determination of fit parameters A,B,C
popt, pcov = curve_fit(convol, t, g)
A,B,C= popt
perr = np.sqrt(np.diag(pcov))

#Plot fit
fit = convol(t,A,B,C)
plt.plot(t, fit)
plt.scatter(t, g,s=50, color='black')
plt.show()

问题是我的拟合参数A和B太低而且没有物理意义。我认为我的问题与步宽有关dx。它应倾向于0,以便将我的总和(np.convolve()对应于卷积乘积的离散和)近似为积分。

提问于
用户回答回答于

虽然这不是答案,但我无法在评论中格式化代码,因此将其发布在此处。此代码显示如何向curve_fit添加边界。请注意,如果参数值在边界处或非常接近边界处返回,则可能存在其他一些问题。

#Determination of fit parameters A,B,C
lowerBounds = [0.0, 0.0, 0.0] # A, B, C lower bounds
upperBounds = [10.0, 10.0, 10.0] # A, B, C upper bounds
popt, pcov = curve_fit(convol, t, g, bounds=[lowerBounds, upperBounds])

扫码关注云+社区

领取腾讯云代金券