用numpy.exp()溢出

时间:2013-09-06 11:01:59

标签: python numpy scipy

我必须找到3个具有scipy的leastsq函数的参数,因为在最小二乘拟合中描述了here的过程。

这是我的代码:

def myFunc(t, Vs, Vi, k):
    y = Vs * t - ((Vs - Vi) * (1 - np.exp(-k * t)) / k)
    return y

x = np.array(temps, dtype='float64')
y = np.array(fluo, dtype='float64')

Vs, Vi, k = [2.8707e-11, 0.01241, 19765.39043]

def residuals(p, y, x):
    Vs, Vi, k = p
    err = y - myFunc(x, Vs, Vi, k) 
    return err

def peval(x, p):
    return myFunc(x, p[0], p[1], p[2])

p0 = [2.8707e-11, 0.01241, 19765.39043]
plsq = leastsq(residuals, p0, args=(y, x))

print(plsq[0])
print(np.array([Vs, Vi, k]))

但我收到了警告:

RuntimeWarning: overflow encountered in exp

我假设exp中产生的数字太大而不适合float64。但我真的需要让它适合。有没有选择来克服这个问题?

2 个答案:

答案 0 :(得分:1)

无法查看输入数据(包含在数组tempsfluo中),但很难确切地说出来,但我认为这不是担心*。当scipy.optimize.leastsq工作时,它通过雅可比行列式优化一组方程,然后向下移动到局部最小值。在此过程中,可能某些值将溢出,这些应该使用优化器正确处理。警告来自对溢出的第一次评估,它可能不止一次发生,但它只是第一次显示。

*前提是您检查解决方案并确认其是实际的并且合理。来自leastsq的输出为您提供参数估计的协方差,您可以使用它来确定拟合的进展情况。

答案 1 :(得分:-3)

也许您应该考虑将所有巨大的变量转换为全局变量。当我在visual studio(c ++)中出现堆栈溢出时,这对我有用。