我必须找到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
。但我真的需要让它适合。有没有选择来克服这个问题?
答案 0 :(得分:1)
无法查看输入数据(包含在数组temps
和fluo
中),但很难确切地说出来,但我认为这不是担心*。当scipy.optimize.leastsq
工作时,它通过雅可比行列式优化一组方程,然后向下移动到局部最小值。在此过程中,可能某些值将溢出,这些应该使用优化器正确处理。警告来自对溢出的第一次评估,它可能不止一次发生,但它只是第一次显示。
*前提是您检查解决方案并确认其是实际的并且合理。来自leastsq的输出为您提供参数估计的协方差,您可以使用它来确定拟合的进展情况。
答案 1 :(得分:-3)
也许您应该考虑将所有巨大的变量转换为全局变量。当我在visual studio(c ++)中出现堆栈溢出时,这对我有用。