Scipy曲线拟合数据如何修复"overflow encounter in exp"?

How to fix "overflow encounter in exp" when curve fitting data in Scipy?

我正在使用 Python 3,我正在尝试使用指数函数找到以下数据集的最佳拟合

xdata = [329.14, 339.43, 344.13, 347.02, 350.79, 353.54, 355.62, 360.51, 362.36, 364.89,
 366.66, 369.0,371.87, 372.91]
ydata = [13.03, 20.53, 25.08, 28.38, 33.18, 36.93, 40.13, 48.23, 51.98, 57.23, 60.98, 66.43,
 73.23, 76.28]

然后我执行下面的代码:

opt.curve_fit(lambda t, a, b: a*np.exp(b/t), xdata, ydata, p0=[P0, p[0]])

其中 P0, p[0] = 76.28, -4957.925919691658。但是我收到以下错误

<ipython-input-67-64582d269012>:3: RuntimeWarning: overflow encountered in exp
  opt.curve_fit(lambda t, a, b: a*np.exp(b/t), xdata, ydata, p0=[76.3, p[0]])

我很确定这个问题与 p0 有关,特别是 P0 因为如果我删除它,我会得到

(array([ 4.33524091e+07, -4.94111729e+03]),
 array([[ 1.93745891e+12, -1.62915424e+07],
        [-1.62915424e+07,  1.37067431e+02]]))

但我并不真正满足这一点,因为我期望指数拟合曲线可以在 P0 附近提供 a

我想知道如何对上面的数据应用指数拟合,以便 a 可以在 P0 左右。我可以接受 python 上的任何方法,即使它没有使用 opt.curve_fit.

谢谢。

取对数并尝试线性拟合。

问题是 a 的值太小了。最小化过程尝试通过 b 进行补偿,导致溢出。我用起始值 p0=( 3.2e6, -4000 ) 得到了很好的结果或者,您可以将函数定义为 exp( a - b / t ) ,它可以很好地覆盖 p0=( 15, -4000 ) 甚至不提供 p0