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
我正在使用 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