1

我必须使用 scipy 的 minimumsq 函数找到 3 个参数,因为该过程在部分最小二乘拟合中有所描述

这是我的代码:

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. 但我真的需要让它合身。有没有办法克服这个问题?

4

2 回答 2

1

如果无法查看输入数据(包含在您的数组tempsfluo作为scipy.optimize.leastsq工作,它通过雅可比优化一组方程并下降到局部最小值。在此过程中,某些值可能会溢出,这些值应该使用优化器正确处理。警告来自对溢出的第一次评估,它可能不止一次发生,但它只是第一次显示。

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

于 2013-09-06T13:55:59.690 回答
-3

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

于 2013-09-06T11:08:11.723 回答