我想知道信号开始呈指数增长的时间。为此,我将指数曲线拟合到数据中,乘以一个较重的阶梯函数。
def fit(x, a, b, c, d, e):
return np.heaviside(x-a, 0.5)*b*np.exp(c*x-d)+e
parameter, covariance = curve_fit(fit, fitx, fity)
x = np.linspace(min(fitx), max(fitx), 1000)
plt.plot(fitx, fity)
plt.plot(x, fit(x, *parameter), 'b-', label='fit')
plt.show()
结果以某种方式成为一条直线
当我只适合指数部分时,我得到以下图表:
我希望x轴上有一条直线,然后是图像2中的指数图。有人知道我哪里出错吗?
答案 0 :(得分:1)
最可能的情况是您遇到参数收敛问题。在大多数情况下,这种收敛问题是由于参数的起点不好造成的。
由于它在没有重力函数的情况下按预期工作,我的猜测是你应该为a
函数调用中的参数curve_fit
给出一个合理的起点。
答案 1 :(得分:0)
你说你想找到“信号开始呈指数增长的时间”,但绘制的信号不会呈指数增长。实际上,它会减少(至少会增加时间和从左到右)。并且看起来像峰值。你的意思是你想要适应某种功能吗?
我猜想高斯可能效果很好。使用步进功能也可以,但可能不适合t = 1e-8左右。
您没有包含数据或完整代码,因此很难给出具体示例。但你可能会发现lmfit包在这里很有帮助。它有一个内置的步骤模型,可以使用线性或误差函数或逻辑曲线。见http://lmfit.github.io/lmfit-py/builtin_models.html#step-like-models。这可能接近你想要做的事情。