在 python 中使用 scipy 的 curve_fit 进行拟合对于 1/t 和 t 给出了完全不同的答案

计算科学 Python scipy 曲线拟合
2021-12-24 04:26:23

我试图将一些数据拟合为单次指数衰减函数,但a*exp(-x*t)给出a*exp(-x/t)了完全不同的答案,后者完全不能很好地拟合数据。代码:

def func(x, a1, t1, c):
    return a1 * numpy.exp(-x*t1) + c

interp_x = np.arange(low,high+dx,dx)
popt, pcov = scipy.optimize.curve_fit(func, x, y,maxfev=10000)
curve = func(interp_x,*popt)

这是使用的数据:

0.050   365.104
0.100   331.764
0.200   299.508
0.500   241.281
0.700   188.579
1.000   144.728
2.000   73.2627
1个回答

曲线拟合可能对您对每个参数的初始猜测非常敏感。因为您没有在代码中指定猜测值,所以所有这些参数的值都以 1 开头。与t拟合的收敛结果相比,虽然t实际上非常接近 1,但其他参数则相距甚远。在为andt搜索适当的值时,该值没有漂移太远,这主要是运气ac

拟合没有那么幸运,1/t搜索导致它远离t拟合获得的良好解决方案。然而,更好的初始猜测可以解决这个问题。使用拟合中的act作为初始猜测会导致相同的解决方案。我没有尝试过,但我怀疑即使只是提供更好的猜测c(比如 400)也可能足以使两者匹配。

通常,您应该始终尝试为这些参数提供初始猜测,尤其是在可能存在多个不同的参数集以最小化拟合误差的情况下。